사실 Virtual Memory에 대해 아직 배워야할 것들이 너무 많고, 아직 이해하지 못한 부분들이 있기 때문에 세세한 내용은 적을 수 없어 자세한 개념이나 설명은 적을 수 없을 것 같고 키워드 위주로 정리하려고 한다.
WIL Keyword
- Virtual Memory (PML4 / TLB)
- Hash Table
- Demand Paging
- frame, page (UNINIT PAGE / ANONYMOUS PAGE / FILE MAPPED PAGE)
- page fault handler
- lazy_load_segment / do claim
- fork () / exec ()- mmap / munmap (file mapping)
- memory swap
PML4 = PAGE MAP LEVEL 4 ( CSAPP 9.6 )
Demand paging 구현을 위해 추가되는 자료구조
구현 및 실행 Flow
초기 프로그램 실행시 process_exec의 load_segment 부분에서 Disk의 file로부터 필요한 data를 곧바로 physical memory에 적재하지 않고 file, offset, readbyte와 같은 data loading에 필요한 정보들만 page에 저장한뒤, SPT table에 page를 insert한다. (만일 running time에 mmap 과 같은 시스템콜이 실행되어도 동일하게 spt table에만 추가를 해둔다. 물론 page에 필수적인 정보는 담아서 추가한다. file_backed page라는점, file, offset 등)
실제 물리적 접근이 이루어지면 프로세서는 virtual address에 필요한 data가 없음을 확인하고 page fault가 발생하게된다. (이때 해당 vaddr은 pml4에 install되어 있지도 않음)
Page fault handler로 제어가 넘어가고 vm_try_handler 가 실행되며 이어지는 흐름에서 vaddr에 대하여 검증하고, 문제가 없다면 physical frame을 할당받고, disk로부터 적합한 data를 load하여 메모리에 적재한다.
mmap은 가상메모리 영역에 페이지를 할당받아 새로운 영역을 맵핑하는 시스템콜이다. 파일식별자 fd로 명시된 연속적인 객체를 맵핑한다. file의 offset
기준으로 length byte
만큼 맵핑한다. 이때 할당받는 페이지들은 File-Backed PAGE
이다.
디스크에 위치한 file에 접근하는 syscall로 open
, write
, read
가 있다. 이 syscall들은 매번 호출 시에 Disk에 위치한 파일에 접근하게된다.
mmap은 이러한 disk 접근방식대신 메모리 참조방식이 가능하게 해준다. file을 아래 이미지 처럼 memory의 특정 영역에 mapping 해준다. mapping된 page는 anonymous가 아니므로 수정됬을 때, write back 될 수 있다.
빈번한 파일접근이 필요한경우 속도측면에서 mmap이 유리할 것이라고 추론할 수 있다.
mmap으로 맵핑된 영역 역시 demand paging 이라는 점 기억해야한다.
OS에서는 mmap 관련 시스콜들에 대하여 copy on write를 지원하기 때문에 프로세스간에 동일한 영역을 share한다. (Pintos에서는 copy on write도 별도로 구현해야한다.)
작성 예정
Project3를 시작하게 되면, Project1과 Project2 여기저기에서 터진다는 말을 들었다. 알고 있어서 당황하지 않을 줄 알았는데 또 막상 상황을 마주하니 당황스럽게 되었다.
Pjt1, pjt2를 하다보면서 익숙해졌다랄까 점점 퍼즐이 맞춰지는 것 같아 기분이 좋았다. 추상적으로 머리에 희미하게 그려지던 부분들이 점점 구체화가 되어가는 느낌. 그러다가 나만의 무기 준비 주제 등 여러가지 준비 하면서 집중력이 흐려져 project3에 온전히 집중을 못해서 아쉽다. 그래서 pjt4 기간에 하루 이틀 정도를 pjt3에 투자해야할 것 같다...