작업 관리자를 메모리 순으로 정렬하면 위쪽에 "데스크톱 창 관리자"가 꼭 끼어 있다. 프로그램을 연 기억도 없는데 수백 MB 를 쓰고 있고, 성능 탭의 GPU 그래프 아래에도 이 이름이 보인다. 앞의 두 편에서 본 conhost·dllhost 가 개수로 눈에 걸렸다면, dwm.exe 는 하나뿐인데 숫자가 커서 눈에 걸리는 경우다.
하나뿐인 프로세스, 그리고 숫자들
dwm.exe 는 로그인한 사용자 세션마다 하나씩 뜬다. 내 PC 에서도 세션 1 에 하나였고, 부모는 winlogon.exe 였다. 로그인 화면을 맡는 프로세스가 화면 합성기도 같이 띄우는 구조다. 일반 권한의 PowerShell 에서는 실행 경로와 명령줄이 빈 값으로 나왔다. dwm 은 로그인한 사용자 계정이 아니라 별도의 창 관리자 계정(DWM-1 같은 이름)으로 도는 것으로 알려져 있어서, 관리자 권한이 없으면 안을 들여다볼 수 없다. 파일은 C:\Windows\System32\dwm.exe, 약 132KB, 파일 설명은 "데스크톱 창 관리자", 버전 10.0.26100.9949 이고 서명은 Microsoft Windows 로 유효했다.
부팅하고 약 14시간이 지난 시점에 읽은 값은 이렇다.
| 항목 | 값 |
|---|---|
| 작업 집합 / 최대 작업 집합 | 226MB / 398MB |
| 개인 메모리 | 510MB |
| 전용 GPU 메모리 | 약 1,287MB |
| 공유 GPU 메모리 | 약 155MB |
| CPU (작업 관리자 기준으로 환산) | 0.1~0.3% |
| GPU 엔진 사용률 | 약 0.3% |
| 핸들 / 스레드 | 3,893 / 62 |
메모리와 GPU 메모리는 큰 편이지만 CPU 와 GPU 사용률은 거의 바닥이었다. \Process(dwm)\% Processor Time 카운터는 2초 간격으로 1.64.7% 를 보였는데, 이 카운터는 코어 하나를 100% 로 치는 값이라 논리 프로세서 16개로 나누면 작업 관리자 화면 기준으로 0.10.3% 정도가 된다.
모든 창을 한 장으로 합치는 일
dwm 은 화면에 보이는 모든 창을 실제로 그리는 마지막 단계다. Windows Vista 이후로 프로그램은 화면에 직접 그리지 않는다. 각 창은 자기 몫의 그림을 메모리에 따로 그려 두고, dwm 이 그 그림들을 겹쳐서 한 장의 화면으로 합친 다음 그래픽카드로 보낸다. 창 그림자, 반투명 효과, 창을 옮길 때 뒤쪽 창이 깨지지 않는 것, 작업 표시줄에 마우스를 올리면 나오는 미리 보기, Alt+Tab 의 창 썸네일이 모두 이 구조 덕분이다.
그러니 dwm 의 메모리는 "열려 있는 창의 수와 크기", 그리고 "화면의 수와 크기"를 따라간다. 내 PC 는 모니터 네 대가 연결되어 있었고, PowerShell 에서 읽은 화면 크기는 1920×1080 세 대와 2752×1152 한 대였다. 화면 배율이 들어간 값이라 실제 픽셀은 이보다 클 수 있다. 이 값으로만 계산해도 약 940만 화소, 화소당 4바이트면 화면 한 벌에 36MB 쯤 된다. dwm 은 화면마다 여러 장의 버퍼를 돌려 쓰고, 열린 창마다 그림을 따로 들고 있으니 수백 MB 에서 1GB 를 넘는 GPU 메모리가 나오는 것이 이상하지 않다. 그래픽카드는 별도 그래픽카드와 CPU 내장 그래픽 두 개가 잡혀 있었는데, dwm 의 GPU 메모리는 거의 전부 한 어댑터에 몰려 있었다. 화면을 내보내는 별도 그래픽카드 쪽으로 보이는데, 카운터 이름에는 어댑터 번호만 나와서 단정하지는 못했다.
HDR 을 켜거나 주사율이 높은 모니터를 쓰면 한 화소에 담는 정보와 초당 합성 횟수가 늘어나니 메모리와 GPU 사용량도 함께 늘어나는 것으로 알려져 있다. HDR 을 켰을 때와 껐을 때의 차이는 이번에 따로 재지 않았다.
끌 수 없는 이유
Windows 7 까지는 Aero 효과를 끄면 dwm 도 꺼졌다. Windows 8 부터는 dwm 이 화면을 그리는 유일한 길이 되어서 끌 수 있는 설정 자체가 없다. 작업 관리자에서 dwm.exe 를 강제로 끝내면 화면이 잠깐 깜빡이거나 검게 변하고, winlogon 이 곧바로 다시 띄우는 것으로 알려져 있다. 얻을 것은 없고 그 사이 화면이 멎는 위험만 있다.
"시각 효과를 끄면 메모리가 줄까" 하는 질문도 많다. 시스템 속성의 성능 옵션에서 애니메이션과 그림자를 끄면 체감 속도는 조금 달라질 수 있지만, 창마다 그림을 따로 들고 합성하는 구조는 그대로라 dwm 메모리가 크게 줄지는 않는 것으로 보인다. 메모리를 줄이는 가장 확실한 방법은 결국 열어 둔 창과 연결된 화면을 줄이는 것이다.
메모리가 계속 늘 때는 그래픽 드라이버부터
정상적인 dwm 은 창을 열고 닫는 데 따라 메모리가 오르내린다. 내 PC 에서도 최대 작업 집합 398MB 를 찍었다가 226MB 로 내려와 있었다. 문제는 창을 닫아도 내려오지 않고 하루 이틀 사이에 수 GB 까지 계속 올라가는 경우다. 이런 증상은 dwm 자체보다 그래픽 드라이버 쪽 원인이 많은 것으로 알려져 있다. 특정 드라이버 버전에서 dwm 메모리가 새는 문제가 보고되고 드라이버 업데이트로 고쳐진 사례가 여러 번 있었다.
확인은 시간을 두고 같은 숫자를 비교하는 것이다. 작업 관리자 세부 정보 탭의 열 머리글을 오른쪽 클릭해 "열 선택"에서 "전용 GPU 메모리"와 "커밋 크기"를 켜 두면 dwm.exe 줄에서 바로 보인다. PowerShell 로는 이렇게 읽는다.
Get-Process dwm | Select-Object `
@{n='WS_MB'; e={[math]::Round($_.WorkingSet64/1MB)}}, `
@{n='Priv_MB'; e={[math]::Round($_.PrivateMemorySize64/1MB)}}
몇 시간 간격으로 적어 두었을 때 창 수와 상관없이 계속 오르기만 한다면, 그래픽카드 제조사 사이트에서 드라이버 버전을 확인해 보는 것이 먼저다. 이벤트 뷰어의 시스템 로그에서 이벤트 ID 4101(디스플레이 드라이버가 응답을 멈췄다가 복구됨)이 자주 보이는지도 함께 보면 좋다. 내 PC 에서는 이 이벤트와 dwm.exe 의 응용 프로그램 오류 기록이 한 건도 없었다. 당장 화면이 이상하다면 Win+Ctrl+Shift+B 로 그래픽 드라이버를 다시 시작하는 방법이 있다. dwm 을 강제로 끄는 것보다 훨씬 안전하다.
다음 편은 한글 입력과 바로 이어지는 ctfmon.exe 다. 끄면 한글이 안 써지는 이유와, 이 프로세스가 어디서 시작되는지 확인해 본다.