2011-12-08 7 views
2

mmapファイルの領域を変更してからmsync(MS_INVALIDATE)に変更して、私のメモリ内の変更が失われたり、変更が必要な場合はmsync(MS_SYNC)書き込んでください元のストレージに戻します。ダーティmmap領域の手動ライトバック

msync manpageMS_INVALIDATEで次の言葉:

MS_INVALIDATEが指定された場合、MSYNC()以降の参照は、そのデータを得なければならないような永久記憶場所と一致しないマップされたデータのすべてのキャッシュされたコピーを無効化しなければなりませんmsync()の呼び出しとデータへの最初の後続のメモリ参照の間の永続的な格納場所と一致していました。

これは、MS_INVALIDATEがメモリを元の状態に戻すようリセットする必要があるという印象を与えます。しかし、私がmsyncコールを行うまでには、変更はすでにデバイスに移行しているようです。

  1. データがデバイスに自動的に書き戻されるのを遅延または防止できますか?
  2. マニュアルライトバックでのみ操作できますか?

ノート

  • 基礎となるストレージのサイズは、数TBであることができます。
+0

私はあなたが達成したいことを理解しているかどうかはわかりません。 'mmap'の全体的なポイントは、それが非同期であり、バッファを書き出す最良のポイントがあるときに心配しないことです。 'msync'はあなたに何らかのスーパーシーケンスポイントを与えるためのものです。単にファイルの一部をバッファリングしたいのであれば、 'read/write/fseek'を使うのでしょうか? –

+1

@ JensGustedt:必要に応じてファイルを遅延読み込みしたい場合は、数TBになる可能性があります。私が読んだり書いたりすると、キャッシュや汚れたマーカーを維持するだけでなく、たくさんのものをコピーして割り当てる必要があります。私がmmapでそれをすることができれば、私はそれをすべて避けるでしょう。 –

+0

確かに、 'mmap'はその目的のために作られただけです。あなたはあなたの修正を行い、システムは最終的にそれらがディスクに着陸するようにスケジュールします。何らかのロールバックやバージョン管理などをしたいのですか? –

答えて

0

大きなファイルにアクセスしてローカル修正を行うためだけの場合は、MAP_PRIVATEを実行して元のバージョンに戻すことを決めたらマッピングを破棄してください。現代のシステムではパフォーマンスのオーバーヘッドが無視できるはずです

:あなたの変更のための

  • システムをコピーするだけで(再度ファイルをマッピングするときに、あなたが
  • を変更するもののために異なる物理 ページが必要になり、再び)物理ページはまだ がページキャッシュに入り、デバイスIOは必要ありません。
+1

はい、これは動作します、私の唯一の質問は、私が "コミット"することを決定したときにストレージへのプライベートマッピングでダーティなページを取得する方法です。この男の答えは私の現在の考えを釘付けにします:http://stackoverflow.com/a/4474496/149482 –