본문 바로가기
CS

[CS] 가상 메모리와 페이지 폴트의 메커니즘

by 비니공일 2026. 5. 23.

들어가며

 

맥북으로 활성 상태 보기를 실행하면 보이는 화면이다.

여기서 주목할 부분은 가장 아래쪽에 위치해 있는 스왑 공간이다. 이건 도대체 무엇이고, 왜 필요한 걸까?

 

 

한정된 메모리에서 효율적이고 안정적으로 여러 개의 프로그램을 실행할 수 있도록 하는 방법이 바로 ‘가상 메모리’다.

가상 메모리가 필요한 이유

모든 PC는 폰 노이만 구조로, 프로그램 코드는 모두 메모리에 올려서 실행된다. 하지만 물리 메모리만으로 시스템을 운영하면 여러 가지 문제가 발생한다.

 

1. 한정된 메모리 용량

프로세스는 충분한 메모리를 할당받아서 실행해야한다. 리눅스는 하나에 4GB인데, 통상적인 메모리는 8GB 또는 16GB다. 

만약에 메신저, 게임, 브라우저가 동시에 실행하면 빠르게 부족할 수 있다. 즉, 멀티태스킹을 할 수가 없다.

 

2. 보안 취약

모든 프로그램이 물리 메모리를 직접 사용한다면 보안에도 취약해진다.

A 프로그램이 실수나 악의적인 목적으로

- B 프로그램의 메모리 영역 침범

- 운영체제(OS)의 커널 영역에 접근

이 경우 데이터가 손상되거나 시스템 전체가 불안정해질 수 있다.

 

3. 기존 기법의 비효율성

가상 메모리가 나오기 전에 아래의 두 가지 방법을 시도했다.

  • 오버레이 기법 : 개발자가 직접 메모리를 쪼개서 관리
  • 스와핑 기법 : 프로세스 통째로 디스크로 보내기

하지만 이 방법은 개발자에게 부담이 되었으며, 디스크 입출력이 많아 성능이 저하되는 문제점이 있었다.

따라서, 운영체제가 자동으로 관리하는 추상화 계층의 필요성이 생겨났으며 '가상 메모리' 개념이 나타났다.

 

가상 메모리란?

한정된 RAM을 효율적으로 쓰기 위해, 실제로 필요한 페이지만 물리 메모리에 올리고 당장 필요 없는 페이지는 디스크(스왑)로 내보내는 방식으로 메모리를 관리하는 기술.

기본 아이디어는 모든 프로세스는 가상 주소를 사용하고, 데이터 사용(읽기/쓰기)할때 물리주소 변환하는 방식이다.

이때 가상 주소에서 'MMU'를 통해 물리주소로 변환한다.

 

MMU(Memory Management Unit): CPU가 코드 실행 시, 가상 주소 메모리 접근할 때, 해당 가상 주소를 물리 주소로 변환해주는 하드웨어 장치

 

<정리표>

물리 메모리의 한계 해결법
메모리 크기 제약 사용 중인 부분만 RAM에 올리고, 나머지는 디스크에 보관하자
메모리 단편화 문제
(연속된 메모리 공간이 없어서 큰 프로그램을 실행하지 못함)
가상 메모리에 페이징 도입
보안과 메모리 보호 모든 프로그램에 자신만의 독립된 가상 주소 공간 추가

가상 메모리 구현 방식

(1) 페이징

가상 메모리는 페이지로 나누어서 관리한다.

예를들어, CPU가 32bit이고 총 4GB 메모리를 4KB 크기의 페이지로 나누었다고 하자. 4KB는 4x\(2^{10}\) 이므로 4x\(2^{30}\)인 4GB를 4KB로 분할하면 \(2^{20}\)개의 페이지가 만들어 진다. CPU는 32bit 로 \(2^{20}\)개의 페이지에 모두 접근할 수 있지만 페이지 개수가 너무 많다. 여기에 인덱싱을 사용하면 매핑이 쉬워진다. 

 

