suminworld

concept

[운영체제론] 가상 메모리

숨usm 2025. 10. 31. 06:09

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 TranslationVA를 PA로 바꾸는 과정. OS와 MMU가 담당VPN → PPN으로 변환한 뒤 오프셋 붙여 PA 생성

기본 흐름

 
 
shell
CPU → MMU → (TLB → Page Table) → Physical Memory

2. Paging (페이지 기법)

페이징 용어

Page가상 메모리를 일정 크기의 단위로 나눈 블록한 페이지 = 32B (즉, 2⁵ bytes)
Page Frame실제 물리 메모리(RAM)의 페이지 단위 공간문제의 PPN (Physical Page Number)
Page TableVPN → PPN 매핑을 저장한 테이블. 각 엔트리에 Valid bit 포함"Page Table for first 32 pages" 표
Page Table Entry (PTE)한 페이지에 대한 정보: (Valid, PPN, Protection bits 등)표의 각 행 (예: VPN=0x06 → PPN=0x9, V=1)
Valid Bit1이면 메모리에 존재, 0이면 디스크에 있음Valid=0 → Page Fault 발생
Page Fault접근한 페이지가 메모리에 없을 때 발생. OS가 디스크에서 적재해야 함문제에서 Valid=0일 때 "DISK"로 표기

Page Fault 처리 과정

 
 
shell
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=1PPN 즉시 사용
TLB Miss세트 내 Tag 불일치 or Valid=0Page Table 참조해야 함

TLB Lookup Flow

 
 
shell
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 Size32B = 2⁵log₂(32)offset = 5bit
VA bits12-12
VPN12−512−57 bits
TLB Index (TLBI)16 entries, 4-way (16/4=4 sets)log₂(4)2 bits
TLB Tag (TLBT)7−27−25 bits
PA bits9-9 bits
PPN9−59−54 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−54 bits

Address 변환

 
 
shell
PA = (PPN << offset) + VPO
예: (0x9 << 5) + 0x2 = 0x122

5. Cache Memory

캐시 용어

CacheCPU가 자주 쓰는 데이터를 저장하는 빠른 메모리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 MissTag 불일치 or Invalid"MEM" (메모리 접근)

캐시 접근 방식

 
 
shell
PA[8:0] = [ Tag(4) | Index(3) | Offset(2) ]

6. 전체 주소 변환 흐름

Virtual → Physical Address Translation Flow

 
 
shell
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 → 메모리 접근

표준 처리 절차

 
 
shell
┌────────────────────────────────────────────────┐
│          가상주소 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이란?

한 페이지 안에서 "몇 번째 바이트인가"를 나타내는 값입니다.

가상주소의 구조

 
 
shell
가상주소(VA) = [ VPN | VPO ]

이름뜻예시 값역할

VPN (Virtual Page Number)이 주소가 몇 번째 페이지인지0x06, 0x19 등페이지 테이블에서 "행" 찾기
VPO (Virtual Page Offset)그 페이지 안에서 몇 번째 바이트인지0x02, 0x09 등페이지 안의 세부 위치

페이지 오프셋의 크기

페이지 크기가 32 bytes라면 이 페이지 안에는 다음과 같이 주소가 있습니다:

 
 
shell
페이지 시작 주소         0 (offset=0)
페이지 안의 1번째 바이트  1 (offset=1)
...
페이지 안의 마지막 바이트 31 (offset=31)

페이지 오프셋은 0~31 사이의 값이고, 이를 표현하려면 5비트(2⁵=32)가 필요합니다.

구조도

 
 
shell
가상주소 (12비트)
┌──────────────┬────────────┐
│  VPN (7bit)  │  VPO (5bit)│
└──────────────┴────────────┘
                  ↑
     └─ 페이지 안에서의 위치 (0~31)

중요한 특징: 페이지 오프셋은 변하지 않는다

페이지 오프셋은 가상주소와 물리주소에서 동일하게 유지됩니다.

 
 
shell
가상주소: [VPN | VPO]
TLB/PT:   VPN → PPN  (페이지만 바뀜)
물리주소: [PPN | VPO]

VPO는 그대로 복사됩니다. 왜냐하면 페이지 안에서의 세부 위치는 변환과 무관하기 때문입니다.

실제 주소 변환 예시

예) VA = 0x0C2, 페이지 크기 = 32B → offset 5bit
VA 분해

  • VPN = 0x06
  • VPO = 0x02

