현실적으로 연속적인 프로그램(명령어의 집합)을 할당할 수 없다.
그래서,
물리적인 주소 공간을 연속적이지 않은 것으로 간주
외부 단편화 방지
하나의 압축 파일로 안해도 됨.
물리적인 메모리를 고정된 크기의 block으로 쪼갠다.(frame)
논리적인 주소를 고정된 크기의 block으로 쪼갠다.(pages)
매핑은 os가 알아서 해서, 연속적일 필요가 없다.
page와 frame을 maping을 한다.



page number "p"를 이용해서 page table에서 위치를 찾는다.
page table에서 frame을 가져온다.
page number p -> frame number f로 대체한다.

external은 아닌데 internal fragmentation 발생.
hardware에 의존적


참고로, 페이지와 프레임은 서로 크기가 같으므로, 1:1 매핑이 가능하다.
( 매핑 내역은 Page Table에 기록된다.)
현재 프로세스 실행에 요구되는 페이지만 메모리에 올리는 것을 Demanding Paging이라고 한다.
Page Table에는 Valid bit가 추가되며, 해당 페이지- 프레임의 메모리 상 존재 여부를 나타낸다.
(만약 현재 페이지가 메모리에 적재 -> 1, 아니면 -> 0)

새로운 프로세스가 들어오면 free-frame list에 위에서부터 순차적으로 매핑을 한다.
CPU 스케줄러가 실행중인 프로세스를 선택할 때, page table도 context switch가 발생해서 reloaded될 필요가 있다.
CPU의 레지스터인데, page table에 적용되로 포인터로,
context switch는 빠르나, memory access가 느리다.


page table이 아니라, TLB라는 하드웨어 캐시 메모리를 쓴다.
(TLB miss 시간을 줄일 수 있다.)





libc의 물리적인 공간은 1개이나, 논리적으로 다양한 프로세스가 참조를 한다.
Read-Only라서 데드락없다.



넣고 빼고 할 때, hash가 가장 빠르다.

필요할 때만 swap해서 사용한다.


근데 페이지로 swapping은 그나마 싸다.

