0

私はPOSIX共有メモリに取り組んでいます。

内部実装がわかりません。プロセスがメモリを共有する方法。プロセスが実際にはメモリを共有していないことを伝えるビデオを見ました。つまり、プロセス A とプロセス B が x などの変数を共有している場合、x を含む論理ページは、プロセス A と B の両方で実際には同じものを指しています。これは、プロセスがメモリを共有する方法です。

私の質問は次のとおりです。

  1. これは、(上で述べたように) 私たちfork()がプロセスを実行したときに起こることです? (つまり、プロセス A が file1 file2 を開き、変数 a,b,c を持っていると仮定します。プロセス A がプロセス B をフォークした場合、プロセス B はこれらすべてのファイルと変数にアクセスできます。)

  2. いいえの場合、その実装を達成する方法は?

  3. はいの場合、無関係なプロセス間でメモリを共有する方法は?

4

3 に答える 3

0

プロセスには 4 つのセグメントがあります

  1. コード セグメント
  2. データセグメント
  3. スタック セグメント
  4. ヒープ セグメント

fork()実行されると、子プロセスには、親の正確なレプリカである独自のデータ、ヒープ、およびスタック セグメントが作成されます。ただし、コード セグメントは親と子の間で共有されます。

そのため、変数を変更しなくても同じ値を表示できます。

各プロセスには、独自のローカル ファイル記述子テーブルがあります。ローカル FDT の各エントリは、グローバル FileTable への参照を保持します。FT のエントリには、開いているファイルに関する情報 (オフセットやすべてなど) が保持されます。データ セグメントが子プロセスに複製されると、子と親は FileTable の同じエントリを指します。そのため、子と親はファイル記述子を共有していると言えます。

2 つのプロセスが同じファイルを一緒に開いた場合、それらはグローバル FileTable のエントリを共有しないことに注意してください。その時点で 2 つの異なるエントリが作成されます。

上記の情報があなたの最初の質問に答えていると思います。

変数をプロセス間で明示的に共有するには、shmライブラリが役立ちます。

于 2013-10-09T17:38:05.807 に答える