2

我希望这是一个简单的问题。我熟悉 unix/linux/etc 中的 fork 实际上并不复制整个映像,而是使用写时复制标志将共享内存映射为私有的想法。为了说明这一点,我尝试了下面的示例,我希望将大型 malloc 区域显示为私有(写入时复制)。但是,我得到下面的输出。任何人都可以帮助阐明这是为什么吗?我的假设是我的操作系统按预期工作(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

:: 为什么没有将那么大的区域(可能还有其他区域)标记为私有?

谢谢!

4

3 回答 3

0

我认为该pmap程序无法打印此信息。您为什么要使用这样的奇怪实用程序而不是 just cat /proc/%d/maps

于 2012-12-21T20:08:01.680 回答
0

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

于 2012-12-21T20:11:33.630 回答
0

更高版本的 pmap 有一个新选项“-X”。使用此选项 pmap 在 /proc/pid/smaps 中显示详细信息

于 2015-10-20T02:17:47.887 回答