[PintOS - Week11-12] WIL

Junyeong Fred Kim·2022년 1월 25일
0

운영체제

목록 보기
23/27

사실 Virtual Memory에 대해 아직 배워야할 것들이 너무 많고, 아직 이해하지 못한 부분들이 있기 때문에 세세한 내용은 적을 수 없어 자세한 개념이나 설명은 적을 수 없을 것 같고 키워드 위주로 정리하려고 한다.

Project3 학습내용 "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

Virtual memory ( PML4 / TLB )

PML4 = PAGE MAP LEVEL 4 ( CSAPP 9.6 )

  • 64 bit 기반의 X86/64, linux, Pintos에서 사용되는 Multi level page table.
  • Vitual address ( = logical address)를 physical address 주소변환에 페이지 테이블이 이용된다. 가상 메모리는 프로세스가 메모리의 모든 공간을 독점적으로 사용하는 듯한 환상을 심어준다. 단순한 구조의 페이지 테이블을 사용하면 모든 공간에 대한 주소 맵핑이 되어야하고 따라서 페이지 테이블의 사이즈가 너무 크게 된다는 문제 점있다. 문제 해결을 위해서 포인터를 활용한 트리구조의 페이지 테이블이 채택되었다. 이것이 다중레벨 페이지 테이블이다.
    이런 구조를 사용하면 힙과 스택 사이 공간처럼 미할당 영역에 대한 주소공간은 매핑을 유예할 수 있기 때문에 메모리 관리에 유리하다.

Demand Paging

Demand paging 구현을 위해 추가되는 자료구조

  1. Page 구조체 ( Virtual memory의 virtual address 및 page information )
  2. Frame 구조체 ( Page에 대응되는 physical memory의 정보)
  3. Supplementary page table ( Page들을 넣는 자료구조, hash table로 구현된다. Struct thread의 member)

구현 및 실행 Flow

  1. 초기 프로그램 실행시 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 등)

  2. 실제 물리적 접근이 이루어지면 프로세서는 virtual address에 필요한 data가 없음을 확인하고 page fault가 발생하게된다. (이때 해당 vaddr은 pml4에 install되어 있지도 않음)

  3. Page fault handler로 제어가 넘어가고 vm_try_handler 가 실행되며 이어지는 흐름에서 vaddr에 대하여 검증하고, 문제가 없다면 physical frame을 할당받고, disk로부터 적합한 data를 load하여 메모리에 적재한다.

mmap / munmap

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도 별도로 구현해야한다.)

Swap in / out

작성 예정

Project3를 시작하게 되면, Project1과 Project2 여기저기에서 터진다는 말을 들었다. 알고 있어서 당황하지 않을 줄 알았는데 또 막상 상황을 마주하니 당황스럽게 되었다.

Pjt1, pjt2를 하다보면서 익숙해졌다랄까 점점 퍼즐이 맞춰지는 것 같아 기분이 좋았다. 추상적으로 머리에 희미하게 그려지던 부분들이 점점 구체화가 되어가는 느낌. 그러다가 나만의 무기 준비 주제 등 여러가지 준비 하면서 집중력이 흐려져 project3에 온전히 집중을 못해서 아쉽다. 그래서 pjt4 기간에 하루 이틀 정도를 pjt3에 투자해야할 것 같다...

profile
기억보다 기록

0개의 댓글