Chapter 10 · Virtual Memory I

페이징, 세그멘테이션, 그리고 요구 페이징의 원리

요약

Paging은 물리 메모리를 고정 크기의 frame으로, 논리 메모리를 같은 크기의 page로 분할하여 프로세스의 물리 주소 공간이 연속적이지 않아도 되게 한다. 각 프로세스는 고유한 page table을 가지며, 가상 주소의 VPN(virtual page number)을 PFN(page frame number)으로 변환하고 offset을 그대로 이어붙여 물리 주소를 만든다.

Demand paging은 실제로 필요한 page만 메모리에 올리는 기법으로, 참조된 page가 메모리에 없으면 page fault가 발생하고 OS가 디스크에서 해당 page를 읽어 frame에 적재한 뒤 명령을 재시작한다. 이 메커니즘 덕분에 물리 메모리보다 큰 가상 주소 공간을 가진 프로세스도 실행할 수 있다.

Segmentation은 메모리를 코드·스택·힙 등 논리적 단위(segment)로 나누는 기법으로, 각 segment는 가변 크기이며 base/limit 쌍으로 관리된다. 두 기법을 결합한 segmentation with paging은 segment의 논리적 구조와 paging의 고정 크기 관리 편의성을 함께 활용하여 external fragmentation을 제거한다.

핵심개념

paging 페이징

물리 메모리를 고정 크기 frame으로, 논리 메모리를 동일 크기 page로 분할하여 프로세스의 물리 주소 공간을 비연속적으로 배치할 수 있게 하는 메모리 관리 기법. 현대 OS는 주로 4KB page를 사용한다.

page table 페이지 테이블

VPNPFN으로 변환하는 자료구조. OS가 관리하며 각 프로세스마다 별도로 존재한다. page table entry(PTE)가 가상 주소 공간의 page 하나씩에 대응한다.

page table entry (PTE) 페이지 테이블 항목

각 page에 대한 메타데이터를 담는 항목. valid bit(V), reference bit(R), modify bit(M), protection bits, 그리고 PFN으로 구성된다.

page number / offset 페이지 번호 / 오프셋

가상 주소는 상위 비트의 VPN과 하위 비트의 offset으로 나뉜다. 4KB page이면 offset은 12비트이고, 32비트 가상 주소에서 VPN은 20비트가 된다.

frame 프레임

물리 메모리를 page와 동일한 크기로 나눈 단위. page frame number(PFN)으로 식별하며, OS는 빈 frame 목록(free list)으로 할당을 관리한다.

address translation 주소 변환

CPU가 생성한 가상 주소를 물리 주소로 바꾸는 과정. page table에서 VPN으로 PFN을 찾고, PFN에 offset을 붙여 물리 주소를 완성한다. 매 메모리 참조마다 수행된다.

TLB 변환 참조 버퍼

page table 조회 오버헤드(메모리 참조 2회)를 줄이기 위한 하드웨어 캐시. 최근 VPN→PFN 변환 결과를 저장하여 빠른 주소 변환을 지원한다.

demand paging 요구 페이징

실제로 접근할 때만 page를 메모리에 적재하는 기법. 프로세스 시작 시 모든 PTE의 valid bit가 false이며, 참조 시 page fault가 발생하면 그때 디스크에서 읽어온다.

page fault 페이지 부재

CPU가 접근한 page의 valid bit가 invalid일 때 발생하는 예외(exception). OS의 page fault handler가 디스크에서 해당 page를 읽어 frame에 올리고 PTE를 갱신한 뒤 명령을 재시작한다.

valid-invalid bit 유효-무효 비트

PTE의 V 비트. valid이면 해당 page가 프로세스 가상 주소 공간에 존재하고 물리 메모리에 적재되어 있음을 의미한다. invalid이면 아직 적재되지 않았거나 디스크로 swap out된 상태이다.

segmentation 세그멘테이션

메모리를 코드·스택·힙 같은 논리적 단위(segment)로 나누는 기법. 가상 주소는 <segment#::offset> 형식이며, segment마다 base/limit 쌍이 있다.

segment table 세그먼트 테이블

각 segment의 base(시작 물리 주소)와 limit(크기)을 저장하는 테이블. segment# 를 인덱스로 사용한다. limit 초과 접근 시 protection fault가 발생한다.

external fragmentation 외부 단편화

가변 크기 segment를 메모리에 할당/해제하다 보면 전체 빈 공간은 충분하지만 연속된 공간이 부족해 할당이 실패하는 현상. paging은 고정 크기 frame을 사용하므로 external fragmentation이 없다.

