熟悉的陌生朋友:svchost.exe
有時候,你可能會打開任務管理器,看看里面有什么進程在跑,你會發現,進程列表中有很多svchost.exe。
為什么會有如此多的svchost.exe進程呢?這個svchost.exe到底是什么呢?今天就來簡單解釋解釋。
設計原理和解釋
從傳統的系統設計角度來看,每一個windows服務都會運行在它所在的進程中。這樣,當你開發和測試你的服務的時候就十分簡單方便。
但是,如果你打開Windows的服務管理器(命令行執行services.msc),你會發現,那里有很多服務,其中主要是Windows的服務,當然也包含第三方應用開發商開發的服務。如果每個服務都對應一個進程的話,則系統需要維護非常多的進程。對于一個進程來說,就算它什么實際的工作也不做,系統也需要為它分配各種資源來維護這個進程。將每個服務都放到一個進程中的設計方式實際上是一種資源的浪費,因為有很大一部分服務僅僅是在某些時間點下被觸發執行。例如Microsoft Windows電話TAPI服務(Tapisrv),它僅僅會在處理和調制解調器(modem)相關的操作時才會被觸發運行。
考慮到性能方面的原因,我們將相關的服務編到一個組中,在這個組中,所有的服務都會運行在一個叫做svchost的共享進程中。
這意味著,如果你發現某一個svchost.exe有些不正常,你還是無法知道到底是里面的哪一個服務出了問題。在微軟的知識庫中,有一篇專門講解svchost的文章(how you can dig into each svchost to see which services are running inside it),它講述了如何通過研究svchost進程來查看它承載了哪些服務。這還是很有用的,因為當svchost進程異常的時候,你至少可以縮寫問題排查的范圍。
查看svchost中的服務的幾種方法
1. 通過任務管理器查看。

2. 執行命令行指令:tasklist /svc /fi “imagename eq svchost.exe”

3. 通過Process Explorer工具來查看。



總結
將多個服務跑在同一個進程中,減少了系統資源消耗,提升了性能。但是,這種設計也不可避免地增加了開發和調試服務的難度。所以,正在開發Windows服務的你,還需要再慎重慎重。