Krafton Jungle/2. Keywords

[WEEK07] 가상 메모리와 페이징

munsik22 2025. 4. 28. 16:40

가상메모리(VM)

Physical Addressing Virtual Addressing
메모리 주소는 메모리의 정확한 장소를 참조한다.
(단순한 시스템에서만 사용됨)
메모리 주소는 HW의 MMU를 통해 물리적 메모리에 매핑된 process-specific address를 참조한다.

페이지 테이블

[출처] CMU system programming

  • Virtual Address(이하 VA)는 페이지 테이블 내에서 physical address(이하 PA)에 매핑된다. 각각의 엔트리는 페이지 테이블 엔트리(이하 PTE)라고 불린다.
  • 페이지는 캐치와 같은 메모리 내에 있다. 메모리 내에서 사용할 수 없다면 페이지 미스가 발생한 것이다.
  • 페이지 미스는 페이지 오류를 일으킬 수 있는데, 이로 인해 OS가 디스크에서 새로운 페이지를 가져오고 DRAM에서 페이지를 내보내게 한다.

[페이징 vs 세그멘테이션]

페이징은 메모리를 동일한 크기의 블록, 즉 '페이지'로 나누는 방법이다. 각 페이지는 가상 메모리 주소와 매핑되며, 페이지 테이블을 통해 물리적 메모리 주소로 변환된다. 페이징은 메모리 관리를 단순화하고, 메모리의 낭비를 줄이며, 프로그램 간의 메모리 충돌을 방지한다.
🔹 장점 : 외부 단편화 문제를 해결함. 메모리 관리가 상대적으로 단순함.
🔸 단점 : 내부 단편화 발생 가능성이 있음. 페이지 테이블 관리에 추가적인 메모리가 필요함.

세그멘테이션은 메모리를 의미 있는 단위인 '세그먼트'로 나누는 방법이다. 각 세그먼트는 시작 주소와 길이를 가지며, 다른 유형의 데이터(예: 코드, 데이터, 스택)를 위해 사용된다. 세그멘테이션은 메모리를 더 유연하게 관리할 수 있게 해주며, 프로그램의 논리적 구조를 반영할 수 있다.
🔹 장점 : 메모리를 논리적 단위로 나누어 프로그램의 구조를 반영함. 세그먼트별 보호와 공유가 용이함.
🔸 단점 : 외부 단편화 발생 가능성이 있음. 메모리 관리가 복잡해질 수 있음.

다중 레벨 페이지 테이블

  • 테이블 사이즈의 크기는 우리가 큰 메모리 주소에 접근해야 할 때 빠르게 컨트롤에서 벗어난다.
  • 해결책은 페이지 테이블 묶음이다: VPO와 PPO는 일종의 block offset처럼 작동한다.
  • 예를 들어, 32bit VA space + 24bit PA space를 가지는 시스템에서 페이지 크기가 4KB, PTE의 크기가 4바이트라고 가정하자.
    1. VA/PA에서의 페이지 오프셋은 몇 비트인가?
      • VPO = PPO = log₂(page size) = 12 bits
    2. 전체 VA space(이하 VAS)를 매핑하려면 얼마만큼의 페이지가 필요한가?
      • VAS에서 페이지의 수 = VAS 크기 / 페이지 크기
      • ∴ 2³² / 2¹² = 2²⁰ PTEs
      • VAS의 페이지 수 = VAS의 PTE 수임을 기억하자. (VA와 PTE은 1:1로 매핑된다!)
    3. 단일 페이지 내부를 가득 채우기 위해 필요한 PTE의 수는?
      • 페이지 내의 PTE 수 = 페이지 크기 / PTE의 크기
      • ∴ 4KB / 4B = 2¹² / 2² = 1024개
    4. 단일 레벨 페이지 테이블을 가득 채우기 위해 필요한 페이지 수는?
      • 단일 레벨에서의 페이지 수 = VAS 매핑을 위한 PTE 수 / 페이지 내의 PTE 수
      • ∴ 2²⁰ / 2¹⁰ = 1024 pages
    5. Outer level 페이지 테이블을 나타내기 위해 필요한 페이지 수는?
      • Outer level의 페이지 수 = 단일 레벨의 페이지 수 / 페이지 내의 PTE 수
      • ∴ 2¹⁰ / 2¹⁰ = 1 page
  • 결과적으로 다중 레벨 페이지 테이블은 이렇게 생겼다.

  • 단일 레벨 테이지 테이블에서는 모든 정보를 한 번에 저장해야 한다.
    • 2²⁰ PTEs × 4bytes = 4096KB (또는 2¹⁰ pages × 4KB = 4096KB)
  • 2레벨 테이지 테이블에서는
    • 모든 outer level에서 (위의 5에서 1 page만 사용)
    • outer level 당 1 PTE만 사용 → 1 page in inner level
    • 총 2 pages = 8KB ← 8KB << 4096KB (👍)

TLB

  • TLBTranslation Lookaside Buffer는 VA→PA 번역을 저장하는 캐시다.
  • TLB hit이 발생하면, 우리는 해석을 위해서 page walk를 할 필요가 없다.

TLB hit는 메모리 접근을 없앨 수 있다.

  • TLB의 장점
    1. 접근 지역성 (Locality of Access)
      • 좋은 지역성은 메모리 내에서 동일한 연속적인 지역, 혹은 같은 페이지를 재사용하는 것이다.
      • 메모리는 이전에 저장한 번역을 통해 동일한 페이지에 접근할 수 있다.
    2. 워킹 셋의 크기 (Size of Working Set)
      • 프로그램의 working set은 접근되었고 활성된 VP의 집합이다.
      • 큰 working set은 thrashing(지속적인 페이지 교체)를 일으킬 수 있다.
      • TLB에 있어서, 이는 한 페이지에서 이전에 저장된 번역이 페이지가 스와핑되어 나간 경우에만 invalid함을 의미한다.
    3. 문맥 전환 빈도 (Frequency of Context Switching)
      • 프로세스는 스스로의 VAS와 페이지 테이블을 할당받은 태스크다.
      • 한 프로세스에서 다른 프로세스로 컨트롤을 전환하는 것은 우리가 이제 새로운 VAS에서 작업할 것, 즉 새로운 번역 세트에서 작업할 것을 의미한다.
      • 문맥 전환이 일어날 때 TLB 내부의 엔트리의 번역 정보를 모두 지워버려서(flush) invalid한 주소 접근을 방지한다. (참고)