メモリ不足時のmmapメモリの動作

メモリ不足時のmmapメモリの動作

イメージファイルを含む大容量のtarファイル(60GB)があります。私はmmap()これらのランダムアクセスイメージを読み取るためにファイル全体を使用しています。

私がそれを使用する理由は次のとおりですmmap()

  1. スレッドセーフ - 複数のスレッドでifstreamが見つかりません
  2. 追加のバッファリングを回避できます。
  3. いくつかのキャッシュ(すでに存在する要求されたページ形式)を取得します。

問題は、60GBファイルのすべての画像を読み取った後にどうなりますか?もちろん、すべての画像がすぐに使用されるわけではありません。画像を読み取り、表示してから削除します。

私のmmap()電話番号は:

mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0); 

問題は、カーネルが私がマップしたファイルベースの読み取り専用ページをチェックし、メモリ不足のために使用されていないページを単に消去することです。この事件が受け入れられたかどうかはよくわかりません。マニュアルページはMAP_NORESERVEスワップスペースのサポートを必要としないと述べていますが、メモリ不足のためにページに何が起こるのか保証できないようです。ファイルシステムキャッシュまたは他のOOMプロセスを消去する前に、カーネルが不要なページを消去することは保証されていますか?

ありがとうございます!

答え1

読み取り専用は、次のものとmmapほぼ同じです。プロセスにマップされたメモリブロックがファイルによってサポートされている場合、RAMのコピーはディスクキャッシュの一部と見なされ、ディスクキャッシュエントリがファイルから作成されたかのようにメモリ不足のために解放されます。openlseekreadread

私はソースコードをチェックしていませんが、MAP_NORESERVE読み取り専用マッピングに違いはないと思います。

関連情報