2

誰かが以下のプログラムの出力を説明できますか?親と子の両方で同じ値の&aを取得するのはなぜですか。

それらは異なる物理アドレスを持っている必要があります。仮想アドレスを取得していると考える場合、各物理アドレスが仮想アドレスに一意にバインドされていることがわかっている限り、どのようにして同じ仮想アドレスを使用できますか。

#include <stdio.h>
#include <stdlib.h>
int main(void) {


    int pid=fork();
      int a=10;
    if(pid==0)
        {
            a=a+5;
            printf("%d %d\n",a,&a);
        }
        else
        {
            a=a-5;
            printf("%d %d\n",a,&a);
        }
        return 0;
}
4

1 に答える 1

10

子プロセスは、子がページに書き込むと仮想アドレスが異なる物理アドレスを参照し始めても、親から仮想アドレス空間を継承します。これは、コピーオンライト(CoW)セマンティクスと呼ばれます。

したがって、親&aではいくつかの物理アドレスにマップされます。Forkは、最初はマッピングをコピーするだけです。次に、プロセスが書き込みを行うとa、CoWが起動し、子プロセスで保持している物理ページがコピーされ、仮想アドレスマッピングが更新されてコピーが参照され、両方のプロセスが同じ仮想アドレスにa独自のコピーを持ちます。しかし、異なる物理アドレスで。a&a

各物理アドレスは、仮想アドレスに一意にバインドされます

それは真実ではない。物理メモリアドレスは、マップされていない場合もあれば、1つ以上のプロセスのアドレス空間内の複数の仮想アドレスにマップされている場合もあります。

逆に、これらの仮想アドレスが異なるプロセスの仮想アドレス空間に存在する限り、単一の仮想アドレスを複数の物理アドレスにマップできます。

[ところで、メモリアドレスを確実に印刷することはできません%d(32ビットx86で動作するだけです)。%p代わりに使用してください。また、の戻りタイプforkpid_t、ではなく、intです。]

于 2012-11-11T20:55:38.177 に答える