跳至內容

Svchost.exe

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書

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).