0.🚶들어가며

이번 글에서는 가상 메모리가 무엇인지에 대해 알아보고 가상 메모리를 구현하는 방법 중 하나인 페이징 기법에 대해 알아보도록 하겠습니다.


1.💻가상 메모리..?

컴퓨터마다 메인 메모리(물리 메모리)의 크기가 다릅니다. 그렇다면 크기가 3GB인 프로세스를 2GB의 메모리만 가지고 있는 컴퓨터에서 실행하고 싶을 때는 어떻게 해야 할까요?

 

크기가 다른 물리 메모리에서도 일관되게 프로세스를 실행할 수 있게 도와주는 것이 바로 가상 메모리 기술입니다. 물리 메모리의 크기와 상관없이 메모리를 이용할 수 있도록 지원해주는 기술이죠. 가상 메모리 기술 덕분에 프로그래머는 물리 메모리 크기에 구애받지 않고 편하게 프로그램을 만들 수 있게 되었습니다. 

 

현대 메모리 관리의 가장 큰 특징은 물리 메모리의 크기와 프로세스가 올라갈 메모리의 위치를 신경 쓰지 않고 프로그래밍하도록 지원하는 것입니다. 이러한 메모리 시스템을 바로 가상 메모리라고 부릅니다. 지난 글에서 살펴보았던 논리 주소 개념도 비슷한 맥락에서 나온 것 입니다. 

 가상 메모리 시스템에서 모든 프로세스는 자신이 메모리 주소 0번지부터 시작하는 커다란 메모리 공간이 있다고 생각합니다. 그 생각을 바탕으로 프로그램을 전개해나가며 이에 대한 처리는 메모리 관리자가 알아서 해주는 것이죠. 

 

그렇다면 메모리 관리자는 한정된 물리 메모리를 가지고 어떻게 이런 기능을 제공할 수 있을까요? 바로 물리 메모리와 저장 장치의 스왑 영역을 같이 사용함으로써 그러한 기능을 제공합니다. 가상 메모리 시스템에서는 프로세스의 내용의 일부는 메모리에, 일부는 스왑 영역에 두고 작업하는 것입니다.

 

메모리 관리자는 프로세스가 가상 주소를 통해 프로그램을 전개하면 이 주소를 실제 물리 주소로 변환해야 합니다. 이러한 과정을 동적 주소 변환(Dynamic Address Translation, DAT)라고 합니다.

 

메모리 관리자는 프로세스를 어떻게 나누어 물리 메모리에 올릴지도 결정해야 합니다. 이전 시간에 가변 분할, 고정 분할에 대해 배워보았는데 가상 메모리 시스템에서는 가변 분할 방식을 세그멘테이션, 고정 분할 방식을 페이징이라고 합니다. 이에 대한 내용은 차차 알아보도록 하겠습니다.

 

가상 주소는 동적 주소 변환 시 실제 물리 메모리 주소나 스왑 영역 중 한 곳을 의미하게 됩니다. 메모리 관리자는 가상 주소와 물리 주소를 일대일 매핑할 수 있어야 하는데 매핑 테이블을 가지고 이를 수행합니다. 아래는 매핑 테이블의 예시입니다.


2.📖페이징 기법

고정 분할 방식으로 메모리를 분할하여 관리하는 페이징 기법에 대해 알아보도록 하겠습니다.

1) 페이징 기법의 구현

페이징 기법의 구현

페이징 기법은 위 사진처럼 가상 주소의 프로세스와 물리 주소의 공간을 같은 크기로 분할하여 구현합니다. 용어 구별을 위해 가상 주소에 있는 분할 공간 하나를 페이지, 물리 주소의 분할 공간 하나를 프레임이라고 합니다. 또한 페이지 매핑 테이블에는 어떤 페이지가 어떤 프레임에 있는지에 대한 정보를 담고 있습니다. 5번 페이지의 경우 매핑 테이블을 보면 Invalid라고 쓰여있는데 이는 5번 페이지가 스왑 영역에 있음을 뜻합니다.

 

2) 페이징 기법의 주소 변환

가상 주소 VA = <P, D>와 물리 주소 PA = <F, D>에서 P와 F는 Page, Frame이고 D는 Distance로 페이지의 처음 위치에서 해당 주소까지의 거리를 의미합니다.

 

VA를 PA로 변환시키는 것 페이징 기법에서의 주소 변환이라 합니다. 즉, 가상 주소를 가지고 물리 주소를 찾는 방법이죠. 이 과정에서 페이지 테이블을 사용합니다.

 

