2012-03-08 24 views
3

fork()で生成されたプロセスについて何か分かりませんでした。 私はこのようなコードをしようとした場合:2つのプロセスが同じヒープを共有しています

int main(int argc, char** argv) 
{ 
    void* mem=malloc(100); 
    pid_t pid=fork(); 
    printf("%p\n",mem); 
} 

を両方のプロセスが同じアドレスを印刷します。 ヒープ内の同じメモリ領域を指していますか? それは危険ですか?競合が発生する可能性があります。 私の本は、スタックの値はコピーされていると言いますが、ヒープについては言及していません。

+0

https://en.wikipedia.org/wiki/Virtual_memory –

答えて

5

異なるプロセスが別々の仮想アドレス空間に含まれているため、それらのメモリアドレスは異なるメモリ位置を指します。

Karoly Horvathは、copy-on-writeという最適化により少し複雑です。これは基本的に区別が必要になるまで1つのコピーを持つことを可能にします。これはページフォルトによって実現され、2つの別々の仮想アドレス空間の同じアドレスは同じメモリ位置を参照しません。

+4

いいえ、あなたが書き込むまで、同じハードウェアアドレスを指していません。 fork()を実行すると、OSはメモリ内のすべてのページをマークして書き込み時にページフォルトを作成します。この書き込みはキャッチされ、実際のコピーが行われます。あなたがメモリから読んでいる限り、これはうまく動作し、貴重なメモリとCPU時間を節約します; –

+2

あなたはそれを答えるべきです – Useless

0

環境、リソース制限、umask、制御端末、現在の作業ディレクトリ、ルートディレクトリ、シグナルマスク、およびその他のプロセスリソースは、フォークされた子プロセスで親から複製されます。

関連する問題