segmentation with paging 페이지드 세그멘테이션

segment를 논리 단위로 관리하되, 각 segment를 고정 크기 page로 다시 분할하는 하이브리드 기법. external fragmentation을 제거하면서도 segment의 논리적 보호·공유 특성을 유지한다. IA-32 아키텍처가 이를 지원한다.

개념정리

1. Paging 기본 & 주소변환

Paging은 고정 크기 메모리 관리의 자연스러운 확장이다. 물리 메모리를 frame으로, 논리 메모리를 page로 동일한 크기로 분할한다. page(frame) 크기는 2의 거듭제곱이며(512B~8KB, 현대 OS는 주로 4KB) 디스크 블록 크기의 배수로 선택한다.

  • 프로세스 실행에 필요한 n개의 page를 위해 n개의 빈 frame을 찾아 적재한다.
  • OS는 모든 빈 frame 목록을 관리한다.
  • 프로세스는 메모리를 0부터 N까지의 연속된 공간(virtual address space, VAS)으로 인식하지만, 실제 물리 page는 흩어져 있다.
  • 서로 다른 프로세스의 가상 주소 0xdeadcafe는 서로 다른 물리 주소에 매핑된다. 이 매핑은 프로그램에게 투명(invisible)하다.

주소 변환 구조

  • 가상 주소 = <VPN :: offset>
  • VPNpage table의 인덱스 → PFN을 획득
  • 물리 주소 = <PFN :: offset> (offset 비트는 그대로 사용)
예시 32비트 가상 주소, 20비트 물리 주소, 4KB(=212) page 크기일 때: offset = 12비트, VPN = 20비트, page table entry 수 = 220개. 가상 주소 0x0004AFE → VPN=0x4, offset=0xAFE → PTE에서 PFN을 읽어 물리 주소 완성.

2. Page Table & PTE

Page table은 OS가 관리하며 프로세스마다 독립적으로 존재한다(100개 프로세스 = 100개 page table). 각 항목 PTE는 다음 필드로 구성된다.

PTE 필드 구성 (V R M Prot | PFN)
필드약어설명
valid bit V PTE가 유효한지 여부. 매 가상 주소 사용 시 검사된다.
reference bit R 해당 page에 읽기 또는 쓰기가 발생했을 때 설정된다.
modify bit (dirty bit) M 해당 page에 쓰기가 발생했을 때 설정된다. swap out 시 dirty이면 디스크에 기록해야 한다.
protection bits Prot read-only / read-write / execute-only 등 허용 연산을 제어한다.
page frame number PFN 매핑된 물리 frame 번호.

valid / invalid bit 의미

  • valid: 해당 page가 프로세스의 가상 주소 공간에 속하며 물리 메모리에 있다.
  • invalid: 아직 할당되지 않았거나 디스크로 swap out된 상태. 접근 시 page fault.

Paging의 장단점

  • 장점: 물리 메모리 할당이 쉬움(free frame 목록에서 꺼냄), external fragmentation 없음, page 단위 swap out 용이, 접근 보호·공유 용이.
  • 단점: internal fragmentation 가능(프로세스가 page의 배수만큼 메모리를 사용하지 않을 수 있음), 주소 조회 시 메모리 참조 2회 오버헤드(해결책: TLB), page table 자체의 공간 오버헤드(4KB page + 32비트 주소 = PTE 220개 × 4B = 4MB/프로세스; 해결책: multi-level page table, inverted page table 등).

3. Demand Paging & Page Fault 처리

Demand paging은 OS가 주 메모리를 page 캐시로 사용하는 방식이다. page가 필요할 때만 디스크에서 읽어오므로 I/O와 메모리 사용을 줄이고 응답 시간을 단축한다.

  • 메모리가 꽉 차면 OS는 page를 swap out(dirty이면 디스크에 기록, clean이면 그냥 버림).
  • swap out된 page의 PTE는 invalid로 표시되고, PTE 내에 swap file 위치가 저장된다.

Page fault 처리 단계 (page_fault_handler)

  1. CPU가 가상 주소를 참조할 때 해당 PTE의 valid bit가 invalid이면 exception(trap) 발생 → OS로 제어 이동.
  2. OS는 해당 접근이 프로세스의 유효한 가상 주소 공간 내인지 검사한다. 범위 밖이면 프로세스를 종료한다.
  3. invalid PTE에 저장된 swap file 위치를 참조하여 page의 디스크 위치를 파악한다.
  4. frame을 확보한다(없으면 page replacement 알고리즘으로 희생 page 선택 후 evict).
  5. 디스크의 swap file에서 해당 page를 frame으로 읽어온다(디스크 I/O).
  6. page table의 PTE를 갱신하고 valid bit를 설정한다.
  7. page fault를 일으킨 명령을 재시작(restart)한다.
