1

クリティカル セクションで変更された共有メモリの一部は、かなりの量のデータで構成されていますが、1 回のパスで変更されるのはごく一部です (空きメモリ ページのビットマップなど)。プログラムが中断/強制終了されたときに、データが一貫した状態のままであることを確認する方法。2 つのコピーを持つ以外の提案はありますか (以下の例のコピーと交換、または何らかのロールバック セグメントを持つなど)?

struct some_data{
  int a;
  int t[100000]; //large number of total data but a few bytes changed in a single pass (eg. free entries bitmap/tree).
};


short int active=0;
some_data section_data[2];

//---------------------------------------------------

//semaphore down

int inactive=active % 2;
section_data[inactive]=section_data[active];

// now, make changes to the section data (section_data[next_active])

active=inactive;

//semaphore up
4

1 に答える 1

4

トランザクションの一貫性を探している: トランザクションは完全に発生するか、まったく発生しない。

一般的なパターンはジャーナルです。変更を適用するときに変更を保存します。共有メモリにアクセスし、クラッシュしたプロセス (部分的に存在するジャーナルでセマフォを何らかの方法で取得したことに気付くなど) を検出した人は、続行する前にジャーナルを再生する責任を負います。

まだ 1 つの競合ケースがあり、実際に消費するジャーナルがあることをすべてのプロセスに通知するビットの実際の書き込みです。ただし、これは十分に小さい情報であるため、別のセマフォやフェンスの巧妙な使用など、任意のチャネルを介して送信できます。

ジャーナルがメモリの状態から十分に独立していて、修復プロセスがジャーナルの最初から開始され、すべてを再生できるようにするのが最善です。ジャーナルのどのエントリが「次」であるかを特定する必要がある場合は、さらに多くの同期が必要です。

于 2013-09-14T22:04:45.123 に答える