가상메모리

가상 메모리는 프로세스가 자신만의 연속적인 메모리 공간을 가지는 것처럼 보이도록 만들어주는 추상화입니다. 실제 물리 메모리는 제한적이고, 여러 프로세스가 동시에 실행될 수 있도록 하기 위해 운영체제는 이 가상 메모리를 물리 메모리에 “매핑”하는 작업을 수행합니다.

핵심 개념

  • Virtual Address (VA): 사용자 프로그램이 사용하는 주소. illusion (환상)
  • Physical Address (PA): 실제 RAM의 주소
  • Address Translation: VA를 PA로 변환하는 과정
  • Page: 고정 크기(예: 4KB)의 메모리 블록 단위
  • Page Table: VA → PA로 변환하는 매핑 정보를 담는 자료구조
  • TLB (Translation Lookaside Buffer): 자주 쓰는 주소 변환 결과를 캐시하는 하드웨어 캐시

역할 (필요성)

  • 보호(Protection): 서로 다른 프로세스가 서로의 메모리에 접근하지 못하도록 방지
  • 추상화(Adstraction): 프로그래머는 메모리 제한 걱정 없이 프로그래밍 가능
  • 효율성(Efficiency): 물리 메모리보다 큰 프로그램도 실행 가능 (부분만 메모리에 올린다)
  • 공유(Sharing): 공통 코드를 여러 프로세스가 공유 가능

주요 기술들 (기능)

  1. 주소변환
    • 하드웨어는 가상 주소를 물리 주소로 변환합니다.
    • 일반적으로는 페이지 단위로 이루어지고, VA의 상위 비트는 페이지 번호(VPN), 하위 비트 오프셋(offset)이 됩니다.
mov eax, [0xB8000000]; // 가상 주소 접근

→ MMU는 Page Table을 통해 0xB8000000의 VA를 PA로 변환하고 접근합니다.

  1. 페이지 폴트 (Page Fault)
    • 해당 가상 페이지가 메모리에 없는 경우 발생합니다.
    • OS가 디스크에서 해당 페이지를 메모리에 로드하고 다시 명령을 재실행 합니다.
  2. 지연 로딩
    • 페이지 내용을 처음 접근할 때까지 로드를 미루는 방식입니다.
    • Pintos에서도 Anonymous Page, File-backed Page 구현 시 사용됩니다.
  3. 페이징의 장점
    • 외부 단편화 없습니다. (모든 페이지가 고정 크기)
    • 다양한 방식의 가상 주소 공간 사용 가능합니다.
    • 페이지 테이블과 TLB 등으로 효율적인 메모리 관리 가능합니다.

Pintos에서…

Pintos에서 VM을 구현하기 위한 부분을 정리해보았습니다.

OSTEP 개념Pintos 구현
페이지(Page)struct page (vm/page.h)
주소 변환(Address Translation)page_fault()에서 발생, vm_try_handle_fault()에서 처리
지연 로딩(Lazy Loading)페이지가 처음 접근될 때 lazy_load_segment() 호출
페이지 테이블(Page Table)각 프로세스의 pml4로 구현 (pml4_activate)
Anonymous Pageanon_page (vm/anon.h)
File-backed Pagefile_page (vm/file.h)
Swap일부 페이지가 메모리에서 디스크로 교체될 수 있음 (swap_in, swap_out)

요약

  • 가상 메모리는 주소 추상화 + 메모리 보호 + 효율성을 위한 강력한 OS 기법입니다.
  • 핵심 구성 요소로는 가상 주소, 페이지, 페이지 테이블, TLB, 페이지 폴트 등이 있습니다.
  • OSTEP의 이론을 기반으로 Pintos 구현을 하면 됩니다.
profile
모든걸 기록하며 성장하고 싶은 개발자입니다. 현재 크래프톤 정글 8기를 수료하고 구직활동 중입니다.

0개의 댓글