작업 관리자 세부 정보 탭에서 상태 열을 보다 보면 대부분 "실행 중"인데 몇 줄만 "일시 중단됨"으로 나온다. 멈춘 프로그램처럼 보여서 끝내야 하나 싶지만, 그 줄의 이름을 보면 대개 ShellExperienceHost.exe 나 SearchHost.exe 같은 Windows 자체 프로세스다. 이번 편은 시작 메뉴와 그 주변 화면을 맡는 호스트 넷, StartMenuExperienceHost·ShellExperienceHost·TextInputHost·sihost 를 열어 본다.
네 개의 호스트가 맡는 일
이름은 비슷하지만 하는 일은 꽤 분명하게 나뉜다.
| 프로세스 | 파일 설명 | 맡는 화면 |
|---|---|---|
| StartMenuExperienceHost.exe | Windows Start Experience Host | 시작 메뉴 |
| ShellExperienceHost.exe | Windows Shell Experience Host | 알림·달력 같은 셸 팝업 |
| TextInputHost.exe | (설명 없음) | 터치 키보드, 이모지 패널(Win+.), 클립보드 기록(Win+V) |
| sihost.exe | Shell Infrastructure Host | 위 화면들이 기대는 셸 기반 |
시작 메뉴는 예전에는 탐색기(explorer.exe) 안에서 그려졌지만, 지금은 따로 떼어 낸 앱 형태로 돈다. ShellExperienceHost 는 이름 그대로 셸의 "경험", 즉 알림 센터와 작업 표시줄 시계를 눌렀을 때 뜨는 달력 같은 팝업을 맡는 것으로 알려져 있다. TextInputHost 는 한글 자판을 쓰는 사람도 Win+. 으로 이모지 패널을 열거나 Win+V 로 클립보드 기록을 열 때 만나는 프로세스다. sihost 는 화면을 직접 그리기보다 이 셸 구성 요소들이 쓰는 공통 기반을 맡는다.
경로·서명·부모를 확인했다
Get-CimInstance Win32_Process -Filter "Name like '%ExperienceHost.exe' or Name='TextInputHost.exe' or Name='sihost.exe'" |
Select-Object Name, ProcessId, ParentProcessId, ExecutablePath
확인한 시점에 네 개 모두 하나씩 떠 있었다. 앞의 셋은 C:\Windows\SystemApps 아래 패키지 폴더에 있었다. StartMenuExperienceHost 는 Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy, ShellExperienceHost 는 ShellExperienceHost_cw5n1h2txyewy, TextInputHost 는 MicrosoftWindows.Client.CBS_cw5n1h2txyewy 폴더였다. 마지막 폴더에는 SearchHost.exe 도 같이 들어 있다. sihost 만 C:\Windows\System32\sihost.exe 였다. 네 파일 모두 서명이 Microsoft Windows 로 유효했다.
부모를 따라가면 성격 차이가 보인다. 앞의 셋은 모두 같은 svchost 가 부모였고, 그 안의 서비스는 DcomLaunch, BrokerInfrastructure, PlugPlay, Power, SystemEventsBroker 였다. Runtime Broker 를 띄우는 바로 그 svchost 다. 명령줄에도 -ServerName:App.AppX...mca 같은 인수가 붙어 있어서, 사용자가 실행한 것이 아니라 "이 앱 화면이 필요하다"는 요청을 받은 DCOM 이 띄운 것임을 알 수 있다. sihost 는 달랐다. 부모가 UserManager 서비스를 담은 svchost 였고, 명령줄은 sihost.exe 한 단어였다. 로그온할 때 사용자 세션의 기반으로 먼저 뜨는 쪽이다. 실제로 시작 시각도 sihost 가 로그온 직후 가장 먼저였고, 시작 메뉴는 2초 뒤, 입력 패널은 12초 뒤였다.
sihost 아래에는 ShellHost.exe 라는 자식도 하나 있었다. 파일 설명은 그냥 "ShellHost"이고 System32 에 있으며 서명도 유효했다. 다른 셋과 달리 로그온 다음 날 밤에 새로 뜬 것이었는데, 최근 빌드에서 빠른 설정 같은 패널을 맡는 새 호스트로 보인다.
'일시 중단됨'은 고장이 아니다
이번에 가장 확인하고 싶었던 것이 일시 중단 상태다. 프로세스의 스레드 상태를 세어 보면 바로 보인다.
$p = Get-Process ShellExperienceHost
($p.Threads | Where-Object WaitReason -eq 'Suspended').Count
확인한 시점에 ShellExperienceHost 는 스레드 39개가 모두 Suspended 로 멈춰 있었다. 알림 센터도 달력도 열려 있지 않았으니 할 일이 없었던 것이다. 앱 형태로 도는 Windows 구성 요소는 화면에 보이지 않으면 Windows 가 통째로 멈춰 두고, 다시 필요해지면 그 자리에서 깨운다. 처음부터 다시 띄우는 것보다 훨씬 빨리 열리기 때문이다. 작업 관리자의 "일시 중단됨"은 이 상태를 보여 주는 것이다. 그러니 끝낼 이유가 없다. 끝내면 오히려 다음에 열 때 처음부터 다시 띄우느라 느려진다.
같은 시점에 StartMenuExperienceHost 는 스레드 33개 중 멈춘 것이 하나도 없었다. 시작 메뉴는 누르자마자 떠야 해서 다른 규칙으로 다뤄지는 것으로 보인다. 대신 메모리가 눈에 띄게 줄어 있었다. 개인 메모리는 121.2MB 인데 작업 집합은 11.9MB 였다. 할당은 해 두었지만 당장 쓰지 않는 부분을 실제 메모리에서 내려놓은 상태다. SearchHost(개인 84.8MB, 작업 집합 10.5MB)와 TextInputHost(132.3MB, 29.1MB)도 비슷했다. 작업 관리자 세부 정보 탭의 기본 메모리 열은 "활성 개인 작업 집합"이라 실제 메모리에 올라와 있는 부분만 보여 준다. 그래서 이런 프로세스는 할당해 둔 것보다 작아 보인다.
CPU 는 거의 쓰지 않았다. 로그온 뒤 약 64시간 동안 누적 CPU 시간이 sihost 130초, TextInputHost 64초, StartMenuExperienceHost 50초, ShellExperienceHost 31초였다. 시간당 1~2초 꼴이다.
시작 메뉴가 안 열릴 때
시작 메뉴가 열리지 않거나 눌러도 반응이 늦을 때 먼저 볼 것은 StartMenuExperienceHost 가 떠 있는지다. 작업 관리자 세부 정보 탭에서 이름을 찾고, 경로를 보려면 오른쪽 클릭 → "파일 위치 열기"를 쓴다. 이 PC 의 응용 프로그램 이벤트 로그에서 지난 30일 동안 기록된 "응용 프로그램 오류·중단" 54건 가운데 이 네 호스트는 한 건도 없었다. 시작 메뉴가 자주 말썽이라면 이 로그에 StartMenuExperienceHost 의 충돌 기록이 쌓여 있는지 보는 것도 단서가 된다.
Get-WinEvent -FilterHashtable @{LogName='Application'; ProviderName='Application Error'} -MaxEvents 200 |
Where-Object { $_.Message -match 'StartMenuExperienceHost' } | Select-Object TimeCreated, Id
해 볼 수 있는 순서는 가벼운 것부터다. 작업 관리자에서 StartMenuExperienceHost 를 끝내면 시작 단추를 다시 누를 때 새로 뜨는 것으로 알려져 있다. 그래도 안 되면 탐색기를 다시 시작하고, 그다음은 로그아웃했다가 다시 로그인한다. 이 셋은 모두 되돌릴 필요가 없는 조치다. 계속 반복된다면 Windows 업데이트가 덜 끝난 상태이거나 시스템 파일이 손상된 경우일 수 있으니, 관리자 권한 명령 프롬프트에서 시스템 파일 검사(sfc /scannow)를 돌려 보는 정도가 안전한 다음 단계다. 시작 메뉴 패키지를 지웠다 다시 등록하라는 명령도 검색에 많이 나오지만, 원인을 모른 채 할 일은 아니다.
가짜 구별은 경로 하나로 거의 끝난다. 이 넷은 C:\Windows\SystemApps 나 C:\Windows\System32 밖에 있을 이유가 없다.
Get-Process StartMenuExperienceHost, ShellExperienceHost, TextInputHost, sihost | Select-Object Name, Path
Get-AuthenticodeSignature C:\Windows\System32\sihost.exe | Select-Object Status
다음 편은 작업 관리자에서 "Windows 작업을 위한 호스트 프로세스"로 보이는 taskhostw.exe 와 backgroundTaskHost.exe 다. 명령줄의 긴 ID 와 메모리에 올라온 DLL 로 어떤 예약 작업을 돌리고 있는지 찾아본다.