[PintOS]Project 03 WIL(2)

경준·2022년 12월 12일
0

OS

목록 보기
5/5
post-thumbnail

개요

해당 포스팅은 PintOS 3주차에 배운 PintOS에 관련된 핵심적인 내용, OS의 동작 원리를 다룰 예정입니다.(수정할 점이나 궁금한점이 있으시면 댓글로 남겨주세요🙂)



가짜 Page Fault(Bogus Page Fault)

Bogus Page Fault : 유효한 Page를 접근했을 때 발생하는 Page Fault

Bogus Page Fault 의 종류

  • Lazy-Loaded Page
  • Swaped-Out Page
  • Write-Protected Page

Page Fault의 처리 과정

  1. Process가 Page에 Access H/W(MMU)가 Page Table의 Addr을 체크하고 Page Table로 이동해 해당 페이지의 Page Table Entry(PTE)에 접근한 후 Present Bit를 체크한다.

    Present Bit : 해당 페이지가 물리메모리에 존재하는지를 확인하는 비트

  2. Present Bit가 유효하면(1), 다음 명령을 실행하고. 무효하면(0) Page Fault Trap이 일어난다.(이 때 제어권: H/W에서 OS로 넘어간다.)

  3. OS가 해당 Page의 접근이 가능한지 체크한다. (Protection bit확인)

  4. 만약 비어있는 물리 프레임이 없다면 기존 메모리에 올라와 있는 Frame을 Swap out한다.

  • anon page일 때 : disk에 백업 파일이 없으므로, 따로 disk에 swap공간을 만들어 그곳을 저장함
    (이 때 PTE에서 Present Bit를 0으로 만들어 해당 페이지가 물리 메모리에 존재하지 않는다는 것을 나타냄)
  • file-backed page일 때 : disk 상에 백업 파일이 존재하므로 백업 파일에 해당하는 위치에 물리메모리의 정보들을 swap out시킨다.
    (이 때 해당 page의 PTE의 Dirty Bit가 1인 경우(페이지의 데이터를 수정핸 경우) disk의 파일과 물리 메모리의 데이터가 서로 sync가 맞지 않는 경우가 발생할 수 있으므로 변경사항을 disk의 파일에 업데이트를 해주어야 한다.)
  1. 적합한 접근이라면 물리메모리에서 비어있는 frame을 하나 할당받아 그 공간에 해당 page를 disk에서 swap in한다. (해당 page가 disk 어디에 있는지 파악하는 것은 여러 방법이 있다)

5-1. PTE에서 물리 페이지 번호를 나타내는 PFN에 disk의 섹터 위치를 저장

5-2. 따로 SPT를 만들어 저장(pintos)
- SPT의 멤버로 페이지가 저장된 disk의 sector를 저장

Page fault가 일어나면 해당 page의 실제 가상 주소를 process가 조작하면 H/W or S/W가 page table에서 해당 페이지의 PTE를 체크한다.

Page Fault Handler는 해당 Page를 관리하는 Page Struct에서 Page가 Swap되어있는 Disk의 Sector Addr를 찾아낸 다음, 물리메모리의 Frame을 하나 할당한다. 그 후 해당 물리Frame에 disk의 file data를 읽어오고 Page와 Mapping하고 Page의 Present Bit를 1로 만들어준다.
이제 다시 해당 페이지에 Process가 접근하면 해당 Page와 Mapping되어 있는 물리 Frame에서 data를 읽어오거나 쓸 수 있게 된다.


  1. Disk에서 Swap in/out 하는 일련의 과정들은 꽤나 시간이 많이 소요되는 작업이므로 이를 발생시킨 Process는 CPU 주도권을 뺐기고 Block된다. 이 때의 PC값과 레지스터 값을 자신의 커널 공간의 PCB에 저장해두어서 다음에 다시 자신이 CPU를 사용할 차례가 되었을 때 자신의 상태를 원복할 수 있다.

  2. Disk in/output이 끝나 Interrupt가 발생하면 Block되었던 프로세스는 다시 Ready Queue로 되돌아가고 해당 페이지의 유효 비트값은 무효(0)에서 유효(1)로 바뀌게 된다.



Demanding Paging(Lazy Loading)

