【问题标题】:C/C++ memory usage API in Linux/WindowsLinux/Windows 中的 C/C++ 内存使用 API
【发布时间】:2010-12-13 01:52:13
【问题描述】:

我想获取每个进程和系统范围的内存使用信息。在 Windows 中,这很容易。 GetProcessMemoryInfo 和 GlobalMemoryStatusEx 可以非常轻松地完成这些工作。例如,GetProcessMemoryInfo 给出给定进程的“PeakWorkingSetSize”。 GlobalMemoryStatusEx 返回系统范围的可用内存。

但是,我需要在 Linux 上进行。我正在尝试查找与 GetProcessMemoryInfo 和 GlobalMemoryStatusEx 等效的 Linux 系统 API。

我找到了“getrusage”。但是,struct rusage 中的 max 'ru_maxrss'(驻留集大小)只是零,没有实现。另外,我不知道要获得系统范围的空闲内存。

目前的解决方法,我正在使用“system("ps -p %my_pid -o vsz,rsz");”。手动记录到文件。但是,处理数据很脏,不方便。

我想知道一些用于此目的的精美 Linux API。

【问题讨论】:

  • 您想要特定进程使用的内存量还是特定线程正在使用的内存量?
  • @ChadNC,我想要每个进程和整个系统,我解决了这个问题。

标签: c linux winapi memory-management


【解决方案1】:

你可以在libstatgrab看到它是如何完成的。
你也可以使用它(GPL)

【讨论】:

  • 谢谢亚历克斯,这正是我想要的。实际上,该库读取 /proc/* 数据,这是我尝试的方式:)
【解决方案2】:

Linux 有一个(模块化)文件系统接口,用于从内核获取此类数据,因此几乎可以被任何语言或脚本工具使用。

内存可能很复杂。有程序可执行文件本身,大概是 mmap()'ed。共享库。堆栈利用率。堆利用率。部分软件驻留在 RAM 中。部分换掉了。等等。


究竟什么是“PeakWorkingSetSize”?这听起来像是最大驻留集大小(进程使用的最大非交换物理内存 RAM)。

虽然它也可能是整个进程的总虚拟内存占用量(总和内存中和交换出部分)。


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

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

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

如果你继续使用“ps”,你可以考虑popen()


我不知道要获得系统范围的空闲内存。

总是有/usr/bin/free

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

【讨论】:

  • 感谢您的详细解答。 “PeakWorkingSetSize”是在Windows系统中定义的,它类似于你指出的max rss。正如您所提到的,libstatgrab 读取 /proc/$PID/status 中的文件。该库还通过阅读“/proc/meminfo”部分提供系统范围的可用内存。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 2017-06-09
  • 1970-01-01
  • 2011-11-07
  • 1970-01-01
相关资源
最近更新 更多