가상 메모리
Virtual Memory
일반적으로 한 시스템의 여러 프로세스들은 CPU와 메인 메모리를 공유한다. CPU를 공유하는 부분에 대해서는 일반적으로 순서를 기다리느라 단지 느려질 뿐이고 심각한 오류는 발생하지 않는다. 그러나 프로세스들이 존재하는 메모리가 여유가 없이 지나치게 많은 요구에 의해 오염될 경우,[1] 프로그램의 논리와 무관하게 오류가 난다. 이를 방지하기 위한 기술이 바로 가상메모리이다.
이러한 가상메모리 기술은 사용자가 신경 쓸 필요 없이 OS 측에서 자동으로 작동하며 사용자가 프로세스를 올리고 내림에 있어서 역시 사용자가 신경 쓸 필요 없이 OS의 가상메모리를 활용하여 자동으로 메모리 관리를 위임할 수 있다는 장점이 있다.
가상 메모리의 주요한 기능은 다음 3가지로 요약할 수 있다.
현대의 CPU 는 전부 MMU 라는 메모리 관리 유닛을 별도로 내장하고 있다. 이 MMU 라는 용어는 반드시 가상 메모리 기법을 구현하는 유닛만을 얘기하는 것은 아니고, 뱅크 스위칭과 같은 방식으로 처리하는 경우에도 MMU 라 부를 수 있다. 이런 목적으로 별도의 칩이 있어서 CPU 와 메모리 사이의 회로 연결로 구현이 되는 경우도 있으나 물론 현재는 CPU 에 포함되어 있다. 여기서는 최신 CPU 기준으로만 설명한다.
각 프로세스가 독립된 가상 주소 공간을 가지면, A 프로세스에서 0x1000 라는 주소를 가질 수도 있고 동시에 B 프로세스에서도 0x1000 이라는 주소를 가질 수도 있다. 이 두 프로세스에서 각자 0x1000 이라는 주소에 접근하는 명령을 실행할 경우, CPU 는 프로세스(컨텍스트)마다 별도로 가지고 있는 페이지 테이블이라는 대상을 참조한다.
이 페이지 테이블은 한 마디로 가상 주소와 실제 주소를 연결시켜주는 테이블이다. 가령 A 프로세스의 페이지 테이블에서, 0x1000 주소에 대응되는 실제 주소는 0x300000 으로 나오고, B 프로세스의 페이지 테이블에서는 0x1000 주소에 대응되는 실제 주소가 0x400000 인 것이다. 이렇게 되면 두 프로세스는 동일한 0x1000 이라는 주소를 참조했지만, 실제로는 MMU 가 이 페이지 테이블을 참조해서 실제 물리 메모리 주소를 얻고 그 위치를 참조해서 값을 가져오게 된다. 이렇게 되면 두 프로세스의 주소 공간이 겹치지 않고 독립적으로 실행될 수 있으며 프로그래머는 다른 프로세스의 주소 공간을 생각할 필요가 없어진다.
가상 메모리 기법은 디스크를 메모리로 사용하는 디스크 페이징(스왑)과는 직접적으로 연관이 없다. 여기서 가상(Virtual) 의 의미는 디스크를 가상의 RAM 처럼 쓴다는 의미가 아니라, 각 프로세스마다 실제 물리 메모리가 아닌 가상의 주소 공간을 보이게 한다는 의미이다. 사실 넓게 보면 메모리의 내용을 디스크에 임시로 저장하는 개념 자체는 별로 특이한 것도 아니고 이론적으로는 가상 메모리를 사용하지 않는 시스템에서도 구현할 수 있다.[4] 이렇게 용어가 혼동되어 쓰이는 이유는 Windows 에서 이러한 디스크 스왑 설정을 "가상 메모리" 라고 해놓았기 때문이다.
램의 크기가 32GB~128GB 정도로 충분히 크다고 판단하여 가상 메모리를 사용할 필요가 없는 것이 아니므로, 가상 메모리 기능을 비활성화하는 것은 좋지 않다. 자세한 내용은 PC최적화 문서를 참고.
1. 개요
일반적으로 한 시스템의 여러 프로세스들은 CPU와 메인 메모리를 공유한다. CPU를 공유하는 부분에 대해서는 일반적으로 순서를 기다리느라 단지 느려질 뿐이고 심각한 오류는 발생하지 않는다. 그러나 프로세스들이 존재하는 메모리가 여유가 없이 지나치게 많은 요구에 의해 오염될 경우,[1] 프로그램의 논리와 무관하게 오류가 난다. 이를 방지하기 위한 기술이 바로 가상메모리이다.
이러한 가상메모리 기술은 사용자가 신경 쓸 필요 없이 OS 측에서 자동으로 작동하며 사용자가 프로세스를 올리고 내림에 있어서 역시 사용자가 신경 쓸 필요 없이 OS의 가상메모리를 활용하여 자동으로 메모리 관리를 위임할 수 있다는 장점이 있다.
2. 기능
가상 메모리의 주요한 기능은 다음 3가지로 요약할 수 있다.
- 주기억장치의 효율적 관리 : 주기억장치[2] 를 하드디스크에 대한 캐시로 설정하여, 당장 사용하는 영역만 유지하고 쓰지 않는 데이터는 하드디스크로 옮긴 뒤, 필요할 때만 램에 데이터를 불러와 올리고 다시 사용하지 않으면 하드디스크로 내림으로써 램을 효과적으로 관리한다.
- 메모리 관리의 단순화 : 각 프로세스마다 가상메모리의 통일된 주소 공간을 배정할 수 있으므로 메모리 관리가 단순해진다.
- 메모리 용량 및 안정성 보장 : 한정된 공간의 램이 아닌 거의 무한한 가상메모리 공간을 배정함으로써 프로세스들끼리 메모리 침범이 일어날 여지를 크게 줄인다.[3]
3. 방식
현대의 CPU 는 전부 MMU 라는 메모리 관리 유닛을 별도로 내장하고 있다. 이 MMU 라는 용어는 반드시 가상 메모리 기법을 구현하는 유닛만을 얘기하는 것은 아니고, 뱅크 스위칭과 같은 방식으로 처리하는 경우에도 MMU 라 부를 수 있다. 이런 목적으로 별도의 칩이 있어서 CPU 와 메모리 사이의 회로 연결로 구현이 되는 경우도 있으나 물론 현재는 CPU 에 포함되어 있다. 여기서는 최신 CPU 기준으로만 설명한다.
각 프로세스가 독립된 가상 주소 공간을 가지면, A 프로세스에서 0x1000 라는 주소를 가질 수도 있고 동시에 B 프로세스에서도 0x1000 이라는 주소를 가질 수도 있다. 이 두 프로세스에서 각자 0x1000 이라는 주소에 접근하는 명령을 실행할 경우, CPU 는 프로세스(컨텍스트)마다 별도로 가지고 있는 페이지 테이블이라는 대상을 참조한다.
이 페이지 테이블은 한 마디로 가상 주소와 실제 주소를 연결시켜주는 테이블이다. 가령 A 프로세스의 페이지 테이블에서, 0x1000 주소에 대응되는 실제 주소는 0x300000 으로 나오고, B 프로세스의 페이지 테이블에서는 0x1000 주소에 대응되는 실제 주소가 0x400000 인 것이다. 이렇게 되면 두 프로세스는 동일한 0x1000 이라는 주소를 참조했지만, 실제로는 MMU 가 이 페이지 테이블을 참조해서 실제 물리 메모리 주소를 얻고 그 위치를 참조해서 값을 가져오게 된다. 이렇게 되면 두 프로세스의 주소 공간이 겹치지 않고 독립적으로 실행될 수 있으며 프로그래머는 다른 프로세스의 주소 공간을 생각할 필요가 없어진다.
4. 기타
가상 메모리 기법은 디스크를 메모리로 사용하는 디스크 페이징(스왑)과는 직접적으로 연관이 없다. 여기서 가상(Virtual) 의 의미는 디스크를 가상의 RAM 처럼 쓴다는 의미가 아니라, 각 프로세스마다 실제 물리 메모리가 아닌 가상의 주소 공간을 보이게 한다는 의미이다. 사실 넓게 보면 메모리의 내용을 디스크에 임시로 저장하는 개념 자체는 별로 특이한 것도 아니고 이론적으로는 가상 메모리를 사용하지 않는 시스템에서도 구현할 수 있다.[4] 이렇게 용어가 혼동되어 쓰이는 이유는 Windows 에서 이러한 디스크 스왑 설정을 "가상 메모리" 라고 해놓았기 때문이다.
램의 크기가 32GB~128GB 정도로 충분히 크다고 판단하여 가상 메모리를 사용할 필요가 없는 것이 아니므로, 가상 메모리 기능을 비활성화하는 것은 좋지 않다. 자세한 내용은 PC최적화 문서를 참고.
5. 참조
[1] 의도치 않게 덧씌워진 경우 등.[2] 항상 RAM이지는 않으나, 일반적으로 이 역할을 RAM이 하므로 이하 램이라 한다. 또한 보조메모리는 그냥 하드디스크로 부른다.[3] 사실상 없앤다고 봐도 무방하나 완전히 없애는 경우는 없다.[4] 애초에 개발자가 명시적으로 구현한다면 어느 시스템이든 안될 건 없으나(이건 데이터 백업이나 다름 없다) 당연히 그런 경우는 포함하지 않으며 응용 프로그램 개발자가 따로 고려하지 않아도 묵시적으로 처리되는 경우만 얘기하는 것이다.