【问题标题】:Obtain Total CPU Time of Idle Process in Windows similar to Task Manager类似于任务管理器获取Windows中空闲进程的总CPU时间
【发布时间】:2012-07-30 15:47:02
【问题描述】:

我正在开发一个大型应用程序,想了解两个时间点之间 CPU 的负载情况。我不仅对自己的流程感兴趣,而且对所有流程都感兴趣。

我的想法是获取两个时间段之间空闲进程的总 CPU 时间。然后将该值与实际时间差进行比较。然后可以计算在空闲进程上花费的平均 CPU 时间百分比,从而计算在实际进程上花费的平均 CPU 时间百分比。

例如:

  • 实时采样:2012/07/30 13:56:1 和 2012/07/30 13:56:21
  • 空闲进程总 CPU 时间样本:56:23:10 和 56:23:15
  • 实时差异:20s
  • 空闲进程总 CPU 时间的差异:5s
  • 空闲进程中的平均 % CPU 时间:25%
  • 实际进程中的平均 CPU 时间百分比:75%

为了尽可能减少对性能的影响,我只想取两个样本。一个在开头,一个在结尾。

我也不想查看其他进程来计算总 CPU 负载,只查看空闲进程。 (例如我不想计算其他进程的 Total CPU Time 的总和)

我尝试使用 Kernel32.dll OpenProcess。但显然您无法访问空闲进程。它抛出一个 ERROR_ACCESS_DENIED 异常。

这必须是可能的,因为任务管理器会显示空闲进程的总 CPU 时间。

注意:我对进程的瞬时 % CPU 时间不感兴趣。只有 Total CPU Time 才能在以后计算平均值。

【问题讨论】:

    标签: c# windows


    【解决方案1】:

    您可能正在寻找这样的东西:

    static Program
    {
        private static PerformanceCounter cpuCounter = new PerformanceCounter() { 
            CategoryName = "Processor", 
            CounterName = "% Processor Time", 
            InstanceName = "_Total" };
    
        static void Main()
        {
            cpuCounter.NextValue();
            // Do your processing here.
            float totalCpuUsagePercentage = cpuCounter.NextValue();
        }
    }
    

    totalCpuUsagePercentage 将包含自上次 cpuCounter.NextValue() 以来的总负载百分比。

    如果您不想要百分比,您可以改用 CounterName = "Processor Time"。

    希望这对您的探索有所帮助。

    【讨论】:

    • 记得使用 System.Diagnostics;
    【解决方案2】:

    “空闲进程”很可能不存在。

    您可以尝试替换您自己的“空闲进程”,其中包含 [no.核心]线程,空闲+1优先级,CPU循环,计算经过的时间。这可能行得通。

    它还可以锻炼您的冷却系统并为您的办公室暖和起来:)

    【讨论】:

    • 空闲进程在某种程度上确实存在。您可以使用 Kernel32 API 调用 OpenProcess 访问它,ProcessID 为 0。但您不能从用户空间应用程序访问它,因为它是受保护的进程。但是任务管理器可以以某种方式访问​​该信息。我想知道任务管理器是如何做到的。我正在寻找一种低影响的优雅解决方案......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    相关资源
    最近更新 更多