2025.04.24
TIL(TODAY I LEARN)
-
오늘한 내용 : CS - 가상메모리 9.1 ~ 9.5
-
WEEK06: 메모리 누수, 균형 이진 탐색 트리(AVL Tree, Red-Black Tree)
9. 가상 메모리
세 가지 주요 기능을 수행
- 캐싱 도구: 느린 디스크 데이터를 빠른 DRAM으로 페이지 단위로 캐싱
- 메모리 관리 도구: 프로그램의 동적 메모리 요청을 유연하게 처리
- 보호 도구: 프로세스 간 메모리 접근을 격리하여 보안과 안정성 보장
9.1 물리 및 가상주소 방식
| 용어 | 정의 |
|---|
| 가상 주소 (Virtual Address) | 프로세스가 사용하는 논리적 주소 공간 (예: 0x8048000) |
| 물리 주소 (Physical Address) | 실제 RAM의 주소 공간 (예: 0x3fbc0000) |
| 주소 변환 (Address Translation) | 가상 주소 → 물리 주소로 변환하는 과정 |
| MMU (Memory Management Unit) | 주소 변환을 수행하는 하드웨어 구성요소 |
| 페이지 테이블 (Page Table) | 가상 주소 → 물리 주소 매핑 정보를 저장하는 자료구조 |
9.2 주소공간
- 비음수 정수 주소의 정렬된 집합
- {0,1,2,…} → 선형적! 선형 주소공간이라 칭함
- 프로세스마다 독립된, 선형적인 가상 주소 공간을 제공하여 물리 메모리를 추상화한다.
- n비트 주소 공간은 2n개의 주소를 표현하고, 최대 주소는 2n−1이다.
- 기본 주소 단위는 바이트(byte)
9.3 캐싱 도구로서의 VM
- 디스크를 위한 캐시 역할
- 디스크의 코드와 데이터를 페이지 단위로 RAM에 불러와 캐싱
- 가상 페이지 : 가상메모리를 규정된 사이즈 블록 단위로 분할한 것
- 3가지 상태를 가짐
- Unallocated(미할당)
- 해당 가상 페이지는 아직 어떤 객체에도 연결되지 않은 상태
- 메모리 요청이 없었고, 운영체제가 페이지를 생성하지도 않았음
- 접근 시 → 세그멘테이션 폴트(segmentation fault) 발생
- Cached (DRAM에 있음)
- 해당 가상 페이지는 DRAM에 존재하며, 실제 물리 메모리와 매핑되어 있음
- 즉, 페이지 테이블 항목이 유효(valid)하고, 물리 프레임과 연결됨
- CPU가 해당 페이지를 즉시 접근 가능
- Uncached (디스크에 있음)
- 해당 가상 페이지는 가상 주소 공간에는 존재하지만, 지금은 DRAM에 없음
- 운영체제가 해당 페이지를 디스크(스왑 영역 또는 파일)로 내보냄
- 접근 시 → 페이지 폴트(page fault) 발생 → OS가 디스크에서 로드함
9.3.1 DRAM 캐시의 구성
- SRAM 캐시 : L1, L2, L3 캐시 메모리
- DRAM 캐시 : 디스크의 페이지를 위한 VM 시스템 캐시
- 완전 결합성(fully associative)에 가까움
- 페이지 미스 발생시 디스크 접근하므로 신중하게 페이지 교체된다.
- 항상 write back을 사용한다.
| 정책 | 설명 | 특징 |
|---|
| Write-through | 쓰기 즉시 메모리에도 반영 | 단순하지만 느림 |
| Write-back | 변경사항을 캐시에만 반영 → 나중에 메모리에 반영 | 성능 좋지만 복잡 |
9.3.2 페이지 테이블
[ 가상 주소 (Virtual Address) 48 bits]
├── [VPN] Virtual Page Number (36 bits)
└── [VPO] Virtual Page Offset (12 bits)
-----
주소 변환 과정
1. CPU → Virtual Address 생성
2. MMU → VPN을 추출
3. 페이지 테이블에서 VPN에 해당하는 PTE 검색
4. valid bit 확인:
- 1이면 → PFN 추출 → VPO로 물리 주소 계산
- 0이면 → 페이지 폴트(Page Fault) 발생
페이지 테이블 구조:
+------+---------------------------+
| VPN | PTE |
+------+---------------------------+
| 0x001| [valid=1, PPN=0x020, R/W] |
| 0x002| [valid=0, ... ] |
| 0x003| [valid=1, PPN=0x01F, R/O] |
+------+---------------------------+
9.3.3 페이지 적중
- CPU가 가상 주소를 통해 접근하려는 가상 페이지가 이미 물리 메모리에 로드되어 있는 상태
- PTE의 valid bit = 1
9.3.4 페이지 오류
- 가상 페이지가 물리 메모리에 존재하지 않을 때 발생하는 예외 상황
- PTE의 valid bit = 0
CPU → 가상 주소 접근
↓
MMU → TLB miss
↓
Page Table lookup
↓
Valid bit == 0 ?
↓
[ Page Fault 발생 ]
↓
OS:
1. 디스크에서 페이지 읽기
2. 물리 메모리에 적재(스와핑)
3. PTE & TLB 업데이트
↓
[ 명령 재시도 → 성공 ]
- 페이지 폴트는 느린 작업 (디스크 접근 포함 → ms 단위 지연)
- 페이지 폴트가 너무 자주 발생하면 시스템 전체 성능 저 (thrashing)
9.3.5 페이지의 할당
| 정책 | 설명 |
|---|
| LRU (Least Recently Used) | 가장 오래 전에 사용된 페이지 제거 |
| FIFO (First-In First-Out) | 가장 먼저 들어온 페이지 제거 |
| Random | 무작위로 하나 제거 (간단하지만 비효율) |
| Clock (Second Chance) | LRU를 근사화한 실용적 알고리즘 |
9.3.6 문제해결을 위한 또 한 번의 지역성의 등장
| 종류 | 설명 | 예시 |
|---|
| 시간 지역성 (Temporal Locality) | 최근에 접근한 데이터는 곧 다시 접근될 가능성 높음 | 반복문에서 사용하는 변수 |
| 공간 지역성 (Spatial Locality) | 가까운 주소의 데이터들이 함께 접근될 가능성 높음 | 배열 순회 |
- 스래싱(Thrashing) : working set이 물리 메모리보다 커지면 페이지들이 계속 해서 스와핑됨 → 프로그램 성능이 급격하게 저하됨.
- 페이지 폴트가 너무 잦아서 디스크 I/O에만 시간을 다 씀.
9.4 메모리 관리 도구로서의 VM
- 링킹 단순화
- 모든 프로그램은 같은 가상 주소에서 실행되도록 설계 가능
- 코드 재사용성 증가, 이식성 향상
- 로딩 단순화
- 프로그램의 일부만 메모리에 올려 실행 시작 가능
- 페이지 단위로 적재(→ 지연 페이징)
- 지연 페이징 : 가상 페이지에 처음 접근하기 전까지는 그 페이지를 물리 메모리에 올리지 않는 전략
- 공유 단순화
- 여러 프로세스가 같은 물리 페이지를 공유하되, 가상 주소는 독립적으로 유지 가능
- 메모리 절약
- copy on write를 통해 빠른 fork 구현 가능
- 메모리 할당 단순화
- 비연속적인 물리 메모리 조각들을 하나의 연속된 가상 메모리로 매핑 가능
- 프로세스는 “연속된 큰 공간”처럼 보이게 할 수 있음
- 메모리 관리 자유도 ↑, 단편화 ↓
| 기능 | 설명 | 효과 |
|---|
| 링킹 단순화 | 모든 프로그램이 같은 가상 주소에서 시작 | 코드 재사용, 모듈성 ↑ |
| 로딩 단순화 | 실행 시점에 필요한 페이지만 로드 | 로딩 속도↑, 메모리↓ |
| 공유 단순화 | 코드/데이터를 여러 프로세스가 공유 가능 | 메모리 절약 |
| 메모리 할당 단순화 | 비연속 메모리를 연속처럼 사용 가능 | 큰 공간도 유연하게 할당 가능 |
9.5 메모리 보호를 위한 도구로서의 VM
가상 메모리는 프로세스 격리(Isolation)와 접근 권한 제한을 통해 시스템의 안정성과 보안을 보장하는 역할을 함.
- 페이지 테이블의 보호 비트(protection bits)가
메모리 접근을 하드웨어 수준에서 제한
- 메모리에 대한 모든 접근은 MMU가 권한을 체크하며,
잘못된 접근 시 예외(interrupt)를 발생시킴
| 보호 유형 | 설명 | 효과 |
|---|
| 코드 실행 보호 | 데이터 영역에서 코드 실행 차단 | 버퍼 오버플로우 방지 |
| 읽기/쓰기 보호 | 코드 수정, 읽기 금지, 비허가 쓰기 차단 | 무결성 보장 |
| 프로세스 격리 | 다른 프로그램 메모리에 접근 불가 | 보안과 안정성 향상 |