[메모리 가상화 #6] 페이지 스왑, 페이지 폴트 본문
개요
- 지금까지 가상 주소 공간이 비현실적으로 작아서 모두 물리 메모리에 탑재가 가능한 것으로 가정하였다. 사실 실행 중인 프로세스의 전체 주소 공간이 메모리에 탑재된 것으로 가정하고 있었다. 이 가정을 이제 완화한다. 다수 프로세스들이 동시에 각자 큰 주소 공간을 사용하고 있는 상황을 가정한다.
- 메모리 계층에 레이어의 추가가 필요하다. 지금까지는 모든 페이지들이 물리 메모리에 존재하는 것을 가정하였다. 하지만 큰 주소 공간을 지원하기 위해서 하드 디스크 드라이브를 사용한다. 이제 메모리 계층에서 크고 느린 하드 디스크 드라이브가 가장 하부에 위치하고 그 위에 메모리가 있다.
핵심 질문
운영체제는 어떻게 크고 느린 장치를 사용하면서 마치 커다란 가상 주소 공간이 있는 것 처럼 할 수 있을까?
왜 프로세스에게 굳이 큰 주소 공간을 제공해야하는가 ?
→ 편리함과 사용 용이성 제공
→ 프로그램의 자료구조들을 위한 충분한 메모리 공간이 있는지 걱정하지 않아도 됌
스왑 공간
디스크에 페이지들을 저장할 수 있는 일정 공간을 확보해야한다. 이를 위한 공간을 스왑 공간이라고한다.
운영체제는 스왑 공간에 있는 모든 페이지들의 디스크 주소를 기억해야한다.
스왑 공간의 크기는 중요하다. 시스템이 사용할 수 있는 메모리 페이지의 최대수를 결정하기 때문이다.

- 물리 메모리와 스왑 공간에는 각각 4개의 페이지와 8개의 페이지를 위한 공간이 존재한다. 이 예에서는 Proc0, Proc1, Proc2가 물리 메모리를 공유하고 있다.
- 세 프로세스는 몇 개의 유효한 페이지들만 메모리에 올려 놓았으며 나머지 페이지들은 디스크에 스왑 아웃되어 있다.
- 네 번째 프로세스(Proc 3) 의 모든 페이지들은 디스크로 스왑 아웃되어 있기 때문에 현재 실행중이 아니다.
- 스왑 영역에 하나의 블럭이 비어있다.
- 이 예제를 통해 스왑공간을 이용하면 실제 물리적을오 존재하는 메모리 공간보다 더 많은 공간이 존재하는 것 처럼 가장할 수 있다는 것을 알 수있다.
- 스왑 공간에만 스왑을 할 수 있는 것은 아니다. 코드영역의 페이지들이 차지하는 물리 페이지는 즉시 다른 페이지가 사용할 수 있다. → 해당 페이지들은 디스크에 원본이 있으므로 언제든지 다시 스왑인이 가능해진다.
Present Bit
페이지가 디스크로 스왑되는 것을 가능케 하려면 많은 기법이 추가되어야함.
- 하드웨어가 PTE에서 해당 페이지가 물리 메모리에 존재하지 않는다는 것을 표현 해야 한다.
- Present bit를 사용하여 1로 설정되어있으면 물리 페이지에 존재한다는 뜻, 0이면 디스크에 존재한다는 뜻
- 물리 메모리에 존재하지 않는 페이지를 접근하는 행위를 페이지 폴트라 한다.
- 페이지 폴트가 발생하면 페이지 폴트를 처리하기 위해 운영체제로 제어권이 넘어가며 페이지 폴트 헨들러가 실행된다.
페이지 폴트
거의 대부분의 시스템들에서 페이지 폴트는 소프트웨어적으로 처리된다.
- 요청된 페이지가 메모리에 없고, 디스크로 스왑되었다면, 운영체제는 해당 페이지를 메모리로 스왑해 온다.
- 원하는 페이지의 위치를 페이지 테이블에 저장해놓고, 페이지 폴트 발생 시, 운영체제는 페이지 테이블 항목에서 해당 페이지의 디스크 상 위치를 파악하여, 메모리로 탑재한다
- 재실행 시 TLB 미스가 발생되면 또 TLB 값 갱신 시키고 다시 재실행.
- I/O 전송 중에는 해당 프로세스가 blocked 상태 인것을 유의해야함.
- 페이지 폴트 처리시 운영체제는 다른 프로세스들을 실행할 수 있다.
메모리에 빈 공간이 없으면 ?
스왑 공간으로 부터 페이지를 가져오는 page-in 은 여유 메모리가 충분하다는 가정했었다. 이렇지 않은 경우는 어떨까 ? 탑재하고자 하는 새로운 페이지들을 위한 공간을 확보하기 위해 page-out 하려고 할 수 있다. 교체 페이지를 선택하는 것을 페이지 아웃 교채 정책이라고 한다.
페이지 교체 정책인 경우 프로그램이 메모리 속도로 실행되는 게 아니라 디스크와 비슷한 속도로 동작할 수 있으므로 정책을 면밀히 검토해야한다.
페이지 교체는 언제 일어나는가 ?
- 메모리에 항상 어느 정도의 여유 공간을 비워두기 위해서 대부분 운영체제들은 최대값 과 최소값을 설정하여 교체 알고리즘 작동에 활용한다.
- 백그라운드 쓰레드**(스왑 데몬, 페이지 데몬)**가 여유공간의 크기가 최솟값보다 작아지면, 여유 공간을 최대값에 이를 때 까지 확보하도록 한다.
- 충분한 여유 메모리가 확보되면 이 쓰레드는 슬립 모드로 들어간다.
내보낼 페이지는 어떻게 결정하는가?
메인 메모리는 시스템의 가상 메모리 페이지를 가져다 놓기 위한 캐시로 생각될 수 있다. 캐시 미스의 횟수를 최소하 하기 위한 방법은 뭘까
- FIFO
- 초기 간단한 교체 정책
- 선입 선출로 먼저 들어온 것이 먼저 나간다.
- 무작위 선택
- 구현하기 쉽지만 제대로 선택할지는 운에 따라 전적으로 의존한다.
- LRU
- 가장 오래전에 사용했던 페이지를 교체한다.
- LFU
- 가장 적은 빈도로 사용된 페이지를 교체한다.
- 시계 알고리즘
- LRU가 좋은 성능을 보이긴하나 이를 완벽하게 구현하기 위해서는 많은 작업을 해야함. 이 작업을 하드웨어의 지원을 받아 효율적으로 하는 방법
- LRU의 근사하는 식으로 구현함
- use bit(페이지가 참조되면 1로 설정됨) 을 이용하여 시계 바늘이 특정 페이지를 가리킨다고 하고, 페이지를 교체했을 때 현재 늘이 가리키고 있는 페이지 가 use bit가 1인지 검사한 후, 1이면 최근에 사용했으므로 넘어가고 use bit가 0인 페이지를 찾아서 교체하는 방법
갱신된 페이지 (Dirty Page)의 고려
시계 알고리즘에 대한 추가 개선 사항을 위해 Corbato가 처음 제안함.
교체 대상을 선택할 때 메모리에 탑재된 이후에 변경되었는지를 추적하는 것
변경이 된 상태(dirty) 라면 해당 페이지를 내보내기 위해서는 디스크에도 변경 내용을 기록해야하기 때문에 비싼 비용을 지불해야함.
반대로 변경되지않은 상태(clean)은 내보낼 때 비용이 없음
VM은 dirty page 대신 clean page를 내보내는 것을 선호함.
이 동작을 위해 하드웨어는 modified bit를 추가하여 페이지가 변경될 때 마다 이 비트를 가지고, 시계 알고리즘 에 추가하여 교체 대상을 선택함.
출처 : 운영체제: 아주 쉬운 세 가지 이야기
'Fundamentals > OS' 카테고리의 다른 글
| [병행성 #2] 락(Lock) (5) | 2025.07.05 |
|---|---|
| [병행성 #1] 개요, 쓰레드 vs 프로세스 (0) | 2025.07.04 |
| [메모리 가상화 #5] 페이징: TLB (1) | 2025.07.01 |
| [메모리 가상화 #4] 페이징 (1) | 2025.06.30 |
| [메모리 가상화 #3] 빈 공간 관리 (1) | 2025.06.28 |