mmap
ファイルの領域を変更してからmsync(MS_INVALIDATE)
に変更して、私のメモリ内の変更が失われたり、変更が必要な場合はmsync(MS_SYNC)
書き込んでください元のストレージに戻します。ダーティmmap領域の手動ライトバック
msync
manpageはMS_INVALIDATE
で次の言葉:
MS_INVALIDATEが指定された場合、MSYNC()以降の参照は、そのデータを得なければならないような永久記憶場所と一致しないマップされたデータのすべてのキャッシュされたコピーを無効化しなければなりませんmsync()の呼び出しとデータへの最初の後続のメモリ参照の間の永続的な格納場所と一致していました。
これは、MS_INVALIDATE
がメモリを元の状態に戻すようリセットする必要があるという印象を与えます。しかし、私がmsync
コールを行うまでには、変更はすでにデバイスに移行しているようです。
- データがデバイスに自動的に書き戻されるのを遅延または防止できますか?
- マニュアルライトバックでのみ操作できますか?
ノート
- 基礎となるストレージのサイズは、数TBであることができます。
私はあなたが達成したいことを理解しているかどうかはわかりません。 'mmap'の全体的なポイントは、それが非同期であり、バッファを書き出す最良のポイントがあるときに心配しないことです。 'msync'はあなたに何らかのスーパーシーケンスポイントを与えるためのものです。単にファイルの一部をバッファリングしたいのであれば、 'read/write/fseek'を使うのでしょうか? –
@ JensGustedt:必要に応じてファイルを遅延読み込みしたい場合は、数TBになる可能性があります。私が読んだり書いたりすると、キャッシュや汚れたマーカーを維持するだけでなく、たくさんのものをコピーして割り当てる必要があります。私がmmapでそれをすることができれば、私はそれをすべて避けるでしょう。 –
確かに、 'mmap'はその目的のために作られただけです。あなたはあなたの修正を行い、システムは最終的にそれらがディスクに着陸するようにスケジュールします。何らかのロールバックやバージョン管理などをしたいのですか? –