Svchost.exe(服務主機,或稱SvcHost)是一個系統進程,可以在Windows NT系列操作系統中託管一個或多個Windows服務[1]Svchost對於實現共享服務進程至關重要,在這種方式下,多個服務可以共享一個進程,以減少資源消耗。將多個服務組合到單一進程中可以節省計算資源,這一點對NT設計者來說尤其重要,因為在Windows操作系統中創建進程比其他操作系統(例如Unix家族)需要更多時間和內存。然而,如果其中一個服務引起未處理的異常,整個進程可能會崩潰。此外,對最終用戶而言識別組件服務可能更加困難。用戶經常報告與各種託管服務(特別是與Windows Update相關的問題),並由媒體作為涉及svchost的新聞報道。[2][3]

Svchost進程首次出現在Windows 2000中,[4]儘管自Windows NT 3.1以來就已存在對共享服務進程的底層支持。[5]

實施

編輯

其可執行文件%SystemRoot%\System32\Svchost.exe%SystemRoot%\SysWOW64\Svchost.exe(針對在64位系統上運行的32位服務)以多個實例運行,每個實例託管一個或多個服務。

在SvcHost中運行的服務以動態鏈接庫(DLLs)形式實現。每項服務的註冊表鍵必須在Parameters子鍵下有一個名為ServiceDll的值,指向相應的服務DLL文件。它們的ImagePath定義格式為%SystemRoot%\System32\svchost.exe -k %service group%;(即netsvcs)。共享同一SvcHost過程的服務指定相同參數,在SCM數據庫中有單一條目。當首次用特定參數啟動SvcHost過程時,它會查找HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost鍵下同名值,並將其解釋為服務名稱列表。然後它通知SCM所有它託管的服務。SCM不會為任何接收到的那些服務啟動第二個SvcHost過程;相反,它只是向包含應啟動該項業務名稱並加載相應DLL SvcHost 的SvcHost過程發送「開始」命令。

根據2003年微軟發布資料顯示,共享服​​務的最小工作集大約150 KB, 而獨立進程則需要800 KB。[6]

Windows 10中Service Host分組變化

編輯

從Windows 10版本1903開始,微軟改變了將服​​務分組到主機進程中的方式。在客戶端計算機系統擁有超過3.5 GB內存時,則不再將服​​務分組到共享主機進制度中。相反地, 每項服​​務都在自己獨立流成里運行, 這樣做提高了服​​務間隔離性, 讓計算機系統對服​​務故障和漏洞更具有彈性且更容易調試, 然而這樣也增加了一些內存開銷。[7]

服役標籤

編輯

從Windows Vista開始, 在共享流成(包括svchost)內部標識服​​務通過所謂服役標籤完成. 每個線程信息塊(TEB)內部SubProcessTag 存儲着線索標籤. 主要服役線索隨後啟動所有線索均傳播該標籤, Windows線程池API間接創建線索除外.[8]

目前一套服役標籤管理程序是未公開API雖然被某些如netstat等windows工具使用以顯示與各項服​​務相關聯TCP連接情況. 也有第三方工具如ScTagQuery利用此API.[9]

託管服​​務識別和管理

編輯

Windows XP及後續版本開始, 命令tasklist /svc可顯示每個列出流成(即每個正在運行svchost.exe實例)所運行之服​務清單,並通過唯一流成ID號(PID)區分每個svchost實例。

Windows VistaWindows 7 中,Windows任務管理器中的「服務」標籤包含一個服務列表,顯示它們的組和進程ID(PID);在任務管理器的「進程」標籤中右擊一個svchost實例並選擇「轉到服務」,將切換到該服務列表並選中在相應svchost實例下運行的服務。

Windows 8中簡化了任務管理器界面使得用戶可以通過點擊展開每個svchost條目查看其內部運行之業務子列表。

Sysinternals Process Explorer(可從微軟免費下載)提供了有關在svchost.exe進程下運行的服務的額外信息,當用戶將鼠標懸停在Process Explorer中的svchost實例上時。

以上方法均無法讓用戶識別在一個svchost實例內運行的多個服務中哪一個訪問了特定資源,例如處理器、磁盤、網絡或內存;Windows資源監視器只能在進程級別記錄(大部分)這些資源。但它確實可以在「CPU」標籤上顯示服務級別的處理器使用情況。[10]可以使用命令netstat -b獲取感知服務的TCP連接和UDP端口開放列表。[11]

為了解決在svchost實例內運行的服務出現的其他類型問題,必須重新配置被懷疑引起問題的所有服務,使每個服務都在其自己的svchost實例中運行。例如,sc config foo type= own 將重新配置名為「foo」的服務,在其自己的svchost實例中運行。將類型改回共享是通過類似命令完成的。此類配置更改生效前必須重啟服務。然而,這種調試過程並非萬無一失;在某些情況下,可能會發生海森蟲錯誤,即當服務單獨運行時問題消失。[12]

更複雜的故障排除方法是創建一個隔離的服務組。[13]

Windows 10中,從1703版本開始,Microsoft重新設計了svchost,使其只託管每個進程一個服務,具體取決於可用系統內存。[14]如果系統至少有3.5 GB 的RAM,默認設置會使服務獨立託管。

參看

編輯

外部連結

編輯
  1. ^ Russinovich, Solomon & Ionescu (2009:302頁)
  2. ^ Woody Leonhard. Microsoft promises to fix Windows XP SVCHOST redlining 'as soon as possible'. InfoWorld. 16 December 2013 [1 October 2014]. (原始內容存檔於2014-08-20). 
  3. ^ Svchost.exe gets worse before it's fixed - Series - Windows Secrets. [1 October 2014]. (原始內容存檔於2014-10-05). 
  4. ^ How to troubleshoot Service Host (svchost.exe) related problems?. [1 October 2014]. (原始內容存檔於2014-10-03). 
  5. ^ Shared Services. [1 October 2014]. (原始內容存檔於6 October 2014). 
  6. ^ David B. Probert, "Windows Service Processes"頁面存檔備份,存於網際網路檔案館
  7. ^ Changes to Service Host grouping in Windows 10. Microsoft. 2021-08-27 [2021-01-10]. (原始內容存檔於2022-08-05). 
  8. ^ Russinovich, Solomon & Ionescu (2012:335頁)
  9. ^ Russinovich, Solomon & Ionescu (2012:335頁)
  10. ^ Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7 - Scott Hanselman. [1 October 2014]. (原始內容存檔於2020-09-15). 
  11. ^ Whether this is useful is doubtful, it typically shows only the name of the service for the running web browser (e.g. it lists various items of information related to the internet connection and ports in use, but logs them all as simply "firefox.exe")
  12. ^ What is svchost.exe, and why do I have so many instances of it?. [1 October 2014]. (原始內容存檔於2014-10-06). 
  13. ^ Getting Started with SVCHOST.EXE Troubleshooting. [1 October 2014]. (原始內容存檔於2010-07-09). 
  14. ^ Changes to Service Host grouping in Windows 10. Microsoft. [30 April 2018]. (原始內容存檔於2022-08-05).