참고 Locality 덕분에 demand paging이 실용적으로 동작한다. temporal locality(최근 참조 위치는 곧 다시 참조)와 spatial locality(최근 참조 위치 주변도 곧 참조)로 인해 page fault는 비교적 드물게 발생한다.

프로세스 시작과 cold fault

프로세스가 처음 시작할 때 모든 PTE의 valid bit는 false이다. 첫 번째로 실행되는 명령이 즉시 page fault(cold miss / cold page fault)를 발생시키며, 실제로 필요한(demanded) 코드·데이터 page만 순차적으로 메모리에 적재된다.

4. Segmentation

Segmentation은 메모리를 코드, 스택, 힙 등 논리적으로 관련된 단위로 분할한다. 사용자 관점에서 메모리는 다양한 크기의 segment 집합으로 보이며, 각 segment는 독립적으로 크기를 늘리거나 줄일 수 있다.

  • 가상 주소 형식: <segment# :: offset>
  • variable-size partition의 자연스러운 확장(1 segment/process → 여러 segment/process).
  • 프로그래머에게 투명하지 않다 — segment 경계를 인식해야 한다.

하드웨어 지원 — segment table

  • segment마다 base(물리 시작 주소)와 limit(크기) 쌍을 저장.
  • 주소 변환: offset < limit인지 확인 → base + offset = 물리 주소. limit 초과 시 protection fault.
  • segment table 항목에도 valid bit와 protection bits(read/write/execute)가 있다.

장단점

  • 장점: 가변 크기 자료구조 관리가 쉬움, segment 수준의 보호와 공유(같은 base/limit를 두 프로세스가 공유 → 공유 라이브러리).
  • 단점: 큰 segment table (메인 메모리에 유지, 하드웨어 캐시로 속도 보완), external fragmentation 발생(가변 크기 할당·해제 반복으로 단편화).

5. Paging vs. Segmentation

Paging과 Segmentation 비교
항목 Paging Segmentation
블록 크기 고정 (4KB~64KB) 가변
선형 주소 공간 수 1개 여러 개
메모리 주소 형식 page number + offset segment + offset
교체(replacement) 난이도 쉬움 (모두 같은 크기) 어려움 (segment가 맞는 공간 탐색 필요)
단편화 internal fragmentation external fragmentation
디스크 I/O 효율 효율적 (page 크기에 최적화) 비효율적 (크기 다양)
프로그래머에게 투명? Yes No
물리 메모리보다 큰 주소 공간? Yes Yes
코드·데이터 별도 보호? No Yes
가변 크기 테이블 수용? No Yes
코드 공유 용이? No Yes
발명 이유 큰 선형 주소 공간 논리적 독립 주소 공간 (공유·보호)
참고 두 기법 모두 물리 메모리보다 큰 주소 공간을 지원하며, 하이브리드 접근인 paged segments(segmentation with paging)로 단점을 상호 보완할 수 있다.

6. Segmentation with Paging

두 기법의 하이브리드 접근법으로 IA-32(x86) 아키텍처가 대표적으로 지원한다.

  • segmentation으로 코드·데이터·힙 등 논리 단위를 관리 — segment는 크기가 가변이지만 보통 크다(여러 page의 배수).
  • 각 segment를 고정 크기 page로 다시 분할 → segment를 "pageable" 하게 만든다.
  • segment 전체를 in/out 하는 대신 segment의 page 단위로만 이동 → 효율적.
  • external fragmentation 제거: 물리 메모리는 항상 고정 크기 frame으로 관리되므로.
  • IA-32: segment table에서 segment의 시작 선형 주소를 찾고, 2단계 page table로 최종 물리 주소를 변환한다.

다중 page 크기 지원

  • IA-32: 4KB, 2MB, 4MB page 크기 지원.
  • Alpha AXP: 8KB, 16KB, 32KB, 64KB page 크기 지원 (43/47/51/55비트 가상 주소).
참고 Paged segments는 segment의 논리적 보호·공유 이점과 paging의 고정 크기 관리 이점을 결합한다. 현대 OS는 대부분 paging 위주로 동작하면서 segmentation을 제한적으로 활용한다.

예상 서술형문제

Q1 paging에서 가상 주소를 물리 주소로 변환하는 과정을 VPN, offset, PFN 개념을 사용하여 단계별로 서술하시오.

모범답안 보기

