메모리 관리와 가상메모리
연속할당, 페이징·세그먼테이션, 주소변환, 페이지 교체와 스래싱을 학습한다.
1. 주소와 적재
프로그램이 사용하는 논리주소(가상주소)는 MMU를 통해 실제 메모리의 물리주소로 변환된다. 주소 바인딩은 컴파일·적재·실행 시점에 이루어질 수 있으며, 현대 시스템은 실행 중 동적 주소변환을 주로 사용한다.
2. 연속 메모리 할당
프로세스를 하나의 연속 공간에 배치한다.
- 고정 분할: 분할 크기가 미리 정해져 내부 단편화 발생 가능
- 가변 분할: 요청 크기에 맞게 배치해 외부 단편화 발생 가능
- 배치 전략: first fit, best fit, worst fit
- 압축: 흩어진 빈 공간을 모으지만 이동 비용이 크다.
내부 단편화는 할당된 공간 안의 낭비, 외부 단편화는 전체 빈 공간은 충분하지만 연속된 큰 공간이 없는 상태이다.
3. 페이징
논리 메모리를 고정 크기 페이지, 물리 메모리를 같은 크기의 프레임으로 나눈다. 페이지 번호를 페이지 테이블로 변환하고 오프셋은 그대로 유지한다.
페이지 크기 = 2^d 바이트
페이지 번호 = 논리주소 // 2^d
오프셋 = 논리주소 mod 2^d
물리주소 = 프레임 번호 × 페이지 크기 + 오프셋
예를 들어 페이지 크기가 1024바이트이고 논리주소가 2500이면 페이지 번호는 2, 오프셋은 452이다. 페이지 2가 프레임 5에 있다면 물리주소는 5×1024+452=5572이다.
TLB는 최근 페이지 변환 결과를 저장하는 빠른 캐시이다. TLB hit이면 페이지 테이블 메모리 접근을 줄일 수 있다.
4. 세그먼테이션
코드·데이터·스택처럼 의미 있는 가변 크기 단위로 주소공간을 나눈다. 논리주소는 세그먼트 번호와 오프셋으로 구성되며, 세그먼트 테이블의 기준주소와 한계를 이용한다. 보호·공유에 유리하지만 외부 단편화가 발생할 수 있다.
5. 가상메모리와 요구페이징
필요한 페이지가 실제로 참조될 때 메모리에 적재한다. 메모리에 없는 페이지를 참조하면 페이지 부재가 발생하고 운영체제가 보조기억장치에서 페이지를 읽는다.
페이지 교체 알고리즘은 다음과 같다.
- OPT: 앞으로 가장 늦게 사용할 페이지, 이론적 최적
- FIFO: 가장 먼저 들어온 페이지
- LRU: 가장 오래 참조하지 않은 페이지
- LFU: 참조 횟수가 가장 적은 페이지
- Clock/NUR: 참조 비트로 최근 사용 여부를 근사
FIFO에서는 프레임 수가 늘어도 페이지 부재가 증가하는 Belady 이상이 발생할 수 있다.
6. 스래싱
프로세스가 필요한 페이지보다 너무 적은 프레임을 받아 페이지 부재와 교체에 대부분 시간을 쓰는 상태이다. 작업집합, 페이지 부재 빈도 제어, 다중 프로그래밍 정도 축소 등으로 완화한다.
7. 가상주소 비트 분해
32비트 가상주소, 페이지 크기 4KiB(2^12)이면 오프셋은 12비트이고 페이지 번호는 20비트다.
31 12 11 0
┌────────────────────┬─────────────┐
│ virtual page number│ page offset │
│ 20 bits │ 12 bits │
└────────────────────┴─────────────┘
페이지 테이블 엔트리가 4바이트라면 단일 단계 페이지 테이블은 2^20×4 = 4MiB가 필요하다. 희소 주소공간에서는 다단계 페이지 테이블이 실제 사용하는 하위 테이블만 만들 수 있어 메모리를 절약한다.
8. TLB 유효 접근시간 계산
TLB 탐색 10ns, 메모리 접근 100ns, TLB 적중률 90%이며 페이지 테이블과 데이터가 모두 메모리에 있다고 하자. 직렬 탐색 모델의 유효 접근시간은 다음과 같다.
hit : 10 + 100 = 110ns
miss: 10 + 100(페이지 테이블) + 100(데이터) = 210ns
EAT = 0.9×110 + 0.1×210 = 120ns
실제 하드웨어는 TLB와 캐시를 병렬 탐색하기도 하므로 문제에서 제시한 모델을 따른다. 페이지 부재 시간은 디스크·SSD 접근 때문에 ns가 아니라 훨씬 큰 단위가 될 수 있어 작은 부재율도 EAT를 크게 악화시킨다.
9. 페이지 테이블 엔트리의 상태 비트
- valid/present: 현재 물리 메모리에 존재하는지
- protection: 읽기·쓰기·실행 권한
- referenced/accessed: 최근 참조 여부
- dirty/modified: 적재 후 수정되었는지
교체되는 페이지가 dirty라면 보조기억장치에 먼저 기록해야 하므로 교체 비용이 커진다. 깨끗한 페이지는 원본이 디스크에 있으면 기록 없이 버릴 수 있다.
10. 페이지 교체 추적 예제
프레임 3개, 참조열 1 2 3 1 4 2를 생각한다.
참조 1 2 3 1 4 2
FIFO F F F H F H → 부재 4회
프레임 1 12 123 123 423 423
LRU F F F H F F → 부재 5회
교체 2 3
짧은 특정 참조열에서는 FIFO가 LRU보다 적을 수도 있다. LRU가 스택 알고리즘이라 Belady 이상이 없다는 사실과 “모든 참조열에서 항상 최소 부재”는 다른 주장이다. 미래를 아는 OPT가 기준상 최소다.
11. 작업집합과 프레임 할당
프로세스가 최근 일정 구간에서 참조한 페이지 집합을 작업집합이라 한다. 전체 작업집합 크기가 물리 프레임 수보다 커지면 페이지 부재가 급증할 수 있다. 지역 교체는 프로세스별 할당 안에서 교체하고, 전역 교체는 다른 프로세스 프레임도 빼앗을 수 있다.
스래싱 완화 방법:
- 다중 프로그래밍 정도 축소
- 작업집합에 맞춘 프레임 할당
- 페이지 부재 빈도(PFF)가 높으면 프레임 증가
- 지역성이 나쁜 작업의 단계 분리
12. Copy-on-Write와 메모리 매핑
fork() 후 페이지를 읽기 전용으로 공유하고 어느 한쪽이 쓰면 해당 페이지만 복사하는 COW는 생성 비용을 줄인다. 메모리 매핑 파일은 파일 내용을 가상주소공간에 연결해 일반 메모리 접근처럼 다룰 수 있으며, 페이지 캐시와 요구페이징이 함께 작동한다.
13. 단편화 계산 관점
4KiB 페이지에서 10,000바이트 프로세스는 3페이지, 즉 12,288바이트를 할당받아 마지막 페이지 내부 단편화가 2,288바이트다. 페이징은 연속 물리공간 요구를 없애 외부 단편화를 줄이지만 페이지 단위 내부 낭비와 페이지 테이블 비용을 만든다.
최종 확인 문제
- 36비트 가상주소와 8KiB 페이지를 사용할 때 페이지 오프셋과 가상 페이지 번호는 각각 몇 비트인가?
- TLB 탐색 5ns, 메모리 80ns, 적중률 95%이고 직렬 탐색일 때 페이지 부재를 제외한 EAT를 구하시오.
- 4KiB 페이지를 쓰는 9,000바이트 프로세스의 마지막 페이지 내부 단편화를 구하시오.
- 교체 대상 페이지의 dirty bit가 1이면 추가로 필요한 대표 작업은 무엇인가?
- LRU에서 프레임 수를 늘렸을 때 Belady 이상이 발생하지 않는 근거가 되는 성질을 무엇이라 하는가?