Проблемы критических участков. Взаимоисключения


При выполнении параллельных процессов может возникать проблема, когда каждый процесс, обращающийся к разделяемым данным, исключает для всех других процессов возможность одновременного с ним обращения к этим данным — это называется взаимоисключением (mutual exclusion).
Ресурс, который допускает обслуживание только одного пользователя за один раз, называется критическим ресурсом. Если несколько процессов хотят пользоваться критическим ресурсом в режиме разделения времени, им следует синхронизировать свои действия таким образом, чтобы этот ресурс всегда находился в распоряжении не более чем одного их них.
Для каждого процесса могут быть выделены участки, в которых происходит обращение к критическим ресурсам, они называются критическими участками. Рассмотрим пример, поясняющий выше сказанное.

Пример.
Пусть два процесса X и Y разделяют переменную СЧЕТ. Если оба процесса попытаются увеличить СЧЕТ на 1 одновременно, то окончательное значение этой переменной может оказаться неверным. Рассмотрим следующую последовательность событий:
• процесс X запоминает значение переменной СЧЕТ в некоторой локальной переменной СЧЕТ_Х;
• процесс Y запоминает значение переменной СЧЕТ в некоторой локальной переменной СЧЕТ_Y;
• процесс Х увеличивает значение СЧЕТ_Х на 1 и записывает его в СЧЕТ;
• процесс Y увеличивает значение СЧЕТ_Y на 1 и записывает его в СЧЕТ.
Заметим, что хотя каждый процесс увеличил значение СЧЕТ на 1, ее окончательное значение увеличилось только на 1, а не на 2. Чтобы избежать таких нежелательных явлений, увеличение разделяемой переменной СЧЕТ следует рассматривать как критический участок.
Рассмотрим несколько решений проблем синхронизации критических участков.