[OS] 메모리 관리(3) - 가상 메모리

Dragony·2020년 3월 7일
0

운영체제

목록 보기
3/8

Base and limit register의 문제점

  • 주소공간이라는 추상화를 제공할 수 있지만, Bloatware 문제 발생
  • 메모리의 크기가 증가하는 것 보다 더 빠르게 소프트웨어의 크기 증가
  • 프로그램들이 사용가능한 메모리 안에 fit 되기에 너무 크다
  • Solution
    • 오버레이(Overlay) : 프로그래머가 프로그램을 작은 조각들로 나누어 실행
    • 가상 메모리(Virtaul memory)
      • 각 프로그램이 자신의 고유한 주소공간을 가지며 주소 공간은 페이지(page)라고 불리는 조각들로 구성. 각 페이지는 연속된 주소를 가짐.
        • 주소공간의 몇 부분 만이 물리 메모리에 존재.
        • 물리 메모리 상에 존재하지 않는 주소 공간을 접근하려고 하면, 운영체제가 그 부분을 디스크에서 읽어 메모리로 적재

본질적으로 가상 메모리는 base and limit 레지스터 사용을 일반화한 것으로 볼 수 있다.

1. 페이징(paging)

  • 가상 주소(virtual address) : 프로그램이 참조하는 주소
  • MMU (memory management unit)

가상 메모리를 사용하지 않는 컴퓨터에서는 가상 주소가 그대로 메모리 버스에 실리며, 결국 이 주소가 물리 주소(physical address)가 된다. 따라서 이 주소에 존재하는 데이터를 접근할 수 있다.
반면, 가상 메모리를 사용하는 시스템에서는 가상 주소가 그대로 메모리 버스에 실리지 않는다. 대신 가상주소는 MMU에 의해 물리 주소로 매핑된다.

가상 주소 공간과 물리 메모리(메인 메모리)는 고정된 크기의 unit들로 나뉘어진다.

1-1) 페이지와 페이지 프레임

  • 페이지(page) : 가상 주소 공간을 구분하는 고정된 크기 단위
  • 페이지 프레임(page frame) : 물리 메모리 상에 대응되는 단위
  • 페이지와 페이지 프레임의 크기는 같다
  • RAM과 디스크 간에 데이터 이동 역시 페이지 단위로 이루어진다.

다음 그림에서 페이지와 페이지 프레임은 4KB이고, (실제 시스템에서는 512B에서 64KB 까지 다양한 크기의 페이지를 사용한다) 64KB의 가상 메모리는 16개의 페이지로 구분되며, 32KB의 물리 메모리는 8개의 페이지 프레임으로 구분된다.

가상 주소 또는 물리 주소에서 0K-4K로 표현된 주소는 실제로 0-4095 주소를 의미한다. 마찬가지로 4K-8K는 4096-8191을 의미한다. 각 페이지는 4096 크기의 주소를 포함한다.

프로그램이 다음 명령을 실행한다고 가정하자.
MOV REG,0
D이 명령은 0번 가상주소를 접근하며, 이 주소는 MMU로 전달된다. MMU는 이 주소가 페이지 0에 속한 것을 계산하고, 이 페이지에 매핑된 물리 주소 상의 페이지 프레임이 2번임을 발견한다. 결국 가상 주소 0은 물리주소 8192로 변환되고, 이 물리 주소가 메모리 버스에 실리게 된다.
결국 MMU는 0~4095 가상주 주소의 접근을 8192~12297 물리 주소로 매핑하는 일을 실행하는 것이다.

MMU가 16개의 가상 페이지를 8개의 페이지 프레임에 매핑하는 것 자체 만으로는 가상 주소 공간이 물리 주소보다 큰 문제를 해결하지 못한다.
이를 해결하기 위해서는 다른 기능들이 추가되어야 한다.

위 그림은 페이지 프레임이 8개 밖에 없기 때문이, 16개의 가상 페이지 중에서 오직 8개만 물리 메모리로 매핑될 수 있다. 그림에서 X표로 표시된 페이지들이 매핑되지 못한 페이지들이다.
이를 위해 하드웨어 적으로 present/absent 비트가 제공되며, 이를 통해 어떤 페이지가 실제 물리 메모리에 존재하는지 파악할 수 있다.