Process를 구성하는 모든 Page를 메모리에 할당하는 것이 아닌 당장 필요한 Page만 메모리에 할당하는 방식이다.(나머지는 Disk에 Swap되어 있음)

장점

  • 당장 필요한 page만 올라와 있으므로 Memory 사용량이 감소하고, Overhead가 줄어듬
  • Process의 일부 Page만을 Memory에 적재해도 되므로, 실제 Memory 용량보다 큰 Memory를 가진 프로그램도 실행가능하고, 시스템이 더 많은 Process를 사용할 수 있게 해줌

단점

  • 처음 Process가 page를 요구할 때 디스크에서 Swap-in해야하므로 다른 방식볻 늦어질 수 있다.

  • Thrashing이 일어날 가능성이 있다.

    Thrashing(쓰레싱) : 멀티 프로그래밍 중 CPU이용률이 급격하게 낮아지는 현상

    OS는 CPU 이용률이 낮아지면 Memory에 상주해 있는 Process의 수가 적어 실행하지 않아 노는 시간이 많다고 판단함. 이 때 MPD(Multi Programming Degree), 즉 Process의 수를 증가시켜 CPU의 이용률을 높일려고 한다. 그러나 MPD가 과도하게 증가하게 되면 각 Process 별로 Memory에 상주하는 Page의 양이 줄어들게 된다. 그러다보면 잦은 page fault가 일어나게 되고, Disk I/O작업으로 인해 다른 프로세스에게 cpu가 양도되는 현상이 반복된다. 이로 인해 Disk I/O만 반복하게 되어 CPU사용률이 낮아지게 된다.



Stack Growth

고정된 크기의 Stack에 메모리 페이지를 할당했을 경우 아직 물리 메모리와 할당되지 않았지만 Mapping된 메모리로 취급한다. 즉 한꺼번에 물리 메모리를file 하나를 통째로 올리는 것이기 때문에 메모리 낭비가 발생함

Stack Growth에 의한 Page fault가 발생 시
(stack 내 메모리 주소에 접근했지만, 할당한 메모리의 주소가 아닌 stack에 접근한 경우)
-> stack의 맨 밑(stack_bottom)보다 한 page아래에 페이지를 할당함.



Memory Mapping

Page fault 발생 시 물리 프레임이 할당되고, 물리 프레임에 파일의 데이터가 복사된다.
-> 이 때 disk I/O를 통해 데이터를 복사하는 것이 아닌 DMA(Direct Memory Access)방식으로 디스크에서 파일을 바로 읽어와서 복사하는 방식을 말한다.

  • Mmap : disk에 있는 파일에 대한 유저 가상 페이지를 미리 가상 주소 공간에 할당하는 것
  • Munmap : 페이지와 물리메모리의 연결을 끊어주는 것

Mmap System Call 의해 mapping된 가상메모리는 Stack과 Heap사이의 미할당공간에 Mapping된다.



파일 종류에 따른 Memory Mapping

  • Regular FIle 대상 매핑(DISK에 파일의 실체가 있고, 해당 파일을 가상메모리에 Mapping한 Page)

파일을 Page단위로 끊어서 각각의 Page에 파일의 정보를 기록한다. 후에 CPU가 lazy_loading을 통해 해당 Page에 접근하게 되면 파일의 Data가 실제 물리 메모리에 할당하게 된다.

  • Anonymous File 대상 Mapping(Kernel에 의해 running time혹은 file load초기에 할당받은 page)

Anonymous file은 모든 데이터가 0으로 초기화된 파일로, 일반적인 파일과 다르게 Anonymous file은 RAM위에 존재하며, memfd_create 등의 함수를 통해 생성하고, 해당 파일을 가리키는 참조가 모두 없어지면 자동으로 삭제된다.
만약 Process가 anonymous file을 mapping하려 하면, 물리메모리에서 적당한 Frame을 찾아 Swap out시키고 해당 Frame을 모두 0으로 초기화 한 다음 frame<->page를 mapping한다.

-> 실행파일 executable file은 anonymous file에 해당함
(ELF file을 load할 때 해당 파일에 대한 모든 page를 anonymous page로 load 한다.)


Memory Mapping의 용도

