Win32:计算多核/多处理器系统中的线程 CPU 利用率

Posted

技术标签:

【中文标题】Win32:计算多核/多处理器系统中的线程 CPU 利用率【英文标题】:Win32: Calculate Thread CPU Utilization in a Multi-Core / Multi-Processor System 【发布时间】:2008-11-04 02:32:11 【问题描述】:

我目前正在开发一个需要了解 CPU 利用率的 MFC 应用程序。它可能在不同的时间点有多个线程,但大部分工作都是由主线程完成的。

我正在尝试找到一种方法来计算此主线程使用的 CPU 百分比。但是,我遇到了一些问题,即如何在多 CPU / 多核环境中准确地完成此任务。问题是大多数系统调用似乎都提供了系统信息,而我需要特定于我的主线程正在其上执行的处理器的信息。

我已经查看了 WMI,但它似乎对这项任务来说有点过头了。 GetThreadTimes() 能满足我的需要吗?

【问题讨论】:

【参考方案1】:

您的主线程可能在不同的时间在不同的 CPU 上执行,因此“特定于我的主线程正在执行的处理器的信息”可能毫无意义——它很可能是所有处理器。 Windows 不会跟踪线程在哪个 CPU 上执行了多少时间,所以你不能问“给我这个线程的执行时间列表,每个 CPU”。唯一的例外是当您将线程关联掩码设置为单个 CPU 时,您可以确定如果线程完全执行,它会在该单个 CPU 上运行。

对于计算运行时间,GetThreadTimes 是正确的 API,是的。如果您想知道进程使用的(理论)CPU 百分比,请计算

(kerneltime+usertime) / (now - starttime) / numberofcpus

当然,此公式假定所有 CPU 具有相同的速度。如果要显示线程最近消耗的 CPU 部分,每秒采样一次 GetThreadTimes,然后计算

(usedtimenow - usedtimeprevious) / (now - previous) / numberofcpus

如果您每秒采样一次,现在-之前大约为 1,但无论如何您都应该记录采样时间 - 系统可能不会让您在两次采样之间准确睡眠 1 秒。

【讨论】:

以上是关于Win32:计算多核/多处理器系统中的线程 CPU 利用率的主要内容,如果未能解决你的问题,请参考以下文章

浅谈多核CPU多线程多进程

单核和多核,单进程和多进程,单线程与多线程

多线程利用多核,cpu利用率却达不到100%?

[转]多线程

进程切换 多线程并发

windows 怎样在调度线程到多核