본문 바로가기
CS/컴퓨터 구조

[Chapter 5.5 컴퓨터 구조 및 설계] 가상 메모리와 페이지 부재

by 베어 그릴스 2022. 7. 30.

컴퓨터의 3대 구성 요소

지금까지는 캐시와 메인 메모리 사이의 메모리 계층 구조를 살펴보았다면,

 

메모리 계층 구조

이번에는 메인 메모리와 Disk 간의 메모리 계층 구조를 살펴보려 한다.

 

 

가상 메모리


메인 메모리를 2차 저장 장치를 위한 캐시로 사용하는 기술을 가상 메모리 (Virtual Memory) 라고 한다.

 

쉽게 생각하면 앞장에서 메모리 접근을 최대한 줄이고 캐시를 사용하려고 했던 것처럼 2차 저장 장치에 대한 접근을 최대한 줄이기 위해 메인 메모리를 사용한다고 생각하면 된다.

 

이러한 가상 메모리 기술을 사용하는 이유는 다음과 같다.

  1.  다수의 프로그램이 효과적으로 메모리를 공유할 수 있게 한다.
  2. 메인 메모리의 크기는 작기 때문에 해당 사이즈에 맞춰 프로그래밍해야 하는 제약을 제거하기 위해서이다.

 

2차 저장 장치의 크기가 메인 메모리보다 훨씬 큰데 어떻게 가상 메모리 기술이 가능해진 것일까?

 

캐시와 마찬가지로 같은 지역 혹은 한번 접근한 데이터를 다시 사용할 가능성이 크다는 '지역성의 원칙' 때문에 가상 메모리 기술이 가능해졌다.

 

즉, 프로그램의 모든 부분을 메인 메모리에 담고 있는 것이 아니라 계속 사용될 확률이 큰 작은 일부분만 메인 메모리에 담아 많은 프로그램을 동시에 사용할 수 있게 된 것이다.

 

 

원리를 설명해보면,

 

각 프로그램은 자신이 메인 메모리의 어떤 주소에 맵핑될지 전혀 모르고 있고, 이 맵핑되는 주소는 다른 프로그램들이 실행되는 동안 자신들이 필요한 만큼 메인 메모리를 사용하기 때문에 동적으로 계속 변한다.

 

프로그램이 실행되는 동안 프로그램의 가상의 주소(virtual address)가 결정되고 이 가상의 주소가 메인 메모리의 실제 주소(physical address)에 mapping 되어 프로그램의 일부분만이 메인 메모리에 올라갈 수 있게 된다.

 

두 프로그램이 메모리를 공유한다고 했을 때, 우선 각 프로그램을 각각 page로 나누고(이때 page의 크기는 고정되어있거나 동적인 크기를 가질 수 있다.), 필요한 부분만 메인 메모리에 적재되어 쓰이게 된다.

 

 

 

이때 위에서 설명했듯이 메인 메모리의 정해진 위치에 가는 것이 아니기 때문에, program의 virtual address가 메모리에 적재될 physical address로 변환될 필요가 있다.

 

 

Page Fault


데이터를 메인 메모리에서 접근하길 원할 때, 프로그램 전체를 메모리에 적재하는 것이 아니기 때문에 원하는 데이터가 메모리에 없을 수도 있다. 이러한 경우를 바로 페이지 부재(Page Fault)라고 한다.

 

이 부재의 경우엔 2차 저장 장치에서 데이터를 가져와서 사용해야 하기 때문에 miss penalty가 매우 크다.

 

큰 miss panalty 때문에 가상 메모리 설계 시 몇 가지 중요한 결정이 내려졌다.

  • 페이지는 접근 시간을 보상할 만큼 충분히 커야 한다. (보통 4 KiB 내지 16 KiB 정도가 일반적)
  • page fault를 줄이는 구현이 바람직하다.
  • page fault는 하드웨어 대신에 소프트웨어로 다루어질 수도 있다. (효율적인 알고리즘을 사용할 수도 있고 하드웨어에 비해 부담이 적다)
  • 가상 메모리에서 즉시 쓰기 방식(write-through)은 효율적이지 못하다. (바로 2차 저장 장치까지 업데이트) 대신 나중 쓰기 방식을 이용한다.

 

Page Tables


 

 

가상 메모리 시스템에서 가상 주소를 실제 주소로 변환해 주는 테이블을 페이지 테이블이라고 한다.

 

메모리에 위치한 테이블은 가상 페이지 번호로 인덱스 된다.

테이블의 위치는 CPU의 Page table register가 Page table의 실제 주소를 갖고 있다.

 

테이블의 각 항목(엔트리)은 해당 페이지가 실제 메모리 내부에 존재할 때 가상 페이지에 해당하는 실제 페이지 번호를 갖고 있다.

 

각 프로그램은 각자 자신의 페이지 테이블을 갖고 있으며, 페이지 테이블은 그 프로그램의 가상 주소 공간을 메인 메모리로 사상한다.

 

각 엔트리의 유효 비트(valid)가 0이면 헤딩 페이지가 메인 메모리에 존재하지 않고, 따라서 페이지 부재가 발생하게 되고, 이 페이지가 1이면 그 페이지는 메모리 내부에 있으며, 해당 엔트리는 실제 페이지 번호를 갖고 있다.

주소 변환 메커니즘

 

 

페이지 부재 시 대체 전략


페이지 부재 비율을 줄이기 위해 메모리의 페이지 대체 전략으로 least-recently used (LRU) 전략을 사용한다.

 

즉, 가장 최근에 쓰이지 않은 페이지를 메모리 상에서 빼오고 새로 필요한 데이터를 가지고 있는 페이지를 메모리에 적재하는 것이다.

 

그렇다면  가장 안쓰인 페이지를 어떻게 알 수 있을까? 이를 위해 Page table의 각 entry에 참조 bit 혹은 byte(Reference bit)를 두어 해당 페이지가 최근에 몇 번 이용되었는지 알 수 있다. 해당 비트는 주기적으로 OS에 의해 0으로 초기화된다.

 

쓰기 접근 시에 페이지 부재라면 어떻게 될까?

 

Disk에 쓰는 것은 엄청나게 많은 cycle이 걸린다.

즉, 메인 메모리에 쓰는 것과 디스크에 쓰는 것을 함께 한다면 성능이 매우 떨어지게 되므로 위에서 언급했듯 나중 쓰기 전략을 사용한다.

 

Page table의 각 entry에 Dirty bit를 사용하여 해당 페이지가 쓰였음을 표시하고, 나중에 페이지가 대체될 때 해당 비트를 통해 디스크에 쓰인다.