가상메모리에 대해서 알아보기 전에, 우선 CPU부터 간략히 알아보자.
32bit CPU, 64bit CPU라는 말을 많이 들어보았을 것이다.
여기서 32bit와 64bit는 무엇일까?
바로. CPU가 접근할 수 있는 메모리(RAM) 주소범위이다.
1bit가 0 과 1 , 2가지 경우를 표현하므로 32bit는 232가지 경우를 표현할 수 있다.
1GB는 230 가지 경우를 표현하므로, 232 = 22 x 230 = 4GB
정리하면,
32bit CPU는 4GB 메모리에 접근 가능하고
64bit CPU는 264 = 232 x 232 = 4GB X 4GB = 16GB 메모리에 접근가능하다.
그럼 이제 32bit CPU를 예로 들어 가상메모리 기법에 대해서 알아보자. ( 64bit도 원리는 동일하다. )
가상메모리(Virtual Memory)
가상메모리 기법이란 CPU가 가상주소로 메모리에 접근을 시도하면 MMU(Memory Management Unit)가 가상주소를 물리주소로 변환하여 실제 RAM으로 매핑해주는 기법을 의미한다.
가상(Virtual)이므로 CPU는 RAM에 자신이 필요한 모든 페이지가 올라와 있다고 생각한다.
그러나 RAM은 제한적이다. RAM에 존재하는 페이지도 있고 Disk에 존재하는 페이지도 있다. 만약 CPU가 가상주소로 접근한 페이지가 Disk에 있으면(페이지 폴트), 해당 페이지를 RAM으로 올려야 한다(I/O발생). 페이지 폴트가 자주 일어날수록 I/O가 잦으므로 성능이 떨어진다. 그래서 페이지를 어떤 정책으로 RAM으로 올릴 것인지도 굉장히 중요하다. 이에 대한 자세한 내용은 해당 링크를 참조하면 된다.
이번 포스팅에서는 아래 2가지에 대해서 자세히 알아보겠다.
1) CPU의 가상주소가 물리주소로 매핑되는 원리
2) 가상(Virtual) 주소라 부르는 이유
CPU의 가상주소가 물리주소로 매핑되는 원리
CPU는 32bit이고 4GB 메모리를 페이징 메모리 분할 기법에 따라 고정크기가 4KB인 페이지로 나누었다고 가정하자. 4KB는 2x210 이므로 2x230인 4GB를 4KB로 분할하면 220개의 페이지가 만들어 진다. CPU는 32bit 로 220개의 페이지에 모두 접근할 수 있지만 페이지 개수가 너무 많다. 여기에 인덱싱을 사용하면 매핑이 쉬워진다.
예를들어, 경복궁의 주소는 [ 서울시 종로구 ( 시/도 ) / 사직로 161 ( 도로명주소) / 경복궁 (상세주소) ]이다. 먼저 서울시 종로구를 찾고 그 다음 사직로 161을 찾고 그 다음 경복궁을 찾는다. 만약 상세주소만 나열되어 있다면 찾기가 쉽지 않을 것이다. CPU의 가상주소도 이와 같은 원리로 구성되어 있다.
32bit 중 10bit는 페이지 디렉토리 인덱스에 할당하고 10bit는 페이지 테이블 인덱스에 할당하고 나머지 12bit는 212 경우를 나타내므로 4KB(212) 페이지 내부주소(오프셋)로 사용한다.
페이지 디렉토리의 크기는 4KB이다.
페이지 디렉토리 인덱스는 10bit로 표현하므로, 4Byte 단위로 210(1024)개로 이루어져 있다. 페이지 디렉토리의 인덱스는 페이지 테이블을 가리킨다. 페이지 테이블은 4KB씩 1024개 묶음으로 존재한다. 그러므로 페이지 디렉토리 인덱스 하나가 페이지 테이블의 한 묶음을 가리킨다.
페이지 디렉토리가 가리키는 인덱스에 따라 페이지 테이블 안의 한 묶음에 도착했다. 한 묶음은 4Byte 단위로 1024개가 이루어져 있다. 그러므로 4Byte가 총 210개씩 210개가 존재하므로 4Byte 220개가 물리적 메모리 4KB 페이지 220개를 매핑하는 것이다. 페이지테이블 인덱스 한 묶음(1024개) 안에서 원하는 페이지를 가리키는 하나를 찾아야 한다. 이는 페이지 테이블 인덱스 10bit에 저장되어 있다.
10bit로 페이지 테이블을, 10bit로 페이지를 찾으면 이제 남은 bit 수는 12bit이다.
12 bit는 앞서 말했듯, 4KB(212) 페이지 내부주소(오프셋)로 사용한다.
4KB 안에 212개의 Byte가 존재하므로 한 곳을 찾으면 된다.
그럼 지금까지 CPU 32bit에 저장된 가상주소로 물리적 메모리인 RAM 4GB 전 영역에 접근하는 원리에 대해서 알아보았다. 그렇다면 32bit에 저장된 주소를 왜 가상(Virtual) 주소라고 부르는 걸까?
가상(Virtual) 주소라 부르는 이유
4KB 짜리 페이지 디렉토리만 있으면 4GB 전영역에 접근할 수 있다.
CPU가 프로세스A의 페이지 디렉토리를 바라보면, CPU는 4GB 전체 공간을 프로세스A만 사용하고 있다고 생각한다. 컨텍스트 스위칭되어 CPU가 프로세스B의 페이지 디렉토리를 바라보면, CPU는 4GB 전체 공간을 프로세스B만 사용하고 있다고 생각한다. 그러나 물리적으로는 프로세스A, 프로세스B, 프로세스C 등이 모두 섞여있다.
CPU가 특정 가상주소에 접근하였는데, 페이지 디렉토리에 존재하지 않는다고 가정해보자.( 페이지 폴트 ) CPU는 4GB에 모든 페이지가 올라와 있다고 생각하는데, 실제 물리 메모리에는 다양한 프로세스가 섞여 있기에, 필요한 페이지 외에는 Disk 영역에 존재하고 있다. 그러므로 Disk에 있는 페이지를 메모리 프레임에 올려야 한다.
만약 메모리에 빈공간이 있으면 그냥 올리면 되지만 빈공간이 없다면 프레임을 차지하고 있는 페이지 중 가장 우선순위가 낮은 페이지를 Disk 영역으로 내려야 한다. 이를 페이지 교체 정책이라고 부른다. 자세한 페이지 교체정책은 아래 링크를 참조하면 된다.
정리하면
CPU는 32bit 가상주소로 메모리 공간에 접근하다. 32bit에 저장된 주소는 가상주소로 4GB 메모리 전체에 접근할 수 있다. 컨텍스트 스위칭이 일어날때 마다 바라보는 페이지 디렉토리가 다르기에, CPU는 할당된 프로세스의 모든 페이지가 4GB 메모리에 올라와 있다고 가정한다. 그러나 물리적으로 모든 페이지가 메모리에 올라올 수 없으므로, 페이지폴트가 발생하면 MMU가 바쁘게 움직여 Disk에 있는 페이지를 메모리 프레임에 올린다. 만약 빈 공간이 없다면 페이지 교체 정책에 따라 메모리 빈공간을 만들고 그 곳에 페이지를 할당하고 기록한다.
참고자료
'CS > OS' 카테고리의 다른 글
[OS] 비동기(Async)와 동기(Sync) (0) | 2024.01.21 |
---|---|
[OS] 멀티 프로세스 vs 멀티 스레드 (0) | 2024.01.18 |
[OS] 프로세스 스케줄링 ( Process Scheduling ) (0) | 2024.01.17 |
[OS] PCB란 무엇일까? (0) | 2024.01.15 |
[OS] 프로세스(Process)란 무엇일까? (0) | 2024.01.15 |