메모리는 손실에 취약하다. 만일 프로세스가 무심코 다른 프로세스가 사용하고 있는 메모리를 쓰게 되면, 이 프로세스는 프로그램의 논리와 전혀 무관하게 실패하게 될 수 있다.
메모리를 보다 효율적이고 더 적은 에러를 갖도록 관리하기 위해 사용
가상메모리(Virtual Memory)는 메인 메모리(RAM)의 추상화를 제공한다. 가상메모리의 중요한 기능은 다음과 같다.
메인 메모리를 디스크에 저장된 주소공간에 대한 캐시로 취급해서 메인 메모리 내 활성화 영역만 유지하고, 데이터를 디스크와 메모리 간에 필요에 따라 전송하는 방법으로 메인 메모리를 효율적으로 사용한다.
각 프로세스에 통일된 주소공간을 제공함으로써 메모리 관리를 단순화한다.
각 프로세스의 주소공간을 다른 프로세스에 의한 손상으로부터 보호한다.
가상메모리는 중앙에 자리한다 : 가상메모리는 컴퓨터 시스템의 모든 레벨에 스며들어 있다. 이를 이해하면 어떻게 시스템이 일반적으로 동작하는지 더 잘 이해할 수 있다.
가상메모리는 강력하다 : 가상메모리는 응용 프로그램에 메모리 블록을 생성하고, 메모리 블록을 디스크 파일의 부분으로 매핑하고, 메모리를 다른 프로세스들과 공유할 수 있는 강력한 기능을 준다. 가상메모리를 이해하면 응용 프로그램에 강력한 성능(powerful capability)를 적용하는 데 도움이 된다.
가상메모리는 위험하다 : 응용 프로그램은 이들이 변수를 참조하고, 포인터를 역참조하고, malloc
같은 동적 할당 패키지로 호출할 때마다 가상메모리와 상호작용한다. 만일 가상메모리가 잘못 사용되면, 프로그램이 "Segmentation fault" 또는 "Protection fault"로 즉시 죽을 수 있으며, 잘못된 결과로 프로그램이 끝까지 실행될 수도 있다. 가상메모리와 이를 관리하는 malloc
같은 할당 패키지를 이해하면 이러한 에러를 피하는 데 도움이 된다.
CPU가 메모리에 접근하는 가장 자연스런 방식은 물리 주소를 사용하는 것이다. 이러한 접근법을 물리 주소 방식이라고 부른다.
<물리 주소 방식의 예시>
CPU가 로드 인스트럭션을 실행할 때 유효 물리 주소 생성 -> 메모리 버스를 거쳐서 메인 메모리에 전달 -> 메인 메모리에서 주소값에 바이트 워드를 선입하고, 이것을 CPU에 돌려줌 -> 레지스터에 저장
초기의 PC들은 물리 주소 방식을 사용하였다. 현대의 프로세서들은 아래 그림과 같이 가상 주소 방식이라 불리는 방식을 사용한다.
CPU는 가상주소지정으로 가상주소(VA)를 생성해서 메인 메모리에 접근하며, 이것은 메모리로 보내지기 전에 적절한 물리 주소로 변환된다. 가상주소를 물리 주소로 변환하는 작업은 주소 번역이라고 알려져 있다.
CS:APP 번역서는 진짜 쓰레기다. 오역 및 오탈자가 난무하다. 영어를 못해도 차라리 원서를 읽는 것이 번역서를 보고 이해하는 것보다 빠르겠다.