크래프톤 정글 (컴퓨터 시스템: CSAPP)/9장 가상 메모리

컴퓨터 시스템 : CSAPP 9장 - 서술형 문제를 통해 이해하기 Part.1

고웅 2025. 4. 23. 15:10

지금까지 9장의 내용을 학습했지만 이에 대한 개념이 아직 헷갈리고 책의 장황한 설명들로 인하여 이해가 어려웠던 내용에 대해 직접 서술형 문제를 답하는 연습을 수행하고 이를 기록하여 9장의 내용을 더 잘 이해하고자 했다. GPT가 내주는 서술형 문제를 직접 작성해 보고 추가로 설명이 되면 좋은 내용들을 추가했다.


가상 메모리가 가지는 주요 목적

  1. 캐싱 도구로서의 역할
    가상 메모리는 주 기억 장치(DRAM)를 보조 기억장치(디스크)의 캐시로 활용한다. 프로그램이 참조하는 페이지가 주 기억장치에 있으면 이를 페이지 히트(page hit)라고 하며, 디스크 접근 없이 빠르게 데이터를 가져올 수 있다. 반대로, 참조한 페이지가 주기억장치에 없으면 페이지 폴트(page fault)가 발생하고 , 운영체제는 디스크에서 해당 페이지를 메모리로 가져온다. 이러한 방식으로 자주 사용되는 데이터만 메모리에 유지함으로써, 한정된 물리 메모리 공간을 효율적으로 활용할 수 있다.
  2.  메모리 관리 도구로서의 역할
    각 프로세스는 고유한 가상 주소 공간을 갖는다. 운영체제는 가상 주소 물리 주소로 매핑하여 각 프로세스가 독립적으로 메모리를 사용하는 것처럼 보이게 한다. 이로 인해 프로그램은 자신의 메모리가 연속적인 것처럼 생각하고 동작할 수 있어, 메모리 관리가 단순해지고 유연해진다. 예를 들어, 프로그램이 사용하는 힙과 스택을 서로 떨어진 공간에 배치하거나, 중간에 공간을 할당 및 해제해도 연속적인 메모리처럼 유지할 수 있다.
  3. 메모리 보호 두구로서의 역할
    가상 메모리는 프로세스 간의 메모리 접근을 격리시켜 보안을 강화한다. 한 프로세스는 다른 프로세스의 메모리 공간에 접근할 수 없으며, 커널 공간 역시 사용자 프로그램으로부터 보호된다. 만약 프로그램이 접근해서는 안 되는 메모리 영역을 참조하려 하면 운영체제는 페이지 폴트를 통해 이 동작을 감지하고 이를 차단하거나 종료시킨다. 이를 통해 시스템 전체의 안정성과 보안이 향상된다.

주소 변환(Address Translation)의 단계적 과정과 구성요소

  1. 가상 주소 생성
    프로그램이 메모리를 참조할 때, CPU는 물리 주소가 아닌 가상 주소(virtual address) 를 생성한다. 이 주소는 해당 프로세스만의 주소 공간에서 의미 있는 주소다.
  2. TLB(Translation Lookaside Buffer) 조회
    CPU는 먼저 TLB라는 작은 캐시 메모리에서 이 가상 주소의 변환 결과(가상 페이지 번호 → 물리 페이지 번호)를 찾는다.
    • TLB hit: 변환된 물리 주소를 즉시 사용하여 메모리에 접근한다.
    • TLB miss: 변환 결과가 없다면, 페이지 테이블을 참조해야 한다.
  3. 페이지 테이블 조회
    TLB miss가 발생하면, 하드웨어 내의 MMU(Memory Management Unit)가 페이지 테이블(page table)을 통해 가상 주소를 물리 주소로 변환한다.
    현대 시스템은 메모리 효율성을 위해 다단계 페이지 테이블(multi-level page tables)을 사용한다. 예를 들어, 64비트 주소에서 상위 비트들은 테이블 인덱스로 사용되고, 마지막 단계에서 실제 프레임 번호를 얻는다.
  4. 물리 주소 생성
    페이지 테이블을 통해 얻은 물리 페이지 번호에, 가상 주소의 페이지 오프셋을 더하여 최종 물리 주소(physical address)를 얻는다.
  5. 메모리 접근 및 TLB 업데이트
    • 메모리에서 데이터를 불러온다.
    • 변환 결과를 TLB에 캐시 하여 이후 동일한 주소 접근 시 빠르게 처리할 수 있도록 한다.
  6. 페이지 폴트(Page Fault)
    만약 페이지 테이블에 해당 항목이 없거나, 디스크에 존재하는 경우에는 페이지 폴트가 발생하고 운영체제가 디스크에서 데이터를 메모리로 가져와 페이지 테이블과 TLB를 갱신한다.

페이지 폴트(Page Fault)의 발생과 처리 과정

  1. 페이지 폴트 발생 상황
    CPU가 어떤 가상 주소를 참조했을 때, 해당 주소가 가리키는 페이지가 주기억장치(DRAM)에 없는 경우.
    • 이 경우 페이지 테이블에 유효하지 않은 항목이 있거나, 항목 자체가 없을 수도 있음.
  2. 운영체제의 개입
    페이지 폴트는 예외(인터럽트)로 처리된다. 이때 하드웨어는 CPU의 실행을 일시 중지하고, 커널 모드로 전환하여 운영체제를 호출한다.
  3. 운영체제의 역할
    운영체제는 다음과 같은 작업을 수행한다:
    • 디스크에서 해당 페이지를 찾아서 메모리의 빈 페이지 프레임에 로드
    • 페이지 테이블을 업데이트 (해당 가상 주소에 대한 물리 프레임 번호 등록 및 유효 비트 설정)
    • TLB를 갱신하거나 해당 엔트리를 무효화
    • CPU가 중단된 위치에서 다시 명령을 실행하도록 재시작
  4. 에러 처리
    만약 참조한 주소가 아예 존재하지 않는 잘못된 주소이거나 접근 권한이 없는 주소라면, segmentation fault 등 예외를 발생시켜 프로세스를 종료한다.