도서관에 가면 층별로 책종류별로 나눈 것과 유사하다. 우리가 [컴퓨터 서적은 3층] -> [3층 A열 5번 책장] -> [위에서 3번째 책] 이렇게 책을 찾는 것처럼 32bit를 세 개로 분리된다.

 

 

 

 

(3) 페이지 폴트

프로그램 실행 중 필요한 데이터가 RAM에 없을 때 '페이지 폴트'현상이 발생한다.

이 현상이 발생하는 이유는, 사실 운영체제가 가상 메모리를 효율적으로 관리하기 위해 채택한 '요구 페이징(Demand Paging)' 기법 때문. 운영체제는 한정된 RAM 공간을 아끼고 시스템의 전반적인 성능과 리소스 효율을 극대화하기 위해, 지금 당장 실행에 필요한 부분만을 RAM에 적재합니다. 따라서 프로그램이 실행되면서 아직 메모리에 올라오지 않은 새로운 영역의 데이터를 참조하려고 할 때, 해당 페이지가 물리 메모리에 존재하지 않아 페이지 폴트가 자연스럽게 발생하게 됩니다.

 

해결방법은 '교체 알고리즘'을 사용하는 것이다.

 

<알고리즘 종류와 특징>

알고리즘 교체기준 장점 단점 특징
FIFO 가장 먼저 메모리에 들어온 페이지를 교체 구현이 단순함 오래 있었지만 자주 쓰는 페이지도 교체될 수 있음 Queue 구조로 구현 가능
Optimal 앞으로 가장 오랫동안 사용되지 않을 페이지를 교체 이론적으로 페이지 폴트 수가 가장 적음 미래의 참조를 알아야 하므로 실제 구현 불가 성능 비교용 기준 알고리즘
LRU 가장 오랫동안 사용되지 않은 페이지를 교체 실제 프로그램의 지역성을 잘 반영함 정확히 구현하려면 비용이 큼 최근 사용 기록을 관리해야 함
LFU 사용 횟수가 가장 적은 페이지를 교체 자주 사용되는 페이지를 오래 유지 가능 과거에 많이 쓰였지만 현재 안 쓰는 페이지가 남을 수 있음 참조 횟수 카운터 필요
MFU 사용 횟수가 가장 많은 페이지를 교체 특정 상황에서 최근에 충분히 사용된 페이지를 제거 가능 일반적으로 직관적이지 않고 효율이 낮을 수 있음 LFU와 반대 전략
Clock Reference Bit가 0인 페이지를 교체 LRU보다 구현 비용이 낮음 정확한 LRU는 아님 LRU를 근사적으로 구현한 방식

 

 

 

 

참고자료

https://lordofkangs.tistory.com/626

 

[OS] 가상메모리(Virtual Memory)란?

가상메모리에 대해서 알아보기 전에, 우선 CPU부터 간략히 알아보자. 32bit CPU, 64bit CPU라는 말을 많이 들어보았을 것이다. 여기서 32bit와 64bit는 무엇일까? 바로. CPU가 접근할 수 있는 메모리(RAM) 주

lordofkangs.tistory.com

https://eunjinii.tistory.com/61

 

가상 메모리 등장한 이유, 가상 메모리 이용하는 원리

1. 가상 메모리란? 등장 배경과 개념 우리 PC는 대부분 폰 노이만 구조 기반으로, 프로그램의 코드는 무조건 메모리에 올려서 실행되어야 한다. 즉 프로세스가 실행되려면, 각 프로세스마다 충분

eunjinii.tistory.com

https://libertegrace.tistory.com/entry/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%80%EC%83%81-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%9D%98-%EC%9D%B4%ED%95%B4

 

[운영체제] 가상 메모리의 이해

가상 메모리(Virtual Memory) 리눅스의 각 프로세스마다 4GB를 차지한다. 그런데 통상 메모리는 16GB? 정도인 것도 있고, 코드는 메모리에 반드시 있어야 하는데 여러개의 프로세스들 실행할 때 메모리

libertegrace.tistory.com