※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)
지금은 시스템 프로그래밍으로서의 Virtual Memory를 포스팅하고 있기 때문에 실제로 Virtual Memory를 구현한 기법인 Demand Paging과 같은 방법에 대한 소개는 안 할 예정이다. Virtual Memory에 대한 실제 개념만을 이야기해보자.
Virtual Memory를 제대로 설명한답시고 굉장히 여러 개의 포스팅을 사전지식으로 올려놨었다. 그것을 지금 활용해보고자 한다.
http://operatingsystems.tistory.com/entry/SP-Virtual-Memory-Basic-Knowledge-1
위의 포스팅에서 프로그램이 실제의 메모리에서 어떠한 방식으로 로드되는지 설명했다. 사람이 생각하기에는 그냥 메모리의 하나의 연속적인 공간을 프로그램이 다 차지하고 있으면 좋겠다. 그런데 컴퓨터 입장에서는 공간의 비효율이 생기기 때문에 연속적이지 않게 프로그램이 로드되는 것이 좋다고 했다. 이 내용이 위의 포스팅의 핵심 내용이다.
이런 생각을 했어야 한다. 실제 메모리에 연속적으로 프로그램이 로드되지도 않았는데 어떻게 프로그램이 실행될 수 있을까? 다음에 실행될 것이 어디있는 줄 알고? 그것에 대한 해답은 Virtual Memory로 할 수 있다. 32비트 컴퓨터 기준에서 OS 설치할 때 하드 디스크의 특정 공간에 4GB의 파일이 생성된다. 32비트 윈도우즈 7기준으로는 C:\pagefile.sys 라는 파일이 4GB의 용량을 차지하고 있을 것이다.
우선 CPU는 프로그램을 위의 공간에 연속적으로 로드시켜놓는다. 위의 공간의 주소에 연속적으로 놓여진 프로그램 명령어 즉,
8048040 push %ebp
8048044 movl %esp, %ebp
... ...
이러한 어셈블리어 코드들이 차례대로 실행이 되는 것이다. 왼쪽에 있는 부분이 Virtual Memory라고 이해하면 되겠다. 이 주소들이 MMU에 의해 실제 Physical Memory주소로 변환되는 것이다. 따라서 실제 프로그램이 Physical Memory에서는 아무리 불연속적으로 로드되어있어도 상관이 없다. 왜냐하면 CPU는 Virtual Memory의 주소값으로 실행을 하는 것이기 때문이다. CPU가 메모리라고 생각하고 썼던 그것은(8048040과 같은 숫자들) 사실은 실제 Physical Memory의 주소가 아니었던 것이다. 일종의 가짜 주소이다. 그래서 Virtual Memory, 가상 메모리라고 부른다.
아래와 같이 그림으로 이해하면 쉽다.
물론 실제로는 push %ebp와 같은 것이 010001101..과 같이 사람이 읽을 수 없는 바이너리 표현으로 되어있겠지. 아무튼 위의 그림으로 충분히 이해할 수 있으리라고 믿는다. 마지막으로 설명을 다시 하면 CPU는 무조건 Virtual Memory를 통해서 실제 Physical Memory에 접근하게 되어있다.
※ 이전의 링크를 참고해봐도 좋다.
http://operatingsystems.tistory.com/entry/SP-Virtual-Memory-Basic-Knowledge
모든 프로그램들은 따라서 Virtual Memory에 우선적으로 로드되는 것이다 그 Virtual Memory에는 연속적으로 로드되는데 이것이 MMU에 의해 실제 메모리주소로 바뀌면서 실제 메모리 공간에 불연속적으로 로드되는 것이다.
여기에서 Virtual Memory의 사이즈를 이야기 해보자. 앞서도 계속 32비트 기준이라는 말을 몇 번 했다. 32비트라 함은 실제로 다음과 같다.
0001 0010 1101 1100 1110 0011 1111 1100
0또는 1이 32개가 나열되어있는 것이다. 위의 Virtual Memory 공간은 2진수 0부터 2진수 1111...11 까지이다. 그것이 결국 몇 개인가? 2의 32승개이다.
2의 32승 = 4,294,967,296
그런데 메모리 한 칸이 1 byte이니까 4,294,967,296 * 1byte = 4GB가 된다. 따라서 32비트 기준으로 가상메모리의 공간은 4GB가 된다. 64비트 컴퓨터면 엄청난 공간의 가상메모리를 사용할 수 있겠지요? 혹시 4GB라는 계산이 잘 이해가 되지 않는 사람은 아래의 그림을 참고해봐라.
짧게 다시 설명을 해보면, 가운데 55 89 e5와 같은 것은 하나하나가 1byte이다. 따라서 명령어 55는 메모리 한 칸을 차지하고 있는 것이고, 명령어 89 e5는 메모리 두 칸을 차지하고 있는 것이다. 따라서 89 e5다음의 명령어는 offset이 3이 되는 것이다. 결국 칸 수 체우는 것이지.
아무튼 다시 본론으로 돌아가보자. 32비트 컴퓨터에서 가상메모리의 한계는 결국 4GB가 된다. 다른 말로 말하면 하나의 프로세스의 크기는 32비트 컴퓨터에서는 4GB가 넘을 수 없다. 그런데 32비트 컴퓨터가 왜 4GB의 가상 메모리 공간을 하드디스크에 가지고 있는 것일까? 즉, 왜 가상 메모리를 쓰는 것일까? 다음 포스팅에서 설명해보자.
'System Programming' 카테고리의 다른 글
[SP] Assembly Language Basic (0) | 2013.04.29 |
---|---|
[SP] Purpose for Virtual Memory (0) | 2013.04.29 |
[SP] Virtual Memory (Swapping) (0) | 2013.04.24 |
[SP] Virtual Memory (Basic Knowledge) (1) | 2013.04.23 |
[SP] Virtual Memory (Basic Knowledge) (6) | 2013.04.23 |