가상 메모리 개념
- 가상 메모리(Virtual Memory) 는 물리 메모리를 추상화하여, 사용자에게는 매우 큰 균일한 저장장소 배열로 보이도록 한다.
- 실제 물리 메모리보다 큰 주소 공간을 사용할 수 있도록 지원한다.
- 가상메모리가 물리 메모리보다 크기가 크다.
- 예) 32비트 시스템: 가상 주소공간 2의 32승 = 4GB, 물리 메모리 512MB
가상 메모리의 이점
- 물리 메모리보다 큰 프로그램 실행 가능
- 전체 프로그램이 메모리에 상주할 필요 없음
- 프로세스 간 메모리 공유 가능
- 프로세스 생성 효율성 향상 (예: 쓰기 시 복사)
페이징 - 배경
초기의 메모리 관리 방식은 연속 메모리 할당(Contiguous Allocation).
- 프로세스는 실행을 위해 연속된 물리 메모리 공간이 필요했음.
- 시간이 지날수록 외부 단편화(External Fragmentation) 발생
- 총 여유 공간은 충분해도, 중간중간 잘린 공간 때문에 새 프로세스를 배치할 수 없는 상황.
페이징 - 등장
페이징은 이 문제를 해결하기 위해 고안됨.
핵심 아이디어:
- 물리 메모리를 일정 크기의 프레임(Frame) 으로 나눔.
- 프로세스 주소 공간을 동일 크기의 페이지(Page) 로 나눔.
- 페이지 단위로 프레임에 적재 → 프로세스는 연속되지 않은 공간에도 올릴 수 있음.
즉, 프로세스는 논리적으로 연속된 주소 공간을 가지지만, 실제 물리 메모리에서는 조각난 프레임에 배치될 수 있음.
페이지 - 장점
외부 단편화 제거 | 페이지 단위로 나누니 큰 연속 공간이 필요 없음. |
메모리 이용 효율 증가 | 작은 빈 프레임들을 조합해서 여러 프로세스를 동시에 실행 가능. |
가상 메모리 구현 기반 | 페이지 단위로 디스크 ↔ 메모리 적재/교체 가능 (요구 페이징) |
프로세스 보호와 공유 용이 | 페이지 테이블로 접근 권한 제어 가능. 동일 페이지를 여러 프로세스가 공유 가능 (예: 라이브러리). |
페이지 - 단점
내부 단편화(Internal Fragmentation) | 마지막 페이지가 프레임보다 작으면 공간 낭비 |
주소 변환 비용 | 가상 주소 → 물리 주소 변환 필요 → TLB 같은 하드웨어 지원이 필수. |
요구 페이징 (Demand Paging)
- 프로그램 실행 시 필요한 페이지만 메모리에 적재한다.
- 요청되지 않은 페이지는 메모리에 올리지 않는다.
- 페이지 폴트(Page Fault): 메모리에 없는 페이지에 접근할 때 발생.
→ 보조 저장장치(디스크)에서 해당 페이지를 읽어와 가용 프레임에 배치한다.
쓰기 시 복사 (Copy-on-Write, COW)
- 자식 프로세스 생성 시, 부모 프로세스의 페이지를 공유한다.
- 부모/자식이 실제로 페이지를 수정할 때만 복사본 생성.
- 프로세스 생성 속도를 높이고 메모리 사용량을 절감한다.
페이지 교체 (Page Replacement)
- 물리 메모리가 부족하면 기존 페이지를 디스크로 내보내고 새로운 페이지를 가져와야 한다.
- 대표 알고리즘:
- FIFO (First-In-First-Out)
- Optimal (앞으로 가장 오랫동안 사용되지 않을 페이지 교체)
- LRU (Least Recently Used, 가장 오랫동안 사용되지 않은 페이지 교체)
- 순수 LRU는 구현 비용이 높아 → 대부분 근사 알고리즘 사용.
- 전역 교체: 시스템 전체에서 교체할 페이지 선택
- 지역 교체: 페이지 폴트를 일으킨 프로세스 내부에서 교체
스래싱 (Thrashing)
- 시스템이 실행보다 페이지 교체에 더 많은 시간을 소모할 때 발생.
- CPU 이용률 급격히 감소 → 프로세스 수 줄이거나 작업 집합 제어 필요.
지역성(Locality) & 작업 집합(Working Set)
- 지역성(Locality): 함께 자주 사용되는 페이지 집합
- 시간적 지역성: 최근 사용된 페이지가 곧 다시 사용됨
- 공간적 지역성: 인접한 주소의 페이지가 함께 사용됨
- 작업 집합(Working Set): 프로세스가 일정 시간 동안 실제로 사용하는 페이지 집합
메모리 압축
- 여러 페이지를 압축해 적은 공간에 저장하는 기법
- 페이징이 불가능한 모바일/임베디드 환경에서 주로 활용
- 페이징의 대안으로 메모리 절약 가능
커널 메모리 관리
- 사용자 모드와 분리된 방식으로 관리된다.
- 연속된 다양한 크기의 블록으로 할당 필요.
- 대표적 기법:
- 버디 시스템: 2의 거듭제곱 크기로 분할 및 병합
- 슬랩 할당자: 자주 사용되는 객체 단위로 미리 메모리를 확보
TLB와 TLB Reach
- TLB (Translation Lookaside Buffer): 가상 주소 → 물리 주소 매핑 캐시
- TLB Reach = TLB 엔트리 수 × 페이지 크기
- TLB reach를 늘리는 방법:
- TLB 엔트리 수를 늘리기
- 페이지 크기 확대