获取特定进程正在运行的处理器数

Get number of processors a particular process is running on

本文关键字:运行 处理器 进程 获取      更新时间:2023-10-16

我有一个与进程关联的进程ID。我使用CreateProcess()函数创建了这个进程。在运行过程中,我想跟踪它在多少处理器上运行,以及这个可执行文件在多核机器上使用了多少时间。

我想写同样的C++代码;有人能帮我吗?

我使用的是WinXP多核计算机。

GetProcessAffinityMask:

检索指定进程的进程关联掩码和系统的系统关联掩码。

GetProcessTimes:

检索指定进程的计时信息。

您可以使用Windows事件跟踪(ETW)和CSwitch事件(在每个上下文开关上发出)在Vista或更高版本上捕获此级别的详细信息。

各种工具(如Windows性能工具包)捕获并可视化这些数据。

但是,这在Windows XP上不受支持。

如果你只想知道你的典型并发是什么(即在给定的时间有多少线程在运行),你可以定期对perfmon线程数据进行采样(从HKEY_PERFORMANCE_data)。"线程状态"计数器将为您提供进程中每个线程的即时状态(即每个线程是否正在运行)。显然,这个采样过程将最大并发限制为(处理器数-1)。

但你真的需要这么多细节吗?GetProcessTimes通常就足够了。

更新

您可以在测试机器上运行应用程序,并使用perfmon简单地测量每个CPU的利用率。您还应该测量每个进程的CPU利用率,以确保没有其他进程意外运行。

若要捕获报表的数据,请以管理员身份运行perfmon。

  • 导航到右侧的"性能监视器"以显示实时性能图表。选择要监视的对象/计数器(即所有处理器和进程的"%处理器时间")。Perfmon应该开始实时捕获数据
  • 右键单击图形并选择捕获频率(例如,如果您的应用程序运行数小时,您可能不希望每秒都有数据)
  • 右键单击右侧树中的"性能监视器"节点,然后选择"新建| Data Collector集"。输入它的名称,然后单击其他默认值
  • 导航到右侧的Data Collector Set(位于"Data Collector Sets|User Defined"下)。您可以使用工具栏按钮(或右键单击)启动和停止数据采集
  • 现在,您已经将一些数据返回到性能监视器图形,并选择"查看日志数据"(第二个工具栏按钮)。从"源"选项卡中选择日志文件。这将显示捕获数据的图形
  • 右键单击图形并选择"将数据另存为…"您可以选择CSV或TSV

就是这样。