21.vm-beyondphys
# 시작하며
지금까지의 전제는 주소공간(가상공간)의 크기가 비현실적으로 작아서 모두 물리메모리에 탑재가 가능한 상황이었다. 그러나 실제로는 다수의 프로세스들이 메모리를 사용하고 있다. 그리고 큰 주소공간(가상공간)을 지원하기 위해서는 현재는 사용되지 않는 것들에 대해서는 디스크에 보관해줘야 이 문제를 해결 할 수 있다. 그러나 하드디스크는 매우 느리다. 하드디스크에서 메모리공간으로 올리는거 자체가 많은 자원을 소모하기 때문에 신중해야 한다.
스왑공간(swap space)를 추가하여 큰 가상 메모리가 있는 것처럼 환상을 심어줄 수있다.
# 스왑 공간 ( swap space)
가장 먼저 디스크에 페이지들을 저장할 수 있는 일정 공간을 확보해야한다. 이러한 공간을 스왑 공간( swap sapce)라고 한다. 이 공간은 안쓰는 메모리의 페이지들을 읽어서 스왑공간(디스크)에 저장(swap out)하거나, 사용해야할 페이지가 물리메모리상에 위치하지 않으면 스왑공간에서 페이지를 읽어 물리메모리에 탑재(swap in)시켜야한다.
스왑 공간은 결국 시스템이 사용할 수 있는 메모리 페이지의 최대수를 결정하기 때문에 중요하다. 지금은 문제를 단순화 하기 위해 스왑공간은 매우 크다고 가정한다.
위 예제에서는 물리메모리에는 4개의 페이지를, 스왑공간에는 8개의 페이지를 저장시킬 수 있다. 현재 물리 메모리에는 Proc0과 Proc1 Proc2가 있으며, 올라온 프로세스에서 사용중이지 않은 공간은 스왑공간에 위치해 있다. Proc3은 모두 스왑공간에 위치하기 때문에 현재 실행중인 프로세스가 아니라고 유추해볼 수 있다.
# Present Bit
PTE에서 해당 페이지가 물리 메모리에 존재하지 않는다는 것을 표현하기 위해서는 추가적인 비트(bit)가 필요하다. present bit을 사용하여 현재 해당 페이지가 물리메모리에 존재하고 있는지 판단한다. 만일 그 비트가 0으로 설정 된다면 메모리에는 존재하지 않고 디스크의 스왑공간에 존재한다는 뜻이다. 물리 메모리에 존재하지 않는 페이지에 접근했기 때문에 페이지 폴트(page fault)를 발생시킨다.
# 페이지 폴트( page fault )
페이지 폹츠가 발생하면 페이지 폴트 핸들러가 그 처리 메커니즘을 구현된 대로 처리한다. 거의 대부분의 시스템에서는 소프트웨어적으로 처리한다.
요청된 페이지가 메모리에 없어 스왑해야하는 상황이 발생하면, 운영체제는 메모리로 스왑을 시킨다. 그렇다면 원하는 페이지의 위치를 어떻게 파악할 수 있을까? 대부분의 시스템에서는 해당 페이지의의 스왑 공간상에서의 위치를 페이지 테이블에 저장한다. PFN과 PTE비트들을 페이지 디스크 주소를 나태는 데 사용 할 수 있다. 이렇게 위치를 파악하여 메모리로 탑재한다. 이 과정은 디스크 I/O가 요청 될 것이다.
메모리에 스왑을 완료했다면 PTE의 PFN값을 불러온 페이직 탑재된 물리메모리의 PFN의 값으로 변경한다. 그리고 페이지폴트를 발생시킨 명령어(코드)가 재실행된다. 이번에는 TLB미스가 발생하고 TLB미스 처리과정에서 TLB값이 갱신된다. 이를 피하기 위해 페이지 폴트시 함께 TLB에 정보를 저장 시킬 수도 있다.
이후 TLB미스가나 다시 해당코드를 재실행하고, TLB에서 주소 변환 정보를 찾게 된다. 물리 주소에 드디어 접근할 수 있게 된다.
# 메모리에 빈 공간이 없으면?
두둥탁이다.. 컴퓨터의 세계는 정말 너무나도 많은 가정과 변수가 있다. 근데 당연한거다. 메모리에 빈공간이 없을 수 있다. 그렇다면 페이지를 물리메모리에서 디스크로 스왑 아웃(swap out) 시켜야 할까? 이것은 페이지 교체 정책(page replacement policy)에 따라서 결정 할 수 있다. 어떤 정책이 채택 됐냐에 따라서 out되는 페이지는 달라진다.
# 지금까지의 가정을 생각했을때 프로그램 제어 흐름
만약 페이지 폴트(PAGE_FAULT) 예외처리가 발생하면, 디스크에서 페이지를 스왑해야 한다.
'•Compter Science > Operating System' 카테고리의 다른 글
[OS/OSTEP] 26.threads-intro - 쓰레드 개념 정리와 필요성, atomic, 전역변수 (0) | 2022.05.20 |
---|---|
[OS/OSTEP] 22.vm-beyondphys-policy : 메모리 교체 정책 - LRU,FIFO,OPTIMAL,RANDOM,CLOCK #16 (0) | 2022.04.19 |
[OS/OSTEP] 20.vm-smalltables : 더 작은 테이블, 하이브리드 테이블, 멀티레벨페이지 #14 (0) | 2022.04.19 |
[OS/OSTEP] 19.vm-tlb : 더 빠른 변환을 위한 TLB와 구조#13 (0) | 2022.04.19 |
[OS/OSTEP] 18.vm-paging : 메모리 페이징,PFN과 VPN #12 (1) | 2022.04.18 |