访问CPU / RAM的使用(如使用任务pipe理器,但通过API!)?

Windows API访问“任务pipe理器”信息的具体方法是什么? 我已经做了一些相关的调查,但是我似乎无法find一个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 

而不是直接调用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 

您可以使用PSAPI函数(尤其是EnumProcesses查找有关RAM使用情况的信息,以查找系统中的所有进程,使用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中提到),并在一段时间后( Sleep(1秒))调用它。这样,你应该能够获取你的程序的所有信息,直到它执行。