Computer Science/컴퓨터 구조

[CSAPP] 9.4 VM as a Tool for Memory Management(메모리 관리 툴로서의 VM)

tgool 2023. 2. 28. 15:57

9.4 VM as a Tool for Memory Management(메모리 관리 툴로서의 VM)

  • 지난 섹션에서 가상 메모리가 DRAM 캐시로 사용되어 가상 주소 공간(Virtual Address Space)에서 페이지를 캐시하는 메커니즘을 제공하는 방법에 대해 알아봤다.
    • 가상 메모리: 디스크에 저장되는 N개의 연속적인 바이트들로 이뤄진 배열
    • 캐시 메모리와 DRAM의 관계에서 블록(Block)이라는 단위를 사용하듯이, 메인 메모리와 디스크의 관계에서는 페이지(Page)라는 단위를 사용
  • 가상 메모리 기술을 사용하는 이유는 크게 세 가지가 있다.
    • 1. Caching
    • 2. Memory Management
    • 3. Memory Protection
  • 지난 섹션까지 단일 가상 주소 공간을 물리적 주소 공간에 매핑하는 단일 페이지 테이블로 가정해왔다.
  • 그러나 실제 운영체제에서는 각 프로세스에 대해 각각의 별도의 페이지 테이블을 제공하기 때문에 별도의 가상 주소 공간이 존재한다.
  • 가상 메모리 시스템에서는 각 프로세스가 완전히 동일한 포맷의 가상 주소 공간을 가진다. 
  • 따라서 각각의 프로세스에게 혼자서 메인 메모리를 사용한다는 듯한 장점을 가져 메모리 관리에 효율적이다.

  • 위 그림은 각 프로세스에 대해 별도의 가상 주소 공간과 물리적 주소 공간이 맵핑되어 있는 모습이다.
  • 프로세스 i의 VP1은 PP2에, 프로세스 j의 VP2는 PP10에 각각 맵핑 되어 있고, 프로세스 i의 VP2와 프로세스 j의 VP1은 동일한 물리적 페이지에 연결되어 메모리를 공유할 수 있다.

 

VM(가상 메모리)는 링커 및 로더의 구현과 메모리 할당 방식 등을 단순화한다.

  • 1. 링킹을 단순화 시킨다.
    • 가상 메모리 시스템에서는 각 프로세스가 똑같은 형식의 가상 주소 공간을 가진다. 따라서 모든 프로세스의 가상 주소 공간은 코드 세그먼트, 유저 스택, 공유 라이브러리 영역이 동일한 주소에서 시작하게 된다. 이는 통일성을 가지게 되어 링커를 디자인하고 구현하는 것이 매우 단순화된다. 예를 들어, 링커가 완전한 하나의 실행 가능한 파일을 만들어내는 과정에서, 해당 프로그램의 코드와 데이터 하나하나가 실제로 메인 메모리의 어느 위치에 맵핑이 될지 전혀 고려할 필요가 없어진다.
  • 2. 로딩을 단순화 시킨다. 
    • 가상 메모리를 사용하게 되면 실행 파일과 공유 객체 파일을 메모리에 쉽게 로드할 수 있다. 로더에 해당하는 execve 함수는 .text 섹션과 .data 섹션을 위한 가상 페이지들을 디스크에 할당하고, 그것들에 대한 PTE들을 새로 만들어서 Valid 비트를 0으로 설정하고 디스크 내 적절한 위치를 가리키도록 한다. 여기서 주의할 점은, 로더가 실제로 디스크에서 메모리로 데이터를 복사하지 않는다는 것이다. 데이터는 각 페이지가 처음 참조될 때, 가상 메모리 시스템에 의해 자동으로 메모리에 데이터가 올라가고, CPU에 의해 instruction을 가져올 때 또는 메모리 위치를 참조할 때, 실행 명령에 의해 호출돼서 메모리에 데이터가 올라간다.
    • 메모리 매핑(memory mapping): 연속적인 가상 페이지들의 집합을 임의의 파일의 임의의 위치에 매핑하는 개념. 리눅스는 애플리케이션 프로그램이 자체 메모리 매핑을 수행할 수 있도록 하는 mmap이라는 시스템 호출을 제공한다.
  • 공유를 단순화 시킨다.
    • 일반적으로 각 프로세스는 다른 프로세스와 공유되지 않는 자체 개인 코드, 데이터, 힙 및 스택 영역을 가진다. 운영 체제는 해당 가상 페이지를 분리된 물리적 페이지에 매핑하는 페이지 테이블(page table)을 생성한다. 
      • 페이지 테이블(Page Table)은 가상 페이지와 물리 페이지 사이의 맵핑 정보를 담은 테이블로, 메인 메모리의 커널 영역에 저장되는 자료 구조 중 하나이고 DRAM 내에 저장된다. 각 프로세스는 자신만의 페이지 테이블을 가지기 때문에, 문맥 전환을 수행할 때 저장 및 복원하는 문맥 정보에도 해당 프로세스의 페이지 테이블 정보가 포함된다. 페이지 테이블의 각 엔트리는 페이지 테이블 엔트리(Page Table Entry, PTE)라고 부른다. 각 PTE는 해당 가상 페이지가 어떤 물리 페이지에 맵핑이 되어 있는지, 또는 맵핑이 되어 있지 않다면 디스크의 어느 위치에 존재하는지에 대한 정보를 담고 있다. 만약 프로그램이 사용하지 않아서 할당되지 않은 가상 페이지라면 null 값을 저장한다. 

Page Table

  •  
    • 프로세스가 코드와 데이터를 공유하는 것이 효율적인 경우가 있다. 예를 들어, 모든 프로세스는 동일한 운영 체제 커널 코드를 호출해야 하며, 모든 C 프로그램은 printf와 같은 표준 C 라이브러리의 루틴을 호출한다. 각 프로세스에 커널과 표준 C 라이브러리의 개별 복사본을 포함하는 대신, 운영 체제는 그림 9.9에서 본 것처럼 서로 다른 프로세스의 적절한 가상 페이지를 동일한 물리 페이지에 매핑함으로써 이 코드의 단일 복사본을 여러 프로세스가 공유할 수 있다. 
  • 메모리 할당을 단순화 시킨다.
    • 가상 메모리는 사용자 프로세스에 추가 메모리를 할당하는 간단한 메커니즘을 제공한다. 유저 프로세스에서 실행 중인 프로그램이 추가 힙(heap) 공간을 요청할 때(예: malloc 호출의 결과) 운영 체제는 k개의 연속된 가상 메모리 페이지의 적절한 수를 할당하고 물리 메모리의 임의의 물리적 페이지에 맵핑한다. 따라서 페이지 테이블이 작동하는 방식 덕분에 운영 체제가 k개의 연속된 물리적 메모리 페이지를 하나하나 다 찾을 필요가 없게 된다.