프로그램이 매핑되지 않는 주소를 참조하면 어떻게 될까?

1-2) Page Fault(페이지 폴트)

MMU는 present/absent 비트를 이용해 페이지가 메모리에 매핑되어 있지 않음을 파악하고 CPU 에게 트랩(trap)을 발생시켜 운영체제에게 이것을 알리도록 한다.
이것을 페이지 폴트라고 한다.

운영체제는 페이지 프레임 중에서 적게 사용되고 있는 페이지 프레임을 선택하고, 선택한 페이지 프레임의 내용을 디스크에 기록한다.(만일 이미 기록되어 있다면 이 과정은 생략됨)
그 이후 참조하려는 페이지의 내용을 페이지 프레임에 적재하고, 맵을 수정한 후, 트랩을 야기한 명령을 다시 실행한다.

예를들어, MOV REG,32780(페이지 8의 12번째 바이트) 명령어가 실행되고, 페이지 폴트가 발생하였다.
OS가 위 그림의 페이지 프레임 중에서 1번을 교체하기로 선택했다고 가정하자.
그럼 운영체제는 페이지 8의 내용을 페이지 프레임 1에 적재하고 MMU에서는 다음 두가지를 수정한다.

  1. 가상 페이지 1이 이제는 매핑되지 않았음을 표시한다.
    (이렇게 되면 이제부터 가상 주소 4096~8191의 참조는 trap을 야기한다)
  2. 가상 페이지 8번이 페이지 프레임 1에 매핑되었음을 기록한다.

1-3) 가상 주소 변환

이제부터 MMU의 내부 구조를 살펴보면서 동작 방법과 페이지 크기를 2의 정수 배수로 선택한 이유를 살펴보자.

위 그림은 가상주소 8196(이진수로는 0010000000000100) 이 위에서 예시된 매핑 정보를 이용해 물리 주소로 전환되는 과정을 보여준다.
16 비트 크기를 갖는 가상주소는 페이지 번호(VPN,virtual page number)와 오프셋으로 구분된다.

이 예에서는 페이지 번호를 위해 4비트가 사용되고,(페이지 개수가 16개) 오프셋을 위해 12비트가 사용된다(페이지 크기가 4096(4K) 이다).

페이지 번호(VPN)는 페이지 테이블(page table)의 인덱스로 사용된다.
페이지 테이블에는 해당 페이지 번호에 대응되는 페이지 프레임 번호(PFN,page frame number)가 기록되어 있다. 만일 present/absent 비트가 0이면 페이지 폴트가 발생한다. 반면 1이라면, 페이지 테이블에 기록되어 있는 페이지 프레임 번호 세 비트와(페이지 프레임이 8개) 가상 주소의 오프셋에 대응되는 12비트가 결합하여 물리 주소가 된다. (physical address = PFN::offset)
이 주소는 주소 출력 레지스터를 통해 메모리 버스로 전달되고, 결국 메모리 참조 주소가 된다.

2. 페이지 테이블(page table)

  • 페이지 테이블
    * 운영체제에 의해 관리
    • VPN을 PFN으로 매핑 (VPN은 간단하게 페이지 테이블의 인덱스임)
    • 가상 주소 공간에서 한 페이지당 하나의 페이지 테이블 엔트리(PTE)를 가짐 (one PTE per VPN)

가상 주소를 물리 주소로 매핑하는 과정을 요약하면 다음과 같다.

첫 번째 단계로 가상 주소를 페이지 번호(상위 비트)와 오프셋(하위 비트)로 구분한다.

예를 들어 16bits 주소 크기를 갖는 시스템에서 페이지의 크기가 4KB 라면, 상위4비트는 페이지를 가리키는 페이지 번호로 사용되고, 하위 12비트는 바이트 오프셋(0부터 4095까지)으로 사용된다.
물론 페이지 번호로 3비트, 5비트 또는 다른 개수의 비트를 사용하는 것도 가능하다. 그러면 페이지 크기도 변하게 된다.