가상 주소, 페이지 크기가 주어졌을 때 이를 물리 주소로 바꾸는 과정을 한 번 살펴봅시다. 가상 주소가 1360번지, 페이지 크기가 1024라고 가정해보겠습니다.

  • 가상 주소를 <P, D>로 변환합니다. P = (가상 주소 / 페이지 크기)의 몫, D = (가상 주소 / 페이지의 크기)의 나머지
  • <P, D>를 통해 <F, D>를 구하기 위해 P와 F 간의 관계를 나타내는 페이지 테이블을 사용합니다.
  • 이 과정을 통하면 1360 ➡ <1, 340> ➡ 물리 주소 : <3, 340> 식의 변환이 이루어집니다. (1번 페이지가 3번 프레임에 있다고 가정)
  • 결과적으로 1360번 가상 주소는 3번 프레임의 340번지를 살펴보면 되는 것이죠.

 

 3) 페이지 테이블 관리

페이지 테이블은 프로세스마다 하나씩 가지고 있는 정보입니다. 여러 개의 프로세스가 메모리에 올라와있다면 이를 모두 관리해야 하죠.

여러 프로세스들이 각자의 페이지 테이블을 가지고 있는 모습

또한 페이지 테이블은 굉장히 많이 쓰이는 데이터이기 때문에 필요시 빨리 접근할 수 있어야 합니다. 따라서 페이지 테이블은 메모리 영역에 올라와있는 운영체제 영역의 일부분에 모아놓습니다. 또한 아래 사진에서 볼 수 있듯 페이지 테이블 기준 레지스터(PTBR)이라는 페이지 테이블 시작 주소를 PCB에 저장하고 있습니다.

운영 체제영역 내부에 존재하는 페이지 테이블 영역

그런데.. 한 번에 많은 프로세스들이 시스템 내에 존재하고 프로세스의 크기도 커 페이지 테이블의 크기가 커진다면 어떻게 될까요? 페이지 테이블 때문에 프로세스들이 사용할 수 있는 메모리 영역이 줄어들게 됩니다. 따라서 메모리 영역이 작으면 프로세스만이 아니라 페이지 테이블의 일부를 스왑 영역으로 옮기기도 합니다.

 

4) 페이지 테이블 매핑 방식

페이지 테이블 전체를 메모리에서 관리하는지, 일부는 스왑 영역에서 관리하는지에 따라서 가상 주소를 물리 주소로 변환하는 방식이 달라집니다. 이에 대한 내용을 살펴봅시다.

(1) 직접 매핑 (Direct Mapping)

직접 매핑의 경우 페이지 테이블 전체가 물리 메모리의 운영체제 영역에 존재하는 방식입니다. 이전에 살펴본 주소 변환 기법으로 간단하게 가상 주소를 물리 주소로 변환할 수 있죠. 매핑 방식 중 가장 간단한 방식입니다.

(2) 연관 매핑 (Associative Mapping)

연관 매핑은 테이블 전체를 스왑 영역에서 관리하는 방식입니다. 메모리 공간이 작을 때 사용하는 방식으로, 페이지 테이블의 일부만 메모리에 가지고 옵니다. 이 일부의 테이블을 변환 색인 버퍼(TLB) 또는 연관 레지스터라고 부릅니다. 일부만 가져오는 방식으로 인해 메모리를 절약할 수 있다는 장점이 존재하죠. 

 

하지만 연관 매핑 방식에서는 메모리로 가져온 테이블 내용의 순서가 무작위기 때문에 변환 과정에서 모든 테이블을 다 살펴보아야 한다는 단점이 있습니다. 또한 검색 실패 시 스왑 영역에서 다시 찾아야 하므로 여기서도 오버헤드가 생깁니다.

(3) 집합-연관 매핑 (Set-Associative Mapping)

집합-연관 매핑은 연관 매핑의 단점을 보완한 방식입니다. 테이블의 일부만 메모리 공간에 올리는 것은 동일하나 페이지 테이블을 일정한 집합으로 자르고 자른 덩어리 단위를 메모리에 올리는 방식입니다. 따라서 특정 프레임을 찾기 위해 모든 페이지를 살펴보지 않아도 된다는 장점이 있습니다.

(4) 역매핑 (Invert Mapping)

역매핑 테이블의 구성

역매핑은 앞의 세 가지 매핑과 반대로 페이지 테이블을 구성하는 방식입니다. 프레임 번호를 기준으로 테이블을 구성하죠. 즉, 테이블을 메모리 프레임 기준 어떤 프로세스의 어떤 페이지가 올라와 있는지를 표시하는 방식입니다. 역매핑의 경우 프로세스의 수와 상관없이 테이블이 하나만 존재한다는 점이 가장 큰 특징입니다. 메모리의 프레임에 맞춰 테이블을 구성하기 때문에 테이블 크기 역시 매우 작다는 장점이 있습니다. 하지만 PID와 페이지 번호에 해당하는 프레임이 어떤 것인지 하나하나 다 살펴봐야 하기 때문에 속도가 매우 느리다는 단점 역시 존재합니다.


3.💨나가며

다음 글에서는 세그멘테이션 기법과 세그멘테이션-페이징 혼용 기법에 대해 알아보도록 하겠습니다. 

반응형
복사했습니다!