MSN 메신저를 한번 살펴보면 재미난 현상을 발견할 수 있습니다. 메신저 창을 띄워놓은 상태에서는 10MB도 넘게 올라가던 메모리가 닫는 순간 1MB로 뚝 떨어지는 것이죠.
트레이에서 동작하는 프로그램을 만들어본 사람이라면 누구나 한번쯤은, 메모리 사용량으로 관리자와 싸운적이 있을 것입니다. msn은 저런데 왜 당신이 만든 프로그램은 그렇지 않죠? 하지만 조금만 알고보면 이건 눈속임과 마찬가지 입니다.
다이알로그 프로그램을 만든 다음 그냥 실행해 두었을때와 최소화 버튼을 눌러서 최소화 한 경우와 비교를 해봅시다. 아마도 자연스레 최소화를 하면 msn처럼 되는 걸 볼 수 있습니다. 그렇다면 최소화 되지 않을때, 최소화 된 것처럼 메모리를 줄일 수 있는 방법은 없을까요? 물론 있습니다.
그 마법의 방법은 다음 함수를 통해서 구현됩니다.
BOOL SetProcessWorkingSetSize( HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize );
함수 이름 부터가 뭔가 근사하지 않습니까? 말 그대로 프로세스의 워킹셋을 설정하는 함수입니다. 저기 들어가는 사이즈에 0을 넣을 경우 프로세스 워킹셋은 최소로 구성됩니다.
SetProcessWorkingSetSize(GetCurrentProcess(), 0, 0);
위와 같이 사용하면 됩니다. 이놈을 메모리를 최소화 해야 하는 순간에 사용하는 거죠. 윈도우가 최소화될때, 윈도우 시스템에서도 위와 같은 방법으로 워킹셋을 정리합니다.
하지만 이 놈을 마구마구 난무해서는 좋지 않습니다. 왜냐하면 그건 이놈이 필요하건 안하건 모든 메모리를 다 페이지 아웃시키 메모리를 정리하기 때문이죠. 따라서 필요한 부분이 실제 물리적인 메모리로 올라올때 마다 다시 로딩해야 합니다. 그건 곧 느려진다는 것을 의미하는 거죠.
뭐든지 과한건 좋지않습니다. 적절한 장소, 적절한 때에 한번씩 사용해서 정리해 주면 프로그램이 한결 가벼워 보일 것입니다. VC++에서 트레이로 내려갈때, SW_SHOWMINIMIZE로 내려가는 경우는 잘 없습니다. 그럴때 이 함수를 통해서 그러한 때에는 워킹셋을 정리해 주면 최소화 할때처럼 메모리를 정리할 수 있습니다.
음, 한가지 주의해야 할 점은 이 방법은 NT 계열에서만 통용된다는 겁니다. SetProcessWorkingSetSize API 또한 NT 계열에서만 지원하므로 9X와 같이 사용하는 프로그램은 다음과 같이 랩핑해서 사용할 필요가 있습니다.
BOOL WINAPI NtSetProcessWorkingSetSize(HANDLE hProcess, SIZE_T dwMin, SIZE_T dwMax)
{
typedef BOOL (WINAPI *FSetProcessWorkingSetSize)(HANDLE, SIZE_T, SIZE_T);
BOOL bRet = FALSE;
HINSTANCE hInst;
FSetProcessWorkingSetSize fnSetProcessWorkingSetSize;
hInst = GetModuleHandle("kernel32.dll");
fnSetProcessWorkingSetSize =
(FSetProcessWorkingSetSize) GetProcAddress(hInst, "SetProcessWorkingSetSize");
if(fnSetProcessWorkingSetSize)
bRet = fnSetProcessWorkingSetSize(hProcess, dwMin, dwMax);
return bRet;
}
- PE 포맷 분석1 (0)2007/01/02
- command 출력 리디렉션 시키기. (0)2006/12/29
- 실행시 메모리 점유율 줄이기. (0)2006/12/29
- 시스템 트레이 사용하기 (0)2006/12/29
- 메모리 오류 (0)2006/12/27

수안이의 컴퓨터 연구실



Leave your greetings.