Program Loading
Swapping
장점: 모든 프로세스 메모리의 합이 PA보다 많아진다.
단점: backing store의 process 크기나 data transfer rate를 알아야 한다.
Demand page 과정
초기에 프로세스를 부르면 blank page table을 설정한다.
main memory안에 프로그램의 부분을 할당한다.
physical memory가 가득차면 안쓰고 있는 evicted page를 만들고 paging file로 옮긴다. 만약 evicted page가 설정되면, MMU는 PTE의 valid bit를 clear한다.
page를 참조할때 valid bit가 clear되어있으면 page fault라 불리는 exception을 던진다.
page fault handler가 page fault를 제어할 수 있다. 만약 PFN이 NULL이면 잘못된 페이지이고 PFN이 있으면 Paging file에서 page를 찾아 main memory에 저장한다.
locality
Temporal locality: 반복해서 사용하는 location
Spatial locality: 가까운 곳에서 사용하는 location
locality를 알 맞게 사용하여 page fault가 잘 일어나지 않도록 해야한다.
Shared memory
프로세스들이 같은 데이터를 공유하고 싶을 때 사용한다.
fork()를하면 페이지들을 모두 read-only로 바꾼다.
만약 write를 한다고 했을때, read-only이므로 write할 수 없다. 이를 통해 shared memory임을 알 수 있다.
frame의 mapping count가 2이상이면 메모리 공간에 frame을 추가하여 해당 page를 연결하고 read-write로 바꾸고, mapping count를 하나 줄인다.
OS in memory
virtual address space는 User address space, kernel address space의 두 부분으로 나뉜다.
user address space는 같은 kernel address space를 공유한다.
Thrashing
메모리의 공간이 충분하지 않을 때, 디스크에서 가져와야하기 때문에 CPU utilization이 낮아진다. working set이 메모리 크기보다 커지는 시점을 Thrasing이라한다.
프로세스를 kill하거나, 메모리를 키우는 수밖에 없다.
Prepaging
Buddy System Allocator
device들이 메모리에게 페이지를 요청할때 일일이 하나씩 페이지를 요청하면 크기가 너무 커 효율이 안좋아진다.
그래서 메모리 인덱스[-100, 100]만큼 요청을 하는 것처럼 인덱스로 요청을 해야한다.
이는 continuous하게 PA에서 가져와야한다. 하지만 이는 External fragment가 발생할 수 있다. 이를 위해 Buddy System allocator를 사용한다.
2^n만큼 chunk를 나누고 이 만큼 page를 줄 수있다.
하지만 이는 Internal fragment가 발생할 수 있지만 external fragment보다 낫다고 판단해 사용한다.
메모리를 반환 할때 메모리의 버디를 보고 버디가 사용 중일때 자기 자신만 반환하고 버디가 사용 중 일지 않을 때 버디와 병합하여 반환한다.
[참고] Operating Systems Three Easy Pieces/Remzi H.Arpaci-Dusseau/ CreateSpace Publishing