프로세스 간 파일 공유(IPC)에도 쓰인다(IPC의 여러 방식 중 하나)
-> 열린 파일을 메모리에 mapping 시켜 공유하는 개념


Memory mapping의 장점

  1. fwrite나 fread보다 파일에 빨리 Acess가능하다.
  • buffer에 복사해서 data를 가져오는 것이 아닌 바로 file에서 가져와서 메모리 상에 read, write할 수 있으므로 data buffer를 이용하는 비용이 줄어든다.
    (DMA 방식으로 disk에서 file data를 복사해오기 때문)
  1. Swap 작업에서 write와 read보다 효과적이다.
  • malloc의 경우 일부를 Swap out해야할 경우 Swap할 buffer의 내용을 무조건 disk의 Swap영역에 옮겨놓아야 해당 Page를 재사용할 수 있으나, mmap의 경우 os가 mmap원본 파일에서 변경사항이 없을 경우 변경사항을 업데이트 하지 않으면 되기에, 이 페이지를 즉시 다른 용도로 재사용 가능하다.
  1. 파일 전체를 모두 메모리에 할당할 필요가 없다.
  • File 전체를 모두 메모리에 올릴 필요가 없고 필요한 부분만 올릴 수 있으므로 물리 메모리를 훨씬 절약가능하다.

Memory mapping의 단점

  1. 대용량 파일을 가상 메모리 공간에 Mapping할 때 외부단편화가 발생할 수있다.
  • mmap은 가상 주소 공간의 연속된 Page들에 file을 연속적으로 올리는 system call이다.
    따라서 전체 파일을 끊임없이 연속적으로 할당할 수 있는 가상 주소 공간이 있어야하는데, 외부 단편화가 있는 가상 주소 공간이 있을 때 파일을 작은 크기로 잘라서 Mapping해야 하여 어려움이 발생할 수 있다.
  1. 작은 크기의 파일을 읽어올 경우 좋지 않다.
  • Page fault가 발생하여 memory를 읽어오므로, page fault에 사용되는 cost를 낭비하지 않을만큼의 충분한 크기의 file을 읽어올 때 사용하는 것이 좋다.
  1. file을 offset부터 data를 읽어올 때, offset이 page align이 되어있어야 한다.



SWAP IN/OUT

물리적 메모리 사용을 최대화하기 위한 메모리 회수 방법

  • Swap Slot : 디스크 공간 안의 Swap Disk에 있는 page 크기의 공간. Swap Disk로 Swap Out된 Sage하나 당 Swap Slot이 Page Align되어 할당됨

  • Swap table : 사용 중인 혹은 사용할 수 있는 Swap slot을 관리하는 Table
    물리 메모리에서 Swap공간으로 Swap Out되는 Page를 관리할 수 있도록 free한 후 Swap Slot을 따로 관리해주어야 하며, Swap Table 안에 있던 Page가 다시 Process에 의해 물리메모리로 할당되면 해당 Page의 Swap Slot을 free해줘야 함



한 주 회고

이번주차는 심리적으로는 촉박했고 신체적으로는 아파서 집중을 많이 하지 못한 한주였던 것 같다.
2주 중 1주를 개념 이해에 많은 시간을 할애해서 그런지 남은 한주를 코드가 어떻게 돌아가고, 왜 필요한지에 대한 생각이 많이 부족했고 이러한 미흡한 점들이 모여서 코드가 제대로 작동하는 원인을 찾지 못하는 결과에 부딪히게 되었었다. VM 관련 공부들은 정글 수료 후에 다시 복기하는 걸 잊지말자 꼭🔪

나만의 무기가 다가오고 혼자만의 걱정이 늘어났다. 나는 어떤 포지션(BE, FE)를 선택하고 어떠한 팀원들과 어떠한 프로젝트를 하게될것이며 수료 후에는 취직이 될것인지 공부를 더할것인지 등등...
항상 고생하는 사람에겐 복이 온다고 했다. 아직 일어나지도 않은 일들에 걱정하지 말고 지금에 잘하자는 말을 가슴에 새기며 PintOS Project3를 마무리하고자 한다.

profile
코린이 좌충우돌 메모장

2개의 댓글

comment-user-thumbnail
2022년 12월 14일

갱준이 컨디션이 안좋았었구만.. 잘읽었습니당

1개의 답글