linux procstat中的RES和PRES字段有什么区别

zim*_*m32 5 linux memory

这是procstat输出的安全性:

  PID              START                END PRT  RES PRES REF SHD FL TP PATH
36502           0x400000           0x45d000 r-x   77    0  23  11 CN vn /usr/local/sbin/httpd
36502           0x65c000           0x660000 rw-    3    3   2   1 CN vn /usr/local/sbin/httpd
36502           0x660000           0x800000 rw-    5    4   2   1 CN sw
36502        0x80065c000        0x800693000 r-x   25    0  83  32 CN vn /libexec/ld-elf.so.1
Run Code Online (Sandbox Code Playgroud)

RES(驻留页面)和PRES(私有驻留页面)之间的主要区别是什么?与共享和私有内存有关吗?

并且有一个所谓的映射标志(CN)。据我了解,这些标志适用于每页基础知识,而不适用于整个内存段,因为标记为“写时复制”而不是段的页面。那么为什么procstat在整个段中显示它?

另一个问题是- 我可以从此输出中算出(写时复制过程中)真正复制了多少页面,父过程中还剩下多少页面?

请,你能帮忙弄清楚所有这些东西吗?我将非常感谢,谢谢

Ben*_*ley 1

procstat(1)是一个 FreeBSD 实用程序,用于获取详细的进程信息。Linux 上有一个类似的工具,但具有与您问题中的输出不同的 Linux 特定字段。此输出必须取自 FreeBSD 系统,因为这些字段在 Linux VM 子系统的上下文中没有意义。

回答您的具体问题:

  1. RES 是驻留页计数,而 PRES 是进程私有影子对象的驻留页计数 [1]。影子对象是在复制 VM 对象时创建的 [2],并且进程可能会请求制作​​私有副本,以便映射文件的其他进程或文件本身无法看到更改 [3]。
  2. 映射标志应用于映射的内存对象,而不是直接应用于页面。某些对象类型可能不是写时复制,但 vnode 和交换(显示在输出中)是。[1]
  3. 我认为您要问的是“与父级共享的页面数量是多少,以及有多少页面有修改后的副本?”。在此输出中,您可以看到其他 23 个 mmap 对象引用了 httpd 文本。这些可能是 httpd 子进程以及该进程的数据段。[1]

参考

[1] http://freebsd.1045724.n5.nabble.com/proc-filesystem-td5719455.html

[2] https://developer.apple.com/library/mac/documentation/Darwin/Conceptual/KernelProgramming/vm/vm.html

[3] http://www.freebsd.org/cgi/man.cgi?query=mmap&sektion=2