13 Критические
секции (CS). Алгоритмы взаимоисключения процессов (аппаратное решение).
Важным
понятием синхронизации процессов является понятие "критическая
секция" программы (CS). Критическая секция - это часть
программы, в которой осуществляется доступ к разделяемым данным. Чтобы
исключить эффект гонок по отношению к некоторому ресурсу, необходимо
обеспечить, чтобы в каждый момент в критической секции, связанной с этим
ресурсом, находился максимум один процесс. Этот прием называют взаимным
исключением. Простейший способ обеспечить взаимное исключение - позволить
процессу, находящемуся в критической секции, запрещать все прерывания. Однако
этот способ непригоден, так как опасно доверять управление системой
пользовательскому процессу; он может надолго занять процессор, а при крахе
процесса в критической области крах потерпит вся система, потому что прерывания
никогда не будут разрешены.
Реализация критических
секций с использованием блокирующих переменных:
Другим способом является использование
блокирующих переменных. С каждым разделяемым ресурсом связывается двоичная
переменная, которая принимает значение 1, если ресурс свободен (то есть ни один
процесс не находится в данный момент в критической секции, связанной с данным
процессом), и значение 0, если ресурс занят. На рисунке показан фрагмент
алгоритма процесса, использующего для реализации взаимного исключения доступа к
разделяемому ресурсу D блокирующую переменную F(D). Перед входом в критическую
секцию процесс проверяет, свободен ли ресурс D. Если он занят, то проверка
циклически повторяется, если свободен, то значение переменной F(D)
устанавливается в 0, и процесс входит в критическую секцию. После того, как
процесс выполнит все действия с разделяемым ресурсом D, значение переменной
F(D) снова устанавливается равным 1.
Если все процессы написаны с
использованием вышеописанных соглашений, то взаимное исключение гарантируется.
Следует заметить, что операция проверки и установки блокирующей переменной
должна быть неделимой.
Реализация
критических секций с использованием блокирующих переменных имеет существенный
недостаток: в течение времени, когда один процесс находится в критической
секции, другой процесс, которому требуется тот же ресурс, будет выполнять
рутинные действия по опросу блокирующей переменной, бесполезно тратя
процессорное время.
На рисунке приведена временная
диаграмма исполнения команды "Проверить и установить".