page는 VM_UNINIT, VM_ANON, VM_FILE 3개 중 하나의 속성을 갖는다.
page 가상 메모리 주소에 접근 시 해당 주소가 page table에 mapping되어 있지 않다면(matching된 kva가 없다면), page fault가 발생하게 되고, page fault handler는 미리 해당 주소에 대한 정보가 담긴 supplemental page table(spt)에 해당 주소에 대한 정보를 찾아 page table에 mapping 시켜준다.
va(page)는 kva(frame)과 matching되어 있고, kva는 실제 물리 메모리와 matching되어 있다. => 실제 물리 메모리를 pintos가 건들지 못하게 하기 위함.
단어 그대로 익명, 이름이 없는 page다.
왜 없냐면 disk의 file을 실행시키면서 만들어 진 게 아니라서(특정 file과 matching 안되서) 이름이 없다.
Anonymous Page는 private 또는 shared로 할당받을 수 있다.
프로세스의 힙과 스택이 private로 할당된 anonymous page이다.
shared는 프로세스간 통신을 위해 사용되는 anonymous page이다.
왜 사용하는 지 궁금해져서 찾아보니
아래와 같은 장단점이 있다.
장점
단편화가 없다.
할당 후 크기 조절이 가능.
heap을 거칠 필요가 없다.
단점
새로운 공간을 할당 받는 overhead가 heap에서 가져오는 것 보다 크다.
kernel의 page 사이즈 크기 배수로 할당 받다보니 공간 낭비가 있을 수 있다.
page fault 후 page 공간만큼 stack 영역이 늘어나야 한다.
메모리 할당 후 stack_bottom을 더 늘려줘야 한다.
Test Case 중 여러 개의 page를 늘리는 경우는 없다.
file backed mapping 부분이다.
mmap을 호출하면 syscall이 발생하고 예외처리 체크 후 do_mmap 호출하게 되고
disk에 있는 file을 메모리 mapping을 하게 된다.
munmap은 반대로 메모리 mapping을 해제함.
Swap In / Out 은 물리 메모리에 page를 올렸다(Swap In), 뺐다(Swap Out)라고 생각하면 된다.
Swap In은 Load를 위해 당연히 진행해야 되고 실제 page 속성은 Swap In 과정에서 정해진다.
Swap Out은 메모리 공간이 부족해졌을 때 판단하에 가장 빠져도 되는 page를 Swap Out(swap area로 방출)하게 된다.
아래와 같이 Swap Out을 위한 여러 policy가 있다.
FIFO
First In First Out
먼저 들어 간 것이 먼저 나온다.
선입 선출
교체 시기도 마찬가지로 먼저 들어간 page가 먼저 나온다.
Second-change
FIFO의 변형된 형태의 알고리즘.
참조비트를 추가하여 참조비트가 1이면 queue의 맨 뒤로 이동시키고, 그렇지 않다면 교체한다.
LRU
가장 오랫동안 사용되지 않은 page를 교체
LFU
참조된 횟수가 가장 적은 page를 교체
Clock
Second-change보다 더 효율적인 FIFO 버전, LRU를 근사화 시킨 알고리즘.
참조 비트가 1이면 옮기지 않고 참조비트를 Clear 한 뒤, 다음 page를 찾는다.
참조 비트가 0인 page를 찾았으면 그 page를 교체한다.
열심히 하는 같은 팀 조원들에 비해 너무 부족하였다고 생각한다.
이번 프로젝트도 역시나 구현은 못했고, 다른 사람들의 내용을 참고하면서 이해하였다.
다들 고생 많았고 다음 주도 화이팅!!