HANDLE pHandle = GetCurrentProcess();
SetProcessWorkingSetSize(pHandle, -1, -1);
윈도우즈에서 사용되는 워킹셋 메모리를 정리하는 함수 라고 인터넷 조사에서 이렇게 기술 되어 있다.
그런데 이것이 실제 물리적 메모리 해제를 하는 것인지 의문이다.
워킹 셋 메모리란? 프로세스가 일정 시간 동안 자주 참조하는 페이지들의 집합으로,
자주 참조되는 워킹셋을 주기억 장치에 상주 시킴으로써 페이지 부재 및 페이지 교체 현상을 줄이는 것으로.
메모리 사용량을 줄이기 위해서 사용하면 되지만, 빈번하게 사용하게 되면 저장장소(보통 하드 디스크)에서 필요한 메모리를 엑세스하는 시간이 필요하게 된다.
즉, 페이지 교체 현상이 늘어나게 된다.
::SetProcessWorkingSetSize( ::GetCurrentProcess( ), -1, -1 ); 호출하게 되면 워킹셋 메모리를 정리하게 된다.
실제 Test 해본 결과 의문이 몇 가지 생기긴 했다.
물론 다른 오류 일 수 도 있지만 현상으로 봤을 땐 메모리를 정리 해주는 효과는 있다.
동시에 10개의 스레드를 실행시키고, 10개의 스레드가 종료되면 다음 Step의 Funtion을
또 동시에 10개의 스레드로 실행하는 프로그램을 만들었는데(한꺼번에 10개씩 연결된 장치와 통신 해야 하는 프로그램)
특이하게도 스레드를 실행 시킬 때 마다 메모리 누수가 발생한다. 누수를 차단하려고 많은 시도를 해 봤는데 실패한다.
그런데 ::SetProcessWorkingSetSize( ::GetCurrentProcess( ), -1, -1 );를 사용하면 메모리가 줄어든다.
메모리 누수가 심화 되면 어느 시점에 메모리가 부족 해지면, 시스템이 다운되는데
시스템 다운이 일어 나지 않는 것으로 봐서 메모리 해제가 되기는 하는 것 같다.
그래도 납득하지 못하는 이유는 저놈의 동작 방식이 다소 뜬금 없다는 생각이다
내가 아는 범주에서는 이해 할 수 가 없어서 확신을 같지 못한다. 뭐 나주에는 이해 할 수 있으려나?
'개발언어 > c++' 카테고리의 다른 글
가변적으로 부동솟수점 표현하기(소수점 자리수를 입력받은 만큼 보여주기) (0) | 2016.07.18 |
---|---|
프로세스간의 간단한 통신 (0) | 2016.07.18 |
처리되지 않은 예외(Exception) 핸들링 (0) | 2016.07.18 |
MFC로 작성한 프로그램에서 폴더선택 하기 (0) | 2016.07.18 |
ATL로 만든 클립보드뷰어 (0) | 2016.07.18 |