LISTORY

[윈도우즈 시스템 프로그래밍] 가상 메모리(1) 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 가상 메모리(1)

LiStoryTeller 2018. 10. 14. 21:55


뇌를 자극하는 윈도우즈 시스템 프로그래밍 책 관련 유투브 강의 정리이다.


이번 내용은 가상메모리이다.


YouTube 주소 : 가상 메모리(1)



가상 메모리


가상메모리를 설명하기 전에 식당을 예로 들어보겠다.


식당에 총 10개의 테이블이 있다. 그럼 손님은 하루에 최대 몇개의 예약을 받을 수 있을까?


확실한건 10개의 팀은 아닐 것이다. 왜냐하면 테이블은 손님이 왔다가 다시 가고,


그 자리에 새로운 손님을 채울 수 있기 때문이다.


메모리에 비유하자면 실제 메모리는 10번지까지만 존재하지만 필요한 메모리는 20이다.


이럴 경우, 비어 있는 메모리를 다시 사용하는 것을 가상메모리라고 한다.



다시 설명해보겠다.


메인메모리가 있다. 이 메인메모리의 크기는 256MB이다.


하지만 실제로 CPU에서 하나의 프로그램을 돌리는데 필요한 메모리 2GB이다. 이럴 경우 어떻게 해야할까?


이럴 경우에는 하드디스크 를 확장해서 쓰자. 


하드디스크도 메인메모리처럼 쓸 수 있을 뿐만 아니라 파일 시스템을 구축하여 비휘발성으로 데이터 저장하는 기능도 가능하다.


즉, 기능적인 측명만봐선 메인메모리보다 낫다. 단점은 하드디스크가 메인메모리보다 속도가 느리다.


메인메모리가 부족한데 나머지는 뭐로 채우지? 하드디스크를 가져다 쓰자!


하드디스크까지 확장하여 메모리 공간을 넓히는 것을 가상메모리 기법이라고 한다.


⊙ 가상메모리 기법

- 하드디스크까지 메인메모리의 영역을 확장하여 넓히는 것



가상 주소(Virtual Address)


여기서 문제가 두가지 있다.


가상 주소가 해결하고 있는 두가지

1. 선할당으로 인한 부담

2. 느린 속도의 개선


운영체제는 프로세스를 생성할 때마다 32비트 기준 4기가의 메모리를 할당한다.


프로세스별로 4기가의 메모리는 어떻게 쓰일까?


프로세스에는 개발자가 짠 코드 외에, 커널 코드도 돌아야 한다. 


즉, 운영체제를 위한 메모리 공간이 필요하다. 이게 2GB이다.


그럼 나머지 2GB의 메모리가 개발자에게 할당된다. 이 2GB 내에 프로그램 크기도 포함된다.


근데 4기가가 필요하다 해서 4기가의 메모리 공간을 이 프로세스 한정으로 쓰는 것은 아니다.


예를 들어 식당에 테이블 3개 있음 테이블이 모두 차있다고 해도 더이상 예약을 받을 수 없는건 아니다.


4기가를 항상 다 할당해버리면 프로세스를 많이 생성할 수 없다.


그래서 메모리 공간을 필요에 맞게 적절히 할당할 필요가 있다.


즉, 선할당으로 인한 부담이 있으므로 손님이 오기도 전에 메모리를 모두 할당하지 말아야 한다.



⊙ 느린 속도의 개선


앞에서 램이 부족하면 하드디스크 활용한다고 했다.


예를들어 램이 1GB 하드디스크가 1GB 총 2GB가 필요하다고 가정해보자.


그럼 프로그램 실행 시 램으로 접근할 경우엔 빠르고 하드디스크로 접근할 경우엔 느릴까?? 말도 안된다.


이렇게 시스템을 구현하면 안된다. 항상 속도는 일정해야 한다.


이렇게 시스템을 구현했을 경우, 시스템이 느릴 텐데 이 느린 속도를 개선하는게 가상메모리 기법의 일부이다.



가상주소와 물리주소


이 부분은 실질적인 주소는 Ram에만 할당이 된다라는 관점에서 설명해야 한다.


하드디스크에도 주소 공간을 할당 할 수 있다. 하지만 영역 확장해도 실질적인 물리주소로 바라보진 않는다.


물리 주소는 ram이라는 메모리 공간 한정이다.


ram이 256MB일 경우, 그럼 1번지~256번지 까지만 물리주소이다.


가상 주소는 하드디스크까지 확장했을 때 플러스 알파로 얻게되는 메모리 주소값을 말한다.



선 할당으로 인한 부담 해결책



그림에서 cpu는 손님, MMU(Mamory Management Unit)은 음식점 주인라 보면 된다.


프로그래머가 프로그램을 개발할 때, 가상 메모리가 2GB 할당되었다고 하면 2GB가 실제 있다고 가정하고 프로그래밍을 한다.


CPU도 마찬가지이다. CPU 관점에서 가상 메모리는 실제 존재하는 메모리로 가정하고 실행된다.


즉, CPU도 2GB의  메모리가 있다고 가정한다.


그러므로 0부터 2기가-1번지까지 메모리에 접근하려 하고, 그렇게 요구한다.


CPU가 이렇게 메모리를 요구하면, MMU라는 애는 그 메모리 공간에 데이터가 있는 것 마냥 잘 가져다 준다.


메인메모리 총 16k 있다고 해보자


CPU는 더 많은 메모리가 있는 줄 알고 더 많은 양을 할당하길 요구한다.


맨 처음, 1k서부터 20바이트의 메모리를 요구하였다.


그럼 MMU는 0~4k 사이의 메모리를 블럭 단위로 할당한다. 그럼 이 블럭은 용도가 결정난 것이고 더이상 바뀌지 않는다.


그런 다음 CPU는 36k번지서부터 20바이트의 메모리를 할당해달라고 요구하였다.


이때 MMU는 36k번지부터 메모리를 할당하는 것이 아니다. 


가상메모리 관점에서는 36k~40k를 할당한 것이지만 실제는 무리적 주소 4k~8k 까지 할당된 것이다.


이렇게 가상메모리로 접근시, MMU는 물리 메모리로 바꾸어 메모리를 관리한다.



Comments