해당 포스팅은 PintOS 3주차에 배운 PintOS에 관련된 핵심적인 내용, OS의 동작 원리를 다룰 예정입니다.(수정할 점이나 궁금한점이 있으시면 댓글로 남겨주세요🙂)
Bogus Page Fault : 유효한 Page를 접근했을 때 발생하는 Page Fault
Bogus Page Fault 의 종류
Process가 Page에 Access H/W(MMU)가 Page Table의 Addr을 체크하고 Page Table로 이동해 해당 페이지의 Page Table Entry(PTE)에 접근한 후 Present Bit를 체크한다.
Present Bit : 해당 페이지가 물리메모리에 존재하는지를 확인하는 비트
Present Bit가 유효하면(1), 다음 명령을 실행하고. 무효하면(0) Page Fault Trap이 일어난다.(이 때 제어권: H/W에서 OS로 넘어간다.)
OS가 해당 Page의 접근이 가능한지 체크한다. (Protection bit확인)
만약 비어있는 물리 프레임이 없다면 기존 메모리에 올라와 있는 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의 파일에 업데이트를 해주어야 한다.)
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를 읽어오거나 쓸 수 있게 된다.
Disk에서 Swap in/out 하는 일련의 과정들은 꽤나 시간이 많이 소요되는 작업이므로 이를 발생시킨 Process는 CPU 주도권을 뺐기고 Block된다. 이 때의 PC값과 레지스터 값을 자신의 커널 공간의 PCB에 저장해두어서 다음에 다시 자신이 CPU를 사용할 차례가 되었을 때 자신의 상태를 원복할 수 있다.
Disk in/output이 끝나 Interrupt가 발생하면 Block되었던 프로세스는 다시 Ready Queue로 되돌아가고 해당 페이지의 유효 비트값은 무효(0)에서 유효(1)로 바뀌게 된다.
Process를 구성하는 모든 Page를 메모리에 할당하는 것이 아닌 당장 필요한 Page만 메모리에 할당하는 방식이다.(나머지는 Disk에 Swap되어 있음)
처음 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에 메모리 페이지를 할당했을 경우 아직 물리 메모리와 할당되지 않았지만 Mapping된 메모리로 취급한다. 즉 한꺼번에 물리 메모리를file 하나를 통째로 올리는 것이기 때문에 메모리 낭비가 발생함
Stack Growth에 의한 Page fault가 발생 시
(stack 내 메모리 주소에 접근했지만, 할당한 메모리의 주소가 아닌 stack에 접근한 경우)
-> stack의 맨 밑(stack_bottom)보다 한 page아래에 페이지를 할당함.
Page fault 발생 시 물리 프레임이 할당되고, 물리 프레임에 파일의 데이터가 복사된다.
-> 이 때 disk I/O를 통해 데이터를 복사하는 것이 아닌 DMA(Direct Memory Access)방식으로 디스크에서 파일을 바로 읽어와서 복사하는 방식을 말한다.
Mmap System Call 의해 mapping된 가상메모리는 Stack과 Heap사이의 미할당공간에 Mapping된다.
파일을 Page단위로 끊어서 각각의 Page에 파일의 정보를 기록한다. 후에 CPU가 lazy_loading을 통해 해당 Page에 접근하게 되면 파일의 Data가 실제 물리 메모리에 할당하게 된다.
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 한다.)
프로세스 간 파일 공유(IPC)에도 쓰인다(IPC의 여러 방식 중 하나)
-> 열린 파일을 메모리에 mapping 시켜 공유하는 개념
물리적 메모리 사용을 최대화하기 위한 메모리 회수 방법
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를 마무리하고자 한다.
갱준이 컨디션이 안좋았었구만.. 잘읽었습니당