본문 바로가기

Windows Platform

데스크탑 힙 / Desktop heap 이란?

데스크탑 힙 / Desktop heap 이란?
Windows NT는 데스크톱에서 실행하는 모든 Windows 기반 프로그램에 특수한 메모리 힙을 사용합니다. 데스크톱 힙은 모든 개체(창, 메뉴, 펜, 아이콘 등)에 사용됩니다. 다수의 Windows 기반 프로그램이 실행되고 있을 때 이 힙의 메모리가 부족할 수 있습니다. 할당 요청을 만족할 만큼의 충분한 메모리가 없는 경우 시스템은 오류를 반환하고 사용자에게 메모리가 부족함을 알립니다. 일부 프로그램은 실패를 제대로 처리하지 못하며, 일부 경우에는 오류 메시지 대화 상자를 만들기 위한 메모리가 부족할 수도 있습니다. 따라서 아무런 표시 없이 요청된 작업이 실패합니다.

Session, Window Station과 Desktop
http://blogs.msdn.com/b/coreinternals/archive/2009/08/19/session-window-station-desktop.aspx

Desktop Kernel Object가 생성된 후 Desktop이 사용할 Desktop Heap을 설정하게 됩니다.
첫 번째 Desktop인 Logon Desktop은 Small Heap (128K)를 사용하게 됩니다. 그리고 Disconnect Heap은 조금 더 작은 Heap(64K) 을 사용합니다. 그리고 Default Desktop은 아래의 레지스트리 경로에 설정된 값으로 설정됩니다.

기본값은 SharedSection에 있는 값입니다. SharedSection=1024,3072,512 값 중에서 3072 입니다. 이 값의 단위는 KB
(Kilobytes)이기 때문에 설정된 값은 3072K가 됩니다.

[Windows Server 2003]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,3072,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16

[Windows Server 2008 R2]
%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,20480,768 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ServerDll=sxssr

그러면 Windows Server 2003의 SharedSection=1024,3072,512의 값의 의미를 좀 더 자세하게 살펴보도록 하겠습니다.

• 첫번째값(1024)는 모든 Desktop에 공통된 Shared Heap의 크기를 의미합니다. 이 값은 Desktop Heap의 사용량에 문제가 발생 경우 이를 위해서 수정되면 안됩니다. (단위는 Kilobytes)

• 두번째값(3072)는 Interactive Windows Station, WinSta0에 생성된 Disconnect와 Winlogon을 제외한 Default Desktop의 Heap Size를 의미합니다. (단위 Kilobytes)

• 세번째값(512)는 Noninteractive Window Station에서 생성된 Desktop에 필요한 Desktop Heap의 크기를 의미합니다. (단위 Kilobytes)

Desktop이 생성될 때 또 하나 아주 중요한 사실이 하나 있습니다. Section 생성 함수를 사용하여 설정한 Desktop Heap Size 만큼의 공간을 가진 Section Object를 생성합니다.
이 Section Object는 SessionSpace에 View를 Mapping하는 함수를 사용하여 생성되는 Session 의 Session Space에 Mapping이 되게 됩니다. 여기서 Mapping된 Session Space는 Session에 할당된 Session View의 크기를 이야기 합니다. 아래 레지스트리 키를 통해 Session에 할당된 View 크기를 설정할 수가 있습니다. 이 값은 16의 배수로 변경시켜야 합니다. 각 OS에 할당된 Session View의 크기는 아래와 같습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
SessionViewSize = 기본값 48, (0x30) (단위 Megabytes)

OS

Size if no registry value configured

Default registry value

Windows 2000 *

20 MB

None

Windows XP

20 MB

48 MB

Windows Server 2003

20 MB

48 MB


 

 

Interactive Desktop

Non-Interactive Desktop

Winlogon Desktop

Disconnect Desktop

Windows XP 32-bit

3 MB

512 KB

128 KB

64 KB

Windows Server 2003 32-bit

3 MB

512 KB

128 KB

64 KB

Windows Server 2003 64-bit

20 MB

768 KB

192 KB

96 KB

Windows Vista/Windows Server 2008 32-bit

12 MB

512 KB

128 KB

64 KB

Windows Vista/Windows Server 2008 64-bit

20 MB

768 KB

192 KB

96 KB

Windows 7 32-bit

12 MB

512 KB

128 KB

64 KB

Windows 7/Windows Server 2008 R2 64-bit

20 MB

768 KB

192 KB

96 KB

 


만일 위의 Desktop Heap의 기본 크기를 늘리게 되면 Session에서 생성할 수 있는 Desktop 수가 줄어들게 됩니다.
따라서 Desktop의 개수를 면밀히 조사하여 사용 개수를 파악한 후 Desktop Heap의 크기와 Session View 크기를 동시에 변경시키는 것을 권합니다.
예를 들어, SessionView의 크기가 48MB인 상태에서 Desktop Heap의 크기를 8192 KB로 증가 시킨 후 문제가 발생한다면 다시 SessionView의 크기를 16의 배수인 64 MB로 늘린 후 모니터링하여야 합니다.



참고로 desktop heap의 사용량을 모니터링 할 수 있는 방법은 아래와 같습니다.

Desktop Heap Monitor를 이용한 Desktop heap 모니터링 방법
http://ryuchan.kr/75

[참고자료]
다수의 프로그램이 실행되고 있을 때 "메모리 부족" 오류 메시지가 나타남
http://support.microsoft.com/kb/126962/

User32.dll or Kernel32.dll fails to initialize
http://support.microsoft.com/kb/184802/en-us

감사합니다.^^