メモリ圧迫下でのmallocに対する匿名mmapの利点

私はいくつかの大規模な配列処理コードを実行しています(Linuxを実行しているPentium上)。配列のサイズは、プロセスがスワップするのに十分な大きさです。これまでのところ、私は私の読書を続けて、連続して書くことを試みているので、おそらく働いています。しかし、すぐに大規模な配列を扱う必要があります。このシナリオでは、匿名のmmappedブロックへの切り替えは役に立ちますか?

もしそうなら、理由を説明してください。

私の浅い理解では、mmapはtmpfsパーティションからマウントされたメモリマップされたファイルを実装しています。私が理解したいのは、mmapが標準のmallocよりも優れていることです(それが本当に良いと仮定しているので、そうであるかどうかわかりません)。

注:64ビット以上のRAMを取得することはお勧めしません。残念ながら、それは選択肢ではありません。

5
@Mitch Wheat mmapedインターフェイスは実装されていません。それを実装する前に、私はそれがより良くなる現実的なチャンスがあるのか​​、そしてなぜ
追加された 著者 san,
私は...あんたに気をつけるように切り替えることを提案する。猫が吠えるのを待って。また、プロフィール、プロフィール、プロフィール。違いはあるとは思っていませんが、あなたの使用パターンにもよるかもしれません。
追加された 著者 sehe,
ベンチマークを試してみてください...
追加された 著者 Mitch Wheat,

2 答え

あなたの malloc()割り当てを裏付けるメモリは、 mmap()で作成されたプライベートな匿名マッピングを返すメモリと同じようにカーネルによって処理されます。実際、大きな割り当てのために、 malloc()はとにかくそれをバックするために mmap()で匿名マッピングを作成するので、 > mmap()してください。

あなたのワーキングセットが物理メモリサイズを超えている場合は、swapを使用する必要があり、 mmap()または malloc()で作成された匿名マッピングを使用するかどうか、/code>はそれを変更しません。あなたが行うことができる最も良いことは、あなたのアルゴリズムを試してリファクタリングすることです。それによって良い参照の地域、スワップがあなたを傷つける程度を減らします。

madvise()システムコールを使用して、メモリの使用に関するヒントをカーネルに与えることもできます。

15
追加された
ありがとう、私は、カーネルのスワッピングメカニズムがディスクベースのファイルをマッピングするよりも優れていると仮定しています。
追加された 著者 san,
@san:ファイルバックアップマッピングまたはスワップバックマッピングにダーティページを書き出すためにカーネルが使用するメカニズムは、実際には非常に密接に関連しています。ファイルベースのマッピングを使用する利点は、スワップよりも高速であることがわかっているデバイスにファイルを配置できることです。
追加された 著者 caf,

ここで重要な違いは、 malloc(3)付き入力バッファを使用すると、メモリにすでに存在するファイルにマップされたページのデータをカーネルにコピー mmap(2)だけでそのページを使用します。最初のアプローチは、カーネルバッファーとカーネルバッファーの両方をバックアップするのに必要な物理メモリーの量を倍増させ、2番目のアプローチはその物理メモリーを共有し、uselandプロセスの仮想マッピングの数を増やします。

2
追加された
ありがとう。これは、mallocが内部でメモリマップファイルを使用している場合ですか、それともいつもmallocの場合ですか?私はCSで訓練されていないので、これらは非常に基本的な質問かもしれません。匿名のmmapでは、ディスクのファイルマッピング権はないのですか? RAMの領域にファイルインタフェースが与えられ、そのファイルインタフェースがファイルマッピングに使用されます。
追加された 著者 san,
はい、私は '匿名'の予選を見逃しました。その場合の@cafの答えを見てください。私の答えは、ファイルのメモリマッピング部分に適用されます。
追加された 著者 Nikolai Fetissov,
これはメモリマップファイル用です。 OPは、具体的には、匿名のmmap、すなわちバッキングファイルがないことについて話しています。ゼロコピーパスは必要ありません
追加された 著者 sehe,