2015. 1. 29.

[OS]가상 메모리(Virtual Memory) - 1. 시스템과 메모리 할당 사이의 관계

 가상 메모리가 등장했다. 윈도우를 사용하다보면 어쩌다가 한 번쯤은 만나볼만한 녀석이다. 나는 종종 가상 메모리를 늘려달라는 잔소리를 Windows7으로부터 들은 경험이 있다.


  Google에서 검색해보면 가상 메모리의 크기를 조절하여 Windows7을 최적화할 수 있다는 글도 보인다. 이래나 저래나 가상메모리가 중요한 녀석일 것 같다는 생각은 가질만하다.


32비트 시스템과 프로세스 메모리 할당

 처음부터 '이거 뭐야?'하는 내용이 등장한다. 32비트 시스템에서 프로세스 생성 시 4G바이트의 메모리를 할당받을 수 있다고 한다. 시작부터 황당하기 그지 없다. 내가 전에 사용했던 컴퓨터는 32비트 시스템이고, 돈 좀 써서 2G바이트 RAM를 장착했었다. 그 당시에 상당히 좋은 사양이었고, 게임도 아주 잘 돌아갔다. 그런데 이상한 점은 32비트 시스템에서 프로세스 생성 시 4G바이트의 메모리를 할당받을 수 있다는 사실이다. 나는 분명 2G바이트 크기의 RAM을 가지고 있었다. '모자라는 상태에서 어떻게 메모리를 할당했지?', '뭐하러 4G바이트나 되는 크기를 할당하지? 윈도우 계산기 켜는데 4G를 할당한다고?' 등등의 의문이 생길 수 밖에 없다. 

 이런 의문들을 하나씩 해결해보자. 먼저 32비트 시스템에서 프로세스 생성 시 최대 4G바이트의 메모리를 할당받을 수 있다는데 왜 그런가? 32비트 시스템은 또 무슨 말인가? 이것에 대한 답을 찾기위해서는 시스템 버스(system bus)라는 것에 대해서 간단히 언급할 필요가 있다. 시스템 버스는 컴퓨터에서 데이터를 이곳에서 저곳으로 옮기는 통로와 이를 관리하는 장치들이라고 생각하자. 이 시스템 버스에서 데이터가 이동하는 실질적인 통로 역할을 하는 것이 바로 I/O 버스이다. 이 I/O 버스가 한번에 전달할 수 있는 데이터의 크기가 바로 32비트이다. 이것 말고도 32비트 시스템에서 32비트가 의미하는 것은 바로 CPU와 같은 장치가 한번에 처리할 수 있는 데이터의 크기이다. 정리하면 한번에 I/O 버스로 이동시킬 수 있는 데이터의 크기도 32비트이고, CPU가 처리할 수 있는 데이터의 크기도 32비트이다. 이 둘의 크기가 같은 것은 우연이 아니다. 한번에 32비트를 처리할 수 있는데, 16비트를 전달해주는 것도 웃긴 일이고 64비트를 전달해주는 것은 무리이다.


 위 그림에서 address bus, control bus, data bus라고 표시된 것들이 바로 시스템 버스에 속하는 녀석들이다. 각 장치들을 연결하면서 데이터 전달 통로 역할을 한다는 사실에 집중하자. 그리고 3가지 bus들의 역할은 각각 다르지만 여기서는 넘어가도록 하겠다.

 그런데 프로세스와 쓰레드를 포스팅할 때도 그랬지만 프로그래머에게 가장 중요한 것 중 하나가 메모리 아니던가. 프로그래머는 메모리를 생각하지 않을 수 없다. 32비트 시스템을 생각할 때도 메모리 측면에서 접근해보자. 

 또 어이없는 상황을 가정해보자. 나는 8비트 시스템에 100G 바이트 RAM를 소유하고 있다. 100G바이트라니 엄청 신나는 일이다. 과연 신나는 일인지 생각해보자. 먼저 8비트 시스템에서는 메모리 주소 공간을 표현할 수 있는 범위는 2^8 만큼이다. 왜 2^8인가? 주소값을 표현하는데 8비트 이상 사용할 수 없기 때문이다.(주소값도 데이터 중 하나이다) 8비트 시스템이 한번에 처리할 수 있는 비트 수는 8개이고, 이에 따라 한번에 다룰 수 있는 주소값은 2^8만큼을 표현할 수 있다. 결국 2^8 = 256, 즉 0 ~ 255까지만 주소를 표현할 수 있다. 100G 바이트 RAM을 달아놓으면 뭐하나? 결국 쓸 수 있는 메모리 공간의 크기는 고작 256바이트 만큼이다. 1/4G 바이트 밖에 사용하지 못하였다.

 그러면 32비트 시스템의 경우는 어떠할까? 한번에 처리할 수 있는 데이터의 크기가 32비트이고, 주소값을 표현하는데 32비트를 모두 사용한다면 최대로 표현할 수 있는 메모리 공간의 크기는 2^32가 된다. 딱 봐도 커보이는 숫자이다. 이를 Windows에 있는 전지전능한 calc.exe를 실행시켜 계산해보면 4294967296이라는 숫자가 나온다. 이 숫자가 바로 4G 바이트를 의미하는 숫자이다. 32비트 시스템에서는 프로세스는 최대 4G 바이트를 할당받을 수 있다는 이유가 이제 설명되었으리라 믿는다.

 최근에는 64비트 시스템이 일반화되고 있다. 그럼 64비트 시스템의 경우 프로세스 당 최대 얼마만큼의 메모리를 할당할 수 있는가? calc.exe의 도움을 받아서 계산해보자. 무려 18446744073709551616라는 숫자가 계산된다. 그냥봐도 큰 수이다. 매우 크다. 여튼 중요한 사실은 한 번에 처리할 수 있는 데이터의 단위가 곧 몇 비트 시스템인지를 결정하고, 이는 곧 메모리를 나타내는 주소값을 표현하는데도 연결되는 사항이라는 사실이다.


아직도 해결되지 못한 궁금증

 시스템과 메모리 할당 사이의 관계는 이해했다. 그렇다면 이제 처음으로 돌아가서 32비트 시스템에서 2G 바이트 RAM에 어떻게 4G 바이트 메모리를 할당할 수 있는지 따져보자. 뜬금없지만 포스트이 길어졌으므로 다음 포스팅으로 넘겨야겠다.    

댓글 2개: