본문으로 바로가기

강제 메모리 해제

category 개발언어/c++ 2016. 7. 18. 06:45

 

HANDLE pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);

윈도우즈에서 사용되는 워킹셋 메모리를 정리하는 함수 라고 인터넷 조사에서 이렇게 기술 되어 있다.

그런데 이것이 실제 물리적 메모리 해제를 하는 것인지 의문이다.

워킹 셋 메모리란? 프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합으로,

자주 참조되는 워킹셋을 주기억 장치에 상주 시킴으로써 페이지 부재 및 페이지 교체 현상을 줄이는 것으로.
메모리 사용량을 줄이기 위해서 사용하면 되지만, 빈번하게 사용하게 되면 저장장소(보통 하드 디스크)에서 필요한 메모리를 엑세스하는 시간이 필요하게 된다.

즉, 페이지 교체 현상이 늘어나게 된다.

 

::SetProcessWorkingSetSize( ::GetCurrentProcess( ), -1, -1 ); 호출하게 되면 워킹셋 메모리를 정리하게 된다.

 

실제 Test 해본 결과 의문이 몇 가지 생기긴 했다.

물론 다른 오류 일 수 도 있지만 현상으로 봤을 땐 메모리를 정리 해주는 효과는 있다.

동시에 10개의 스레드를 실행시키고, 10개의 스레드가 종료되면 다음 Step의 Funtion을

또 동시에 10개의 스레드로 실행하는 프로그램을 만들었는데(한꺼번에 10개씩 연결된 장치와 통신 해야 하는 프로그램)

특이하게도 스레드를 실행 시킬 때 마다 메모리 누수가 발생한다. 누수를 차단하려고 많은 시도를 해 봤는데 실패한다.

 

그런데 ::SetProcessWorkingSetSize( ::GetCurrentProcess( ), -1, -1 );를 사용하면 메모리가 줄어든다.

메모리 누수가 심화 되면 어느 시점에 메모리가 부족 해지면, 시스템이 다운되는데

시스템 다운이 일어 나지 않는 것으로 봐서 메모리 해제가 되기는 하는 것 같다.

그래도 납득하지 못하는 이유는 저놈의 동작 방식이 다소 뜬금 없다는 생각이다

내가 아는 범주에서는 이해 할 수 가 없어서 확신을 같지 못한다. 뭐 나주에는 이해 할 수 있으려나?