性能监视器中有两个计数器:“对象”下的“线程”和“进程”下的“线程数”。
在我查看过的机器上,两个计数器的值相差很大,对象 > 线程要大得多。这两个值之间的差异说明了什么?
答案1
让我们从过程→线程数为了_全部的实例。此计数器会遍历每个进程,获取其线程数,然后将其加起来。这样做会得到与以下 PowerShell 命令相同的数字:
(gwmi -Query "select threadcount from win32_process" | Select-Object -Property ThreadCount | Measure-Object ThreadCount -Sum).Sum
在我的机器上,这个总数比对象→线程柜台。
造成这种差异的一个假设是:在用户模式下,每个线程都与一个进程相关联。然而,内核模式驱动程序可以创建设备专用线程,它们从不执行用户模式代码,因此,它们似乎不会被用户模式进程检查发现。但是,看起来系统进程负责驱动程序的线程,所以这个解释可能不正确。
更可能的解释是,尽管上述命令统计了所有正在运行的线程,但仍然有一些线程对象(虽然已终止)尚未被清除。由于一些线程记账会一直保留,直到所有程序都放弃对它的了解,持有死线程句柄的存活进程可能会造成这种差异。
有点相关:Windows 线程内部原理。