가상메모리의 주소 변환과 메모리 관리 정책

가상메모리의 주소 공간 확장 원리와 페이지 테이블, TLB, 교체 정책, 페이징·세그먼테이션 관리 기법을 정리한다.

2026-08-14 · 최초 발행 2025-12-28

물리 메모리보다 큰 주소 공간을 다루는 방식

가상메모리는 디스크 또는 SSD의 일부를 주기억장치처럼 활용해, 실제 물리 메모리 크기보다 큰 주소 공간을 프로세스에 제공하는 메모리 관리 기법이다. 각 프로세스는 독립된 가상 주소 공간을 받으므로, 개발자는 데이터가 어느 물리 주소에 놓였는지 직접 관리하지 않아도 된다.

이 방식이 가능한 이유는 프로그램 전체가 실행 내내 필요한 것은 아니기 때문이다. 특정 시점에는 일부 코드와 데이터만 사용되는 지역성 원리가 있고, 필요한 부분을 그때그때 적재할 수 있다. 예를 들어 100MB 프로그램은 물리 메모리가 50MB뿐인 환경에서도 실행될 수 있다. 사용하지 않는 함수는 디스크에 두었다가 필요할 때 페이지 인·아웃한다.

디스크 (스왑 공간)물리 메모리 (1GB)가상 주소 공간 (4GB)매핑매핑매핑매핑스왑 아웃스왑 아웃스왑코드 세그먼트데이터 세그먼트스택페이지 0-255페이지 파일

프로세스 간 메모리 침범을 막고 커널 영역을 보호하는 역할도 수행한다. 잘못된 접근은 세그먼트 폴트로 차단할 수 있다.

개발자가 직접 메모리를 교체하지 않아도 되는 이유

가상메모리가 없던 환경에서는 프로그램이 직접 Overlay 코드를 작성해 메모리의 내용을 교체해야 했다. 이 방식은 구현과 유지보수가 복잡하고 오류가 발생하기 쉬웠다. 가상메모리에서는 운영체제가 페이지 교체를 맡으므로, 프로그램은 물리 메모리의 배치를 의식하지 않고 실행된다.

필요한 페이지만 올리면 전체 프로그램을 매번 적재할 필요가 없다. 더 많은 프로세스를 동시에 실행할 수 있고, Ready 상태의 프로세스가 늘어나면서 CPU 유휴 시간을 줄일 수 있다. 멀티프로그래밍 수준이 높아져 컨텍스트 스위칭 오버헤드를 상쇄하며, 전체 시스템 처리량도 증가한다.

가상메모리 적용프로세스 1실제 30MB물리 메모리256MB프로세스 2실제 40MB프로세스 3실제 35MB프로세스 4실제 50MB프로세스 5실제 45MB나머지디스크스왑 공간가상메모리 적용프로세스 1전체 100MB물리 메모리256MB프로세스 2전체 100MB대기프로세스 3, 4, 5...

주소 변환은 직접 사상과 연관 사상을 함께 쓴다

직접 사상은 페이지 테이블을 통해 가상 주소를 물리 주소로 바꾸는 방식이다. 가상 페이지 번호에서 인덱스를 직접 계산하므로 O(1) 시간 복잡도로 접근할 수 있고, 하드웨어 구현도 단순하다. 반면 전체 가상 주소 공간에 대한 엔트리가 필요해 페이지 테이블이 커지며, 사용하지 않는 영역도 엔트리를 차지한다.

연관 사상은 병렬 검색이 가능한 연관 메모리에 유효한 엔트리만 보관한다. 필요한 매핑만 저장하고 동시에 비교할 수 있지만, 연관 메모리는 비용이 높고 용량이 제한되며 전력 소비도 증가한다.

현대 시스템은 두 방식을 결합한다. TLB(Translation Lookaside Buffer)는 최근 사용한 페이지의 매핑을 연관 메모리로 캐싱하고, 전체 매핑 정보는 페이지 테이블에 둔다. TLB에서 찾지 못한 경우에만 페이지 테이블을 참조한 뒤 결과를 TLB에 반영한다.

히트미스YesNo가상 주소TLB 검색(연관 사상)물리 주소즉시 획득페이지 테이블(직접 사상)페이지존재?물리 주소 획득TLB 업데이트페이지 폴트디스크에서 로드메모리 접근

할당·배치·호출·교체가 메모리 동작을 결정한다

가상메모리 관리 정책은 할당, 배치, 호출(인출), 교체라는 네 관점으로 나눌 수 있다.

할당 정책은 프로세스에 메모리를 얼마나, 어떤 형태로 줄지 다룬다. 연속 할당은 연속된 공간에 배치하기 때문에 관리가 단순하지만 외부 단편화가 생긴다. 불연속 할당은 메모리를 나누어 분산 배치하며 Paging과 Segmentation이 여기에 속하고, 외부 단편화 문제를 해결한다.

