プロセスの再起動後にデータを回復する

2.6.3xカーネルを実行しているx86ベースのLinuxシステムでは、この要件があります。

私のプロセスには、プロセスがクラッシュした場合に回復する必要のあるいくつかの動的データ(数メガバイトの範囲ではない)があります。データを共有メモリに格納し、プロセスが再起動した場合には再度読み取ることです。共有メモリへの書き込みは、更新の途中でプロセスがクラッシュしても、共有メモリにデータが破損しないように注意深く行わなければなりません。

これをコーディングする前に、この機能を提供するオープンソースのプログラム/ライブラリがあるかどうかを確認したいだけでした。ありがとう。

サントス

ベストアンサー

私はあなたの提案されたデザインが健全だとは思わない。
OSのクラッシュ(停電など)によって、mmap’d領域がディスクと部分的に同期することがあります(ページが書かれた順序とは異なる順序で書かれている可能性があります)。これは、データ構造が任意の方法で破損しています。

あなたのデータベースの変更が永続的でアトミックである必要がある場合(一貫性と完全性はどちらも悪くないでしょうか?)、ACIDまたは適切なサブセットをサポートする既存のデータベースシステムを使用することを強くお勧めします。たぶん、sqliteやBerkeley
DBがこのトリックを行うでしょう。

原則としてあなた自身で行うことができますが、あなたが記述したやり方ではできません。原子的に読めるように更新されたある種類のログファイルを作成する必要があります。
“いくつかの既知のスナップショットなどのイベントは、技術的に挑戦的です。

覚えていること:

  • OSの障害により、msync()などによって開始された書き込みが耐久性のあるディスクに部分的に完了する可能性があります。
  • mmapは他の時、つまりしばらくの間msync()を呼び出していないときにデータを書き戻さないことを保証しません
  • ページはメモリ内のページを変更したのと同じ順序で書き戻す必要はありません。あなたは[0]に書き込み、次に[4096]に書き込み、クラッシュ後ではなく[4096]の耐久性を持ちますが、[0]
  • 個々のページをフラッシュしても、アトミックになることは絶対に保証されていません。

私は、あなたのデータ構造への読み書き操作のたびにライブラリ(例えば、bdbやsqlite)を使うことは邪魔になりますが、このような堅牢性が必要な場合は、それが必要だと思います。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です