물리 주소 공간
, frame
, 논리 주소 공간
, page
, 가상 메모리
, swapping
, 물리 메모리보다 더 큰 프로세스
paging은 메모리의 물리 주소 공간을 frame 단위로 자르고, 프로세스의 논리 주소 공간을 page 단위로 자른 뒤에, 각 page를 frame에 할당하는 가상 메모리 관리 기법입니다.
paging에서의 swapping은 page 단위로 이루어지기 때문에, 한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재되지 않더라도, 실행에 필요한 일부 page만을 메모리에 적재하고, 당장 필요하지 않은 page들은 보조 기억 장치에 남겨둘 수 있습니다.
이 덕분에, 물리 메모리보다 더 큰 프로세스도 실행할 수 있게 됩니다.
paging을 사용하는 시스템에서는 page 단위로 swap-out/swap-in 된다. 그래서 paging 시스템에서의 swap-out은 page-out, swap-in은 page-in이라고 부른다.
만약 paging 기법으로 시스템을 설계하면, CPU 입장에서는 메모리에 프로세스가 불연속적으로 배치되어있어 다음 실행할 명령어를 찾는 등의 작업이 어려워진다.
이를 해결하기 위해 paging 시스템은 프로세스가 비록 물리 주소에 불연속적으로 배치되더라도, CPU가 바라보는 주소인 논리 주소에는 연속적으로 배치되도록 page table을 생성한다.
page table은 현재 어떤 page가 어떤 frame에 할당되었는지 찾을 수 있는 table이다. page 번호를 이용하여, page가 적재된 frame을 찾을 수 있도록 하는 기법이다.
paging은 프로세스의 논리 주소 공간을 page라는 일정한 크기 단위로 자른다. 그래서 모든 프로세스가 page 크기에 맞게 잘리는 것은 아니다. 그래서 내부 단편화 문제가 발생할 수 있고, 이를 해결하기 위해서는 page를 적절한 크기로 설정하는 것이 중요하다.
프로세스마다 각자의 page table을 가지고 있고, 그들은 메모리에 적재되어 있다. 그리고 CPU 내부의 Page Table Base Register는 각 프로세스의 page table이 적재된 주소를 가르킨다.
예를 들어 프로세스 A가 실행될 때는 PTBR은 프로세스 A의 page table을 가르키고, CPU는 프로세스 A의 page table을 통해 프로세스 A의 page가 적재된 frame을 알 수 있게 된다.
참고로, 각 프로세스들의 page table 정보들은 각 프로세스의 PCB에 기록된다. 그래서 Context switching이 일어날 때, 다른 레지스터와 마찬가지로 PTBR이 변경된다.
물리 메모리에 CPU가 요청한 page가 없는 경우가 Page Fault이다.
이 경우에는 스왑 영역(보조기억장치에 위치한 가상 메모리 영역)에서 page를 찾아 물리 메모리에 로드한다.
Major Page Fault
Major Page Fault는 요청한 page가 물리 메모리로부터 swap-out되어 보조기억장치의 가상 메모리에 저장되어 있는 경우를 말한다. 이 경우, 물리 메모리로 swap-in하는 과정에서 Disk I/O를 발생시킨다.
Minor Page Fault
Minor Page Fault는 요청한 page가 물리 메모리에는 로드되었지만, 메모리 관리 유닛(Memory Management Unit, MMU)에는 로드되어있지 않은 경우를 말한다. 한 예시로, 어느 프로세스의 한 thread가 어떤 page를 사용하고 있을 때, 해당 프로세스의 다른 thread가 그 page를 요청하는 경우를 들 수 있다.
이 경우, MMU는 해당 thread에서 요청한 page가 이미 사용되고 있는 page를 가르키도록 하면 되기 때문에, swap-in이 발생하지 않고, 따라서 Disk I/O도 발생하지 않는다.
Invaild Page Fault
Invaild Page Fault는 요청한 page가 스왑 영역의 밖을 참조하거나, page를 쓰기 불가능한 영역에 쓰려고 할때 발생한다. 이 경우에, page fault handler가 segentation Fault를 발생시킨다.
Page 크기는 하드웨어 설계에 있어 주요한 결정 사항 중 하나이다.
Page 크기가 작을 경우
page 크기가 작을수록, Internal fragmentation의 양이 줄어든다.
(고정된 page의 크기가 작기 때문에, Internal fragmentation이 발생하더라도, 남는 공간이 적다.)
page table 크기 증가
(page 크기가 작기 때문에, 더 많은 page가 필요로 하고 이를 인덱싱하는 Page table의 크기는 증가할 수 밖에 없다.)
동일 크기 데이터 적재에 필요한 입출력 횟수 증가
(page 크기가 작기 때문에, 더 많은 page를 필요로 하고 이에 따라서 당연하게도 I/O 횟수는 증가한다.)
지역성(locality)과 관련된 부분만으로 적재 집합 구성 가능
(Page 크기가 작을 수록, 참조 지역성 효과가 커진다.)
프로세스 당 할당된 frame이 많을 수록, page fault 발생률 감소
Page 크기가 매우 작을 경우
한 프로세스가 사용할 수 있는 Page들이 상대적으로 많아진다. 그 말은 많이 사용되는 page들을 물리 메모리에 적절히 올려놓을 가능성이 높아진다는 것이다. 그래서 결국, 메모리에 적재된 page들이 프로세스가 최근에 참조한 인접부분을 모두 포함하고 있기 때문에, page fault 발생률이 낮아진다.
Page 크기가 증가할 경우
page 크기가 커질 수록, 개별 page들이 최근 참조로부터 멀리 떨어진 위치를 포함하는 정도가 커진다. 이렇게 되면, locality의 원리가 약해져서 page fault 발생률이 증가하게 된다.
Page 크기가 프로세스 전체 크기와 같아질 경우
한 page의 크기가 프로세스 전체를 포함할 경우에, page fault가 발생하지 않는다.
copy on write는 리소스가 복제되었지만, 수정되지 않은 경우에는 새 리소스를 만들 필요 없이 복사본과 원본이 리소스를 공유하고, 복사본이 수정되었을 경우에만, 새로운 리소스를 만드는 리소스 관리 기법이다.
예시로, OS에서 fork()를 수행하면, 자식 프로세스가 부모 프로세스의 복사본이 된다. 이때, 자식 프로세스에 수정이 일어날 때에 새로운 리소스를 만드는 것이 효율적이다.
이렇게 하면, 내용이 바뀌지 않을 때까지는 page를 공유하고, 내용이 변경된다면 새로운 page를 할당해서 복사를 해주어, 복사에 드는 오버헤드를 감소시킬 수 있다.