※ 질문/내용오류/공유할 내용이 있다면 jinkilee73@gmail.com으로 메일 주세요 :-)


왜 요즘 컴퓨터들은 모두 Virtual Memory를 지원하는가? 왜 모두가 가상 메모리를 사용하고 있는 것인가? 오늘은 그것을 이야기 해볼 생각이다. 신난다. 사실은 이 얘기를 하고 싶어서 지금까지 몇 개의 포스팅을 써왔던 것이다. :-) 

근데 졸려-_-


지금까지 했던 내용과 그림들을 총동원해서 번개보다 빠르게 갈 것이니 잘 이해해보자.


프로그램을 실행하기 위해서 아마도 최초의 컴퓨터는 메모리의 고정 주소에 프로그램을 로드해서 썼을 것이다.(compile time binding) 그러다보니 메모리를 사용할 수 있는 공간의 범위가 조금 유연해졌으면 해서 relocatable object file, load time binding을 가능하게 했던 것이다.



위의 그림과 같다. 그런데 load time binding도 비효율적이드라. 무조건 연속적인 공간이 있어야 프로그램이 로드될 수 있다는 것이 매우 비효율적이라고 느껴졌던 것이다. 그래서 이를 효율적으로 사용할 수 있게 하기 위해서 execution time binding을 구현한 것이다. 실행시간 중에 메모리의 아무 공간에나 로드해라. 따라서 아래와 같이 가능하다.



각각의 프로그램이 분리되어 메모리어 로드되어도 실행가능하게 하는 것이다. 불연속적으로 로드되어도 실행가능하게 말이다. 이것이 가능하려면 특별한 하드웨어적 지원이 필요한데 그것이 MMU이다. 따라서 MMU가 logical address를 physical address로 변환해주는 역할을 하게 되는 것이다. 아래의 그림과 같다.



하나의 프로그램이 위와 같은 형태로 돌아가면 뭐가 좋은가? 우선 프로그래머 입장에서 코딩할 때 메모리 공간을 신경쓰지 않고 코딩해도 된다는 점이 좋다. 프로그래머가 "앗, 저 회사에서 메모리 1GB밖에 안 쓰는 PC가 있으면 어떻하지? 500 MB밖에 안 쓰는 PC도 있으면 어쩌지?" 이런 생각을 할 필요가 없게 만든다. 왜냐하면 왠만해가지고는 요즘 컴퓨터의 하드디스크 공간은 4GB는 넘는다.-_- 어짜피 연산을 수행하는 CPU가 실제로 접근하는 주소는 Virtual Memory이다. 따라서, 프로그래머로 하여금 "모든 컴퓨터는 4GB의 메모리 공간을 가지고 있다"고 생각하게 만들 수 있다. 프로그래머 입장에서는 사용자들의 메모리 성능 생각할 필요 없어서 좋다.


네? 어짜피 Virtual Memory이든 physical memory이든 load되는 프로세스의 크기는 똑같으니까 못돌리는 것은 매한가지 아니냐고요? 아니죠! dynamic loading입니다. 즉, 필요한 함수만 골라서 loading해서 쓰기 떄문에 프로그램의 크기가 실제 메모리보다 커도 실제로 메모리에 올라와 있는 공간은 작을 수 있죠.


에헴, 다시 독백모드로. 그래서 Virtual Memory를 쓴다. dynamic loading을 통해 실제로 쓰는 함수들만 호출할 수 있고 그것을 physical memory의 연속적이지 않고 불연속적으로 로드되어도 상관없게 만드므로서 실제 메모리 공간의 활용은 아래 그림과 같이 좋아진다.



이러다 보니 실제 메모리 공간에 올라와있는 프로그램의 수가 많아질 수밖에 없다. 당연하다. dynamic loading이 아니라면, 프로그램의 크기가 5MB, 5MB, 5MB짜리를 10MB의 메모리 공간에 돌릴 수 없지만, dynamic loading이 지원되는 환경에서는 5MB의 프로그램이 가령 3MB의 메모리 공간만을 차지하기 때문에(dynamic loading이란, 필요한 프로그램만 불러서 '알짜배기'로 쓰는 것니까) 10MB의 메모리 공간으로도 총 15MB의 프로그램을 실행시킬 수 있다.


따라서 multi-programming degree가 높아진다. 여러 개의 프로세스가 메모리에 load되어있기 때문에 multi-programming degree는 당연히 높아지는 것이다.


Virtual Memory의 또 다른 장점은 바로 Swapping이다. 


http://operatingsystems.tistory.com/entry/SP-Virtual-Memory-Swapping

위의 링크에서 간단하게 언급만 하고 넘어갔다고 해서 무시하면 안 된다. Swapping을 하는 것은 사실 굉장히 시간이 오래 걸리는 작업이다. (CPU 입장) 따라서 Swapping하는 회수를 줄인다면 컴퓨터의 성능을 높일 수도 있다. Virtual Memory는 Swapping 회수를 줄여줄 수 있다. 왜냐하면 이것 역시 Dynamic loading이 전재되어있기 때문이다. Dynamic loading이 불가능하다면 메모리에 하나의 프로세스가 통째로 들어와야 하는데, 그렇게 되면 메모리의 활용가능한 공간은 당연히 줄어들 게 될 것이고, 활용가능한 공간이 줄어들면 활용가능한 공간을 만들기 위해 계속적으로 하드디스크와 Swapping을 해야하기 때문이다. (이 때 Swap 되는 하드디스크 영역을 Swap 영역이라고 한다.) Dynamic loading이 전재된 Virtual Memory 환경에서는 프로그램의 자주 사용되는 프로세스들이 알짜배기로 많이 로딩되어있기 떄문에 하드디스크와의 Swapping이 자주 발생하지 않을 수 있다.


아 개운하다. 지금까지가 내가 정말로 포스팅하고 싶었던 내용이다. 마지막으로 Virtual Memory의 장점을 아래와 같이 요약해보자.

1. 프로그래머 입장에서 쉽게 프로그래밍할 수 있다

2. Multi-programming degree를 높일 수 있다.

3. 메모리와 하드디스크간의 Swapping 회수를 줄일 수 있다.


이 포스팅부터 본 사람들은 아마 이해하기 힘드실 지도 모른다. 그런 분들께는 조심스럽게 이전에 포스팅해둔 [SP] Virtual Memory (Basic Knowledge) 부터 차례대로 공부해오시기를 권고한다.

'System Programming' 카테고리의 다른 글

[SP] Assembly Language  (1) 2013.04.30
[SP] Assembly Language Basic  (0) 2013.04.29
[SP] Virtual Memory  (3) 2013.04.29
[SP] Virtual Memory (Swapping)  (0) 2013.04.24
[SP] Virtual Memory (Basic Knowledge)  (1) 2013.04.23
Posted by 빛나유
,