3

C/C++ プロジェクトなど、複数のコンピューターで特定のメモリ領域を共有したいと考えています。コンピューター B の何かが、現在コンピューター A にあるメモリ領域にアクセスすると、それは A でロックされ、B に送信される必要があります。

前もって感謝します:D

4

2 に答える 2

6

これは、単純な C/C++ プロジェクトでは実行できません。

一般的なコンピュータ ハードウェアには、これを直接サポートする物理的特性はありません。あるシステムのメモリを別のシステムで読み取ることはできません。

異なるマシン上の C/C++ プログラムがメモリを共有しているように見せるには、この機能を提供するソフトウェアを作成する必要があります。通常、次のようなことを行う必要があります。

  1. (各プロセスの) 仮想メモリ アドレス空間にいくつかのページを割り当てます。
  2. それらのページを読み取り専用としてマークします。
  3. プロセスが読み取り専用メモリに書き込もうとしたときに発生する例外を受け取るようにハンドラを設定します。(このハンドラーは、ある種のカーネル拡張機能としてオペレーティング システムにある場合もあれば、プロセス内のシグナル ハンドラーである場合もあります。)
  4. 例外を受け取ったら、プロセスがメモリに書き込もうとしていたものを特定します。それをページに書き込みます(おそらく、仮想メモリの別のマッピングを介して同じ物理メモリに書き込み、この追加のマッピングは書き込み可能とマークされます)。
  5. メモリが変更されたことを知らせるメッセージをネットワーク通信で他のマシンに送信します。
  6. メモリに書き込んだ命令の次のプロセスで実行を再開します。

さらに、メモリの一貫性をどうするかを決定する必要があります。2 つのプロセスがほぼ同時にメモリ内の同じアドレスに書き込むとどうなるでしょうか? プロセス A が場所 X に書き込み、次に場所 Y を読み取り、ほぼ同時にプロセス B が場所 Y に書き込み、X を読み取る場合、何が表示されるでしょうか? 2 つのプロセスが、メモリへの 1 回の書き込みシーケンスの結果であるとは考えられないデータを認識しても大丈夫ですか?

それに加えて、これは時間的に非常にコストがかかります。例外処理とネットワーク操作を必要とするメモリへのストアは、通常のメモリへのストアよりも数千倍、場合によっては数十万倍の時間がかかります。この共有メモリに書き込むたびに、プロセスの実行速度が非常に遅くなります。

于 2012-08-10T13:49:35.520 に答える
5

コメントに記載されているように、ソフトウェアソリューションがあります。これらは、ノード上のプロセッサのページングハードウェアを使用してアクセスを検出し、ローカルネットワークファブリックを使用して変更をメモリに配布します。ハードウェアの代替案の1つはリフレクティブメモリです。詳細については、こちらをご覧ください。

https://en.wikipedia.org/wiki/Reflective_memory http://www.ecrin.com/embedded/downloads/reflectiveMemory.pdf

古いページが壊れていた

http://www.dolphinics.com/solutions/embedded-system-reflective-memory.html

リフレクティブメモリは、リング構成またはツリー構成のいずれかで低遅延(ホップあたり約1マイクロ秒)を提供します。

于 2012-08-10T13:38:35.287 に答える