5

这是 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

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

并且有一个所谓的映射标志(CN)。据我了解,这些标志适用于每页的基础知识,而不是整个内存段,因为它是标记为 Copy-On-Write 的页面,而不是段。那么为什么 procstat 会为整个段显示它?

另一个问题是 - 我可以从这个输出中找出真正复制了多少页面(在 Copy-On-Write 过程中)以及父进程中剩下多少页面?

拜托,你能帮忙弄清楚所有这些东西吗?我将不胜感激,谢谢

4

1 回答 1

0

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

要回答您的具体问题:

  1. RES 是常驻页数,而 PRES 是进程私有影子对象的常驻页数 [1]。复制 VM 对象时会创建影子对象 [2],并且进程可能会请求制作​​私有副本,以便映射文件的其他进程或文件本身不可见更改 [3]。
  2. 映射标志应用于映射的内存对象,而不是直接应用于页面。某些对象类型可能不是写时复制,但 vnodes 和交换(显示在您的输出中)是。[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

于 2014-02-14T02:38:17.767 回答