하드디스크는 저장, 메인 메모리엔 실행으로 알고 있지만 하드디스크는 실행의 기능도 있다.




프로그램의 실행은 지역적인 특성이 있다.


메모리 크기가 1 ~ 100까지 있다면 난수처럼 산발적으로 실행되는 것이 아니라,


한 부분이 실행되면 그 주변을 돌면서 작동하고 시간이 지나면 다른 곳으로 점프해서 그 주변을 실행한다.


그 주변을 더 빠르게 실행하기 위해 나온 것이 캐시로, 메인 메모리보다 CPU에 더 가깝게 위치한다. 속도는 빠르지만 용량은 메인 메모리보다 작다


이 방법이 효과가 좋았기 때문에, 메모리를 또 놨다.



기존 캐시보다 더 빠르지만, 용량은 더 작다.


하드디스크 또한 이러한 구조와 같다.


하드디스크는 실행을 빨리 하기 위해 메인 메모리에 데이터를 넣고,


메인메모리는 더 실행을 빨리 하기 위해 L2캐쉬에 데이터를 넣는다.


ALU는 L1에 데이터를 요청하면, L1은 L2에 요청하고 ... 하드디스크에 요청한다.


하드디스크에 데이터가 있으면 그 데이터를 메인 메모리, L2, L1, 레지스터에 올려 실행시킨다.


즉, 하드디스크의 저장이라는 관점은 파일 시스템이다. 메모리 매니지먼트 측면으로 이해하면 안된다.





모든 프로그램은 지역성을 갖는다.



CPU가 데이터를 요청하면 캐쉬에 그 데이터가 있을 확률이 90%가 넘는다


와우!


좋은 프로그램은 지역성 또한 좋을 것이다.



캐쉬 메모리로 성능이 향상되는 이유는 바로 Locality 때문


Temporal Locality :

만약 int a를 선언했다면 CPU는 int a에 다시 접근할 가능성이 높다


Spatial Locality :

int a에 접근하는 경우 int a와 함께 선언할 int b에도 접근할 가능성이 높다.



로컬리티의 예


Temporal Locality와 Spatial Locality를 만족하는 것을 볼 수 있다.



캐시에 적절한 데이터가 있을 확률이 90%가 넘는 이유는 Spatial Locality의 특성때문이다.


하드가 메인메모리에 데이터를 넘겨줄 때, 하드가 메모리에, 메모리가 L2에, L2가 L1에, L1이 레지스터에 넘겨주는 데이터는 특정 용량의 기준이 있다.




10mb도 5mb도 2mb도 아니지만 예를 들어 이러한 기준이 있다고 보면


메모리 계층간 데이터 이동은 블록단위로 이동한다.


그래서 캐시 히트가 90% 넘는 확률로 발생하는 이유가 바로 블록단위 데이터 이동 때문이다.


일반적으로 짜는 코드 역시 이러한 방식이기도 한데, 캐시 친화적인 코드란 메모리를 순서대로 읽게 되는 코드를 뜻한다.


하지만 캐시에 대해 공부하려면 그 양이 너무 방대해 밑도끝도 없는 공부를 하게 될수도 있다고 하네





동대문좌


실제로 필요한 메모리가 20개인데 실제 가지고 있는 메모리는 10개라면 소유중인 메모리를 자유자재로 매핑할 필요가 있다.



메인 메모리가 부족하면 하드 디스크까지 확장하는 것을 가상 메모리라고 한다.




선 할당으로 인한 부담


특정 프로세스가 선 할당으로 메모리 4gb를 점유해버리면

다른 프로세스는 메모리 사용을 못하고 발만 동동 구르게 된다.


느린 속도의 개선



1gb는 램, 1gb는 하드에 데이터가 올라가 있으면 언제는 빠르고 언제는 느리고 할 것이다.

하지만 속도가 일정해야 하니 이것을 개선해야 한다.



CPU가 어떤 데이터 할당을 요청하면 MMU는 물리 메모리(램)에 가상 메모리를 할당한다.


1K번지부터 20바이트를 할당을 요청하면 MMU는 가상 메모리로 0K ~ 4K를 매핑해 물리 메모리 0 ~ 4K에 할당하고,


36K번지부터 20바이트를 할당을 요청하면 MMU는 가상 메모리로 36K ~ 40K를 매핑해 물리 메모리 4 ~ 8K에 할당한다.


만약 CPU가 36K번지를 요청하면 MMU는 이를 가상 메모리에서 물리 메모리로 치환해서 실제로 데이터가 존재하는 4K번지에 있는 것을 CPU로 전달한다.


가상 메모리 관점으로 페이지, 물리 메모리 관점으로 페이지 프레임이라고 하네


만약 프로세스를 실행해서 가상 메모리에 2gb를 할당할 일이 있다면, 하드디스크에 2gb를 다 넣어둔다. 그리고 필요한 데이터를 램에다 올리는 것이다.


즉, 램을 일종의 캐쉬처럼 사용하는 것이다.



램이 꽉 찬 상태에서 4 ~ 8K를 CPU로부터 요청받으면


LRU는 램에서 사용된지 오래된 것을 하드디스크에 스토어한다.( 8 ~ 12K )


그리고 4~8K를 부른다.


하지만 그러자마자 8 ~ 12K를 다시 요청받으면


램에 존재하는 단위 중 사용된지 가장 오래된것을 다시 하드에 스토어하고, 하드에 있는 8 ~ 12K를 다시 로드한다.


하드에 데이터를 저장할 때 파일 시스템, 즉 파일로 저장한다. 이러한 임시 데이터를 스왑파일이라고 한다.



그림이 지존 멋있군


컨텍스트 스위칭은 이러한 경우에도 일어난다.



+ Recent posts