2012-04-11 6 views
1

2つのマシン間に分散共有メモリを構築する必要がある私たちの割り当ての1つでは、ベースアドレスが両方のマシンで異なる。しかし、このリンクされたリストのテストケースでは、両方のアドレス範囲が同じであることをほぼ強制しています。 mmapの固定アドレスはMAP_FIXEDを使ってスレーブマシンをクラッシュさせます(返信サーバスレッドのスタックが上書きされてしまったため)。両プロセスの初期化中に最初から空いているアドレスを作成すると合理的です。しかし、ネットを精練した後、私はまだそのデフォルトアドレスを見つけるのは不運です。我々の要件は10000ページです。もし誰かがヒープアドレスの基底を指し示すことができれば、それ以上のsbrkが成長しないようにすることができます。mmapアドレスヒントのための合理的な有効な開始アドレスは、仕事が成立するために

ベスト

、 サブラマニアン

+0

これは非常に移植性が高くありません。興味のあるオペレーティングシステムだけでなく、アーキテクチャも指定する必要があります。それはカーネルのバージョンに依存するかもしれません! – Celada

+0

Oh、Centos、2.6.32 64ビットマシン、脇に、このRLIMIT_DATAのcur_limitエントリを見つけました。それは4 GBを言う!!!!コンパイラフラグに-m32と書いてあったとしても。私は32ビットマシン上でRLIMIT_DATAをたくさん検索しました – subramanian

答えて

3

私は、誰もが常に動作する任意のアドレスを保証することができるようになるだろうとは思いません。仮想アドレスの選択は常にカーネルに任され、MAP_FIXEDは常にそのつま先を踏み出すでしょう。

-m32をアプリケーションのコンパイルに使用しないことをお勧めしますか?あなたがランダムなアドレスを選んだ場合、より多くのアドレスが利用可能になれば、競合を起こす可能性は4294967296倍になります。

  • あなたがLinux上でされているので、読んで/proc/self/mapsを解析:

    私は、次のハッキングのいずれかをお勧めします。任意の2つのマッピングの中で最大のギャップを見つけ、このギャップの中間点でアドレスを選択します。以前のマッピングが上に向かってクリープしたり、次のマッピングが後続の実行で下に這い上がる場合は、合理的に安全でなければなりません。このアドレスを他のプロセスと通信し、同じアドレスにマッピングできるようにします。うまくいけば、他のプロセスのメモリマップは十分に似ていて、同じ場所でこの大きなギャップがある程度あるでしょう。

  • MAP_FIXEDを使用せずに、大量の匿名メモリを一時的に割り当てます。固定マッピングの場合は、このマッピングの直後にあるアドレスを試してください。このアドレスを他のプロセスと通信して、同じアドレスにマッピングを試み、一時マッピングを取り除くことができるようにします。うまくいけば、他のプロセスのメモリマップは十分に似ていて、選択したアドレスの前に膨大な数のスペアアドレスを残しておけば、2番目のプロセスがそれらの一部を占めていても、それでも問題はありません。

これらはハックであることに注意してください。

+0

実際にmakefileはコースインストラクターLOLによって与えられました。分散共有メモリを実装しているので、初期化の始めに来ます。my/proc/self/mapsはデータセクション、bss、cs、スタックのみになりますか?おそらく私はヒープとスタックの間で何かを選択するでしょう。 – subramanian

+0

'/ proc/self/maps'には、データ、bss、cs、スタック、ヒープ、共有ライブラリ、およびクエリを実行した時点ですでに設定されているマップされたファイルが含まれます。私のシステムでは、ヒープとlibcのマッピングの間に大きなギャップがあります。 – Celada

+0

私は、RLIMIT_DATAとgetrlimitを使用してヒープの最大境界を取得しています。しかし、私の研究室にある64ビットLinuxマシンでは、getrlimitは32ビットアドレス空間を超えて4GBを返します。私は32ビットアプリケーションで使用しています。はい、あなたのテクニックを使用しようとします。 – subramanian

関連する問題