pmap和fork:写入标志的副本在哪里?

时间:2012-12-21 19:55:36

标签: c fork pmap

我希望,这是一个简单的问题。我很熟悉unix / linux / etc中的fork实际上并不复制整个映像的想法,而是将共享内存映射为私有的copy-on-write标志。为了说明这一点,我尝试了下面的示例,我希望将大型malloc'd区域显示为私有(写入时复制)。但是,我得到下面的输出。谁能帮助解释为什么会这样?我的假设是我的操作系统按预期工作(uname -a:Linux xxxxxx 2.6.32-279.19.1.el6.x86_64#1 SMP Tue Dec 18 17:22:54 CST 2012 x86_64 x86_64 x86_64 GNU / Linux)但是pmap是不像我期望的那样工作..

int main(int argc, char *argv[]) {

    pid_t pid;
    char syscmd[80];
    char *somebuffer=(char*)malloc(999999999l);
    pid = fork();
    if (0 == pid) { /* Child */
            sprintf(syscmd, "pmap -x %d", getpid());
            system(syscmd);

    } else { /* parent */
            wait(NULL);
    }

    return 0;
}

输出:

9822:   ./a.out
Address           Kbytes     RSS   Dirty Mode   Mapping
0000000000400000       4       4       0 r-x--  a.out
0000000000600000       4       4       4 rw---  a.out
000000357e000000     128      24       0 r-x--  ld-2.12.so
000000357e21f000       4       4       4 r----  ld-2.12.so
000000357e220000       4       4       4 rw---  ld-2.12.so
000000357e221000       4       4       4 rw---    [ anon ]
000000357e400000    1572     120       0 r-x--  libc-2.12.so
000000357e589000    2048       0       0 -----  libc-2.12.so
000000357e789000      16      12       8 r----  libc-2.12.so
000000357e78d000       4       4       4 rw---  libc-2.12.so
000000357e78e000      20      16      16 rw---    [ anon ]
00007f64228ad000  976576      16      16 rw---    [ anon ]
00007f645e27b000       4       4       4 rw---    [ anon ]
00007f645e27c000       4       0       0 r-x--    [ anon ]
00007fff2a1eb000      84      12      12 rw---    [ stack ]
ffffffffff600000       4       0       0 r-x--    [ anon ]
----------------  ------  ------  ------
total kB          980480     228      76

::为什么那个大区域(可能还有其他区域)不是标记为私有区域?

谢谢!

3 个答案:

答案 0 :(得分:0)

我认为pmap程序无法打印此信息。为什么你使用像这样的奇怪实用工具而不仅仅是cat /proc/%d/maps

答案 1 :(得分:0)

我不确定pmap如何表示“copy-on-write”,我的印象是它在内核之外是不可见的(也就是说,你的第二个“anon”部分是你的malloc'd区域) ,但我可能是错的。这当然是我要找的地方,而且大小合适。您可以进行一些测量以查看是否填充内存两次(测量需要多长时间),然后在子进程中执行相同操作,您将看到第二次填充需要更少的时间,但是第一次分叉过程需要更长时间。

答案 2 :(得分:0)

更高版本的pmap有一个新选项`-X'。使用此选项,pmap在/ proc / pid / smaps

中显示详细信息