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

3
有没有一种特定的方法可以使用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个回答

4

不要直接调用Windows API,可以使用psutil库,它是一个跨平台库,提供了大量关于进程的信息。

它适用于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

这绝对是最好的答案,但我有一个额外的问题:psutil是Python特定的(显然),那么是否有类似于C / C ++的库?Python对我的目的很好,但我目前正在加强我的C ++技能,像这样的库将非常有用。谷歌搜索“psutil c++ alternative”没有得到任何结果。 :( - b4ux1t3
@b4ux1t3 很抱歉,我不知道有任何适用于 C/C++ 的等效库。你应该在 软件推荐 网站上询问。 - Bakuriu

4
您可以使用PSAPI函数来获取关于RAM使用情况的信息,特别是使用EnumProcesses来查找系统中的所有进程,以及使用GetProcessMemoryInfo来获取有关每个进程的内存使用情况的信息。
您可以使用GetProcessTimes为每个进程检索CPU使用情况。这并不总是完全准确的,但我认为在相同情况下任务管理器产生的结果也是不准确的。
如果需要,可以通过GetPerformanceInfo获取有关整个系统的内存使用情况的信息。

2
您可以在C/C++程序中使用以下Windows API来检索各种进程计数器。
它检索有关指定进程的内存使用情况的信息。
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(1秒))。这样,您应该能够获取程序执行期间的所有这些信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接