728x90

가상 메모리 컨트롤

- CPU와 프로그래머 관점에서 보는 메모리는 가상메모리이고 실제 물리적 메모리에 매핑되는 구조

- 가상 메모리의 페이지

    -> Windows는 가상메모리의 페이지를 관리할 때 페이지에 특성을 부여

    -> Commit 상태 : 물리적인 메모리가 할당이 된 상태

    -> Free 상태 : 할당을 하지 않은 상태. 물리 메모리에 매핑되지 않은 상태

    -> malloc 함수를 통해 commit 상태가 되고 free 함수를 통해 Free 상태가 됨

    -> Reserve 상태 : 미리 사용할 메모리를 Commit 상태로 놓게되면 비효율적이면서 다른 곳에서 사용할 수 없고 연속적인 페이지 할당을 받고 싶기 때문에 필요한 연속된 페이지를 예약하여 다른 누군가가 메모리 공간을 할당할 때 허용을 해주지 않고 물리적인 메모리 공간도 할당하지 않은 상태

 

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

- 메모리 할당의 시작점

    -> Allocation Granularity Boundary 기준 : 메모리 공간을 할당할 때 어디서부터 할당하라는 기준 

    -> 페이지 크기의 몇 배수로 할당을 하게 되어 있고 각 페이지의 시작주소로 할당을 요구하면 할당하는 크기가 작아지기 때문에 지나친 단편화가 발생할 수 있음

        * 단편화 : 기억 장치의 빈 공간 또는 자료가 여러 개의 조각으로 나뉘는 현상을 말한다. 이 현상은 기억장치의 사용 가능한 공간을 줄이거나, 읽기와 쓰기의 수행속도를 늦추는 문제점을 야기

- 페이지 크기와 Alloc Granularity 확인

#include <stdio.h>
#include <windows.h>

int main()
{
	SYSTEM_INFO si;
	GetSystemInfo(&si);
	printf("페이지 크기 = %d\n Alloc Granularity = %d\n",si.dwPageSize, si.dwAllocationGranularity);
}

 

VirtualAlloc & VirtuallFree

- 가상 메모리를 할당, 해제

- malloc과 free로는 commit, free 상태로밖에 둘 수 없는 단점을 보완하기 위해 사용

LPVOID VirtualAlloc(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  flAllocationType,		// MEM_RESERVE, MEM_COMMIT
  DWORD  flProtect
);

BOOL VirtualFree(
  LPVOID lpAddress,
  SIZE_T dwSize,
  DWORD  dwFreeType			// MEM_DECOMMIT or MEM_RELEASE
);

 

728x90

+ Recent posts