访问CPU / RAM使用情况(例如使用任务管理器,但通过API!)?

时间:2014-04-13 05:28:58

标签: python c++ windows winapi

是否有特定的方式来访问"任务管理器" 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

3 个答案:

答案 0 :(得分:4)

不是直接调用Windows API,而是使用psutil库,它是一个跨平台库,提供有关进程的大量信息。 它适用于Windows,Linux,Mac OS,BSD和Sun Solaris,并以32位和64位方式使用2.4至3.4的python。

特别是它的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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

您可以使用以下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中提及)并在一段时间延迟后调用它( Sleep(1second))。这样您就可以获取所有这些程序的信息,直到它执行。