출처 : http://soyokaze.egloos.com/900499/

 

Windows Application의 Minimize의 비밀.
Windows 상에서 돌아가는 응용 프로그램의 경우 한 가지 신기한 점이 있는데, UI를 가진 아무 프로그램이나 띄워 놓고 작업 관리자에서 메모리 사용량을 체크한 후, 해당 프로그램을 태스크 바로 내리면 (최소화 시키면) 작업 관리자의 해당 프로세스 메모리 사용량이 줄어드는 것을 볼 수 있다. 이런 방식을 사용해서 백그라운드 프로그램(서비스가 아닌)의 작업 관리자에서 보여지는 메모리 사용량을 적어 보이게 하는 방식을 사용하기도 하는데.. ^^



하여튼 왜 이런 현상이 발생하는지는 모르고 있다가 Eclipse와 Firefox의 Swapping 문제라는 글에서 원인을 발견했다. 이 글의 중반 쯤의 링크에 보면 PRB: An Application's Working Set Is Trimmed When Its Top-Level Window Is Minimized 라 는 MS의 KB 문서가 있다. 이를 보면, Windows는 ShowWindow API에 SW_MINIMIZE 파라미터를 통해 프로그램을 최소화 하는 경우 프로그램의 워킹 셋 (물리적 메모리 - RAM 에 현재 기록되어 있는 메모리 페이지) 을 줄여버린다는 것이다. 플로우 상으로는 ShowWindow API를 SW_MINIMIZE 파라미터를 통해 콜하면(또는 WM_SYSCOMMAND에 SC_MINIMIZE 파라미터로 메시지를 전달하는 경우) 기본 윈도우 프로시저 - DefWindowProc 가 불려지고 여기에서 SetProcessWorkingSetSize API에 파라미터를 -1, -1로 넘겨서 워킹 셋을 완전히 날려버린다. 아, 시도한다는 말이 맞을 듯..



MS KB 에서는 이 점에 대한 해결책도 제시하고 있는데, ShowWindow API 사용지 SW_MINIMIZE 대신 SW_SHOWMINIMIZED를 사용하면 된다고 한다. WM_SYSCOMMAND를 통해 최소화 시에는 WM_SYSCOMMAND 메시지 처리 시 해당 메시지의 WPARAM이 SC_MINIMIZE 인 경우 ShowWindow API를 콜하고 (물론 SW_SHOWMINIMIZED 파라미터로) 리턴해 버리면 된다.



참, 위의 이야기는 모두 Windows NT 계열 이상에서의 이야기이다. ^^
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스

댓글을 달아 주세요