1

プロセスによって fork() システム コールが実行されると、そのプロセスから子プロセスが生成されます。fork() 呼び出しに続くすべてのコードは、メモリの新しい物理ページ、つまりフレームにコピーされます。子プロセスの仮想メモリ部分を視覚化できません。次のコードでは、char 変数のアドレスが子と親で同じであるためです。

#include <stdio.h>
#include <sys/types.h>

int main(void)
{
    pid_t pid;
    char y='Y';
    char *ptr;
    ptr=&y;
    pid = fork();
    if (pid == 0)
    {
        y='Z';
        printf(" *** Child process ***\n");
        printf(" Address is %p\n",ptr);
        printf(" char value is %c\n",y);
        sleep(5);
    }
    else
    {
        sleep(5);
        printf("\n ***parent process ***\n",&y);
        printf(" Address is %p\n",ptr);
        printf(" char value is %c\n",y);
    }
}

およびその出力:

*** Child process ***
Address is 69002894
char value is Z

***parent process ***
Address is 69002894
char value is Y
4

2 に答える 2

6

仮想アドレスは両方のプロセスで同じですが、物理アドレスは異なります。プロセスは仮想メモリへのアクセスのみを許可されています。仮想メモリ機能を備えたマシンでは、メモリ管理ユニットが仮想アドレスを物理アドレスに変換します。

通常、オペレーティング システムはコピー オン ライト スキームを使用して分岐を実装します。つまり、何かがメモリ ページに書き込もうとするまで、同じ物理アドレスを持つことになります。あなたが置くとき:

y = 'Z'

オペレーティング システムは、y があったメモリ ページをコピーし、その仮想アドレスを新しい物理アドレスに再割り当てしました。

于 2012-11-01T21:48:16.240 に答える
0

私によると、「execve」コマンドを実行した後、違いがわかります。それまで、子供は親と同じイメージと空間を共有します。

于 2012-11-01T21:47:29.153 に答える