① CPU가 가상 주소를 생성한다. 가상 주소는 상위 비트의 VPN(virtual page number)과 하위 비트의 offset으로 나뉜다. (예: 32비트 가상 주소, 4KB page → VPN 20비트 + offset 12비트)

VPN을 현재 프로세스의 page table에 대한 인덱스로 사용하여 해당 PTE를 읽는다.

③ PTE의 valid bit가 valid이면 PTE에서 PFN(page frame number)을 추출한다. invalid이면 page fault가 발생한다.

④ 물리 주소 = <PFN :: offset>. PFN을 물리 주소의 상위 비트에, 원래 offset을 하위 비트에 그대로 붙여 최종 물리 주소를 완성한다.

참고 이 과정은 매 메모리 참조마다 발생하며, 오버헤드를 줄이기 위해 TLB가 최근 변환 결과를 캐싱한다.

Q2 page table entry(PTE)에 포함된 주요 필드를 나열하고, 각 필드의 역할을 설명하시오.

모범답안 보기

PTE는 일반적으로 다음 필드로 구성된다.

  • valid bit (V): PTE가 유효한지 나타낸다. 매 가상 주소 참조 시 검사된다. invalid이면 page fault.
  • reference bit (R): 해당 page에 읽기 또는 쓰기가 발생하면 설정된다. page replacement 알고리즘에서 활용된다.
  • modify bit (M, dirty bit): 해당 page에 쓰기가 발생하면 설정된다. swap out 시 dirty이면 디스크에 기록해야 하고, clean이면 그냥 버린다.
  • protection bits (Prot): 해당 page에 허용된 연산(read-only, read-write, execute-only 등)을 제어한다.
  • PFN: 매핑된 물리 frame 번호.

Q3 demand paging 환경에서 page fault가 발생했을 때 OS가 이를 처리하는 과정을 page_fault_handler의 단계별로 서술하시오.

모범답안 보기

① CPU가 가상 주소를 참조할 때 해당 PTE의 valid bit가 invalid이면 trap이 발생하여 OS의 page fault handler로 제어가 넘어간다.

② OS는 해당 주소가 프로세스의 유효한 가상 주소 공간 내에 있는지 검사한다. 범위를 벗어나면 프로세스를 종료(illegal access)한다.

③ invalid PTE에 저장된 swap file 위치 정보를 통해 디스크에서 해당 page의 위치를 파악한다.

④ 빈 frame을 확보한다. 빈 frame이 없으면 page replacement 알고리즘으로 희생(victim) page를 선택하고 evict한다 (dirty이면 swap file에 write back).

⑤ 디스크 swap file에서 해당 page를 확보한 frame으로 읽어온다(디스크 I/O).

page table의 PTE를 갱신하여 새 PFN을 기록하고 valid bit를 valid로 설정한다.

⑦ page fault를 일으킨 명령을 처음부터 재시작(restart)한다.

참고 page fault 처리 비용의 대부분은 디스크 I/O이므로 page fault rate를 낮추는 것이 성능 최적화의 핵심이다. locality 특성이 이를 가능하게 한다.

Q4 paging의 장점과 단점을 각각 서술하고, 단점에 대한 대표적인 해결책을 제시하시오.

모범답안 보기

장점

  • 물리 메모리 할당이 쉽다: 빈 frame 목록에서 꺼내기만 하면 된다.
  • external fragmentation이 없다: 모든 단위가 고정 크기이기 때문이다.
  • page 단위 swap out이 쉽다: 모든 chunk가 같은 크기이며 valid bit로 swap out 여부를 감지한다.
  • page 보호·공유가 쉽다.

단점 및 해결책

  • internal fragmentation: 프로세스가 정확한 page 배수만큼 메모리를 사용하지 않아 마지막 page 내 낭비 발생. 해결책: page 크기 최적화.
  • 메모리 참조 오버헤드(성능): 주소 조회마다 page table 참조 + 실제 메모리 = 2회 참조. 해결책: TLB(하드웨어 캐시).
  • page table 공간 오버헤드: 32비트 주소 + 4KB page → 220개 PTE × 4B = 4MB/프로세스. 프로세스 25개면 100MB. 해결책: multi-level page table, inverted page table 등.

Q5 segmentation의 개념과 하드웨어 지원 방식을 설명하고, paging과 비교하여 각각의 단편화 유형이 다른 이유를 서술하시오.

모범답안 보기

Segmentation은 메모리를 코드·스택·힙 같은 논리적 단위(segment)로 나누는 기법이다. 가상 주소는 <segment# :: offset> 형태이며, 각 segment는 독립적으로 크기를 조절할 수 있다.

