访问CPU/RAM使用情况(类似于任务管理器,但通过API!)



是否有特定方法可以使用Windows API访问"任务管理器"信息?我已经在这个问题上做了相当多的搜索,但我似乎找不到一个API调用来告诉我:

  • 给定进程的CPU/RAM使用情况
  • 使用最多CPU/RAM的进程

有没有办法通过Python或C++(基本上是通过Windows API)访问这些信息?

以下是我(在伪代码中)主要要做的事情:

app x = winapi.most_intensive_process
app y = winapi.most_RAM_usage
print x.name
print y.name

您可以使用psutil库,而不是直接调用windows API,这是一个跨平台库,提供了大量关于进程的信息。它适用于Windows、Linux、Mac OS、BSD和Sun Solaris,并以32位和64位的方式与python从2.4到3.4兼容。

特别是它的Process类有以下有趣的方法:

  • cpu_times:进程从一开始所花费的用户和系统时间
  • cpu_percent:自上次调用以来或给定时间间隔内的cpu利用率百分比
  • memory_info:关于Ram和虚拟内存使用情况的信息注意:文档明确指出这些是taskmgr.exe显示的,因此它看起来正是您想要的
  • memory_info_ex:扩展内存信息
  • memory_percent:进程已使用内存的百分比

要对所有进程进行迭代(例如,为了找到最需要CPU/内存的进程),只需对process_iter进行迭代即可。


以下是您想要实现的目标的简单实现:

import psutil
def most_intensive_process():
    return max(psutil.process_iter(), key=lambda x: x.cpu_percent(0))
def most_RAM_usage():
    return max(psutil.process_iter(), key=lambda x: x.memory_info()[0])
x = most_intensive_process()
y = most_RAM_usage()
print(x.name)
print(y.name)

在我的系统上运行的示例:

In [23]: def most_intensive_process():
    ...:     # psutil < 2.x has get_something style methods...
    ...:     return max(psutil.process_iter(), key=lambda x: x.get_cpu_percent(0))
    ...: 
    ...: def most_RAM_usage():
    ...:     return max(psutil.process_iter(), key=lambda x: x.get_memory_info()[0])
In [24]: x = most_intensive_process()
    ...: y = most_RAM_usage()
    ...: 
In [25]: print(x.name, y.name)
firefox firefox

您可以使用PSAPI函数检索有关RAM使用情况的信息,尤其是EnumProcesses,用于查找系统中的所有进程,GetProcessMemoryInfo用于获取每个进程的内存使用情况信息。

您可以使用GetProcessTimes检索每个进程的CPU使用情况。这并不总是完全准确的,但我相信任务管理器在相同的情况下会以同样的方式产生不准确的结果。

如果您需要,可以通过GetPerformanceInfo获得有关整个系统内存使用情况的信息。

您可以使用以下Windows API来检索C/C++程序中的各种进程计数器。

它检索有关指定进程的内存使用情况的信息。

BOOL WINAPI GetProcessMemoryInfo(
  _In_   HANDLE Process,
  _Out_  PPROCESS_MEMORY_COUNTERS ppsmemCounters,
  _In_   DWORD cb
);

MSDN上有一个完整的示例,它解释了如何使用它为您的流程检索此类信息。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682050%28v=vs.85%29.aspx

您已经提到,您希望在连续的基础上获取信息(像任务管理器那样有一定的时间间隔)。要实现这一点,您可能需要在函数中编写完整的逻辑(MSDN中提到),并在一段时间延迟后调用它(睡眠(1秒))。这样,您就可以获取程序的所有这些信息,直到它执行为止。

最新更新