가상 메모리
최근 수정 시각: (5년 전)
가상메모리에서 넘어옴
분류
1. 개요 [편집]
일반적으로 한 시스템의 여러 프로세스들은 CPU와 메인 메모리를 공유한다. CPU를 공유하는 부분에 대해서는 일반적으로 순서를 기다리느라 단지 느려질 뿐이고 심각한 오류는 발생하지 않는다. 그러나 프로세스들이 존재하는 메모리가 여유가 없이 지나치게 많은 요구에 의해 오염될 경우,[1] 프로그램의 논리와 무관하게 오류가 난다. 이를 방지하기 위한 기술이 바로 가상메모리이다.
이러한 가상메모리 기술은 사용자가 신경 쓸 필요 없이 OS 측에서 자동으로 작동하며 사용자가 프로세스를 올리고 내림에 있어서 역시 사용자가 신경 쓸 필요 없이 OS의 가상메모리를 활용하여 자동으로 메모리 관리를 위임할 수 있다는 장점이 있다.
이러한 가상메모리 기술은 사용자가 신경 쓸 필요 없이 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 가 이 페이지 테이블을 참조해서 실제 물리 메모리 주소를 얻고 그 위치를 참조해서 값을 가져오게 된다. 이렇게 되면 두 프로세스의 주소 공간이 겹치지 않고 독립적으로 실행될 수 있으며 프로그래머는 다른 프로세스의 주소 공간을 생각할 필요가 없어진다.
각 프로세스가 독립된 가상 주소 공간을 가지면, A 프로세스에서 0x1000 라는 주소를 가질 수도 있고 동시에 B 프로세스에서도 0x1000 이라는 주소를 가질 수도 있다. 이 두 프로세스에서 각자 0x1000 이라는 주소에 접근하는 명령을 실행할 경우, CPU 는 프로세스(컨텍스트)마다 별도로 가지고 있는 페이지 테이블이라는 대상을 참조한다.
이 페이지 테이블은 한 마디로 가상 주소와 실제 주소를 연결시켜주는 테이블이다. 가령 A 프로세스의 페이지 테이블에서, 0x1000 주소에 대응되는 실제 주소는 0x300000 으로 나오고, B 프로세스의 페이지 테이블에서는 0x1000 주소에 대응되는 실제 주소가 0x400000 인 것이다. 이렇게 되면 두 프로세스는 동일한 0x1000 이라는 주소를 참조했지만, 실제로는 MMU 가 이 페이지 테이블을 참조해서 실제 물리 메모리 주소를 얻고 그 위치를 참조해서 값을 가져오게 된다. 이렇게 되면 두 프로세스의 주소 공간이 겹치지 않고 독립적으로 실행될 수 있으며 프로그래머는 다른 프로세스의 주소 공간을 생각할 필요가 없어진다.
4. 기타 [편집]
가상 메모리 기법은 디스크를 메모리로 사용하는 디스크 페이징(스왑)과는 직접적으로 연관이 없다. 여기서 가상(Virtual) 의 의미는 디스크를 가상의 RAM 처럼 쓴다는 의미가 아니라, 각 프로세스마다 실제 물리 메모리가 아닌 가상의 주소 공간을 보이게 한다는 의미이다. 사실 넓게 보면 메모리의 내용을 디스크에 임시로 저장하는 개념 자체는 별로 특이한 것도 아니고 이론적으로는 가상 메모리를 사용하지 않는 시스템에서도 구현할 수 있다.[4] 이렇게 용어가 혼동되어 쓰이는 이유는 Windows 에서 이러한 디스크 스왑 설정을 "가상 메모리" 라고 해놓았기 때문이다.
램의 크기가 32GB~128GB 정도로 충분히 크다고 판단하여 가상 메모리를 사용할 필요가 없는 것이 아니므로, 가상 메모리 기능을 비활성화하는 것은 좋지 않다. 자세한 내용은 PC최적화 문서를 참고.
램의 크기가 32GB~128GB 정도로 충분히 크다고 판단하여 가상 메모리를 사용할 필요가 없는 것이 아니므로, 가상 메모리 기능을 비활성화하는 것은 좋지 않다. 자세한 내용은 PC최적화 문서를 참고.
5. 참조 [편집]
라이선스를 별도로 명시하지 않은 문서는 CC BY-NC-SA 2.0 KR에 따라 이용할 수 있습니다.
기여하신 문서의 저작권은 각 기여자에게 있으며, 각 기여자는 기여하신 부분의 저작권을 갖습니다.
문서의 기여자는 역사 탭에서 확인할 수 있습니다.
접두어의 N: - 나무위키 사용자, R: - 리그베다 위키의 사용자를 뜻합니다.
자세한 사항은 나무위키에서 동일한 문서의 역사를 참고하시기 바랍니다.