2016-11-11 7 views
1

ここでfork()について理解しています。 fork()システムコールは、親プロセスから子プロセスをスピンオフします。子プロセスのコアイメージ(アドレス空間)は、親プロセスのものとまったく同じです。アドレス空間には、次のものが含まれます。フォーク時の書き込み時コピー

  1. スタック
  2. テキストセグメント(プログラムを含む)。
  3. データセグメント(変数を含む)。

しかし、プロセスのいずれか(親または子)がそのアドレス空間に書き出しを開始するまで、コピーは実際には実行されません。子が別のアドレス空間に割り当てられるのは、それだけです。

私は私の理解をテストするためのプログラムを書いて、その結果は、私が何か欠けている可能性があります示しています。ここ

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

int main() 
{ 
pid_t pid; 
pid=fork(); 
int a=5; 

if(pid<0){/*error condition*/ 
printf("Error forking\n"); 
} 

if(pid==0){/*child process*/ 
printf("Child process here\n"); 
a=a+5; 
printf("The value of a is %d\n",a); 
printf("The address of a is %p\n",&a); 
printf("Child terminated\n"); 
exit(getpid()); /*child terminates*/ 
} 
else{/*parent process*/ 
printf("Parent blocked\n"); 
wait(NULL); /*waiting for child process to exit*/ 
printf("Parent process here"); 
printf("The value of a is %d\n",a); 
printf("The address of a is %p\n",&a); 
printf("parent terminated"); 
} 

} 

は、上記のプログラムの出力です:

Parent blocked 
Child process here 
The value of a is 10 
The address of a is 0x7ffe4c37b1a0 
Child terminated 
Parent process hereThe value of a is 5 
The address of a is 0x7ffe4c37b1a0 

誰かがに説明することができますなぜ私は両方のアドレスが同じですか?子プロセスはその変数を更新したので、別のメモリ位置に割り当てられているはずです。

+0

子供は親のコピーであることを忘れないでください。これには*メモリマップ*が含まれます。 –

+0

仮想アドレスはpyhsicalではなく同じです。 – mch

+0

Blimey。私はそれを認識しませんでした。実際の住所を見ることはできませんか? –

答えて

3

そうではありません。

子と親の両方から見えるアドレスは、システム全体に関係なく、それぞれのアドレス空間に相対的です。

オペレーティングシステムは、各プロセスで使用されるメモリを物理(または仮想)メモリ内の別の場所にマップします。しかし、そのマッピングはプロセスには見えません。

1

しかし、プロセスのいずれか(親または子)がアドレス空間に書き出しを開始するまで、コピーは実際には行われません。子が別のアドレス空間に割り当てられるのは、それだけです。

これは、Linuxがそれを行う方法ですが、すべてのEunuchsの亜種がそうするわけではありません。

両方のaのアドレスが同じである理由を誰かに説明することはできますか?

最新のオペレーティングシステムでは、各プロセスに物理ページフレームにマップされたページを持つ独自の論理アドレス空間があります。システム専用のアドレスと明示的に共有されているアドレスを除き、すべてのプロセスの同じアドレスが異なる物理アドレスにマップされます。

親の論理アドレス0x7ffe4c37b1a0は、子の0x7ffe4c37b1a0とは異なる物理アドレスにマップされます。

関連する問題