这里是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)。据我所知,这些标志适用于每页的基本内容,而不是整个内存段,因为标记为写时复制的是页面,而不是段那么为什么procstat会在整个段中显示它呢 另一个问题是-我能从这个输出中计算出(在写时复制过程中)真正复制了多少页面,以及父进程中还剩多少页面吗 拜托,你能帮我弄清楚这些东西吗?我会非常感激,谢谢
procstat(1)
是一个用于获取详细流程信息的FreeBSD实用程序。Linux中也有类似的工具,但其特定于Linux的字段与问题中的输出不同。这个输出必须取自FreeBSD系统,因为这些字段在LinuxVM子系统的上下文中没有意义。
回答您的具体问题:
- RES是常驻页面计数,而PRES是进程的私有阴影对象的常驻页面计数[1]。复制VM对象时会创建卷影对象[2],进程可能会请求进行私有复制,这样映射文件的其他进程和文件本身都看不到更改[3]
- 映射标志应用于映射的内存对象,而不是直接应用于页面。有些对象类型可能不是写时复制,但vnode和swap(显示在输出中)是。[1]
- 我想你要问的是"与家长共享的页面数量是多少,修改后的页面副本数量是多少?"。在这个输出中,您可以看到另外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