메모리 관리
메모리 관리
📝 개념 정의
가상 메모리 (Virtual Memory)
실제 물리 메모리보다 큰 메모리 공간을 제공하는 기술입니다.
핵심 아이디어:
- 프로세스 전체가 메모리에 올라가지 않아도 실행 가능
- RAM과 디스크를 하나의 추상화된 메모리 영역으로 제공
- 필요한 부분만 메모리에 적재, 나머지는 디스크에 저장
페이징 (Paging)
프로세스의 가상 주소 공간을 **고정 크기 단위(Page)**로 나누어 메모리에 할당하는 방식입니다.
용어:
- Page: 가상 메모리의 고정 크기 블록
- Frame: 물리 메모리의 고정 크기 블록 (Page와 동일한 크기)
- Page Table: Page와 Frame의 매핑 정보 저장
🎯 가상 메모리의 필요성
등장 배경
- 시스템 안정성: 프로세스 비정상 종료 시 시스템 전체 영향 방지
- 메모리 제약 극복: 물리 메모리보다 큰 프로그램 실행 가능
- 참조 지역성: 전체 프로세스가 메모리에 없어도 실행 가능
장점
✅ 메모리 제약 해소: 물리 메모리 크기에 제한받지 않음 ✅ 멀티프로그래밍: 여러 프로그램 동시 실행으로 CPU 이용률 증가 ✅ I/O 감소: 필요한 부분만 로드하여 스왑 I/O 감소
💾 페이징 (Paging)
개념
가상 주소 공간과 물리 메모리를 동일한 고정 크기로 나누어 관리하는 방식입니다.
가상 메모리 (64 bytes) 물리 메모리 (128 bytes)
┌─────────┐ ┌─────────┐
│ Page 0 │ ──────────────────> │ Frame 7 │
├─────────┤ ├─────────┤
│ Page 1 │ ──────────────────> │ Frame 3 │
├─────────┤ ├─────────┤
│ Page 2 │ ──────────────────> │ Frame 5 │
├─────────┤ ├─────────┤
│ Page 3 │ ──────────────────> │ Frame 2 │
└─────────┘ └─────────┘
장점
✅ 유연성: Heap/Stack 크기 걱정 불필요 ✅ 단순성: 여유 공간 관리 용이 ✅ 외부 단편화 해결: 고정 크기로 단편화 방지
주소 변환 (Address Translation)
가상 주소 구성
┌──────────┬──────────┐
│ VPN │ Offset │
└──────────┴──────────┘
- VPN (Virtual Page Number): Page 번호
- Offset: Page 내 위치
변환 과정
1. 가상 주소 21 (64-byte 주소 공간)
Binary: 010101
2. VPN 추출 (상위 2비트): 01 = Page 1
Offset 추출 (하위 4비트): 0101 = 5
3. Page Table 조회: Page 1 → Frame 7
4. 물리 주소 계산: Frame 7 + Offset 5 = 117
Page Table
역할: 가상 주소를 물리 주소로 매핑하는 자료 구조
저장 위치: OS 가상 메모리
구조: 1차원 배열 (VPN을 인덱스로 사용)
Page Table Entry (PTE)
| 비트 | 이름 | 설명 | |------|------|------| | Present | 유효 비트 | 메모리/디스크 존재 여부 | | R/W | 보호 비트 | 읽기/쓰기 권한 | | U/S | 사용자 비트 | 사용자 모드 접근 가능 여부 | | A | 참조 비트 | 최근 참조 여부 (페이지 교체 시 사용) | | D | 수정 비트 | 페이지 수정 여부 | | PFN | 프레임 번호 | 물리 메모리 프레임 번호 |
페이징의 문제점
❌ 메모리 오버헤드: Page Table 크기가 큼
- 예: 32bit 주소 공간, 4KB Page → 4MB Page Table
❌ 성능 저하: 메모리 접근마다 Page Table 조회 필요
- 실제 데이터 접근 전에 추가 메모리 접근 발생
해결책: TLB (Translation Lookaside Buffer) - 하드웨어 캐시
🔄 요구 페이징 (Demand Paging)
개념
필요한 Page만 메모리에 적재하는 기법입니다.
특징:
- 사용되지 않는 Page는 스왑 공간(디스크)에 저장
- 메모리 절약 및 스왑 시간 감소
Valid/Invalid Bit
- Valid: Page가 메모리에 존재
- Invalid: Page가 스왑 공간에 존재
페이지 폴트 (Page Fault)
Invalid Page 접근 시 발생하는 인터럽트입니다.
처리 과정
1. 프로세스가 Page 접근 → Page Table 확인 → Invalid
2. 페이지 폴트 트랩 발생 → OS 인터럽트 핸들러 실행
3. 스왑 공간에서 해당 Page 읽기 (I/O 작업)
4. 빈 Frame에 Page 적재
5. Page Table 갱신 (Invalid → Valid)
6. 프로세스 재시작
성능 고려사항
페이지 폴트율 영향:
- 모든 데이터가 메모리에 있을 때보다 약 10배 성능 저하
- 하지만 참조 지역성으로 실제 성능 저하는 드물게 발생
최적화 방법:
- 효율적인 스왑 공간 관리
- 페이지 교체 알고리즘 개선
🔀 페이지 교체 (Page Replacement)
메모리 과할당 (Over-allocation)
물리 메모리의 모든 Frame이 할당되어 빈 Frame이 없는 상태입니다.
해결 방법
- ❌ 프로세스 종료: 실행 중단 (비효율적)
- ❌ 프로세스 스와핑: 전체 스왑 (비용 큼)
- ✅ 페이지 교체: 일부 Page만 스왑 (효율적)
페이지 교체 알고리즘
1. FIFO (First In First Out)
방식: 가장 오래된 Page 교체
장점:
- 구현 간단 (Queue 사용)
단점:
- 성능 보장 불가
- Belady의 모순 발생 가능
2. OPT (Optimal Page Replacement)
방식: 앞으로 가장 오래 사용되지 않을 Page 교체
장점:
- 이론적으로 최적
- 다른 알고리즘 성능 비교 기준
단점:
- 미래 예측 불가능 → 실제 구현 불가
3. LRU (Least Recently Used)
방식: 가장 오래 사용되지 않은 Page 교체
장점:
- OPT에 근사
- 실제 구현 가능
구현:
- 참조 시간 기록
- Stack 자료구조 사용 (최근 참조 Page가 Top)
단점:
- 하드웨어 지원 필요
- 모든 참조마다 시간 정보 갱신
4. LFU/MFU (Counting 기반)
LFU (Least Frequently Used):
- 참조 횟수가 가장 적은 Page 교체
MFU (Most Frequently Used):
- 참조 횟수가 가장 많은 Page 교체
단점:
- 구현 복잡
- 최적 알고리즘에 근사하기 어려움
알고리즘 비교
| 알고리즘 | 구현 난이도 | 성능 | 실용성 | |----------|-------------|------|--------| | FIFO | 쉬움 | 낮음 | 높음 | | OPT | 불가능 | 최적 | 없음 (이론적) | | LRU | 보통 | 높음 | 높음 | | LFU/MFU | 어려움 | 보통 | 낮음 |
💡 참조 지역성 (Locality of Reference)
개념
프로그램이 특정 시간에 특정 메모리 영역을 집중적으로 참조하는 경향입니다.
종류
시간적 지역성 (Temporal Locality):
- 최근 참조한 메모리를 다시 참조
- 예: 반복문의 변수
공간적 지역성 (Spatial Locality):
- 참조한 메모리 근처를 참조
- 예: 배열 순차 접근
중요성:
- 가상 메모리 성능의 핵심
- 캐시 메모리 효율성 결정
❓ 면접 질문 예시
Q1. 가상 메모리란 무엇이고 왜 필요한가요?
답변: 가상 메모리는 실제 물리 메모리보다 큰 메모리 공간을 제공하는 기술입니다. 프로세스 전체를 메모리에 올리지 않고 필요한 부분만 적재하여 실행할 수 있습니다. 이를 통해 물리 메모리 크기 제약을 극복하고, 여러 프로그램을 동시에 실행할 수 있으며, 시스템 안정성을 확보할 수 있습니다.
Q2. 페이징이란 무엇이고 장점은?
답변: 페이징은 가상 주소 공간과 물리 메모리를 고정 크기 단위(Page/Frame)로 나누어 관리하는 방식입니다. 장점으로는 외부 단편화 문제 해결, 유연한 메모리 관리, 간단한 여유 공간 관리가 있습니다. Page와 Frame이 같은 크기이므로 할당이 쉽고 메모리 관리가 단순합니다.
Q3. 페이지 폴트란 무엇이고 어떻게 처리되나요?
답변: 페이지 폴트는 프로세스가 접근하려는 Page가 메모리에 없을 때 발생하는 인터럽트입니다. 처리 과정은: 1) Page Table에서 Invalid 확인, 2) 페이지 폴트 트랩 발생, 3) 스왑 공간에서 Page 읽기, 4) 메모리에 적재, 5) Page Table 갱신, 6) 프로세스 재시작입니다.
Q4. LRU 페이지 교체 알고리즘을 설명해주세요.
답변: LRU는 가장 오래 사용되지 않은 Page를 교체하는 알고리즘입니다. 과거 참조 이력을 기반으로 하며, 최적 알고리즘(OPT)에 근사합니다. Stack 자료구조를 사용하여 최근 참조된 Page를 Top에 유지하고, Bottom의 Page를 교체합니다. 하드웨어 지원이 필요하지만 실제로 구현 가능하고 성능이 우수합니다.
Q5. 참조 지역성이 가상 메모리 성능에 미치는 영향은?
답변: 참조 지역성은 프로그램이 특정 시간에 특정 메모리 영역을 집중적으로 참조하는 경향입니다. 시간적 지역성(최근 참조한 메모리 재참조)과 공간적 지역성(인접 메모리 참조)으로 나뉩니다. 이로 인해 프로세스 전체가 메모리에 없어도 필요한 부분만으로 실행이 가능하며, 페이지 폴트 발생률이 낮아져 가상 메모리 성능이 향상됩니다.
📚 원본 참고 자료
출처 1: 2023-CS-Study - 가상 메모리
- 파일: os_virtual_memory_and_demand_paging.md
- 내용: 가상 메모리, 요구 페이징, 페이지 교체 알고리즘
출처 2: 2023-CS-Study - 페이징
- 파일: os_paging.md
- 내용: 페이징 개념, Page Table, 주소 변환
추가 학습 자료
🔗관련 문서
이 개념과 함께 학습하면 좋은 문서들입니다.
⬅️이 문서를 참조하는 문서
이 개념을 기반으로 하는 고급 주제들입니다.