시스템상에서 프로세스들은 다른 프로세스들과 CPU와 메인 메모리를 공유합니다. 메인 메모리를 공유하는 것은 몇가지 문제에 직면하게 됩니다. CPU에 대한 요청이 늘어나면, 프로세스는 몇가지 이유로 인해 느려지게됩니다. 만약 많은 프로세스들이 많은 메모리를 필요로 하면, 몇몇 프로세스들은 동작하지 못할 수 있습니다. 프로그램이 특정 공간을 벗어나면, 프로그램은 더 이상 동작하지 않습니다. 메모리는 corruption에 취약합니다. 만약 몇몇 프로세스들이 의도치 않게 다른 프로세스에 의해 사용되고 있는 메모리에 쓰려고 하면, 해당 프로세스는 프로그램 로직과 관련없는 혼잡한 방식으로 에러를 발생시킵니다.
메모리를 더 효율적이고 더 적은 에러가 발생하게끔 관리하기 위해, 현대 시스템들은 virtual memory (VM) 이라 알려진 메인 메모리 추상화를 제공합니다. 가상 메모리는 하드웨어 exception, 하드웨어 주소 변환, 메인 메모리, 디스크 파일, 커널 소프트웨어 간 상호작용입니다. 커널 소프트웨어는 각각 프로세스에 크고 균일하고 독자적인 주소 공간을 제공합니다. 한가지 명확한 메커니즘으로, 가상 메모리는 중요한 3가지 기능을 제공합니다.
가상 메모리는 컴퓨터 시스템에서 가장 위대한 개념 중 하나입니다. 가상 메모리가 성공할 수 있었던 가장 큰 이유중 하나는 가상 메모리가 프로그래머 간섭 없이 자동적으로 실행된다는 점입니다. 가상 메모리가 뒤에서 잘 동작하는데, 왜 프로그래머는 가상 메모리를 이해해야 할까요? 여기에는 몇가지 이유가 있습니다.
malloc
과 같은 동적인 메모리할당을 위한 함수 콜을 하는 등 여러가지 동작에서 가상 메모리와 상호작용합니다. 만약 가상 메모리가 적절치 못하게 사용되면, 프로그램은 복잡하고 알 수 없는 메모리 관련 버그로부터 시달리게 됩니다. 예를 들어, 잘못된 포인터를 가지고 있는 프로그램은 "segmentation falut" 또는 "protection fault" 같은 에러를 내며 충돌할 수 있습니다. 또한, 충돌나기 전까지 잘못된 결과를 내며 동작할 수도 있는데, 이것은 모든 프로그래머가 가장 무서워하는 상황입니다. 가상 메모리, 그리고 가상 메모리를 관리하는 malloc과 같은 메모리 할당을 이해하는 것은 이러한 에러를 회피하는데 도움이 됩니다.이 장에서는 가상 메모리를 두가지 시각에서 살펴볼 것입니다.
가상 메모리가 복잡합니다. 희소식은 이 장의 세세한 사항을 모두 겪고나면, 직접 작은 시스템 가상 메모리 매커니즘을 시뮬레이션할 수 있게되고 가상메모리 개념이 더 이상 혼란스럽지 않을 것입니다.
후반부는 이러한 이해에 기반해, 프로그램에서 어떻게 가상메모리를 사용하고 관리하는지를 보여줍니다. 직접적인 메모리 맵핑과 malloc 같은 동적 메모리 할당을 통해 가상 메모리를 어떻게 관리하는지 배웁니다. 또한 C 프로그램의 일반적인 메모리 에러들을 배우고 이들을 어떻게 피하는지도 배울것입니다.