1

私たちの割り当ての1つでは、2台のマシン間で分散共有メモリを構築する必要があります。私は、両方のマシンでベースアドレスが異なるようにページングベースの手法を使用していました。しかし、両方のアドレス範囲が同じであることをほぼ義務付けるこのリンクリストテストケースがあります。MAP_FIXEDを使用したmmapの固定アドレスにより、スレーブマシンがクラッシュします(応答サーバースレッドのスタックが上書きされたため)。両方のプロセスの初期化中に、最初から解放されることが保証されているアドレスを作成するのが妥当であると考えました。しかし、ネットを何時間も精査した後でも、そのデフォルトのアドレスを見つけるのは不運です。要件は10000ページです。誰かがヒープアドレスのベースを指定でき、それを超えるとsbrkが成長しないことが保証されている場合は、それを使用できます。

最高の、サブラマニア人

4

1 に答える 1

3

常に機能するアドレスを保証できる人はいないと思います。仮想アドレスの選択は常にカーネル次第であり、MAP_FIXED常にその足を踏み入れます。

-m32アプリケーションのコンパイルには使用しないことをお勧めしますか?利用可能なアドレスが非常に多いため、ランダムなアドレスを選択した場合、競合が発生する可能性は4294967296倍低くなります。

次のハックのいずれかをお勧めします。

  • Linuxを使用しているので、を読んで解析し/proc/self/mapsます。任意の2つのマッピング間の最大のギャップを見つけ、このギャップの中間点にあるアドレスを選択します。前のマッピングが上向きにクリープしたり、次のマッピングが後続の実行で下向きにクリープしたりする場合に備えて、かなり安全である必要があります。このアドレスを他のプロセスに伝達して、同じアドレスでマッピングを試行できるようにします。うまくいけば、他のプロセスのメモリマップは十分に類似しており、同じ場所に多かれ少なかれこの大きなギャップがあります。
  • を使用せずに、一時的に大量の匿名メモリを割り当てMAP_FIXEDます。固定マッピングの場合は、このマッピングの直後のアドレスを試してください。このアドレスを他のプロセスに通信して、同じアドレスでマッピングを試行できるようにしてから、一時的なマッピングを削除します。うまくいけば、他のプロセスのメモリマップが十分に似ていて、選択したアドレスの前に大量のスペアアドレスを残しているので、2番目のプロセスがそれらの一部を占有している場合でも問題ありません。

そして、これらはハックであることを忘れないでください。

于 2012-04-11T22:37:34.147 に答える