운영체제

[운영체제] 가상 메모리, 페이징 기법

체리1001 2022. 6. 9.
가상 메모리

 

: 물리 메모리의 크기와 상관없이 프로세스에 커다란 메모리 공간을 제공하는 기술

: 가상 메모리를 이용하면 프로세스는 운영체제가 어디에 있는지, 물리 메모리의 크기가 어느 정도인지 신경 쓰지 않고 메모리를 마음대로 사용할 수 있다.

: 메모리 오버레이를 운영체제 내부에서는 가상 메모리의 개념으로 관리를 한다.

 

가상 메모리의 구성

1. 프로세스가 바라보는 메모리 영역

2. 메모리 관리자가 바라보는 메모리 영역

 

- 가상 메모리에서 메모리 관리자는 물리 메모리의 부족한 부분을 스왑 영역으로 보충한다.

- 프로세스의 입자에서는 물리 메모리를 신경쓰지 않고 자신이 필요한 만큼 그냥 가상 주소 공간을 사용한다.

(이 가상 주소 공간을 따져보면 실제로는 물리 메모리 + 스왑 영역으로 이루어져 있다는 것!!)

 

가상 메모리에서 메모리 관리자가 사용할 수 있는 메모리의 전체 크기는 물리 메모리(실제 메모리)와 스왑 영역을 합한 크기이다.

 

 

동적 주소 변환 (Dynamic Address Translation: DAT)

 

: 가상 주소를 실제 메모리의 물리 주소로 변환하는 것

: 동적 주소 변환을 거치면 프로세스가 아무 제약 없이 사용자의 데이터를 물리 메모리에 배치할 수 있다. (물리 메모리가 부족할 경우에는 스왑 영역에 배치)

 

 

가상 메모리의 메모리 분할 방식

 

1. 가변 분할 방식을 이용한 세그먼테이션

2. 고정 분할 방식을 이용한 페이징 기법

 

- 기본적으로 페이징 기법을 사용하기는 하나 페이지 테이블 관리가 어렵다.

- 세그먼테이션 기법은 외부 단편화 등의 문제가 있다.

-> 가상 메모리 시스템에서는 두 기법의 단점을 보완한 세그먼테이션-페이징 혼용 기법을 주로 사용한다.

구분 가상 메모리 물리 메모리
최대 메모리 크기 CPU의 비트 값에 의존
(예. 32비트 CPU이면 최대 4GB까지 인식)
CPU의 비트 값에 의존
메모리 분할 방식 세그먼테이션 가변 분할 방식
페이징 고정 분할 방식
세그먼테이션-페이징 혼용 기법  
주소 지정 방식 가상 주소 절대 주소, 상대 주소

 

메모리 매핑 테이블

 

: 가상 메모리 시스템에서 메모리 관리자는 가상 주소와 물리 주소를 일대일 매핑 테이블로 관리한다.

-> 가상 주소를 물리 주소로 변환하는 동적 주소 변환을 위해

(가상 메모리 시스템에서는 메모리 관리자가 가상 주소와 물리 주소를 모두 관리해야 한다.)

(보통 프로세스의 실행 순서에 맞게 쭉 나열이 된다.)

 

 

페이징 기법 개요

 

: 고정 분할 방식을 이용한 가상 메모리 관리 기법 

: 물리 주소 공간을 같은 크기로 나누어 사용한다.

-> 가상 주소는 프로세스 입장에서 바라본 메모리 공간으로 항상 0번지부터 시작한다.

 

가상 주소의 분할된 각 영역"페이지"라고 하며 번호를 매겨 관리한다.

물리 메모리의 각 영역은 가상 주소의 페이지와 구분하기 위해 "프레임"이라고 한다.

-> 페이지와 프레임의 크기는 같기 때문에 페이지는 어떤 프레임에도 배치될 수 있다.

