LISTORY

[윈도우즈 시스템 프로그래밍] 메모리 관리 본문

IT/윈도우 프로그래밍

[윈도우즈 시스템 프로그래밍] 메모리 관리

LiStoryTeller 2018. 11. 11. 01:19


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


오늘 정리할 내용은 메모리 관리 부분이다.


YouTube 주소 : 메모리 관리



메모리 관리


가상 메모리 컨트롤


cpu가 메모리를 보는 관점이나, 프로그래머나 메모리를 보는 관점은 똑같다.


개발할 때 32비트 환경 기준, 4기가의 메모리가 할당된다고 가정한다. 이는 cpu도 마찬가지이다.


이는 가상메모리 이고, 가상메모리는 물리메모리에 매핑된다.


가상메모리를 컨트롤 한다는 건 어떤 의미일까?



⊙ 가상메모리의 Commit, Free와 물리메모리의 관계


가상메모리는 페이지단위로 나뉘어 진다.


페이지의 크기는 메모리를 페이지 수로 나누면 된다.


4기가의 메모리가 있다? 4기가/페이지 수 그럼 페이지의 크기가 나온다


가상메모리를 관리하는 것은 윈도우즈이다.


윈도우즈가 페이지를 관리할 때, 페이지에 대한 특성 정보를 기록하는데


보통 Commit , 또는 Free 상태로 나뉘어진다. 하지만 윈도우즈는 Reserve 상태라는 것도 존재한다.


즉, 윈도우즈는 페이지가 이 셋중 하나의 상태가 되게 한다.



내가 할당 받지 않은 페이지는 Free 상태이다. 즉, 물리메모리와 연결이 이루어지지 않은 상태, 비어있는 메모리 공간이다.


반면에 commit 상태는 메모리가 물리메모리가 할당된 상태이다.


대표적으로 malloc 함수가 호출되었을 때, 페이지가 Commit 된다. 반면에 매핑된 페이지를 Free 함수를 써서 반환하면 물리메모리와의 연결도 끊어진다.


근데 이게 너무 비효율적이다. 왜일까?


⊙ Reserve 상태의 필요성



우리가 프로그램을 생성하여 배열을 통해 메모리 공간을 할당 받아야 한다.


프로그램은 일년 내내 동작하고, 보통은 1~100 정도만 차지하지만 아주 가끔 1만의 크기를 할당해야 할 때가 존재한다.


그럼 우리는 1만의 배열을 생성하기 마련이다.


근데 이건 너무나도 비효율적이다. 평상시에는 100도 안되는 크기를 필요로 하는데,


아주 가끔 있는 메모리 할당을 위해 1만의 메모리를 잡아야 한다.


다시 사진을 보자 5페이지를 할당했다. 근데 우리 페이지0 1 만 사용한다.


특히, 이 쓰지 않는 메모리를 위해 물리메모리의 연결도 이미 해두었기 때문에 더욱 비효율적이다.


그럼 페이지 0,1 만 잡아두고 나중에 추가적으로 하면 되지 않느냐? 라고 생각할 수도 있겠지만


하지만 순차적으로 메모리를 할당받고 싶어하는 경우가 많다. 즉, 연결된 메모리 공간을 할당하고 싶을 경우가 많다.


문제점을 정리해보자


문제1. 연결된 메모리 공간 필요

문제2. 메모리를 미리 할당하면 너무 낭비


그래서 reserve상태가 등장했다. 즉, 메모리를 예약하는 상태가 등장했다.


예약을 하면 다른 프로그램이 쓰지 못하지만, 물리 메모리에 연결하진 않는다.


여기서 commit 하면 예약한 메모리를 사용할 수 있다.



⊙ 메모리 할당의 시작점과 단위 확인


가상메모리 상에서 메모리 할당한다.


기본적으로 메모리는 모두 free 상태. 여기서 commit, 또는 reserve 상태로 바꿀 수 있다.


윈도우즈는 페이지 단위로 메모리를 관리하기 때문에, 메모리 공간을 할당할 때에는 어디서부터 시작해야 하는지, 할당할 수 있는 크기는 최고 얼만큼인지 기준이 필요하다.


메모리 할당의 시작점

Allocation Granularity Boundary 기준 -> 메모리 할당의 시작점

페이지 크기의 몇 배수 : 지나친 단편화를 막기 위해 


● 할당할 메모리의 크기

최소 1페이지 이상


● GetSystemInfo(&si) // SYSTEM_INFO

pageSize = si.dwPageSize

allocGranularity = si.dwAllocationGranularity


메모리 할당의 시작점은 각 페이지의 시작 주소로 시작한다. 


GetSystemInfo(&si)  호출 시, 멤버 중에서 PageSize와 dwAllocationGranularity가 존재한다.


dwAllocationGranularity가 메모리의 시작점을 알려준다.


할당할 메모리의 크기는 최소 1페이지 이상을 해야한다.







Comments