Linux/Windows中的C/C++内存使用API

5
我想获取每个进程和整个系统的内存使用情况。在Windows中,这很容易实现。GetProcessMemoryInfo和GlobalMemoryStatusEx可以轻松完成这些工作。例如,GetProcessMemoryInfo会返回给定进程的“PeakWorkingSetSize”。GlobalMemoryStatusEx返回系统范围内可用的内存。
然而,我需要在Linux上实现它。我正在尝试寻找Linux系统API,它们等效于GetProcessMemoryInfo和GlobalMemoryStatusEx。
我发现了“getrusage”。但是,在结构体rusage中,最大的“ru_maxrss”(驻留集大小)仅为零,即未实现。并且我不知道如何获取整个系统的可用内存。
当前的解决方法是,我正在使用“system(“ps -p%my_pid -o vsz,rsz”);”。手动记录到文件中。但是,这很不方便且难以处理数据。
我想了解一些适用于此目的的高级Linux API。

你想要知道特定进程使用的内存量还是特定线程正在使用什么? - ChadNC
@ChadNC,我想要逐进程和系统范围的解决方案,而我已经解决了这个问题。 - minjang
2个回答

6
你可以在 libstatgrab 中看到它的实现方式。
而且你也可以使用它(GPL)。

谢谢Alex,这正是我想要的。实际上,该库读取/proc/*数据,这也是我尝试的方式 :) - minjang

5

Linux提供了(modular)文件系统接口,可以从内核中获取这些数据,因此几乎可以被任何语言或脚本工具使用。

内存可能很复杂。 有程序可执行文件本身,可能是mmap()方式调用的。共享库。堆栈利用率。堆利用率。软件驻留在RAM中的部分。部分交换出去。等等。


"PeakWorkingSetSize"到底是什么?听起来像是进程使用的最大常驻集大小(进程使用的最大非交换物理内存RAM)。

虽然它也可能是整个进程的总虚拟内存占用量(在RAM和SWAPPED-out部分的总和)。


无论如何,在Linux下,您可以使用strace跟踪进程以查看其内核级别的交互。 "ps"从/proc/${PID}/* 文件中获取其数据。

我建议您cat /proc/${PID}/status。 Vm*行非常有用。

具体来说:VmData指的是进程堆利用率。 VmStk指的是进程堆栈利用率。

如果您继续使用"ps",您可以考虑使用popen()


我不知道如何获取系统范围内的可用内存。

始终可以使用/usr/bin/free

请注意,Linux将利用未使用的内存缓冲文件和缓存... 因此有+/-buffers/cache 行。


感谢您提供详细的答案。"PeakWorkingSetSize" 在 Windows 系统中定义,与您指出的最大 RSS 类似。正如您所提到的,libstatgrab 通过读取 "/proc/$PID/status" 文件来获取信息。该库还通过读取 "/proc/meminfo" 部分来提供系统范围内的可用内存。谢谢! - minjang

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