출처
: http://mooneegee.blogspot.kr/2015/01/os-virtual-memory-1.html
: http://mooneegee.blogspot.kr/2015/01/osvirtual-memory-2-virtual-address.html
: http://mooneegee.blogspot.kr/2015/01/os-virtual-memory-3-page-page-frame.html
1. 시스템과 메모리 할당 사이의 관계
가상 메모리가 등장했다. 윈도우를 사용하다보면 어쩌다가 한 번쯤은 만나볼만한 녀석이다.
나는 종종 가상 메모리를 늘려달라는 잔소리를 Windows7으로부터 들은 경험이 있다.
이래나 저래나 가상메모리가 중요한 녀석일 것 같다는 생각은 가질만하다.
시작부터 황당하기 그지 없다. 내가 전에 사용했던 컴퓨터는 32비트 시스템이고, 돈 좀 써서 2G바이트 RAM를 장착했었다.
그 당시에 상당히 좋은 사양이었고, 게임도 아주 잘 돌아갔다. 그런데 이상한 점은 32비트 시스템에서 프로세스 생성 시 4G바이트의 메모리를 할당받을 수 있다는 사실이다. 나는 분명 2G바이트 크기의 RAM을 가지고 있었다. '모자라는 상태에서 어떻게 메모리를
할당했지?', '뭐하러 4G바이트나 되는 크기를 할당하지? 윈도우 계산기 켜는데 4G를 할당한다고?' 등등의 의문이 생길 수 밖에 없다.
2. 가상 주소 시스템(Virtual Address System)
시스템과 메모리 할당 사이의 관계에서 해결하지 못했던 궁금증을 이번에는 반드시 개운하게 풀어보고자 한다. 하지만 포스팅하면서도 또 분량이 늘어져서 3편, 4편으로 이어질 것 같다. 분명히.
가상주소(virtual address)
지난 포스팅에서 32비트 시스템에서 2G바이트 RAM으로 어떻게 4G바이트를 할당할 수 있는지 답을 내리지 못하고 마무리하였다. 분명한 사실은 4G바이트를 할당하였다는 점이다. 어떻게든 할당하였다. 메모리가 모자람에도 불구하고 할당하였다는 점은 실재 메모리말고 다른 어떤 메모리가 있다는 것을 의미한다. 그래야 실재 메모리 이상을 할당할 것이 아닌가. 그런 메모리를 할당하고 관리하는 주체가 바로 운영체제이다.
먼저 32비트 시스템으로 돌아가보자. 프로세스를 하나 실행하여 메모리를 할당받는다. 최대로 할당받을 수 있는 크기는 물리적인 메모리 크기인 2G 바이트와 별개로 시스템이 표현할 수 있는 최대의 메모리 주소 공간의 크기였다. 즉 4G바이트만큼 할당받을 수 있었다. 물리적 메모리를 초과하는 용량은 4G바이트를 도대체 어디서 할당한다는 말인가? 이것 의문을 먼저 해결해보자.
메모리 계층 구조를 떠올려보자. 느린 대신 값싸고 용량이 엄청 큰 하드디스크는 요즘 1T바이트짜리도 많이 사용한다. 그리고 메모리 계층 구조에서 알 수 있듯이 하드디스크라고 해서 메인 메모리 같은 역할을 수행하지 말라는 법은 없다. 느려서 문제일 뿐이다. 속도가 느리다는 문제를 극복할 수 있는 대안이 나온다면 하드디스크의 빵빵한 용량을 메모리 할당에 활용할 수는 있을 것 같다는 생각이 든다. 그리고 추가로 4G바이트만큼을 늘 할당할 필요도 없을 것 같다. 한번에 4G바이트만큼이나 차지하는 프로세스는 흔치 않다.
출처는 내 컴퓨터^^
이런 가상의 공간에 대한 지정해주기 위해서 가상 주소 시스템이 필요하다.
3. 페이지(Page), 페이지 프레임(Page Frame), 페이지 테이블(Page Table)
시스템과 메모리 할당 간의 관계와 가상 주소 시스템까지 알아보았다.
이제 아직 해결하지 못한 두 문제를 해결하고자 한다. 이 문제를 해결하면 가상 메모리에 대한 핵심을 거의 이해했다고 봐도 무방하다.
아직 해결하지 못한 문제들
1. 32비트 시스템에서 하드디스크를 이용하여 프로세스마다 가상 메모리 공간 4G바이트를 할당하는 것은 효율적이지 못하다.
2. 하드디스크는 메인 메모리와 비교했을 때 느리다.
이 두 가지 문제를 해결하기 위해서 페이지, 페이지 프레임, 페이지 테이블이 필요하다.
페이지, 페이지 프레임, 페이지 테이블
먼저 1번 문제를 해결해보자.
불필요하게 많은 공간을 하드디스크에 할당하는 것은 올바르지 못하다. 4G바이트나 되는 공간을 할당하면 낭비도 심하고 시간도 오래 걸리기 때문이다. 그래서 좀더 작은 단위로 할당하는 것은 어떤가?
이는 2번 문제점에 대한 답이 된다. 가상 주소 공간을 활용하면 물리 주소 공간에 비해서 표현할 수 있는 메모리 주소의 범위가
증가하고, 더 많은 메모리를 사용하는 효과를 얻을 수 있다. 다만 하드디스크는 느리다는 단점이 있다.
느린 하드디스크의 한계를 극복하고자 하드디스크와 맵핑된 메인 메모리를 활용한다. 이는 메모리 계층 구조와 동일한 원리이다.
위의 그림이 바로 페이지 테이블에 대한 설명이다.
없다. 그럼 가상 주소 공간의 일부분만 메인 메모리에 올려서 사용할 수 밖에 없을 것이다. 그런데 필요한 데이터가 메인 메모리의 존재하지 않으면 어떻게 하나? 이는 캐쉬 알고리즘을 이해하고 있다면 쉽게 알 수 있다. 가상 주소 공간에 존재하는 즉 실제로는 하드디스크에 저장된 데이터를 메인 메모리로 올리고, 가장 불필요하다고 판단되는 데이터를 다시 하드디스크로 내리면 된다. 이 과정에 대해서 조금더 부연 설명을 하면 올리고 내리는 데이터는 스왑파일(swap file)이라는 형태로 저장된다. 내리고자 하는 데이터를 스왑파일로
저장하여 하드디스크로 저장하고, 올리고자 하는 데이터 또한 스왑파일로 저장된 상태이므로 메인 메모리로 바로 올리면 된다.