Когда несколько процессов могут асинхронно изменять содержимое общей области данных, необходимо защитить данные от одновременного изменения двумя и более процессами. Рассмотрим два процесса P1 и P2 работающих на центральных процессорах C1 и C2. Эти процессы увеличивают значение переменной X, которая представляет число единиц ресурса. Если P1 выполняется на C1, а P2 выполняется на C2, то может возникнуть одна из следующих последовательностей:
3. P1:R1:=x; R1:=R1+1; x:=R1; ….
P2:… R2:=x; R2:=P2+1; x:=R2;
t0 → time
4. P1:R1=x; R1:=R1+1; x:=R1;…
P2:… R2:=x; R2:=R2+1; x:=R2;
Пусть х содержит значение V в момент времени t0. В момент tk переменная содержала бы V+1 , если бы выполнение шло на процессорах С1 и С2 выполнялось бы по 1) и переменная х содержала бы V+2 , если выполнялось по 2). Оба значение могут быть реализованы, если Р1 и Р2 разделены во времени. При этом должно учитываться каждое приращение х. Решение заключается в x:=x+1 только одному процессу. Если имеется несколько последовательных процессов, которые могут связываться друг с другом через общую память для хранения данных, то каждая программа, выполняемая процессорами, содержит критическую область, в которой организован доступ к общим данным. Проблема заключается в том, чтобы запрограммировать процессы так, чтобы в любой момент только один из процессов находился в своей критической области. Если процесс P входит в свою критическую область (CS) то никакой другой процесс не может сделать, то же самое до тех пор, пока P не покинет свою CS. Следует иметь в виду, что в любом случае должны выполняться следующие предположения:
4. Считывание из общей памяти и запись в неё есть неделимая операция.
5. Критические области не могут иметь связанных с ними приоритетов.
6. Программа может останавливаться и вне своей критической области.
Схема работы с критической областью может быть представлена следующим образом:
Основной целью является взаимное исключение. Одновременно должны быть устранены два возможных типа блокировки:
3. Процесс нормально работающий вне своей CS не может блокировать другой процесс при вхождении другого процесса в свою CS.
4. Два процесса, готовые войти в свои критические области не могут откладывать неопределённо долго решение о том какой из них действительно войдёт в CS первым, используя принцип «сверхвежливости».