-> 어떤 페이지가 어떤 프레임에 있는지에 대한 연결(매핑) 정보는 페이지 테이블에 담겨있으며, 페이지 테이블에 invalid는 해당 페이지가 스왑 영역에 있다는 것을 의미한다.

 

 

페이징 기법 주소 변환

 

페이징 기법에서는 가상 주소를 VA=<P, D>로 표현한다.

VA: 가상 주소(virtual address)

P: 페이지(page)

D: 페이지의 처음 위치에서 해당 주소까지의 거리(distance)

 

페이징 기법에서의 주소 변환은 가상 주소 VA=<P, D>를 물리 주소 PA=<F, D>로 변환하는 것이다.

PA: 물리 메모리의 주소를 가리키는 용어로 물리 주소 또는 실제 주소

F: 프레임(frame)

D: 프레임의 처음 위치에서 해당 주소까지의 거리(distance)

 

주소 변환 과정

VA<P, D> -> PA<F, D>

: 페이지 테이블을 사용하여 P를 F로 바꾸고 D는 변경 없이 그대로 사용한다.

(D를 변경하지 않는 이유는? 페이지와 프레임의 크기가 똑같기 때문)

 

예 1. 프로세스가 30번지의 내용을 읽으려고 할 때 (페이지의 크기 10B라고 가정)

(1) 가상 주소 30번지가 어느 페이지에 있는지 찾는다 : 30번지는 페이지 3의 0번째 위치이므로 VA=<3, 0>

(2) 페이지 테이블의 페이지 3으로 가서 해당 페이지의 프레임을 찾는다 : 예시에서는 1이므로 프레임 1

(3) 최종적으로 물리 메모리의 프레임 1의 0번째 위치에 접근해서 내용을 읽어온다. PA=<1, 0>

 

예 2. 프로세스가 가상 주소 18번지에 값을 저장하려고 할 때

(1) 가상 주소 18번지가 어느 페이지에 있는지 찾는다: 18번지는 페이지 1의 8번째 위치이므로 VA=<1, 8>

(2) 페이지 테이블의 페이지 1로 가서 해당 페이지의 프레임을 찾는다: 예시에서는 3이므로 프레임 3

(3) 최종적으로 프로세스가 저장하려는 값을 프레임 3의 8번 위치에 저장한다. PA=<3, 8>

 

예 3. 16비트 CPU의 컴퓨터에서 한 페이지의 크기가 2의 10승 (1024) B일 때 페이징 시스템 (프레임은 32개만 있다고 가정)

: 한 프로세스가 사용할 수 있는 가상 메모리의 크기는 2의 16승 (16비트 CPU니까)

-> 사용자는 0번지부터 65535번지(2의 16승 -1)까지 가상 주소 공간을 사용할 수 있다.

-> 페이지의 크기가 1024B이므로 페이지의 개수는 64개 (0번부터 63번까지) 

-> 페이지 테이블은 페이지 테이블 엔트리가 0~63으로 총 64개 (페이지 테이블의 크기는 물리 주소의 크기가 아니라 프로세스의 크기에 비례한다)

(페이지의 크기는 운영체제별로 각기 다르다)

 

* 페이지의 크기가 다양할 경우 가상 주소를 <P, D>로 변환하는 공식

P = (가상 주소/ 한 페이지의 크기)의 몫

D = (가상 주소/ 한 페이지의 크기)의 나머지

 

-> 예) 한 페이지의 크기가 512B인 시스템에서 가상 주소 2049번지

P = 4 (2049/512 의 몫)

D = 1 (2049/512 의 나머지)

 

 

페이지 테이블 관리

 

다수의 프로세스가 있는 페이징 시스템

: 프로세스마다 페이지 테이블이 존재한다. 프로세스의 수가 많아지면 페이지 테이블의 크기가 커지고, 이에 따라 프로세스가 실제로 사용할 수 있는 메모리 영역이 줄어든다. -> 페이지 테이블 크기를 적정하게 유지하는 것은 페이지 테이블 관리의 핵심!!!

