논리 주소(가상 주소)를 물리 주소로 변환해서 쓰는 것이 가상 메모리입니다. 면접에서는 "논리 주소" 라는 말로 묻는 경우가 많습니다. 같은 것을 가리키는 두 이름입니다.
가상 메모리
실제 물리 메모리보다 큰 메모리 공간을 프로세스에게 제공하는 기법
왜 필요한가?
물리 메모리: 8GB
프로세스 A: 4GB 요청
프로세스 B: 4GB 요청
프로세스 C: 4GB 요청 ← 메모리 부족!
가상 메모리:
각 프로세스: 4GB 가상 공간
실제로는 필요한 부분만 물리 메모리에
나머지는 디스크(Swap)에 저장
동작 원리
[가상 주소] [페이지 테이블] [물리 메모리]
Page 0 ──────→ Frame 3
Page 1 ──────→ Frame 1
Page 2 ──────→ (디스크) ← 페이지 폴트!
Page 3 ──────→ Frame 7
| 용어 | 설명 |
|---|---|
| 페이지 | 가상 메모리 단위 (보통 4KB) |
| 프레임 | 물리 메모리 단위 |
| 페이지 테이블 | 가상→물리 매핑 |
| TLB | 페이지 테이블 캐시 |
주소 변환 과정
가상 주소: [페이지 번호|오프셋]
↓
TLB 확인 (캐시)
→ 히트: 바로 물리 주소
→ 미스: 페이지 테이블 조회
↓
물리 주소: [프레임 번호|오프셋]
프로세스 격리
프로세스 A의 가상 주소 0x1000
→ 물리 주소 0x5000
프로세스 B의 가상 주소 0x1000
→ 물리 주소 0x8000 (다른 곳!)
→ 각 프로세스는 독립된 메모리 공간
→ 서로의 메모리에 접근 불가 (보안!)
장점과 비용
| 장점 | 비용 |
|---|---|
| 물리보다 큰 메모리 사용 | 주소 변환 오버헤드 |
| 프로세스 격리 (보안) | 페이지 폴트 시 느림 |
| 메모리 공유 (라이브러리) | 페이지 테이블 메모리 |
| 스왑으로 유연한 관리 | 스왑 과다 → Thrashing |
Thrashing
물리 메모리 부족 → 페이지 폴트 빈발
→ 디스크 I/O 폭증 → CPU 이용률 급락
→ OS가 프로세스 추가 → 더 악화!
해결: 메모리 추가, 프로세스 줄이기
페이징과 세그멘테이션
둘 다 가상 주소를 물리 주소로 바꾸지만 자르는 기준이 다릅니다.
| 항목 | 페이징 | 세그멘테이션 |
|---|---|---|
| 자르는 기준 | 고정 크기 (보통 4KB) | 논리 단위 (코드, 데이터, 스택) |
| 남는 낭비 | 내부 단편화. 마지막 페이지의 빈 공간 | 외부 단편화. 사이사이 못 쓰는 틈 |
| 보호 설정 | 페이지 단위 | 단위 자체가 의미를 가져 권한 부여가 자연스럽다 |
내부 단편화는 할당한 칸 안에서 남는 것이고, 외부 단편화는 칸과 칸 사이에 남는 것입니다. 페이징이 널리 쓰이는 이유가 여기 있습니다. 크기가 모두 같으니 빈 칸이면 어디든 들어가고, 사이에 못 쓰는 틈이 생기지 않습니다.
세그멘테이션은 크기가 제각각이라 빈 공간이 흩어집니다. 전체로는 충분한데 연속으로는 모자라 할당이 실패하는 상황이 외부 단편화입니다. 그래서 현대 운영체제는 세그먼트로 의미를 나누고 그 안을 페이지로 관리하는 식으로 둘을 함께 씁니다.