Virtual Memory가상 메모리
가상 메모리(Virtual Memory)는 실제 물리적 RAM보다 큰 메모리 공간을 프로세스에게 제공하는 운영체제 기법이다. 각 프로세스는 독립된 가상 주소 공간을 갖고, 운영체제와 하드웨어(MMU)가 가상 주소를 물리 주소로 변환한다.
물리 주소 vs 논리 주소
| 구분 | 물리 주소 (Physical Address) | 논리 주소 (Logical Address) |
|---|---|---|
| 의미 | RAM 하드웨어상의 실제 주소 | 프로세스마다 0번지부터 시작하는 가상 주소 |
| 중복 | 없음 (유일) | 가능 (프로세스마다 독립) |
| 관리 | OS + MMU | 프로세스 |
MMU(Memory Management Unit): CPU와 메모리 사이에서 논리 주소 → 물리 주소 변환을 담당하는 하드웨어.
CPU (논리 주소) → MMU → 메모리 (물리 주소)
핵심 원리
페이징 (Paging)
가상 메모리를 고정 크기 페이지(Page) 단위로, 물리 메모리를 프레임(Frame) 단위로 나누어 페이지를 프레임에 할당하는 방식.
내부 단편화 (Internal Fragmentation)
페이지 크기(10KB)와 프로세스 크기(107KB)가 맞지 않으면 마지막 페이지에 낭비 공간 발생.
| 단편화 종류 | 발생 상황 | 해결책 |
|---|---|---|
| 외부 단편화 | 연속 메모리 할당 방식 | 페이징으로 해결 |
| 내부 단편화 | 페이징 방식 | 페이지 크기 최적화 |
페이지 테이블 (Page Table)
페이지 번호와 프레임 번호를 매핑하는 자료구조. 프로세스마다 독립적으로 가짐.
페이지 테이블 엔트리(PTE) 구성 비트
| 비트 | 이름 | 설명 |
|---|---|---|
| 유효 비트 | Valid Bit | 1=메모리에 있음, 0=보조기억장치에 있음 |
| 보호 비트 | Protection Bit | r(읽기)/w(쓰기)/x(실행) 권한 |
| 참조 비트 | Reference Bit | CPU가 접근한 적 있으면 1 |
| 수정 비트 | Dirty Bit | 쓰기 작업을 한 적 있으면 1 (스왑 아웃 시 저장 필요) |
PTBR(Page Table Base Register): 현재 실행 중인 프로세스의 페이지 테이블 위치를 가리키는 레지스터. PCB에 기록되며, 문맥 교환 시 변경된다.
페이지 폴트 (Page Fault)
프로세스가 접근한 페이지가 물리 메모리에 없을 때(유효 비트=0) 발생하는 예외(인터럽트).
요구 페이징 (Demand Paging)
프로세스의 필요한 페이지만 메모리에 적재하는 기법. 전체를 올리지 않고 CPU가 요구할 때만 로드한다.
- •장점: RAM 절약, 프로세스 크기 > 물리 RAM도 실행 가능
- •단점: 초기 실행 시 Page Fault 빈번 발생 (워밍업 필요)
스와핑 (Swapping)
물리 메모리가 부족할 때 사용하지 않는 페이지를 디스크(스왑 공간)로 내보내는 것.
| 용어 | 설명 |
|---|---|
| Swap Out (Page Out) | RAM → 디스크로 페이지 이동 (메모리 확보) |
| Swap In (Page In) | 디스크 → RAM으로 페이지 복귀 |
| 스래싱(Thrashing) | 스와핑이 과도해 실제 작업보다 스왑에 시간 소비 — 성능 급락 |
TLB (Translation Lookaside Buffer)
페이지 테이블 조회를 빠르게 하는 CPU 내부 캐시 메모리.
- •참조 지역성(Locality) 원리로 높은 히트율 달성
- •컨텍스트 스위칭 시 TLB 플러시(무효화) 필요
계층적 페이징 (Multi-level Page Table)
64비트 시스템에서 페이지 테이블 자체가 너무 커지는 문제를 해결하기 위해 페이지 테이블을 다단계로 분리하는 방식.
페이지 교체 알고리즘
새 페이지를 로드할 때 어떤 기존 페이지를 내보낼지 결정.
| 알고리즘 | 기준 | 장점 | 단점 |
|---|---|---|---|
| FIFO | 가장 먼저 적재된 페이지 | 구현 간단 | 자주 쓰는 페이지도 교체 가능 |
| Optimal | 앞으로 가장 늦게 쓸 페이지 | 최적 성능 | 미래 예측 불가 → 구현 불가 |
| LRU | 가장 오래 사용 안 된 페이지 | 실용적, 효율적 | 구현 복잡 |
| Clock (NRU) | 참조 비트 기반 LRU 근사 | LRU와 유사, 효율적 | 완전한 LRU는 아님 |
Linux에서는 Clock 알고리즘(Active/Inactive 리스트 기반)을 사용한다.
세그멘테이션 (Segmentation)
페이징과 달리 프로세스를 논리적 단위(코드/데이터/스택) 로 가변 크기 분할하는 방식.
| 방식 | 분할 크기 | 외부 단편화 | 내부 단편화 |
|---|---|---|---|
| 페이징 | 고정 (4KB) | 없음 | 있음 |
| 세그멘테이션 | 가변 | 있음 | 없음 |
현대 OS는 주로 페이징을 사용하며, x86-64는 세그멘테이션을 최소화한다.
가상 메모리의 장점
| 장점 | 설명 |
|---|---|
| 프로세스 격리 | 각 프로세스가 독립된 주소 공간 → 서로 침범 불가 |
| 메모리 확장 | RAM + 디스크로 실질적 메모리 확장 |
| 메모리 보호 | 읽기 전용 페이지, 실행 불가 페이지 설정 가능 |
| 지연 로딩 | 실제 접근 전까지 물리 메모리에 로드하지 않음 |
| COW(Copy-On-Write) | fork() 시 부모-자식이 같은 페이지 공유, 쓰기 시에만 복사 |
관련 개념
- •커널 — 가상 메모리를 관리하는 OS 커널
- •프로세스와 스레드 — 가상 주소 공간을 사용하는 실행 단위
- •스택 — 프로세스 가상 주소 공간 내 스택 영역
- •해시맵 — 페이지 테이블 구현에 해시 활용
참고문헌
- •Silberschatz et al. Operating System Concepts — Chapter 9, 10
- •Patterson & Hennessy. Computer Organization and Design
- •강민철. 혼자 공부하는 컴퓨터 구조+운영체제
