2013-09-14 7 views
1

Некоторая часть разделяемой памяти, измененная в критическом разделе, состоит из значительного объема данных, однако только небольшая ее часть изменяется за один проход (например, растровое изображение свободной памяти). Как убедиться, что при прерывании/уничтожении программы данные остаются в согласованном состоянии. Любые предложения, отличные от двух копий (например, копия & своп в примере ниже или с каким-то сегментом отката)?Атомные операции с данными критического сечения

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

Вы имеете в виду убийство процесса средней модификации? – WhozCraig

ответ

4

Вы ищете последовательность транзакций: транзакция происходит в целом или вообще отсутствует.

Обычный шаблон - это журнал, в котором вы сохраняете изменение, которое собираетесь наложить во время применения. Любой, кто обращается к общей памяти и обнаруживает разбитый процесс (например, замечая, что они каким-то образом приобрел семафор с частично существующим журналом), берет на себя ответственность за повторное воспроизведение журнала перед продолжением.

У вас все еще есть один случай гонки, фактическая запись бит сигнализации всем процессам, которые есть, по сути, журнал, чтобы потреблять. Тем не менее, это достаточно маленький объем информации, которую вы можете отправить по любому каналу, например, другому семафору или умному использованию ограждений.

Лучше, если журнал достаточно независим от состояния памяти, так что процесс восстановления может начаться только в начале журнала и воспроизвести все это. Если вам нужно определить, какая запись в журнале «следующая», вам потребуется намного больше синхронизации.

Смежные вопросы