Ch9.4 VM as a Tool for Memory Management

suseodd·2021년 6월 14일
0

CSAPP 9. Virtual Memory

목록 보기
5/6

9.4 VM as a Tool for Memory Management

지난 장에서 가상 메모리가 DRAM을 더 큰 가상 메모리 캐시 페이지 집합으로 어떻게 활용하는지를 살펴보았습니다. 흥미롭게도, 몇몇 초기 시스템들(ex. DEC PDP-11/70)은 물리 메모리보다 더 적은 가상 메모리 공간을 지원했습니다. 그럼에도 가상 메모리는 여전히 유용한 메커니즘인데 왜냐하면 가상 메모리가 메모리 관리를 간편하게 해주고 메모리를 보호할 방법을 제공하기 때문입니다.

지금까지 우리는 싱글 페이지 테이블 하나가 가상메모리 하나와 물리메모리 하나를 맵핑한다고 가정했습니다. 사실, 운영체제는 분리된 페이지 테이블 하나와 가상 메모리 공간 하나를 프로세스마다 제공합니다.

위 그림을 보면, 프로세스 i 페이지 테이블을 보면 VP1은 PP2에 VP2는 PP7에 맵핑되어 있습니다. 프로세스 j 페이지 테이블에서는 VP1을 PP7에 VP2를 PP10에 맵핑하고 있습니다. 여러개 가상 페이지가 공유된 물리 페이지에 맵핑될 수 있음을 명심하기 바랍니다.

페이징과 분리된 가상 메모리 공간간의 결합은 메모리가 시스템에서 사용되고 관리되는데 있어 특정 효과를 가져옵니다. 특히, VM은 링킹, 로딩, 코드와 데이터 공유 그리고 메모리를 애플리케이션에 할당하는 것을 간단하게 만들어줍니다.

  • Simplifying linking: 분리된 메모리 공간은 각 프로세스가 코드와 데이터의 실제 물리 메모리 위치 상관없이 메모리 이미지 기본 포맷을 사용할 수 있게 합니다. 예를 들어, 리눅스 시스템 상 모든 프로세스들은 비슷한 메모리 포맷을 가집니다. 64-bit 주소 공간에서 code segment는 항상 가상 메모리 0x400000에서 시작합니다. Data segment는 적당하게 떨어져, code segment 이후 공간을 차지합니다. 스택은 유저 프로세스 주소 공간 가장 높은 부분에서 시작해 서서히 내려옵니다. 이러한 통일성은 링커 디자인과 실행을 간편하게 해주고, 링커가 완전히 링크된 실행 가능한 파일 즉, 피지컬 메모리상 코드와 데이터의 절대적인 위치로부터 독립적인 파일을 만드는 것을 가능하게 해줍니다.

  • Simplifying loading: 가상 메모리는 또한 실행 가능하고 공유된 오브젝트 파일들을 메모리에 올리는 것을 간편하게 만들어줍니다. 오브젝트 파일의 .textdata섹션들을 새롭게 생성된 프로세스에 로드하기 위해서, 리눅스 loader는 code와 data segment를 위한 가상 페이지를 할당하고 이들을 invalid(not cached)하다고 마킹한 뒤 이들 페이지 테이블 entry를 적절한 오브젝트 파일상 위치와 맵핑합니다. 흥미로운 부분은 로더가 실제로 어떤 데이터도 디스크에서 메모리로 복사하지 않는다는 점입니다. 데이터는 각 페이지들이 처음 참조될 때 또는 CPU에 의해 인스트럭션이 fetching 되거나 인스트럭션에 의해 메모리 위치가 참조될 때 페이징됩니다. 이러한 파일 위치에 따른 연속적인 가상 페이지들 맵핑을 memory mapping이라 합니다. 리눅스는 애플리케이션 프로그램들이 자신만의 메모리 맵핑을 가능하게 해주는 mmap이라는 시스템 콜을 제공합니다. Application-level에서 메모리 맵핑을 차후 9.8에서 살펴보겠습니다.

  • Simplifying sharing: 분리된 메모리 주소는 유저 프로세스와 운영 체제간 공유를 관리하는 지속적인 매커니즘을 운영체제에 제공합니다. 일반적으로, 각 프로세스들은 자신만의 코드, 데이터, 힙, 스택 영역을 가지고 있고 이들은 다른 어떤 프로세스와도 공유되지 않습니다. 이 경우, 운영체제는 페이지 테이블을 생성하고 분리된 물리 페이지에 상응하는 가상 페이지를 맵핑합니다. 하지만, 몇몇 경우에는 코드와 데이터를 프로세스간에 공유해야하는 것이 필요한 경우가 있습니다. 예를 들어, 모든 프로세스들은 같은 운영체제의 커널 코드를 호출해야 합니다. 또한, 모든 C 프로그램들은 printf와 같은 standard C library에서 제공하는 루틴을 호출해야 합니다. 각 프로세스마다 분리된 커널 코드와 standart C library 복사본을 가지는 것보다 운영체제는 프로세스 여러 개가 복사본 하나를 공유하게끔 합니다. 여러 다른 프로세스들의 가상 페이지를 같은 물리 페이지에 맵핑하는 형식으로 이러한 작업을 진행하는데 Figure9.9에서 이를 확인할 수 있습니다.

  • Simplifying memory allocation: 가상 메모리는 추가적인 메모리를 유저 프로세스에 할당하는 간단한 매커니즘을 제공합니다. 유저 프로세스에서 동작하는 프로그램이 추가적인 힙 공간을 요청했을 때(malloc 함수를 호출) 운영체제는 적당한 숫자(예를 들어, k)만큼 연속된 가상 메모리 페이지를 할당하고 피지컬 메모리에 위치한 임의의 피지컬 페이지 k개들과 맵핑합니다. 페이지 테이블이 동작하는 방식으로 인해, 운영 체제는 연속되는 페이지 k개를 물리 메모리에서 찾을 필요없습니다. 페이지는 물리 메모리상 임의로 흩어져 있을 수 있습니다.

profile
백엔드 개발자 디디라고합니다.

5개의 댓글

comment-user-thumbnail
2021년 6월 17일

충호형 안녕하세요 ㅋㅋ
예~~~전에 한양대에서 포리프 같이했던 황성우에요.. 안드로이드 같이했떤,,기억하실려나 모르겠네요 잘지내시나요

1개의 답글