본문 바로가기
프로그래밍

가상메모리의 상태를 알아보자!

by 안플루언서 2011. 3. 3.
윈도우에서 애플리케이션에서 가상메모리공간의 정보를 가져올수 있는 함수를 제공한다.



BOOL WINAPI GlobalMemoryStatusEx(
  __inout  LPMEMORYSTATUSEX lpBuffer
);

위의 함수는 4GB 이상의 메모리를 체크할수 있는 함수 이며
4GB 까지 커지기 전의 시스템에서 사용하던 함수는 함수이름에서 Ex 를 뺀
GlobalMemoryStatus 함수를 사용였다..

GlobalMemoryStatusEx 함수에는

typedef struct _MEMORYSTATUSEX {
    DWORD dwLength;
    DWORD dwMemoryLoad;// 머신의 메모리 사용 퍼센트
    DWORDLONG ullTotalPhys;// 물리메모리 총 사이즈
    DWORDLONG ullAvailPhys;// 물리메모리 가용 사이즈
    DWORDLONG ullTotalPageFile;// 페이지파일 총 사이즈
    DWORDLONG ullAvailPageFile;// 페이지파일 가용 사이즈
    DWORDLONG ullTotalVirtual;// 현재 프로세스 가상메모리 유저모드 총 사이즈
    DWORDLONG ullAvailVirtual;// 현재 프로세스 가상메모리 유저모드 가용 사이즈
    DWORDLONG ullAvailExtendedVirtual;// 확장 메모리 가용 사이즈
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;

구조체를 넣어주면 값을 알아올수 있고..
함수에 인자로 넣기 전에 dwLength 변수에 구조체의 값을 설정하고 사용해야한다.

MEMORYSTATUSEX statex;
memset( &statex, 0, sizeof(MEMORYSTATUSEX) );
statex.dwLength = sizeof(MEMORYSTATUSEX);
GlobalMemoryStatusEx(&statex);

//아래와 같은 방식으로 가상메모리의 남은 용량을 알아볼수 있다.
int availVirSize = statex.ullAvailVirtual>>20; // MB 사이즈

위의 함수에서는 프로세스의 가상 주소 공간내의 특정페이지가
물리 저장소(램)에 올라가서(커밋) 동작 중인지 아닌지를 알수 있는 방법이 없다..

가상 주소가 물리 저장소에 커밋되어 있는 부분을 워킹셋 이라고 부른다..
paspi.h 헤더 파일에는 GetProcessMemoryInfo 함수가 지원 되며
특정 프로세스의 워킹셋과 같은 정보를 알아볼수 있다..


PROCESS_MEMORY_COUNTERS_EX ProcessMemCntEx;
memset(&ProcessMemCntEx,0,sizeof(PROCESS_MEMORY_COUNTERS_EX));
ProcessMemCntEx.cb = sizeof(PROCESS_MEMORY_COUNTERS_EX);
GetProcessMemoryInfo(GetCurrentProcess(),
   (PROCESS_MEMORY_COUNTERS*)&ProcessMemCntEx,
   sizeof(PROCESS_MEMORY_COUNTERS_EX)) );

typedef struct _PROCESS_MEMORY_COUNTERS_EX {
    DWORD cb;
    DWORD PageFaultCount;
    SIZE_T PeakWorkingSetSize; // 애플리케이션이 시작된후 가장 많은 램을 사용한 순간의 크기
    SIZE_T WorkingSetSize; // GetProcessMemoryInfo함수가 호출된 순간의 램 사용 크기
    SIZE_T QuotaPeakPagedPoolUsage;
    SIZE_T QuotaPagedPoolUsage;
    SIZE_T QuotaPeakNonPagedPoolUsage;
    SIZE_T QuotaNonPagedPoolUsage;
    SIZE_T PagefileUsage;
    SIZE_T PeakPagefileUsage;
    SIZE_T PrivateUsage; // 애플리케이션에서 명시적으로 할당한 메모리의 크기
} PROCESS_MEMORY_COUNTERS_EX;
typedef PROCESS_MEMORY_COUNTERS_EX *PPROCESS_MEMORY_COUNTERS_EX;

PrivateUsage 변수를 이용해 현재 new, malloc,VirtualAlloc 등으로 할당한 메모리의 총 사이즈를 알수 있다.

시스템, 쓰레드스택, dll, exe 등의 메모리는 유저모드 파티션에 로드가 되므로..
_MEMORYSTATUSEX  구조체의 값과 _PROCESS_MEMORY_COUNTERS_EX 구조체를 이용해
애플리케이션에서 가상 주소공간내에 내가 사용할수 없는 용량이 얼마나 되는지 알수 있다..
전체 가상메모리 - 사용가능 가상메모리 - 할당한 가상메모리

댓글