2

これは簡単な質問だと思います。unix / linux / etcのforkは実際にはイメージ全体をコピーするのではなく、コピーオンライトフラグを使用して共有メモリをプライベートとしてマップするという考えに精通しています。これを説明するために、以下の例を試してみました。この例では、大規模なmalloc領域がプライベートとして表示されると予想されていました(コピーオンライト)。ただし、以下の出力が得られます。誰かがこれがなぜであるかを明らかにするのを手伝うことができますか?私の想定では、OSは期待どおりに機能します(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 が「copy-on-write」をどのように示しているかはわかりませんが、カーネルの外側では見えないという印象を受けました (つまり、2 番目の「anon」セクションは malloc された領域です)。間違っている可能性があります。それは確かに私が探していた場所で、ちょうどいいサイズです。少し測定して、メモリを 2 回満たすかどうかを確認し (所要時間を測定)、子プロセスで同じことを行うと、2 回目の充填は両方で時間がかからないことがわかりますが、フォークされたプロセスの初回は時間がかかります。

于 2012-12-21T20:11:33.630 に答える
0

pmapプログラムがこの情報を印刷できないだけだと思います。ではなく、そのような奇妙なユーティリティを使用しているのはなぜcat /proc/%d/mapsですか?

于 2012-12-21T20:08:01.680 に答える