물리 메모리 내 페이지 테이블의 구조

: 각 페이지 테이블의 시작 주소는 페이지 테이블 기준 레지스터(Page Table Base Register, PTBR)에 보관되어 있다.

: 페이지 테이블 영역은 물리 메모리 중 운영체제의 영역에 들어가 있다.

-> 물리 메모리의 크기가 작을 때에는 프로세스만 스왑 영역으로 옮겨지는 것이 아니라 페이지 테이블의 일부도 스왑 영역으로 옮겨진다.

 

 

페이지 테이블 매핑 방식

 

1. 직접 매핑 (direct mapping)

2. 연관 매핑 (associative mapping)

3. 집합-연관 매핑 (set-associative mapping)

4. 역매핑 (invert mapping)

 

 

직접 매핑

 

: 페이지 테이블 전체가 물리 메모리의 운영체제 영역에 존재하는 방식

(별다른 부가 작업 없이 바로 주소 변환이 가능하기 때문에 직접 매핑이라고 한다.)

 

- 페이지 테이블 전체가 물리 메모리에 저장되기 때문에 가상 주소 VA=<P, D> 를 물리 주소 PA=<F, D>로 변환하려면 페이지 테이블의 P번째 위치에서 원하는 프레임 값을 얻을 수 있다.

- 페이지 테이블의 시작 주소는 페이지 테이블 기준 레지스터가 가지고 있으므로 물리 메모리상 페이지 테이블의 P번째 주소가 시작 주소로부터 P번째 위치에 존재한다.

 

 

연관 매핑

 

: 페이지 테이블 전체를 스왑 영역에서 관리하는 방식 (물리 메모리의 여유 공간이 작을 때 사용하는 방식)

: 모든 페이지 테이블을 저장장치의 스왑 영역에 저장하고 그 중 일부만 물리 메모리에 가져온다.

-> 일부 내용만 무작위로 가져오기 때문에 페이지 번호와 프레임 번호 둘 다 표시

-> 주소 변환 시 물리 메모리 내의 페이지 테이블을 다 검색해야 하며 만약 원하는 프레임 번호를 얻지 못하면 스왑 영역에 있는 페이지 테이블에서 검색해야 한다. (검색 실패 시 스왑 영역에서 다시 찾아야 하므로 시간을 낭비하게 된다.)

 

- 메모리에 접근하기 위해 먼저 변환 색인 버퍼 (Translation Look-ahead Buffer, TLB)를 찾아야 한다.

  1) TLB 히트: 원하는 페이지 번호가 변환 색인 버퍼에 있는 경우 -> 곧바로 물리 주소로 변환

  2) TLB 미스: 원하는 페이지 번호가 변환 색인 버퍼에 없는 경우 -> 스왑 영역에 저장된 직접 매핑 테이블을 사용하여 프레임 번호로 변환

- 전체 페이지 테이블을 물리 메모리에 보관하지 않아 메모리를 절약할 수 있다.

- TLB 미스가 빈번하게 발생할 경우 시스템의 성능이 떨어지는 단점이 존재한다.

- 변환 색인 버퍼는 페이지 테이블의 일부를 무작위로 가지고 있기 때문에 모든 변환 색인 버퍼를 검색한 후에야 원하는 페이지가 메모리에 없다는 것을 알 수 있다.

 

 

 

집합-연관 매핑 ( = 디렉토리 매핑)

 

: 페이지 테이블을 일정한 집합으로 자르고, 자른 덩어리 단위로 물리 메모리에 가져오는 방식

: 페이지 테이블을 n개씩 자르고 이를 관리하는 페이지 테이블을 하나 더 생성한다.

-> 페이지 테이블을 같은 크기의 여러 묶음으로 나누고, 각 묶음의 시작 주소를 가진 디렉토리 테이블을 새로 만들어서 관리한다.

