폴더 하나를 오른쪽 클릭했을 뿐인데 커서가 돌고 작업 표시줄의 시계까지 멈춘다. 몇 초 뒤 화면이 깜빡이며 작업 표시줄이 사라졌다가 다시 나타난다. "explorer.exe 응답 없음"을 검색하게 되는 흔한 장면이다. 이때 "탐색기 창 하나가 멈췄는데 왜 작업 표시줄까지?"라는 의문이 든다. 답은 둘이 같은 프로세스라는 데 있다.
탐색기 창과 작업 표시줄은 같은 프로세스
확인한 시점에 이 PC 에는 explorer.exe 가 하나 떠 있었다. 기본 설정에서는 파일 탐색기 창을 여러 개 열어도 새 프로세스가 생기지 않는다. 작업 표시줄, 바탕 화면 아이콘, 알림 영역, 그리고 열어 둔 탐색기 창이 모두 이 한 프로세스 안에 있다. Windows 에서 이것을 "셸"이라고 부른다. 지난 편에서 본 대로 winlogon 이 로그인 뒤에 레지스트리 Shell 값(explorer.exe)을 실행해서 뜨는 프로그램이다.
Get-Process explorer |
Select-Object Id, StartTime, Handles, @{n='Threads'; e={$_.Threads.Count}},
@{n='PrivateMB'; e={[math]::Round($_.PrivateMemorySize64/1MB)}}, Path
로그인 직후인 20시 36분에 시작해서 이틀 반 넘게 떠 있던 explorer.exe 는 개인 메모리 약 685MB, 작업 집합 153MB, 스레드 190개, 핸들 12,127개였다. 1시즌에 본 다른 프로세스와 비교하면 덩치가 크다. 여러 창과 아이콘, 썸네일 캐시, 그리고 아래에서 볼 확장 DLL 들을 한 몸에 담고 있기 때문이다.
파일 위치도 다른 핵심 프로세스와 다르다. C:\Windows\System32 가 아니라 C:\Windows\explorer.exe 다. 크기는 3,479,440바이트, 설명은 "Windows 탐색기", 서명은 Microsoft Windows 로 유효했다. 경로가 이 한 곳이 아니거나 서명이 없으면 이름만 빌린 것이다.
Get-AuthenticodeSignature C:\Windows\explorer.exe | Select-Object Status
탐색기 창을 따로 띄우게 하는 옵션도 있다. 폴더 옵션의 보기 탭에 있는 "별도 프로세스에서 폴더 창 시작"을 켜면 창마다 explorer.exe 가 하나씩 더 생긴다. 이 PC 는 꺼져 있었다(레지스트리 SeparateProcess 값 0). explorer.exe 가 여러 개라면 이 옵션부터 보면 된다.
자식 프로세스는 시작 프로그램
explorer.exe 를 부모로 둔 프로세스는 17개였다. 메신저, 클라우드 동기화, 캡처 도구, 오디오 드라이버의 보조 프로그램, Windows 보안 알림 아이콘, 공동 인증서 관련 프로그램 같은 것들이다. 로그인할 때 탐색기가 시작 프로그램 목록을 읽어 하나씩 띄우기 때문에 이들의 부모가 explorer 로 남는다. 시작 메뉴나 바탕 화면 바로 가기로 실행한 프로그램도 마찬가지다.
부모가 explorer 라고 해서 탐색기가 그 프로그램들의 메모리나 CPU 를 쓰는 것은 아니다. 각자 따로 계산되니, 탐색기 자체가 무거운지는 세부 정보 탭의 explorer.exe 한 줄만 보는 편이 정확하다.
CPU 는 평소에 낮았다. 성능 카운터로 2초 간격 세 번 재 보니 코어 하나 기준 3.1~9.3%였고, 논리 프로세서가 16개라 작업 관리자 표시로는 1% 미만이다. 누적 CPU 시간은 약 1,874초였다. 64시간 동안 평균으로 치면 코어 하나의 1% 남짓만 쓴 셈이다.
멈추거나 CPU 가 높을 때: 우선 다시 시작
탐색기가 굳었을 때 가장 먼저 해 볼 것은 재부팅이 아니라 탐색기만 다시 시작하는 것이다. Ctrl+Shift+Esc 로 작업 관리자를 열고, 프로세스 탭에서 "Windows 탐색기"를 선택한 뒤 위쪽의 "다시 시작"(또는 오른쪽 클릭 → 다시 시작)을 누른다. 작업 표시줄이 잠깐 사라졌다가 새로 그려진다. 열려 있던 탐색기 창은 닫히지만 다른 프로그램은 그대로다.
"작업 끝내기"를 누르면 작업 표시줄이 없는 빈 화면이 된다. 이때는 작업 관리자의 "새 작업 실행"에 explorer.exe 를 입력하면 돌아온다. 다시 시작이 이 두 단계를 한 번에 해 주는 기능이다.
다시 시작해서 풀린다면 일시적인 문제였을 수 있다. 하지만 같은 동작(특정 폴더 열기, 특정 파일 오른쪽 클릭, 미리 보기 창)에서 반복된다면 탐색기 자체보다 탐색기 안에 올라온 남의 DLL 을 의심하는 편이 맞다.
셸 확장과 미리 보기 처리기가 원인일 때
탐색기는 다른 프로그램이 넣은 확장 DLL 을 자기 프로세스 안에 올린다. 오른쪽 클릭 메뉴의 "압축하기", "PDF 로 변환", 아이콘 위의 동기화 표시, 미리 보기 창이 모두 이런 확장이다. 확장 하나가 느리거나 멈추면 탐색기 전체가 같이 멈춘다. dllhost.exe 편에서 본 것처럼 썸네일 일부는 별도 프로세스로 빼지만, 오른쪽 클릭 메뉴 확장은 대개 탐색기 안에서 돈다.
오른쪽 클릭 메뉴 확장 목록은 레지스트리를 읽기만 해도 나온다.
Get-ChildItem -LiteralPath 'Registry::HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers' |
Select-Object PSChildName
이 PC 에서 파일(*), 폴더(Directory, Folder), 폴더 빈 곳(Directory\Background) 네 곳의 메뉴 확장을 모아 보니 34개였다. 각 항목의 CLSID 를 따라가 DLL 의 제조사를 보면 23개는 Microsoft 또는 제조사 정보가 없는 Windows 기본 항목이었고, 11개는 압축 프로그램, PDF 편집기, 파일 비교 도구, 버전 관리 도구 네 회사의 것이었다. 탐색기가 오른쪽 클릭에서 멈춘다면 이 11개가 먼저 볼 후보다. 미리 보기 처리기는 HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\PreviewHandlers 에 16개가 있었고, Windows 기본 처리기와 Office 문서 미리 보기였다.
어느 DLL 인지 확정하려면 기록을 본다. 탐색기가 죽으면 응용 프로그램 로그에 이벤트 ID 1000(응용 프로그램 오류)이, 응답이 없어 닫히면 1002(응용 프로그램 중단)가 남고, 1000 에는 "오류 있는 모듈 이름"이 같이 적힌다. 그 모듈이 Windows 파일이 아니라면 그 프로그램을 업데이트하거나 지우는 것이 해결책이다. 이벤트 뷰어가 낯설다면 perfmon /rel 로 여는 안정성 모니터에서 날짜별로 같은 내용을 볼 수 있다. 이 PC 의 응용 프로그램 로그는 10월 14일부터 남아 있었는데, 그동안 explorer.exe 의 오류나 중단 기록은 한 건도 없었다.
기록이 없다면 하나씩 빼 보는 수밖에 없다. 의심 가는 프로그램의 설정에서 "탐색기 메뉴에 표시" 같은 옵션을 끄거나, 잠깐 지웠다가 증상이 사라지는지 본다. 레지스트리의 확장 항목을 직접 지우는 방법도 검색에 나오지만, 잘못 지우면 복구가 번거로워 권하지 않는다. 미리 보기 창이 원인 같다면 탐색기 보기 메뉴에서 미리 보기 창을 닫아 두는 것만으로도 확인이 된다.
다음 편은 작업 표시줄 검색 상자 뒤에 있는 SearchHost.exe 와 파일 색인을 만드는 SearchIndexer.exe 다. 둘의 역할이 어떻게 다른지, 그리고 이 PC 의 Windows Search 서비스가 어떤 상태였는지 확인한다.