본문 바로가기
CS/OS

가상 메모리 (페이징) [혼공컴구]

by 블로블로글 2024. 1. 31.

가상 메모리

  - 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술

 

페이징

  - 메모리와 프로세스를 일정한 단위로 자르고, 이를 메모리에 불연속적으로 할당하는 방법

  - 프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 자르고, 메모리 물리 주소 공간을 프레임이라는 페이지와 동일한 크기의 일정한 단위로 자른 뒤 프레지를 프레임에 할당하는 가상 메모리 기법

  - 프로세스 전체를 스와핑하는 것이 아닌 페이지 단위로 스왑

    - 스왑 인 -> 페이지 인

    - 스왑 아웃 -> 페이지 아웃

  - 프로세스를 이루는 페이지 중 실행에 필요한 일부 페이지만을 메모리에 적재하고, 당장 실행에 필요하지 않은 페이지들은 보조기억장치에 남겨둠

 

페이지 테이블

  - 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서 이를 순차적으로 실행할 수가 없음

  - 프로세스를 이루는 어느 프레임에 적재되어 있는 알기 어렵기 때문

  - 이를 위해 프로세스가 비록 물리 주소에 불연속적으로 배치되더라도 논리 주소에는 연속적으로 배치되도록 페이지 테이블을 이용

  - 페이지 번호와 프레임번호를 짝지어 주는 일종의 이정표

  - 페이지 테이블은 현재 어떤 페이지가어떤 프레임에 할당되었는지를 알려줌

 

페이지 테이블 레지스터 (PTBR)

  - 각 프로세스의 페이지 테이블이 적재된 주소를 가리키고 있음

  - 예를 들어 프로세스 A가 실행될 때 PTBR은 프로세스의 A의 페이지 테이블을 가리키고, CPU는 프로세스 A의 페이지 테이블을 통해 프로세스 A의 페이지가 적재된 프레임을 알 수 있음

 

TLB

  - 페이지 테이블을 메모리에 두면 메모리 접근 시간이 두 배로 늘어남

    - 메모리에 있는 페이지 테이블을 보기 위해 한 번, 그렇게 알게 된 프레임에 접근하기 위해 한 번, 총 두 번의 접근이 필요함

  - 이 같은 문제를 해결하기 위해 TLB라는 페이지 테이블의 캐시 메모리(일반적으로 MMU내에 존재)를 둠

  - 참조 지역성에 근거해 최근에 사용된 페이지 위주로 가져와 저장

  - TLB 히트

    - CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우

  - TLB 미스

    - CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우

 

페이징에서의 주소 변환

  - 하나의 페이지 혹은 프레임은 여러 주소를 포괄하고 있음

    - 따라서 두가지 정보가 필요함

      - 어떤 페이지 혹은 프레임에 접근하고 싶은지

      - 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지

  - 페이징 시스템에서는 모든 논리 주소가 기본적으로 페이지 번호와 변위로 이루어짐

    - 페이지 번호

      - 말 그대로 접근하고자 하는 페이지 번호

    - 변위

      - 접근하려는 주소가 프레임의 시작 번지로부터 얼만큼 떨어져 있는지를 알기 위한 정보

  - 즉 논리 주소 <페이지 번호, 변위>는 페이지 테이블을 통해 물리 주소 <프레임 번호, 변위>로 변환

 

페이지 테이블 엔트리

  - 페이지 테이블의 각각의 행

  - 유효 비트

    - 일반적으로 프로세스를 이루는 모든 페이지가 메모리에 있지 않음

    - 유효 비트는 현재 페이지가 메모리에 적재되어 있는지 아니면 보조기억장치에 있는지를 알려주는 비트

    - 유효 비트가 0인 메모리에 접근하면 페이지 폴트라는 예외가 발생

    - 페이지 폴트의 과정은 하드웨어 폴트 처리 과정과 유사

  - 보호 비트

    - 페이지 보호 기능을 위해 존재하는 비트

    - 보호 비트를 통해 해당 페이지가 읽고 쓰기가 모두 가능한 페이지인지, 혹은 읽기만 가능한 페이지인지를 나타낼 수 있음

    - 읽기 전용 페이지에 쓰기를 시도하면 운영체제가 이를 막아줌

    - r,w,x등을 통해 3개의 비트로 좀 더 복잡하게 구현 가능

  - 참조 비트

    - CPU가 이 페이지에 접근한 적이 있는지 여부를 나타냄

  - 수정 비트

    - 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야하는지, 할 필요가 없는지를 판단하기 위해 존재

    - 해당 페이지에 데이터를 쓴 적이 있는지 없는지 수정 여부를 알려줌

    - 더티 비트라고도 부름

    - 수정된 적이 있는 페이지가 스왑 아웃될 경우 변경된 값을 보조기억장치에 기록하는 작업이 추가

 

페이징의 이점

  - 쓰기 시 복사

    - 부모와 자식 프로세스가 동일한 프레임을 가리킴

    - 부모 프로세스의 메모리 공간을 복사하지 않고도 동인한 코드 및 데이터 영역을 가리킬 수 있음

    - 부모나 자식 프로세스가 메모리에 어떠한 데이터도 쓰지 않고 그저 읽기 작업만 이어 나간다면 이 상태가 지속

    - 부모 프로세스 혹은 자식 프로세스 둘 중 하나가 페이지에 쓰기 작업을 하면 그 순간 해당 페이지가 별도의 공간으로 복제

 

계층적 페이징

  - 페이지 테이블을 페이징하여 여러 단계의 페이지를 두는 방식

  - 여러 단계의 페이지를 둔다는 점에서 다단계 페이지 테이블 기법이라고도 함

  - 프로세스의 페이지 테이블을 여러 개의 페이지로 자르고, 바깥쪽에 페이지 테이블을 하나 더 두어 잘린 페이지 테이블의 페이지들을 가리키게 하는 방식

  - 페이지 테이블을 계층적으로 구성하면 모든 페이지 테이블을 항상 메모리에 유지할 필요가 없음

  - 페이지 테이블들 중 몇 개는 보조기억장치에 있어도 무방하며, 추후 해당 페이지 테이블을 참조해야 할 때가 있으면 적재

  - 이 경우 CPU가 발생하는 논리 주소도 달라짐

  - 바깥 페이지 번호

    - CPU와 근접한 곳에 위치한 페이지 테이블 엔트리를 가리킴

  - 안쪽 페이지 번호

    - 첫 번째 페이지 테이블 바깥에 위치한 두 번째 페이지 테이블, 즉 페이지 테이블의 페이지 번호를 가리킴

  - 주소 변환 과정

    - 1. 바깥 페이지 번호를 통해 페이지 테이블의 페이지를 찾기

    - 2. 페이지 테이블의 페이지를 통해 프레임 번호를 찾고 변위를 더함으로서 물리 주소 얻기

  - 페이지 테이블의 계층은 세 개, 네 개, 그 이상의 계층으로도 구성될 수 있음

  - 페이지 테이블의 계층이 늘어날수록 페이지 폴트가 발생했을 경우 메모리 참조 횟수가 많이지므로 계층이 많다고 해서 반드시 좋다고 볼 수는 없음