: 새로 생성한 집합 테이블에는 일정하게 자른 페이지 테이블이 물리 메모리에 있는지, 스왑 영역에 있는지에 대한 위치 정보를 표시한다.

(전체 페이지 테이블은 스왑 영역에 있으며, 일부 테이블은 묶음 단위로 메모리로 옮긴다)

 

-> 연관 매핑은 물리 메모리에 있는 데이터가 무작위로 올라오기 때문에 원하는 프레임 번호를 얻기 위해 모든 테이블을 검색해야 한다는 문제가 있다. 연관 매핑과 비교했을 때 집합 테이블을 통해 원하는 페이지 테이블 엔트리가 스왑 영역에 있는지, 물리 메모리에 있는지 간단히 파악할 수 있다. (해당 묶음이 현재 메모리에 있는지, 스왑 영역에 있는지를 표시하는 디렉토리 테이블을 새로 만들기 때문에)

-> 디렉토리 테이블을 살펴보면 원하는 테이블 묶음이 어디에 있는지 알 수 있으므로 전체 테이블을 찾아보지 않아도 TLB 미스를 바로 알 수 있다.

-> 연관 매핑과 집합-연관 매핑은 CPU의 캐시에서도 사용하는 방식이다.

* 집합-연관 매핑 방식의 가상 주소

: 페이지 테이블이 일정 크기의 묶음으로 나뉘기 때문에 가상 주소를 VA=<P1, P2, D>로 표시한다.

    P1: 디렉토리 테이블에서의 위치 정보

    P2: 묶음 내에서의 위치 정보

    예) 페이지 테이블을 10개씩 한 묶음으로 나눌 경우 0~9번 테이블은 0번 디렉토리에, 10~19번 테이블은 1번 디렉토리에 속한다.

          가상주소 32번지  <0, 3, 2>

          가상주소 127번지  <1, 2, 7>  

 

* 집합-연관 매핑 방식의 구조

: 디렉토리 페이지 테이블의 시작 주소는 페이지 테이블 기준 레지스터가 가지고 있다.

1) 프로세스가 특정 주소를 요구하면 VA=<P1, P2, D>로 변환되고, P1을 이용하여 디렉토리 테이블에서 주소를 찾는다.

2) 만약 I(invalid)라고 표시되어 있으면 TLB 미스가 발생한 것이다. 원하는 테이블이 물리 메모리에 있으면 묶음 테이블의 시작 주소가 명시되어 있다.

 

 

역매핑

 

: 물리 메모리의 프레임 번호를 기준으로 테이블을 구성하는 방식

: 물리 메모리의 프레임에 어떤 프로세스의 어떤 페이지가 올라와있는지 표시하는 방식이다.

: 프로세스 수와 상관없이 테이블이 하나만 존재하므로 테이블의 크기가 매우 작다.

: 프로세스가 가상 메모리에 접근할 때 프로세스 아이디와 페이지 번호를 모두 찾아야 한다는 단점이 있다.

 

* 역 매핑 방식의 구조

: 테이블이 <프레임 번호, 프로세스 아이디, 페이지 번호>로 구성되어 있다.

: 페이지 테이블의 행 수는 실제 프레임의 수와 같다.

: 프로세스의 수와 상관없이 항상 일정 크기의 페이지 테이블을 유지하여 테이블의 크기가 매우 작다.

1) 주소 변환 시 메모리 관리자는 주소 변환을 해야 하는 프로세스의 아이디와 페이지 번호가 물리 메모리에 있는지 역매핑 테이블에서 검색한다.

2) 현재 테이블에 원하는 데이터가 없으면 스왑 영역에서 가져온다.

-> 페이지 테이블을 다 검사한 후에야 저장장치에 접근하기 때문에 검색 시간을 낭비하는 단점이 있다.

 

* 쉽게 배우는 운영체제 책 참고

댓글