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,預設設置會使服務獨立寄存。

參看

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.