OS - Beyond Physical Memory: Mechanisms
Goal: 물리 메모리보다 많은 가상 메모리를 활용하는 방법 Idea: hierarchy 하게 메모리 구조를 만들어야 지금 사용하지 않는 Page 들은 느리지만 큰 Disk에 저장하게 끔
기존에는 각 프로세스 전체 주소 공간이 물리 주소에 모두 들어간다 가정했지만 실제로 32gb램에서 50gb 이상의 게임이 돌아가는 기이한 현상이 존재한다.
왜 Large Virutal Memory Space 를 지원하는 가
reason:
- 개발 편의성: 애플리케이션 개발자들이 물리 메모리 걱정 없이 가상 주소로만 다 만들면 알아서 동작하게!
- Multiprogramming: 여러 프로세스가 물리 주소 위에 모두 돌릴 수 없기에 Swap 공간을 사용해 해결한다.
결국 현대 시스템은 아래 기능을 지원해야한다.
- physical memory 보다 큰 memory space를 지원한다.
- 큰 process를 Multiprocess 로 동시성 실행을 해줘야한다.
Swap Space
Swap 공간은 disk에 존재하지만 OS가 Memory 처럼 사용한다(Linux의 Swap Memory 생각하면 될 듯)
OS는 Memory 가 차면 Swap 공간으로 Page-in, Page-out 을 하면서 필요한 Page를 가져온다. 이 과정에서 Swap I/O 가 발생한다.
The Present Bit
우리가 Virtual Memory 에서 VPN으로 PTE를 찾는 데 실제로 물리 메모리에 있는 지 어떻게 아는 가!
PTE 에 Present bit 를 만들어서 구분한다.
- 1: 물리 주소 공간에 존재함
- 0: 물리 주소 공간에 없음 -> Page fault 발생함.
Handling Page Faults
Handling Page Faults 는 항상 OS 직접 처리한다. Page가 디스크에 있으면 페이지 테이블에서 찾아서 페이지의 주소 찾는다!
Step:
- PTE에서 disk 주소 찾는다
- disk에서 memory로 가져온다
- swap page-in disk I/O 하는 동안 Process는 block 상태가 된다.
- page tabe 에서 present bit 마크처리
- 실패한 명령어 재실행
- TLB Miss 발생하므로, 새 항목으로 TLB 업데이트
- 결국 명령어 다시 시작하면 TLB Hit함~
Memory 가 가득찼을 때
Memory 에서 page 제거하면 됩니다. 제거하는 알고리즘은 ‘page replacement policy’ 에 따른다.
HW/SW 역할
HW 는 TLB 미스하고 PTE 확인했을 때 present bit 없으면 PageFault 발생 시키면 됨
SW 는 PageFault 핸들링 해서
- Memory Full 여부 확인, 비었을 경우 해당 메모리 가져옴
- Full 경우 교체 알고리즘을 페이지 제거하고 가져옴
- 디스크 읽어서 PTE 업데이트 한다.
- 명령어 재시작
운영체제별 기법
Watermark를 만들고 메모리 여유 공간을 확인해서 0이 되고 page replacement 하는 게 아니라 주기 적으로 임계값에 맞게 메모리를 여유있게 유지 시킨다.