svchost.exe(服务宿主)是一个系统进程,可以在Windows NT系列的操作系统中托管一个到多个Windows 服务[1]。Svchost是实现所谓的共享服务进程的关键,许多服务可以共享一个进程以减少资源消耗。将多个服务分组到一个进程中可以节省计算资源,这是NT设计人员特别关注的地方,因为创建Windows进程要比在其他操作系统(如Unix系列)花费更多的时间和消耗更多的内存[2]。但是,如果其中一个服务触发一个未被处理的异常,整个进程可能会崩溃。此外,对最终用户来说,识别组件服务可能更加困难。因为牵扯到svchost进程,各类托管服务(特别是Windows更新服务[3][4])的问题被用户发现上报(媒体也有所报道)。
svchost进程是在Windows 2000中引入的[5],尽管自Windows NT 3.1以来已存在对共享服务进程的底层支持。[2]
它的可执行映像,% Systemroot % \System32\Svchost.exe或% Systemroot%\SysWoW64\Svchost. exe(针对64位系统上运行的32位服务)在多个实例中运行,每个实例托管一个或多个服务。
在SvcHost中运行的服务以动态链接库(DLL)的形式来实现。此类服务的注册表项必须在“Parameters”子项下有一个名为“ServiceDll”的值,指向相关服务的DLL文件。他们的“ImagePath”定义形式为%Systemroot%\System32\svchost.exe -k (服务组;netsvcs)。
共享同一个SvcHost进程的服务指定相同的参数,在配置管理的数据库中只有一个单一条目。第一次用特定参数启动SvcHost进程时,它会在 HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost键下查找相同名称的值,并将其解释为服务名称列表。然后,它通知SCM(软件配置管理)它所托管的所有服务。SCM不会为任何接收到的服务启动第二个SvcHost进程:相反,它只是向相应的SvcHost进程发送一个“start”命令,该命令包含应该在其上下文中启动的服务的名称,以及各自需要SvcHost加载的DLL。
根据2003年微软的演示,共享服务的最小工作集大约为150KB,而独立进程的最小工作集为800KB。[6]
从Windows Vista开始,共享进程内部服务的内部标识(包括svchost)是通过所谓的服务标签来实现的。每个线程的服务标签存储在其线程环境块(TEB)的子进程标签中。该标签可在主服务线程随后启动的所有线程中传播,但Windows线程池API间接创建的线程除外。[7]
服务标签管理程序集合是一个目前尚未文档化的API接口,尽管它已被一些Windows实用程序使用, 如netstat使用它用来显示与每个服务相关联的TCP连接。一些第三方工具,如ScTagQuery,也利用了这个API。[7]
Netsvcs是svchost.exe(netsvcs)使用的一个子进程。[8]如果出现内存泄漏,svchost.exe会消耗并占用CPU(中央处理器)。出现此问题是因为在计算机上安装了窗口管理框架3.0后,Winmgmt服务中出现句柄泄漏。Winmgmt服务是在本地系统帐户下运行的svchost.exe进程中的窗口管理工具(WMI)服务。
在Windows XP和更高版本中,带有/svc选项的tasklist命令可列出每个进程中的组件服务列表。
在Windows Vista和Windows 7中,Windows任务管理器中的“服务”选项卡可显示服务列表以及它们的组和进程标识(PIDs)信息;右键单击任务管理器中的svchost实例并选择“转到服务”也会切换到服务列表,并可对相应svchost实例下运行的服务做额外的选择。
在Windows 8中,任务管理器界面被简化了,因此只需单击一下即可将每个svchost条目展开为在其中运行的服务的子列表。
当用户将鼠标悬停在svchost实例上时,微软的系统内部进程资源管理器还提供了有关在svchost.exe进程下运行的服务的信息。
上述方法都不允许用户查看在一个svchost实例中运行的多个服务中的某一个对特定资源进行消耗,例如处理器、磁盘、网络或存储器; Windows资源监视器仅按进程粒度来统计大部分这些资源。但是,通过切到“CPU”选项卡,它可以按服务粒度来统计处理器使用情况。[9]可以使用netstat -b获得打开TCP连接和UDP端口的已知服务器列表。
为了解决运行在svchost实例中的一个服务遇到的其他类型问题,这个服务(或怀疑导致问题的服务)必须(全部)重新配置,以便每个服务都运行在他自己的svchost实例中。例如,scconfig foo type= own将重新配置名为“foo”的服务来运行它自己的svchost实例。将type改回shared也是通过相似命令完成的。必须重新启动服务才能使这类配置更改生效。然而,这个调试过程并不是那么简单;在某些情况下,可能会出现海森堡bug,这将导致服务单独运行时问题并不重现。[10]
一种更复杂的故障排除方法是创建一个独立的服务组。[11]
在Windows 10中,从版本1703开始,微软对svchost进行了重构,根据系统规范,每个进程只托管一个服务。[12]当系统有至少3.5GB内存时,默认设置就会让服务被独立托管。
^Russinovich, Solomon & Ionescu (2009:302).
^"Shared Services". Retrieved 1 October 2014..
^Woody Leonhard (16 December 2013). "Microsoft promises to fix Windows XP SVCHOST redlining 'as soon as possible'". InfoWorld. Retrieved 1 October 2014..
^"Svchost.exe gets worse before it's fixed - Series - Windows Secrets". Retrieved 1 October 2014..
^"How to troubleshoot Service Host (svchost.exe) related problems?". Retrieved 1 October 2014..
^大卫·普罗伯特,Windows服务流程.
^Russinovich, Solomon & Ionescu (2012:335).
^"High CPU Usage by svchost.exe (nets". Appuals.com (in 英语). 2015-12-03. Retrieved 2016-08-12..
^"Figuring out why my SVCHOST.EXE is at 100% CPU without complicated tools in Windows 7 - Scott Hanselman". Retrieved 1 October 2014..
^"What is svchost.exe, and why do I have so many instances of it?". Retrieved 1 October 2014..
^"Getting Started with SVCHOST.EXE Troubleshooting". Retrieved 1 October 2014..
^"Changes to Service Host grouping in Windows 10". Microsoft. Retrieved 30 April 2018..
暂无