2025-2 운영체제론 수업 중간고사 대비하면서 강의안 기준으로 정리한 내용입니당 φʕ•ᴥ•oʔ
시험은 끝났지만 요새 오전 5시에도 잠이 안와서 수면패턴 똥망한김에 정리해보았습니다🫠
주의사항
> 이 글의 비트 분해 및 주소 계산은 강의 예제(12-bit VA, 9-bit PA, 32B 페이지, 16-line 2-way 캐시)를 기준으로 작성되었습니다.
실제 시스템에서는 운영체제(OS) 와 하드웨어 아키텍처, 페이지 크기, 캐시 구성, 메모리 관리 정책 등에 따라 주소 비트의 분할(tag/index/offset) 및 계산 결과가 달라질 수 있습니다!
1. Virtual Memory 기본 개념
| Virtual Memory | 프로세스마다 독립된 주소 공간을 제공하여, 실제 RAM보다 큰 메모리를 쓸 수 있게 하는 논리적 메모리 체계 | CPU가 사용하는 주소는 Virtual Address (VA) |
| Virtual Address (VA) | 프로세스가 바라보는 메모리 주소. CPU가 직접 접근하는 주소 | 문제에서 12비트로 주어짐 (0x0C2, 0x329 등) |
| Physical Address (PA) | 실제 하드웨어 메모리(RAM) 주소 | 문제에서 9비트 (총 512B 메모리 공간) |
| Address Translation | VA를 PA로 바꾸는 과정. OS와 MMU가 담당 | VPN → PPN으로 변환한 뒤 오프셋 붙여 PA 생성 |
기본 흐름
CPU → MMU → (TLB → Page Table) → Physical Memory
2. Paging (페이지 기법)
페이징 용어
| Page | 가상 메모리를 일정 크기의 단위로 나눈 블록 | 한 페이지 = 32B (즉, 2⁵ bytes) |
| Page Frame | 실제 물리 메모리(RAM)의 페이지 단위 공간 | 문제의 PPN (Physical Page Number) |
| Page Table | VPN → PPN 매핑을 저장한 테이블. 각 엔트리에 Valid bit 포함 | "Page Table for first 32 pages" 표 |
| Page Table Entry (PTE) | 한 페이지에 대한 정보: (Valid, PPN, Protection bits 등) | 표의 각 행 (예: VPN=0x06 → PPN=0x9, V=1) |
| Valid Bit | 1이면 메모리에 존재, 0이면 디스크에 있음 | Valid=0 → Page Fault 발생 |
| Page Fault | 접근한 페이지가 메모리에 없을 때 발생. OS가 디스크에서 적재해야 함 | 문제에서 Valid=0일 때 "DISK"로 표기 |
Page Fault 처리 과정
Valid=0이면 page fault 발생
→ OS가 page-in 수행
→ Page Table 업데이트 후 재시도
3. TLB (Translation Lookaside Buffer)
TLB 용어
| TLB | "VPN→PPN 변환결과"를 캐시하는 하드웨어 버퍼 | 4-way, 16 entries → 4 sets |
| TLB Tag (TLBT) | VPN 상위 비트. TLB 세트 내에서 어느 VPN인지 구별 | VPN 상위 5bit |
| TLB Index (TLBI) | 세트 선택 비트 (몇 번째 set?) | VPN 하위 2bit |
| TLB Entry | { Tag, PPN, Valid } 구조. Valid=1이면 변환 결과 사용 가능 | 표에서 각 세트별 4행으로 주어짐 |
| TLB Hit | 세트 안에서 Tag 일치 + Valid=1 | PPN 즉시 사용 |
| TLB Miss | 세트 내 Tag 불일치 or Valid=0 | Page Table 참조해야 함 |
TLB Lookup Flow
VPN → [TLB lookup]
├─ Hit → PPN 획득
└─ Miss → Page Table → (Page Fault?) → PPN
4. Address Breakdown (주소 비트 분할)
기본 원칙
페이지 크기가 2ᵏ이면, 하위 k비트는 Page Offset(VPO/PPO), 나머지 상위 비트는 Page Number(VPN/PPN)입니다.
비트 분할표
| Page Size | 32B = 2⁵ | log₂(32) | offset = 5bit |
| VA bits | 12 | - | 12 |
| VPN | 12−5 | 12−5 | 7 bits |
| TLB Index (TLBI) | 16 entries, 4-way (16/4=4 sets) | log₂(4) | 2 bits |
| TLB Tag (TLBT) | 7−2 | 7−2 | 5 bits |
| PA bits | 9 | - | 9 bits |
| PPN | 9−5 | 9−5 | 4 bits |
| Block Offset (CO) | 4 byte line size=2² | log₂(4) | 2 bits |
| Cache Index (CI) | 16 lines, 2-way (16/2=8 sets) | log₂(8) | 3 bits |
| Cache Tag (CT) | 9−(3+2) | 9−5 | 4 bits |
Address 변환
PA = (PPN << offset) + VPO
예: (0x9 << 5) + 0x2 = 0x122
5. Cache Memory
캐시 용어
| Cache | CPU가 자주 쓰는 데이터를 저장하는 빠른 메모리 | 2-way, line size 4B, 총 16라인 (8세트) |
| Block / Line | 캐시가 데이터를 저장하는 최소 단위 | 4B |
| Cache Tag (CT) | 물리주소 상위 비트로 세트 내 블록 구분 | PA 상위 4bit |
| Cache Index (CI) | 캐시 세트 선택 | PA 중간 3bit |
| Block Offset (CO) | 한 캐시 블록 내 바이트 위치 | PA 하위 2bit |
| Cache Hit | 세트 내 Tag 일치 + Valid=1 | 데이터 읽음 |
| Cache Miss | Tag 불일치 or Invalid | "MEM" (메모리 접근) |
캐시 접근 방식
PA[8:0] = [ Tag(4) | Index(3) | Offset(2) ]
6. 전체 주소 변환 흐름
Virtual → Physical Address Translation Flow
CPU Virtual Address (VA)
│
├─► [TLB Lookup] ───► (Hit?) ─────► PPN (물리페이지번호)
│ │
│ └─► (Miss) ─► Page Table Lookup
│ │
│ ├─ Valid=0 → Page Fault
│ └─ Valid=1 → PPN 획득
│
└─► Combine with VPO → Physical Address (PA)
│
▼
[Cache Lookup]
│
├─ Hit → 데이터 반환
└─ Miss → 메모리 접근
표준 처리 절차
┌────────────────────────────────────────────────┐
│ 가상주소 VA (12b) 입력 │
└───────┬───────────────────────────────┬────────┘
│ │
▼ ▼
[ VPN(7) 추출 ] [ VPO(5)=PPO ]
│
┌───────┴────────────────────────────────────────────────┐
│ VPN(7) = [TLB TAG(5) | TLB IDX(2)] 분해 │
└───────┬────────────────────────────────────────────────┘
│
▼
┌────────────────────────────────────────────────────────┐
│ TLB Lookup: 세트 = TLB IDX(2) │
│ └─ 4-way 중 (TAG==TLB TAG & Valid=1) 있으면 HIT │
└───────┬────────────────────────────────────────────────┘
(HIT) │ (MISS)
│ │
▼ ▼
[ PPN ← TLB에서 얻음 ] ┌─────────────────────────┐
│ │ Page Table[VPN] 조회 │
│ │ Valid=1 → PPN 획득 │
│ │ Valid=0 → Page Fault │
│ └───────────┬────────────┘
│ (Fault) │ (Hit)
│ │
▼ ▼
┌─────────────────────┐ [ PPN 획득 ]
│ Page Fault 처리(디스크)│ │
└─────────────────────┘ │
▼
┌────────────────────────────────────┐
│ 물리주소 PA = (PPN<<5) | VPO │
└───────┬────────────────────────────┘
│
▼
┌──────────────────────────────────────────────────┐
│ 캐시 접근 (물리기반) │
│ PA[8:5]=CT, PA[4:2]=CI, PA[1:0]=BO │
│ 세트 CI에서 2-way 중 (Tag==CT & Valid=1) → HIT │
│ - HIT: 라인 데이터의 바이트[BO] = 값 │
│ - MISS: 메모리에서 가져옴 → "MEM" │
└──────────────────────────────────────────────────┘
7. Page Offset의 이해
Page Offset이란?
한 페이지 안에서 "몇 번째 바이트인가"를 나타내는 값입니다.
가상주소의 구조
가상주소(VA) = [ VPN | VPO ]
이름뜻예시 값역할
| VPN (Virtual Page Number) | 이 주소가 몇 번째 페이지인지 | 0x06, 0x19 등 | 페이지 테이블에서 "행" 찾기 |
| VPO (Virtual Page Offset) | 그 페이지 안에서 몇 번째 바이트인지 | 0x02, 0x09 등 | 페이지 안의 세부 위치 |
페이지 오프셋의 크기
페이지 크기가 32 bytes라면 이 페이지 안에는 다음과 같이 주소가 있습니다:
페이지 시작 주소 0 (offset=0)
페이지 안의 1번째 바이트 1 (offset=1)
...
페이지 안의 마지막 바이트 31 (offset=31)
페이지 오프셋은 0~31 사이의 값이고, 이를 표현하려면 5비트(2⁵=32)가 필요합니다.
구조도
가상주소 (12비트)
┌──────────────┬────────────┐
│ VPN (7bit) │ VPO (5bit)│
└──────────────┴────────────┘
↑
└─ 페이지 안에서의 위치 (0~31)
중요한 특징: 페이지 오프셋은 변하지 않는다
페이지 오프셋은 가상주소와 물리주소에서 동일하게 유지됩니다.
가상주소: [VPN | VPO]
TLB/PT: VPN → PPN (페이지만 바뀜)
물리주소: [PPN | VPO]
VPO는 그대로 복사됩니다. 왜냐하면 페이지 안에서의 세부 위치는 변환과 무관하기 때문입니다.
실제 주소 변환 예시
예) VA = 0x0C2, 페이지 크기 = 32B → offset 5bit
VA 분해
- VPN = 0x06
- VPO = 0x02
페이지 테이블/TLB에서
- VPN 0x06 → PPN 0x09
물리주소 조합
PA = (PPN << 5) | VPO = (0x09 << 5) | 0x02 = 0x122
즉, "가상페이지 6의 2번째 바이트"가 "물리페이지 9의 2번째 바이트"로 변환됩니다.
8. 1-byte word의 중요성
1-byte word의 의미
CPU는 메모리를 읽을 때 "한 번에 몇 바이트씩 읽느냐"를 정하는데, 그 단위를 word라고 합니다.
시스템1 word = 몇 byte주소 증가 단위
| 1-byte word 시스템 | 1 | 주소가 1씩 증가할 때 1바이트씩 이동 |
| 4-byte word 시스템 | 4 | 주소가 1씩 증가할 때 4바이트씩 이동 (32비트 CPU 등) |
이번 문제는 1-byte word → 즉, 주소 1 = 1바이트 단위 주소
계산에 미치는 영향
페이지 크기, 캐시 블록 크기 계산
1바이트 단위 주소 (문제의 경우):
- 페이지 크기가 "32 bytes"
- 1바이트 단위 주소라면 "32바이트 페이지 = 32개의 주소"
- offset bit 수 = log₂(32) = 5 bits
만약 4-byte word 시스템이었다면:
- 1주소당 4바이트니까
- 페이지당 "8 words" → log₂(8) = 3bit 오프셋
캐시 블록 오프셋 계산
- 캐시 line size = 4 bytes → block offset = log₂(4) = 2 bits
- 이때도 "주소 1 = 1바이트" 기준이니까 그대로 2 비트
물리 주소 계산 시 덧셈 단위
Physical Address = (PPN << offset_bits) | VPO
offset_bits = 5 (32B 페이지)
오프셋 단위가 "바이트 주소"니까, 단순히 << 5 = × 32 bytes = 32 addresses × 1 byte
PPN × 32 = 다음 페이지 시작 주소가 정확히 32 byte 간격
비교표
항목1바이트 주소 단위4바이트 word 단위
| 주소 표현 | 0x0, 0x1, 0x2, 0x3 ... → 각각 1byte 위치 | 0x0, 0x1, 0x2 ... → 각각 4byte씩 건너뜀 |
| 페이지 오프셋 | 32B → offset = 5bit | 32B = 8word → offset = 3bit |
| 캐시 오프셋 | 4B → offset = 2bit | 4B = 1word → offset = 0bit |
정리
"메모리 접근이 1-byte words" = 주소 1당 1바이트씩 증가한다는 뜻입니다.
덕분에 이번 문제에서:
- 페이지 오프셋 5bit
- 캐시 오프셋 2bit가 그대로 적용
- 물리주소 계산을 바이트 단위로 정확히 수행 가능
9. 비트 분해 구조도
VPN/VPO 분해 (Paging 영역)
VA(12bit)
┌────────────┬────────────┐
│ VPN (7bit) │ VPO (5bit) │
└────────────┴────────────┘
↑
Page Offset (32B 페이지 내부 위치)
- VPN은 페이지 번호
- VPO는 페이지 내부 위치 (0~31)
- VPN은 TLB/페이지테이블로 변환
- VPO는 그대로 물리주소에 붙음
TLB 구조 (4-way, 16 entries → 4 sets)
VPN(7bit)
┌────────────┬────┐
│ TLB TAG(5) │IDX(2)│
└────────────┴────┘
│
├─ Set 선택 (IDX)
└─ Tag 비교 (TAG)
- TLB Index(2bit): 세트 선택
- TLB Tag(5bit): 세트 내 매칭용
- Valid=1 & Tag 일치 → TLB Hit → PPN 획득
- Miss → Page Table 확인
페이지 테이블 (VPN→PPN 매핑)
VPN Valid PPN
0x00 1 3
0x01 1 5
... ... ...
0x06 1 9
0x19 1 5
- Valid=0 → Page Fault (Disk)
- Valid=1 → PPN 사용
PA/Cache 비트 분해
PA(9bit)
┌────────────┬──────────┬────────┐
│ CT(4bit) │ CI(3bit) │ CO(2bit) │
└────────────┴──────────┴────────┘
- CT (Cache Tag): 세트 내 블록 식별
- CI (Cache Index): 세트 선택 (8세트)
- CO (Block Offset): 4B 라인 안의 바이트 위치
10. 실전 예제
예제 1: VA = 0x0C2
비트/필드 계산
0x0C2 = 0000 1100 0010₂
VPO = 0x02
VPN = ⌊0x0C2 / 32⌋ = 0x06 (000 0110₂)
TLB IDX = VPN 하위 2b = 6 mod 4 = 2
TLB TAG = VPN>>2 = 0x01
구조도 (값 삽입)
VA=0x0C2
├─ VPN=0x06, VPO=0x02
├─ TLB: IDX=2, TAG=0x01
│ └─ 세트#2에서 TAG=0x01 & V=1 발견 → TLB HIT
│ └─ PPN=0x9 (표에서 가져옴)
└─ PA = (0x9<<5) | 0x02 = 0x122
├─ CT = PA[8:5] = 0x4
├─ CI = PA[4:2] = 0x4
└─ BO = PA[1:0] = 0x2
캐시 세트 CI=4 확인:
- 보유 Tag ≠ 0x4 (예: 0x7 또는 0x6) → Cache MISS
요약 답
- VPN=0x06
- TLBI=2
- TLBT=0x01
- TLB Hit=Yes
- Page Fault=No
- PPN=0x9
- PA=0x122
- Cache Hit=No
예제 2: VA = 0x329
비트/필드 계산
0x329 = 0011 0010 1001₂
VPO = 0x09
VPN = ⌊0x329 / 32⌋ = 0x19 (001 1001₂)
TLB IDX = 0x19 mod 4 = 1
TLB TAG = 0x19>>2 = 0x06
구조도 (값 삽입)
VA=0x329
├─ VPN=0x19, VPO=0x09
├─ TLB: IDX=1, TAG=0x06
│ └─ 세트#1에 TAG=0x06 & V=1 없음 → TLB MISS
│ └─ Page Table[VPN=0x19] 조회:
│ Valid=1, PPN=0x5 → Page Fault 없음
└─ PA = (0x5<<5) | 0x09 = 0x159
├─ CT = PA[8:5] = 0x5
├─ CI = PA[4:2] = 0x2
└─ BO = PA[1:0] = 0x1
캐시 세트 CI=2 확인:
- 2-way 중 Tag=0x5 & Valid=1 발견 → Cache HIT
- 값 = 라인 데이터의 Byte[BO=1] = 0xC6
요약 답
- VPN=0x19
- TLBI=1
- TLBT=0x06
- TLB Hit=No
- Page Fault=No
- PPN=0x5
- PA=0x159
- Cache Index=2
- Cache Tag=0x5
- Cache Hit=Yes
- Value=0xC6
11. 주소 변환 단계별 요약
단계별 처리
단계강의안 개념실제 계산
| (1) VA 분해 | VPN, VPO | 0x0C2 → VPN=0x6, VPO=0x2 |
| (2) TLB lookup | TLBT, TLBI | 세트=2, 태그=0x1 → HIT |
| (3) PT lookup | Valid, PPN | Valid=1 → PPN=0x9 |
| (4) 주소 결합 | (PPN<<5)+VPO | PA=0x122 |
| (5) 캐시 접근 | CT, CI, CO | CT=0x4, CI=4, CO=2 → MISS |
| (6) 최종 결과 | - | 캐시 미스 → "MEM" or 물리주소 접근 |
Page Fault vs Cache Miss 비교
구분Page FaultCache Miss
| 발생 위치 | 메모리 계층 중 가상→물리 변환 과정 | 메모리 계층 중 캐시 |
| 원인 | 페이지 테이블 Valid=0 | 캐시에 블록 없음 |
| 처리 주체 | OS (디스크 접근 필요) | 하드웨어 자동 (메모리에서 라인 fetch) |
| 처리 시간 | 매우 느림 (ms 수준) | 빠름 (ns~µs 수준) |
| 이번 문제에서 | PT Valid=1 → No fault | 캐시 Tag 불일치 → Miss |
12. 시험 대비 요약
주소 변환 5단계
- VA 분해: VA → (VPN, VPO)
- TLB: (TLB IDX, TLBTAG)로 세트 대조 → Hit? Miss면 PT 조회
- PT: Valid=1 → PPN, 0 → Page Fault
- PA: (PPN<<5) | VPO
- Cache(물리기반): CT/CI/BO 분해 → 세트에서 태그/Valid 대조 → Hit→Byte[BO], Miss→"MEM"
전체 흐름 한줄 요약
가상주소(VA) → [TLB Hit/Miss] → [Page Table Valid 확인] → 물리주소(PA) 계산 → [Cache Hit/Miss 판정]
13. 비트 수 계산 규칙
모든 비트 수는 2의 로그(log₂) 규칙을 따릅니다:
- Page Offset: log₂(Page Size)
- VPN: Total VA bits - Page Offset bits
- TLB Index: log₂(Number of Sets)
- TLB Tag: VPN bits - TLB Index bits
- Cache Index: log₂(Number of Sets)
- Block Offset: log₂(Block Size)
- Cache Tag: PA bits - (Cache Index + Block Offset)
14. 변환되지 않는 비트
주소 변환 과정에서 오프셋 비트는 변환되지 않고 그대로 유지됩니다:
VPO = PPO (페이지 오프셋은 동일)
이는 페이지 내부 위치가 변환과 무관하기 때문
15. Hit/Miss 판정
TLB Hit 조건
- 해당 세트에 Tag 일치
- Valid bit = 1
Page Table Hit 조건
- Valid bit = 1
- Valid = 0이면 Page Fault
Cache Hit 조건
- 해당 세트에 Tag 일치
- Valid bit = 1
16. 문제 풀이 체크리스트
- VA를 VPN과 VPO로 분해
- VPN을 TLB Tag와 TLB Index로 분해
- TLB에서 Hit/Miss 확인
- Miss면 Page Table에서 Valid 확인
- PPN 획득 후 PA 계산
- PA를 CT, CI, CO로 분해
- Cache에서 Hit/Miss 확인
- Hit면 데이터 값, Miss면 "MEM" 또는 물리주소
이 순서를 정확히 따르면 모든 문제를 해결할 수 있습니다.
17. 메모리 계층 구조
┌────────────────────────────────────┐
│ CPU (Virtual Address) │
└────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────┐
│ TLB (Translation Cache) │
│ - VPN → PPN 변환 결과 저장 │
└────────────┬───────────────────────┘
│ (Miss)
▼
┌────────────────────────────────────┐
│ Page Table (Main Memory) │
│ - VPN → PPN 매핑 │
└────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Physical Address │
└────────────┬───────────────────────┘
│
▼
┌────────────────────────────────────┐
│ Cache (Data Cache) │
│ - 자주 쓰는 데이터 저장 │
└────────────┬───────────────────────┘
│ (Miss)
▼
┌────────────────────────────────────┐
│ Main Memory (RAM) │
└────────────────────────────────────┘
18. 핵심 개념 정리
- Virtual Memory: 프로세스마다 독립된 주소 공간 제공
- Paging: 메모리를 고정 크기 단위로 관리
- TLB: 주소 변환 결과를 캐싱하여 속도 향상
- Page Table: VPN을 PPN으로 변환하는 매핑 테이블
- Cache: 자주 사용되는 데이터를 빠르게 접근
- Page Fault: 페이지가 메모리에 없을 때 발생하는 예외
- Address Translation: VA → PA 변환 과정
- Memory Hierarchy: TLB → Page Table → Cache → Memory
19. 최종 요약
운영체제 메모리 계층 구조
CPU → TLB → Page Table → RAM → Disk
핵심 원리
- CPU는 가상 주소(VA)로 메모리 접근
- MMU가 TLB/Page Table을 통해 물리 주소(PA)로 변환
- Cache에서 데이터 확인 후 없으면 RAM 접근
- RAM에도 없으면(Page Fault) 디스크에서 가져옴
- 이 과정이 투명하게 처리되어 프로그램은 무한한 메모리를 가진 것처럼 동작
'concept' 카테고리의 다른 글
| [운영체제론] Constant Time Coalescing (Case 1-4) 정리 (0) | 2025.11.08 |
|---|---|
| tmux (수정 예정) (0) | 2025.11.03 |
| [운영체제론] Dynamic Memory Allocation (0) | 2025.10.29 |
| [운영체제론] errno와 시그널 핸들러 (1) | 2025.10.23 |
| 컴퓨터 시스템의 메모리 계층 및 가상 메모리 구조 (0) | 2025.10.17 |