다음 단계로 페이지 번호를 인덱스로 이용해 페이지 테이블에서 가상 주소에 대응되는 엔트리를 찾는다. 페이지 테이블 엔트리에서 페이지 프레임 번호를 얻을 수 있다. (매핑되어 있다면)
가상 주소에서 페이지 번호가 차지하던 부분을 페이지 프레임 번호로 대치하면 (즉, 페이지 프레임 번호를 상위에 놓고, 오프셋을 하위에 놓으면) 결국 물리 주소가 된다.
이 물리 주소가 메모리 참조에 사용된다.

결국, 페이지 테이블의 목표는 가상 페이지를 물리 페이지 프레임으로 매핑하는 것이다.
수학적으로 말하자면, 페이지 테이블이 함수이고 가상 페이지 번호는 입력 인자가 되며 물리 페이지 프레임 번호는 함수의 결과가 된다.

2-1) 페이지 테이블 엔트리(PTE, page talbe entry) 구조

이제부터 페이지 테이블을 구성하는 각 엔트리의 구조를 자세히 살펴보자.
엔트리의 구조는 CPU에 따라 다르며, 하드웨어 종속적이다.
하지만 모든 CPU들이 공통으로 가지고 있는 정보들도 있다.

위 그림이 공통적인 페이지 테이블 엔트리 구조를 보여준다.
엔트리의 크기 역시 시스템에 따라 다르나, 일반적으로 32비트 크기를 갖는다.

  • 페이지 프레임 번호
    - 가상주소를 물리 주소로 매핑하는 기능 담당
    • 해당 페이지가 매핑된 물리주소 결정
  • present/absent 비트
    - 페이지 프레임 번호가 유효한지 아닌지 결정
    • 0이면 해당 엔트리에 대응되는 페이지가 물리 메모리에 존재하지 않는 상태
    • 가상 주소가 사용될 때마다 체크
  • protection 비트 (보호비트)
    - 어떤 접근이 허용되는지 표시 (w,r,execute)
  • modify 비트 (수정 비트, dirty bit)
    - 페이지가 수정되었는지 아닌지
    • 페이지의 내용이 변경되면(write 시) 하드웨어가 자동으로 비트 set (1로 설정된 상태 : dirty 상태, 0 인 상태: clean 상태)
    • 운영체제가 페이지 프레임을 교체할 때 영향을 줌
    • 1로 설정된 경우 페이지 프레임은 교체될 때 그 내용이 디스크에 기록되어야 함
    • 0인 경우 디스크에 쓰여질 필요 없이 새로운 내용으로 덮여 쓰여져도 됨, 유효한 내용이 디스크에 이미 존재하기 때문에
  • reference bit (참조 비트)
    - 해당 페이지가 읽기 or 쓰기로 접근되었을 때 설정
    • 운영체제가 page fault 처리를 위해 교체할 page frame 을 선택할 때 이용됨
    • 사용된 페이지 보다는 그렇지 않은 페이지를 교체 대상으로 선택하는 것이 성능에 좋음
  • caching disabled (캐시 무효화) 비트
    - 해당 페이지가 캐싱될 수 있는지 여부
    • 페이지가 메모리가 아닌 장치 레지스터에 매핑되어 있을 때 중요한 역할 실행

한 가지 주의할 것은, 페이지 테이블에는 메모리에 존재하는 페이지의 주소에 대한 정보만 존재할 뿐 디스크에 존재하는 페이지의 디스크 주소에 대한 정보는 없다.
즉, 페이지 테이블에는 하드웨어가 가상 주소를 물리 주소로 변경할 때 필요한 정보들만 존재한다.
page fault를 처리하기 위해 필요한 정보는 OS 내부에서 소프트웨어 적으로만 존재한다. 하드웨어적으로는 이 정보는 필요 없다. (디스크 건들이는 것)

가상 주소(virtual address)란 본질적으로 물리 메모리에 대한 추상화를 제공하는 주소 공간(address space)라는 추상화(abstraction)을 제공하는 것이다.

profile
안녕하세요 :) 제 개인 공부 정리 블로그입니다. 틀린 내용 수정, 피드백 환영합니다.

0개의 댓글