17

共有メモリの概念全体について考えた後、質問が出てきました。

2つのプロセスが同じ共有メモリセグメントを共有できますか?2つのスレッドが同じ共有メモリを共有できますか?

もう少し明確に考えた後、2つのプロセスが同じ共有メモリセグメントを共有できることをほぼ確信しています。最初のプロセスは父親で、2番目のプロセスは息子です。これはで作成されましたがfork()、2つのスレッドはどうでしょうか。

ありがとう

4

4 に答える 4

30

2つのプロセスが同じ共有メモリセグメントを共有できますか?

はいといいえ。通常、最新のオペレーティングシステムでは、別のプロセスが最初からフォークされると、すべてのページでコピーオンライトが設定された同じメモリスペースを共有します。読み取り/書き込みメモリページのいずれかに更新が行われると、そのページのコピーが作成されるため、2つのコピーが作成され、メモリページは親プロセスと子プロセスの間で共有されなくなります。これは、読み取り専用ページまたは書き込まれていないページのみが共有されることを意味します。

プロセスが別のプロセスからフォークされていない場合、通常、プロセスはメモリを共有しません。1つの例外は、同じプログラムの2つのインスタンスを実行している場合、それらはコードを共有し、静的データセグメントでさえも共有する可能性がありますが、他のページは共有されません。もう1つは、一部のオペレーティングシステムで、アプリケーションが複数のアプリケーションによってロードされるダイナミックライブラリのコードページを共有できるようにする方法です。

同じメモリセグメントを共有するための特定のメモリマップ呼び出しもあります。この呼び出しは、マップが読み取り専用か読み取り/書き込みかを指定します。これを行う方法は、OSに大きく依存します。

2つのスレッドが同じ共有メモリを共有できますか?

そうです。通常、マルチスレッドプロセス内のすべてのメモリは、スレッドごとの比較的小さなスタックスペースを除いて、すべてのスレッドによって「共有」されます。これは通常、すべてが同じメモリ空間内で実行されているという点でスレッドの定義です。

スレッドには、プロセッサ/コアに関連付けられた高速メモリにキャッシュされたメモリセグメントがあるという追加の複雑さもあります。このキャッシュされたメモリは共有され、メモリページの更新は、同期操作に応じて中央ストレージにフラッシュされます。

于 2012-07-19T18:12:59.727 に答える
5

一般に、プロセスの主要なポイントは、メモリが共有されないようにすることです。共有メモリセグメントを介したプロセス間通信は、最も一般的なOSで確かに可能ですが、メカニズムはデフォルトではありません。共有領域の設定と管理に失敗すると、運が良ければsegFault / AVになり、運が悪ければUBになります。

ただし、同じプロセスに属するスレッドには、そのようなハードウェアメモリ管理保護がないため、好きなものをほとんど共有できます。明らかな欠点は、好きなものをほとんど破損する可能性があることです。私は実際にこれが大きな問題であることに気づいたことはありません。ポインタをオブジェクトインスタンスとして「構造化」する傾向がある最新のオブジェクト指向言語(Java、C#、Delphi)。

于 2012-07-19T18:18:44.660 に答える
2

はい、2つのプロセスの両方を共有メモリセグメントに接続できます。共有メモリセグメントは、それが当てはまらない場合はあまり使用されません。これは、共有メモリセグメントの背後にある基本的な考え方であるためです。これが、IPC(プロセス間通信)のいくつかの形式の1つである理由です。

同じプロセス内の2つのスレッドは、両方とも共有メモリセグメントに接続することもできますが、それらが含まれるプロセスのアドレススペース全体をすでに共有していることを考えると、あまり意味がない可能性があります(ただし、誰かがそれをそうするための多かれ少なかれ有効なユースケースを考え出すことに挑戦してください)。

于 2012-07-19T18:17:37.927 に答える
1

一般的に、各プロセスは、不要な相互作用(セキュリティの問題を表すものを含む)を回避するために、他のすべてのプロセスから分離されたメモリスペースを占有します。ただし、通常、プロセスがメモリの一部を共有するための手段があります。これは、RAMフットプリントを削減するために行われる場合があります(VAX / VMSの「インストール済みファイル」はそのような例の1つです)。また、協調するプロセスが通信するための非常に効率的な方法にもなります。その共有がどのように実装/構造化/管理されるか(親/子など)は、特定のオペレーティングシステムによって提供される機能と、アプリケーションコードに実装されている設計上の選択によって異なります。

プロセス内では、各スレッドは、同じプロセスの他のすべてのスレッドとまったく同じメモリスペースにアクセスできます。スレッドがそれ自体に固有である唯一のものは「実行コンテキスト」であり、その一部はそのスタックです(ただし、あるスレッドが同じプロセスの別のスレッドに「属する」スタックにアクセスまたは操作することを妨げるものはありません)。

于 2013-06-23T18:27:01.267 に答える