Introduction

Park Choong Ho·2021년 6월 7일
0

CSAPP 9. Virtual Memory

목록 보기
1/6

Introduction

시스템상에서 프로세스들은 다른 프로세스들과 CPU와 메인 메모리를 공유합니다. 메인 메모리를 공유하는 것은 몇가지 문제에 직면하게 됩니다. CPU에 대한 요청이 늘어나면, 프로세스는 몇가지 이유로 인해 느려지게됩니다. 만약 많은 프로세스들이 많은 메모리를 필요로 하면, 몇몇 프로세스들은 동작하지 못할 수 있습니다. 프로그램이 특정 공간을 벗어나면, 프로그램은 더 이상 동작하지 않습니다. 메모리는 corruption에 취약합니다. 만약 몇몇 프로세스들이 의도치 않게 다른 프로세스에 의해 사용되고 있는 메모리에 쓰려고 하면, 해당 프로세스는 프로그램 로직과 관련없는 혼잡한 방식으로 에러를 발생시킵니다.

메모리를 더 효율적이고 더 적은 에러가 발생하게끔 관리하기 위해, 현대 시스템들은 virtual memory (VM) 이라 알려진 메인 메모리 추상화를 제공합니다. 가상 메모리는 하드웨어 exception, 하드웨어 주소 변환, 메인 메모리, 디스크 파일, 커널 소프트웨어 간 상호작용입니다. 커널 소프트웨어는 각각 프로세스에 크고 균일하고 독자적인 주소 공간을 제공합니다. 한가지 명확한 메커니즘으로, 가상 메모리는 중요한 3가지 기능을 제공합니다.

  1. 가상 메모리는 메인 메모리를 디스크 주소 공간 캐시로 다뤄 효율적으로 메인 메모리를 사용합니다. 메인 메모리 사용 부분만 가지고 있고 필요할 때마다 디스크와 메모리사이에서 데이터를 옮깁니다.
  2. 각 프로세스마다 균일한 주소 공간을 할당해 메모리 관리를 단순하게 만듭니다.
  3. 다른 프로세스에 의한 corruption으로부터 각 프로세스 주소 공간을 보호합니다.

가상 메모리는 컴퓨터 시스템에서 가장 위대한 개념 중 하나입니다. 가상 메모리가 성공할 수 있었던 가장 큰 이유중 하나는 가상 메모리가 프로그래머 간섭 없이 자동적으로 실행된다는 점입니다. 가상 메모리가 뒤에서 잘 동작하는데, 왜 프로그래머는 가상 메모리를 이해해야 할까요? 여기에는 몇가지 이유가 있습니다.

  • 가상 메모리는 central합니다. 가상 메모리는 컴퓨터 시스템 전반에 스며들어 있습니다. 하드웨어 exception, 어셈블러, 링커, 로더, shared object, 파일, 프로세스 디자인에 있어 가상 메모리는 핵심적인 역할을 하고 있습니다. 가상 메모리를 이해하는 것은 시스템이 어떻게 동작하는지를 이해하는데 도움이 됩니다.
  • 가상 메모리는 강력합니다. 가상 메모리는 메모리 단위를 생성하거나 버리고, 메모리 단위를 디스크 파일에 맵핑하고, 다른 프로세스들과 메모리를 공유하는 등 강력한 기능들을 애플리케이션에 제공합니다. 예를 들어, 메모리를 읽고 씀으로써 디스크 파일을 읽거나 쓸 수 있다는 사실을 알고 계셨나요? 또는 어떤 명시적인 복사없이 파일 내용들을 메모리에 로드할 수 있다는 것을 알고 계셨나요? 가상 메모리를 이해하는 것은 애플리케이션 내 이러한 강력한 기능들을 활용하는데 도움이 됩니다.
  • 가상 메모리는 위험합니다. 애플리케이션은 자신이 변수를 참조하거나, 포인터를 더이상 참조하지 않거나, malloc 과 같은 동적인 메모리할당을 위한 함수 콜을 하는 등 여러가지 동작에서 가상 메모리와 상호작용합니다. 만약 가상 메모리가 적절치 못하게 사용되면, 프로그램은 복잡하고 알 수 없는 메모리 관련 버그로부터 시달리게 됩니다. 예를 들어, 잘못된 포인터를 가지고 있는 프로그램은 "segmentation falut" 또는 "protection fault" 같은 에러를 내며 충돌할 수 있습니다. 또한, 충돌나기 전까지 잘못된 결과를 내며 동작할 수도 있는데, 이것은 모든 프로그래머가 가장 무서워하는 상황입니다. 가상 메모리, 그리고 가상 메모리를 관리하는 malloc과 같은 메모리 할당을 이해하는 것은 이러한 에러를 회피하는데 도움이 됩니다.

이 장에서는 가상 메모리를 두가지 시각에서 살펴볼 것입니다.

  1. 처음 절반은 가상 메모리가 어떻게 동작하는지에 관한 것입니다.
  2. 나머지 절반은 가상메모리가 프로그램에 의해 어떻게 사용되고 관리되는지를 살펴봅니다.

가상 메모리가 복잡합니다. 희소식은 이 장의 세세한 사항을 모두 겪고나면, 직접 작은 시스템 가상 메모리 매커니즘을 시뮬레이션할 수 있게되고 가상메모리 개념이 더 이상 혼란스럽지 않을 것입니다.

후반부는 이러한 이해에 기반해, 프로그램에서 어떻게 가상메모리를 사용하고 관리하는지를 보여줍니다. 직접적인 메모리 맵핑과 malloc 같은 동적 메모리 할당을 통해 가상 메모리를 어떻게 관리하는지 배웁니다. 또한 C 프로그램의 일반적인 메모리 에러들을 배우고 이들을 어떻게 피하는지도 배울것입니다.

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

0개의 댓글