하드웨어는 segment table로 지원한다. 각 항목에는 base(물리 시작 주소)와 limit(크기)이 있다. 주소 변환 시 offset이 limit보다 작은지 확인한 후 base + offset으로 물리 주소를 계산한다. limit 초과 접근 시 protection fault.

단편화 비교

  • Paging: 고정 크기 frame을 사용하므로 external fragmentation이 없다. 대신 프로세스가 page 배수만큼 사용하지 않으면 마지막 page 내에 낭비가 생기는 internal fragmentation이 발생한다.
  • Segmentation: 가변 크기 segment를 할당·해제하면 물리 메모리 사이사이에 사용할 수 없는 작은 빈 공간들이 생기는 external fragmentation이 발생한다. segment 내부에서는 필요한 만큼만 사용하므로 internal fragmentation은 없다.

Q6 demand paging이 실용적으로 동작할 수 있는 이유를 locality 개념을 중심으로 설명하고, "demand" paging이라는 이름의 의미를 서술하시오.

모범답안 보기

Demand paging이 실용적인 근본 이유는 locality이다.

  • temporal locality: 최근에 참조한 위치는 가까운 미래에 다시 참조될 가능성이 높다.
  • spatial locality: 최근에 참조한 위치 근처도 곧 참조될 가능성이 높다.

locality 덕분에 한 번 메모리에 적재된 page는 이후 여러 번 재사용된다. 따라서 page fault는 비교적 드물게 발생하고, 전체 평균 메모리 접근 시간이 허용 가능한 수준으로 유지된다.

"demand" paging이라는 이름은 프로세스가 실제로 page를 요구(demand)할 때, 즉 처음 접근할 때만 메모리에 올린다는 의미이다. 프로세스 시작 시 모든 PTE의 valid bit가 false이므로 첫 명령 실행부터 cold fault가 발생하며, 실제로 필요한(demanded) page만 순차적으로 적재된다.

Q7 segmentation with paging의 개념과 필요성을 설명하고, 이 기법이 external fragmentation을 제거하는 이유를 서술하시오.

모범답안 보기

Segmentation with paging은 segmentation과 paging을 결합한 하이브리드 기법이다. IA-32(x86) 아키텍처가 대표적으로 지원한다.

동작 원리

  • segmentation으로 코드·데이터·힙·스택 등을 논리 단위로 관리한다. segment는 보통 크기가 크며 논리적 보호·공유 이점을 제공한다.
  • 각 segment는 고정 크기 page로 다시 분할된다. segment가 "pageable"해진다.
  • segment 전체를 메모리에 올리는 대신 필요한 page 부분만 이동시킨다.

external fragmentation 제거 이유

순수 segmentation에서는 가변 크기 segment를 물리 메모리에 배치할 때 크기가 들쭉날쭉해 external fragmentation이 생긴다. 하지만 segmentation with paging에서는 segment를 고정 크기 page로 분할하고, 물리 메모리는 항상 고정 크기 frame 단위로 할당한다. 따라서 빈 frame이 있는 한 항상 할당할 수 있고 외부 단편화가 발생하지 않는다.

Q8 pagingsegmentation의 차이점을 "프로그래머에게 투명한가", "코드·데이터 별도 보호가 가능한가", "단편화 유형" 측면에서 비교하고, 각 기법이 발명된 목적을 서술하시오.

모범답안 보기

프로그래머 투명성

  • Paging: 투명(yes). 가상 주소 공간은 프로그래머에게 0부터 N까지의 연속 공간처럼 보이고 page 경계는 의식할 필요 없다.
  • Segmentation: 투명하지 않음(no). 프로그래머(또는 컴파일러)가 segment 경계를 인식해야 하며 가상 주소가 <segment#::offset> 형태이다.

코드·데이터 별도 보호

  • Paging: page 단위 protection bit가 있지만 논리적 코드/데이터 경계와 page 경계가 일치하지 않을 수 있어 제한적.
  • Segmentation: code segment는 read-only/execute, data segment는 read-write 등으로 segment 수준에서 명확하게 보호 가능.

단편화 유형

  • Paging: internal fragmentation (마지막 page의 미사용 공간).
  • Segmentation: external fragmentation (가변 크기 할당·해제로 인한 조각난 빈 공간).

발명 목적

  • Paging: 큰 선형 가상 주소 공간을 효율적으로 제공하기 위해.
  • Segmentation: 논리적으로 독립된 주소 공간 — 공유와 보호를 용이하게 하기 위해.