3

可以通过运行显示进程的内存使用情况:

$ ps -C processname -o size
 SIZE
 3808

有没有办法在不执行ps(或任何外部程序)或阅读的情况下检索这些信息/proc

4

2 回答 2

7

在Linux系统上,可以通过读取查询进程的内存使用情况/proc/[pid]/statm[pid]进程的PID在哪里。如果一个进程想要查询它自己的数据,它可以通过读取/proc/self/statm来实现。man 5 proc说:

/proc/[pid]/statm

          Provides information about memory usage, measured in pages.  The
          columns are:

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              text       text (code)
              lib        library (unused in Linux 2.6)
              data       data + stack
              dt         dirty pages (unused in Linux 2.6)

您可以使用:打开文件fopen("/proc/self/statm", "r")并读取内容。

由于文件以“页面”返回结果,因此您还需要查找页面大小。getpagesize ()返回页面的大小,以字节为单位。

于 2012-08-16T09:09:07.150 回答
0

您有几个选项可以查找程序的内存使用情况:

  • 在 Valgrind 或 memprof 等分析器中运行它。
  • exec/proc_open/fork 一个新的进程来使用ps, top, 或者pmap像你从命令行一样
  • 捆绑ps到您的应用程序中并直接使用它(它是开源的,当然!)
  • 使用/proc系统(ps反正就是这样……)
  • 创建一个内核报告,它监视进程内存操作。文件系统只是内核内部数据结构的/proc一个视图,所以这实际上已经为您完成了。
  • 开发自己的机制来计算内存使用量而无需内核帮助。

从系统管理的角度来看,前者都是教育性的,并且是现实生活中的最佳选择,但最后一个要点可能是最有趣的。您可能想阅读 Valgrind 或 memprof 的源代码以了解它是如何工作的,但本质上您需要做的是在应用程序和内核之间插入您的机制,并拦截任何内存分配请求。此外,当进程启动时,您可能希望使用预设值(如 0xDEADBEEF)初始化其内存空间。然后,在该过程完成后,您可以读取内存空间并计算预设值以外的单词的出现次数,从而估算出内存使用情况。

当然,事情总是比看起来更复杂。共享库使用的内存呢?管道?您的进程和另一个进程之间的共享内存?系统调用?已分配但未使用的虚拟内存?缓冲到磁盘的数据?除了您的问题“过程记忆”之外,还有很多电话需要拨打,请参阅这篇文章了解其他一些问题。

于 2012-08-16T15:17:12.097 回答