크래프톤 정글 WIL_Week11 ~ 12 [PintOS] Virtual Memory

pigpgw·2024년 10월 1일

크래프톤 정글

목록 보기
12/13
post-thumbnail

📌 학습 개요

  • 주요 목표:
    • 가상 메모리 시스템 구현 및 작동 원리 이해.
    • 페이지 테이블, 페이지 폴트 처리, 스왑 디스크 활용.
    • Lazy LoadingPage Replacement Policy 구현.
  • 진행 방식:
    • KAIST PintOS의 Project 3 기반.
    • 필수 테스트 케이스 통과 및 추가 구현 사항(extra) 도전.

📚 공부 키워드

  1. 가상 메모리 개념:
    • Virtual Memory:
      • 물리적 메모리보다 큰 논리적 메모리 공간 제공.
      • 프로세스 간 메모리 보호와 메모리 효율성 개선.
    • Page Table:
      • 가상 주소를 물리 주소로 매핑.
    • Translation Lookaside Buffer (TLB):
      • 페이지 테이블의 최근 참조 항목을 저장하는 캐시.
    • Page Fault:
      • 참조한 페이지가 물리 메모리에 없는 경우 발생.
  2. 페이지 관리 및 정책:
    • Lazy Loading:
      • 필요한 페이지만 메모리에 로드하여 초기 로딩 시간 단축.
    • Page Replacement Policy:
      • LRU(Least Recently Used) 등 페이지 교체 방식 이해.
    • Anonymous Page:
      • 디스크에 저장되지 않은 메모리 전용 페이지.
    • File-backed Page:
      • 파일 시스템에서 데이터를 읽어오는 페이지.
    • Swap Disk:
      • 메모리가 부족할 때 페이지를 임시로 저장하는 디스크.
  3. Direct Memory Access (DMA):
    • CPU 개입 없이 메모리와 디바이스 간 데이터 전송.

📖 읽어야 할 자료


💻 과제 진행 방법

1. 개발 환경 구성

  • AWS EC2 Ubuntu 18.04를 사용해 환경 설정.
  • 필수 패키지 설치:
    $ sudo apt update
    $ sudo apt install -y gcc make qemu-system-x86 python3

2. GitHub Repository 설정

  • PintOS 공식 저장소를 팀 저장소로 복제:
    $ git clone --bare https://github.com/casys-kaist/pintos-kaist.git
    $ cd pintos-kaist.git
    $ git push --mirror https://github.com/${팀ID}/pintos-kaist.git
    $ cd ..
    $ rm -rf pintos-kaist.git
    $ git clone https://github.com/${팀ID}/pintos-kaist.git

3. PintOS 초기 설정

  • PintOS 활성화 및 테스트:
    $ cd pintos-kaist
    $ source ./activate
    $ cd vm
    $ make check
    • 정상 실행 시: 대부분의 테스트 실패 출력.
    • 이후 테스트 케이스를 통과하도록 코드 구현.

4. 필수 구현 항목

  • vm 디렉토리에서 다음 테스트를 통과하도록 구현:
    • Page Fault Tests:
      • pt-grow-stack, pt-grow-bad, pt-bad-addr.
    • Swap Tests:
      • swap-file, swap-anon, swap-fork.
    • Lazy Loading Tests:
      • lazy-file, lazy-anon.
    • Memory Mapping Tests:
      • mmap-read, mmap-write, mmap-close.

📌 주요 개념 정리

1. Virtual Memory

  • 물리적 메모리보다 큰 논리적 주소 공간 제공.
  • 프로세스 간 메모리 충돌 방지.
  • CPU가 가상 주소를 물리 주소로 변환할 수 있도록 페이지 테이블 활용.

2. Page Table

  • 프로세스마다 독립적으로 유지.
  • 가상 주소를 물리 주소로 매핑하는 데이터 구조.
  • TLB를 통해 페이지 테이블 조회 성능 향상.

3. Page Fault

  • 페이지 폴트 발생 시, OS는 디스크에서 해당 페이지를 메모리에 로드.
  • 페이지 폴트 처리 과정:
    1. CPU가 페이지 테이블 조회.
    2. 페이지가 메모리에 없으면 페이지 폴트 발생.
    3. OS가 디스크에서 페이지를 로드.
    4. 페이지 테이블을 업데이트하고 CPU에 알림.

4. Lazy Loading

  • 프로그램 실행 시 필요한 페이지만 메모리에 로드.
  • 메모리 사용량 최적화 및 로딩 시간 단축.

5. Page Replacement Policy

  • 물리 메모리가 가득 찬 경우, 페이지 교체 정책을 통해 페이지를 교체.
  • LRU(Least Recently Used):
    • 가장 오랫동안 사용되지 않은 페이지를 교체.
  • FIFO(First-In, First-Out):
    • 가장 먼저 들어온 페이지를 교체.

6. Swap Disk

  • 메모리가 부족할 때 디스크에 페이지를 임시 저장.
  • 스왑 디스크에서 페이지를 가져올 때 페이지 폴트 발생.

7. Anonymous Page vs File-backed Page

  • Anonymous Page:
    • 디스크에 저장되지 않은 메모리 전용 페이지.
    • 스왑 디스크에만 저장 가능.
  • File-backed Page:
    • 파일 시스템에서 데이터를 읽어오는 페이지.
    • 파일 수정 시 디스크에 저장.

🛠 구현 세부 사항

1. Lazy Loading 구현

  • 프로그램 실행 시 모든 페이지를 메모리에 로드하는 대신, 필요한 시점에 페이지를 로드하도록 구현.
  • 페이지 폴트 발생 시, 해당 페이지를 디스크에서 로드하여 메모리에 추가.

2. Swap Disk 구현

  • 물리 메모리가 부족할 경우, 페이지를 스왑 디스크에 저장.
  • 스왑 인/아웃 메커니즘을 구현하여 메모리 사용량 최적화.

3. Memory Mapping 구현

  • 파일을 메모리에 매핑하여, 파일 읽기/쓰기를 메모리 접근처럼 수행.
  • mmap 시스템 호출을 구현하고 테스트 케이스 통과.

🧩 트러블슈팅 사례

문제: 페이지 폴트 처리 중 커널 패닉 발생

  • 원인: 페이지 테이블 업데이트 로직 오류.
  • 해결: 페이지 폴트 발생 시, 페이지 테이블을 올바르게 업데이트하도록 수정.

문제: Lazy Loading 시 초기 프로그램 실행 실패

  • 원인: 초기 스택 설정 오류.
  • 해결: 프로그램 시작 시 필요한 초기 페이지를 미리 로드하도록 수정.
profile
https://www.pigpgw.cloud 로 이전합니다~

0개의 댓글