페이지 테이블/TLB에서

  • VPN 0x06 → PPN 0x09

물리주소 조합

 
 
shell
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 비트

물리 주소 계산 시 덧셈 단위

 
 
shell
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 = 5bit32B = 8word → offset = 3bit
캐시 오프셋4B → offset = 2bit4B = 1word → offset = 0bit

정리

"메모리 접근이 1-byte words" = 주소 1당 1바이트씩 증가한다는 뜻입니다.
덕분에 이번 문제에서:

  • 페이지 오프셋 5bit
  • 캐시 오프셋 2bit가 그대로 적용
  • 물리주소 계산을 바이트 단위로 정확히 수행 가능

9. 비트 분해 구조도

VPN/VPO 분해 (Paging 영역)

 
 
shell
VA(12bit)
┌────────────┬────────────┐
│ VPN (7bit) │ VPO (5bit) │
└────────────┴────────────┘
             ↑
    Page Offset (32B 페이지 내부 위치)
  • VPN은 페이지 번호
  • VPO는 페이지 내부 위치 (0~31)
  • VPN은 TLB/페이지테이블로 변환
  • VPO는 그대로 물리주소에 붙음

TLB 구조 (4-way, 16 entries → 4 sets)

 
 
shell
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 매핑)

 
 
shell
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 비트 분해

 
 
shell
PA(9bit)
┌────────────┬──────────┬────────┐
│  CT(4bit)  │  CI(3bit) │ CO(2bit) │
└────────────┴──────────┴────────┘
  • CT (Cache Tag): 세트 내 블록 식별
  • CI (Cache Index): 세트 선택 (8세트)
  • CO (Block Offset): 4B 라인 안의 바이트 위치

10. 실전 예제

예제 1: VA = 0x0C2

비트/필드 계산

 
 
shell
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

구조도 (값 삽입)

 
 
shell
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

비트/필드 계산

 
 
shell
0x329 = 0011 0010 1001₂
VPO = 0x09
VPN = ⌊0x329 / 32⌋ = 0x19 (001 1001₂)
TLB IDX = 0x19 mod 4 = 1
TLB TAG = 0x19>>2 = 0x06

구조도 (값 삽입)

 
 
shell
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, VPO0x0C2 → VPN=0x6, VPO=0x2
(2) TLB lookupTLBT, TLBI세트=2, 태그=0x1 → HIT
(3) PT lookupValid, PPNValid=1 → PPN=0x9
(4) 주소 결합(PPN<<5)+VPOPA=0x122
(5) 캐시 접근CT, CI, COCT=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단계

  1. VA 분해: VA → (VPN, VPO)
  2. TLB: (TLB IDX, TLBTAG)로 세트 대조 → Hit? Miss면 PT 조회
  3. PT: Valid=1 → PPN, 0 → Page Fault
  4. PA: (PPN<<5) | VPO
  5. Cache(물리기반): CT/CI/BO 분해 → 세트에서 태그/Valid 대조 → Hit→Byte[BO], Miss→"MEM"

전체 흐름 한줄 요약

 
 
shell
가상주소(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. 변환되지 않는 비트

주소 변환 과정에서 오프셋 비트는 변환되지 않고 그대로 유지됩니다:

 
 
shell
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. 문제 풀이 체크리스트

  1. VA를 VPN과 VPO로 분해
  2. VPN을 TLB Tag와 TLB Index로 분해
  3. TLB에서 Hit/Miss 확인
  4. Miss면 Page Table에서 Valid 확인
  5. PPN 획득 후 PA 계산
  6. PA를 CT, CI, CO로 분해
  7. Cache에서 Hit/Miss 확인
  8. Hit면 데이터 값, Miss면 "MEM" 또는 물리주소

이 순서를 정확히 따르면 모든 문제를 해결할 수 있습니다.


17. 메모리 계층 구조

 
 
shell
┌────────────────────────────────────┐
│         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. 최종 요약

운영체제 메모리 계층 구조

 
 
shell
CPU → TLB → Page Table → RAM → Disk

핵심 원리

  • CPU는 가상 주소(VA)로 메모리 접근
  • MMU가 TLB/Page Table을 통해 물리 주소(PA)로 변환
  • Cache에서 데이터 확인 후 없으면 RAM 접근
  • RAM에도 없으면(Page Fault) 디스크에서 가져옴
  • 이 과정이 투명하게 처리되어 프로그램은 무한한 메모리를 가진 것처럼 동작