시스템 성능에 미치는 영향

  • 디스크 접근은 매우 느리다: 메모리 접근은 나노초(ns) 단위지만, 디스크 접근은 밀리초(ms) 단위로 수백만 배 차이.
  • 페이지 폴트가 잦으면 성능 급감: 페이지 교체가 빈번하게 일어나면, CPU는 대부분의 시간을 디스크 I/O를 기다리는 데 쓰게 된다.
  • 쓰레싱(Thrashing): 작업 집합(working set)이 물리 메모리에 수용되지 못하면, 시스템은 끊임없이 페이지를 교체하게 되며, 실질적인 진행은 거의 없게 된다.

단일 페이지 테이블 vs 다단계 페이지 테이블

  1. 단일 페이지 테이블의 한계
    • 예: 32비트 주소 공간, 페이지 크기 4KB일 경우
      → 페이지 수 = 2³² / 2¹² = 2²⁰ = 약 100만 개
      → 각 페이지마다 4바이트로 페이지 테이블 항목을 저장한다면
      → 총 페이지 테이블 크기 = 2²⁰ × 4 = 4MB
    • 64비트 시스템에서는 상황이 더 심각해짐. 테이블이 기가바이트 단위로 커질 수 있음.
    • 문제점: 많은 프로그램은 주소 공간 전체를 사용하지 않기 때문에 대부분이 낭비됨.
  2. 다단계 페이지 테이블의 필요성
    • 불필요한 페이지 테이블 항목의 공간 낭비를 줄이기 위해, 필요할 때만 메모리를 할당하는 구조를 도입.
    • 다단계 페이지 테이블은 트리 구조를 이루며, 상위 테이블이 하위 테이블을 가리키는 포인터를 가지고 있음.
    • 실제 주소 공간에서 사용 중인 영역에 해당하는 테이블만 동적으로 생성.

다단계 주소 변환 방식

예: 32비트 주소 공간, 2단계 페이지 테이블

  • 가상 주소를 비트 단위로 나눔:
    • 상위 10비트: 상위 페이지 테이블의 인덱스
    • 중간 10비트: 하위 페이지 테이블의 인덱스
    • 하위 12비트: 페이지 내 오프셋

→ 이 구조는 마치 "이중 배열"을 순차적으로 접근하듯이 작동하며,
최종적으로 물리 프레임 번호 + 오프셋을 통해 물리 주소를 얻는다.

장점 요약

  • 공간 절약: 사용 중인 부분만 메모리에 존재하여 비효율 감소
  • 확장성: 주소 공간이 커져도 테이블 크기의 급격한 증가 없이 대응 가능
  • 유연성: 주소 공간이 희소하게 사용되는 현대의 프로그램 패턴에 적합

TLB(Translation Lookaside Buffer)의 역할

  • TLB는 주소 변환 캐시다. CPU가 가상 주소를 물리 주소로 변환할 때, 이 과정을 빠르게 하기 위해 최근에 사용한 페이지 매핑 정보를 저장한다.
  • 이 구조 덕분에, 페이지 테이블 전체를 매번 접근하지 않아도 되므로, 주소 변환 속도가 획기적으로 향상된다.
  • TLB 항목 하나는 보통 다음 정보를 포함한다:
    • 가상 페이지 번호(VPN)
    • 물리 페이지 번호(PPN)
    • 유효 비트, 접근 권한 등

TLB Miss가 발생했을 때 처리 과정

  1. TLB 조회 실패(TLB miss)
    → 변환 정보가 없으므로 MMU(Memory Management Unit)가 페이지 테이블 탐색 시작.
  2. 페이지 테이블 탐색
    • 가상 주소를 VPN과 오프셋으로 나눈 뒤, VPN을 다단계 페이지 테이블의 인덱스로 사용해 탐색.
    • 최종적으로 물리 페이지 번호(PPN)를 찾음.
  3. 물리 주소 계산 및 데이터 접근
    • PPN과 오프셋을 합쳐 최종 물리 주소를 계산.
    • 해당 주소로 메모리에서 데이터를 읽음.
  4. TLB 갱신
    • 새로 얻은 매핑 정보를 TLB에 추가 (기존 항목을 제거할 수도 있음, 이는 캐시 교체 정책에 따라 다름)
  5. 페이지 폴트가 있는 경우
    • 만약 페이지가 메모리에 없으면 → 운영체제가 디스크에서 페이지를 로드 후, 위 과정을 다시 수행.

TLB가 성능에 미치는 영향

  • TLB hit → 매우 빠름 (수 나노초)
  • TLB miss → 페이지 테이블 접근 필요 → 수십에서 수백 나노초 소요
  • 페이지 폴트 → 디스크 접근 → 수 밀리초 소요 (매우 느림)

→ 따라서 TLB hit ratio가 높을수록 시스템의 전체 성능이 좋아짐.
→ 현대 CPU는 TLB hit ratio를 높이기 위해 TLB prefetching, superpages(큰 페이지) 등을 사용하기도 함.