1

同じマシン (Linux x86_64 shmget とその仲間) 上の 2 つのプロセス間で IPC を実装しており、プロセス間のデータのスループットを最大化しようとしています。たとえば、2 つのプロセスを同じマシンでのみ実行するように制限しています。ハードウェア キャッシングを利用するための CPU。

私の質問は、各プロセスが共有オブジェクトを仮想アドレス空間のどこに置くかは問題ですか? たとえば、オブジェクトを両方のプロセスで同じ場所にマップすると有利でしょうか? なぜですか、そうでないのですか?

4

2 に答える 2

3

OSに関する限り、それは問題ではありません。TLB キャッシュがコンテキスト スイッチ間でフラッシュされていない場合は、両方のプロセスで同じベース アドレスを使用すると有利でした。トランスレーション ルックアサイド バッファー (TLB) キャッシュは、プロセス ページ テーブルからの高価なメモリ読み取りの数を減らすために、個々のページの仮想アドレスから物理アドレスへの変換をキャッシュする小さなバッファーです。コンテキスト スイッチが発生するたびに、TLB キャッシュがフラッシュされます。ページ テーブル エントリがまだ TLB にキャッシュされているという理由だけで、プロセスが他のプロセスのメモリのごく一部を読み取れるようにする必要はありません。

異なるコアで実行されているプロセス間でコンテキスト スイッチは発生しません。ただし、各コアには独自の TLB キャッシュがあり、その内容は他のコアの TLB キャッシュの内容と完全に相関していません。同じプロセスからスレッドを切り替える場合、TLB フラッシュは発生しません。ただし、スレッドは仮想アドレス空間全体を共有します。

共有メモリ セグメントを同じ仮想アドレスにアタッチするのは、その中の領域への絶対ポインタを渡す場合にのみ意味があります。たとえば、共有メモリ内のリンクされたリスト構造を想像してみてください。通常は、絶対ポインタではなく、ブロックの先頭からのオフセットを使用します。ただし、追加のポインター演算が含まれるため、これは遅くなります。そのため、絶対ポインターを使用するとパフォーマンスが向上する可能性がありますが、両方のプロセスの仮想アドレス空間で適切な場所を見つけるのは簡単な作業ではない可能性があります (少なくとも移植可能な方法でそれを行うことはできません)。 x86-64。

于 2012-11-15T12:36:34.697 に答える
0

私はここの専門家ではありませんが、他に答えがないので試してみます。仮想アドレスは必ずしも物理アドレスに対応しているとは限らないため、実際に違いが生じるとは思いません。別の言い方をすれば、OS が仮想アドレスをマップする基礎となる物理アドレスは、OS が提供する仮想アドレスに依存しません。

繰り返しますが、私は記憶の達人ではありません。私がここから離れていたらごめんなさい。

于 2012-11-13T20:39:28.710 に答える