배치 정책은 빈 공간 중 어느 위치를 선택할지 정한다. First Fit은 처음 발견한 충분한 공간을 사용해 검색이 빠르지만 메모리 앞부분에 작은 홀이 생길 수 있다. Best Fit은 가장 작은 충분한 공간을 택해 메모리 효율을 높이지만 작은 홀이 많이 생긴다. Worst Fit은 가장 큰 공간을 선택해 큰 홀을 남기며 큰 프로그램에 유리하다.

할당 요청: 15KBFirst FitFree 30KB (첫 번째)Best FitFree 20KB (가장 작은 충분한공간)Worst FitFree 30KB (가장 공간)메모리 공간 상태Free 10KBUsedFree 30KBUsedFree 20KB

호출 정책은 페이지를 언제 적재할지 결정한다. 요구 반입(Demand Paging)은 페이지 폴트가 발생했을 때만 로드하므로 초기 로딩 시간이 짧지만 페이지 폴트가 빈번할 수 있다. 예측 반입(Prepaging)은 앞으로 사용할 페이지를 예상해 미리 적재해 페이지 폴트를 줄이지만, 예측이 빗나가면 I/O가 낭비된다. 혼합 방식은 초기 실행 시 프로그램 시작 부분을 예측 반입하고, 정상 실행에서는 요구 반입을 사용하며 실무에서 가장 많이 사용된다.

교체 정책은 물리 메모리가 부족할 때 어떤 페이지를 내보낼지 정한다. Random은 구현이 간단하지만 성능을 예측하기 어렵다. FIFO는 먼저 들어온 페이지를 교체하며 큐로 구현할 수 있으나 Belady's Anomaly가 발생할 수 있다. OPT는 가장 나중에 사용될 페이지를 교체하는 이론적 최적 방식이지만 미래를 예측할 수 없어 구현할 수 없다.

LRU는 가장 오래 사용하지 않은 페이지를 교체해 OPT에 가까운 결과를 노리지만 카운터나 스택 같은 하드웨어 지원이 필요하다. LFU는 사용 빈도가 가장 낮은 페이지를 교체하지만 초기에 많이 사용된 페이지가 남는 문제가 있고 카운터 오버헤드가 있다. NUR은 참조·수정 비트로 LRU를 근사해 하드웨어 효율을 높인다. WSM은 작업 집합을 기준으로 스래싱을 방지하며, PFF는 페이지 폴트 빈도를 관찰해 프레임을 동적으로 할당한다.

고급 정책WSM스래싱 방지적응적메모리 관리PFF동적 할당교체 정책 성능 비교근사치근사치벤치마크OPT이론적 최적LRU실용적 최선NUR하드웨어 효율적FIFO간단, 성능 낮음LFU빈도 기반Random예측 불가

페이지와 세그먼트로 나뉘는 관리 기법

Paging은 메모리를 고정 크기 페이지로 나누는 방식이다. 일반적으로 페이지 크기는 4KB이며, 페이지 테이블이 가상 주소와 물리 주소를 연결한다. 외부 단편화가 없고 할당과 스왑이 단순하지만, 페이지 크기보다 작은 낭비인 내부 단편화가 생긴다. 평균 내부 단편화는 0.5 페이지이며, 페이지 테이블이 커질 수 있고 보호 단위가 페이지여서 세그먼트보다 유연성이 낮다.

Segmentation은 코드·데이터·스택처럼 논리적 단위로 가변 크기 세그먼트를 구성한다. 세그먼트 테이블에는 베이스 주소와 한계 주소를 두며, 코드 세그먼트 공유와 논리 단위의 보호에 적합하다. 내부 단편화는 없지만 세그먼트 사이에 외부 단편화가 생기며, 메모리 할당이 복잡하고 압축(Compaction)이 필요하다.

Paged Segmentation은 세그먼트를 다시 페이지로 나누어 두 방식을 결합한다. 세그먼트 테이블과 페이지 테이블을 거치는 2단계 테이블 구조를 사용해 논리적 보호와 외부 단편화 해소를 함께 얻는다. 그 대가로 주소 변환이 복잡해지고 메모리 접근 오버헤드와 테이블 크기가 증가한다.

Paged Segmentation가상 주소세그먼트페이지오프셋세그먼트테이블페이지테이블프레임물리 주소Segmentation가상 주소세그먼트 번호오프셋세그먼트 테이블베이스 주소물리 주소Paging가상 주소페이지 번호오프셋페이지 테이블프레임 번호물리 주소

가상메모리는 보조기억장치를 활용해 대용량 애플리케이션을 실행하고, 여러 프로세스가 물리 메모리를 효율적으로 공유하게 한다. 페이지 테이블과 TLB의 주소 변환, 그리고 할당·배치·호출·교체 정책은 이 구조가 실제로 동작하는 핵심이다.

가상메모리운영체제페이징TLB메모리 관리