私はあなたの提案されたデザインが健全だとは思わない。 OSのクラッシュ(停電など)により、mmap'd領域がディスクと部分的に同期することがあります(ページが書かれた順序とは異なる順序で書かれている可能性があります)。これは、データ構造が任意の方法で破損しています。
データベースの変更が耐久性とアトミックになる必要がある場合は、ACIDまたは適切なサブセットをサポートする既存のデータベースシステムを使用することを強くお勧めします。たぶん、sqliteやBerkeley DBがこのトリックを行うでしょう。
原則としてあなたが記述した方法ではありません。原子的に読み取られるように更新された種類のログファイルを作成する必要があります。技術的に困難な既知のスナップショットなどのイベントを「再生」することができます。
のことを忘れないでください:
- アンOSの障害がMMAPは他の時間にデータを書き戻すことはありませんし保証するものではありません
- 部分的に耐久性のあるディスクに完了することが、MSYNCによって開始書き込み()または同様の原因となることがありますつまり、しばらくの間、msync()を呼び出していないとき
- メモリ内のページを変更したときと同じ順序でページを書き戻す必要はありません。あなたは[0]に書き込み、次に[4096]に書き込むことができ、クラッシュ後ではなく[4096]の耐久性を持ちますが、[0]
- 個々のページをフラッシュしても絶対的にアトミックであることは保証されません。
私はあなたのデータ構造へのすべての読み取りまたは書き込み操作のために(例えばBDBまたはsqliteの)ライブラリを使用すると、侵入の変化ですが、堅牢性のこの種をしたい場合、私はそれが必要だと思うことを実現します。
ご提案いただきありがとうございます。しかし、私はプロセスが再開したときにのみデータを復元する必要があります。 OSがクラッシュした場合、私はする必要はありません。共有メモリに書き込むために、私は単に/ dev/shmにファイルを作成することを考えていました。/dev/shm(つまり:tempfs)に書かれたものは、ディスクに書き込まれることはありませんか? – Manohar
私は、あなたのデータはアプリケーションのクラッシュだけでなく、OSのクラッシュ、停電またはその他のハードウェアの障害も生き残らなければならないと想定していました。 「実際のシステム」はいつもそのような失敗から生き残らなければならないので、そうすることができないデータベースを作ることは一般的に無意味です。 – MarkR