在关键部分中修改的共享内存的某些部分由大量数据组成,但是其中只有一小部分在一次通过中被更改(例如,空闲内存页位图)。 如何确保在程序中断/终止时数据保持一致状态。除了有两份副本之外的任何建议 (比如下面的示例中的副本和交换或具有某种回滚段)?
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
答案 0 :(得分:4)
您正在寻找交易一致性:交易完全发生,或根本不发生。
常见模式是日记,您可以在其中存储应用它们时要进行的更改。任何人访问共享内存并检测崩溃的进程(例如注意到他们以某种方式获得了部分存在的日志的信号量),在继续之前负责重播日志。
你仍然有一个种族案例,实际写了一点信号给所有进程,实际上是一个消费日志。但是,这是一个足够小的信息体,您可以通过任何您喜欢的频道发送信息,例如另一个信号量或巧妙使用栅栏。
如果期刊足够独立于记忆状态,那么修复过程可以在期刊开始时重新开始并重播整个事情,这是最好的。如果你必须确定期刊中的哪个条目是"接下来,"那么你需要更多的同步。