Операционные системы. Теория и практика. Замятин А.В. - 68 стр.

UptoLike

Составители: 

68
могло и не быть. Это подтверждает нерегулярность рассинхронизации
процессов и наличие сложностей в обеспечении их синхронизации.
Ситуации подобные этой, когда два или более процессов обрабаты-
вают разделяемые данные, и конечный результат зависит от соотноше-
ния скоростей процессов, называются гонками.
Важным понятием, используемым при синхронизации потоков, яв-
ляется понятие «критической секции» программы. Критическая секция
это часть программы, результат выполнения которой может непред-
сказуемо меняться, если переменные, относящиеся к этой части про-
граммы, изменяются другими потоками в то время, когда выполнение
этой части еще не завершено. Критическая секция всегда определяется
по отношению к определенным критическим данным, при несогласо-
ванном изменении которых могут возникнуть нежелательные эффекты.
В примере, представленном на рис. 17, такой критической секцией явля-
ется файл «заказов», являющийся разделяемым ресурсом для процессов
R и S.
3.3.4 Механизмы синхронизации
Как было отмечено выше в п. 3.3.2, ОС поддерживает целый ряд
различных средств синхронизации процессов, позволяющих избежать
проблем, подобной той, что описана выше и представлена на рис. 17.
Рассмотрим каждое из этих средств синхронизации процессов более по-
дробно.
Блокирующие переменные. Для синхронизации потоков одного
процесса прикладной программист может использовать глобальные бло-
кирующие переменные. С этими переменными, к которым все потоки
процесса имеют прямой доступ, программист работает, не обращаясь к
системным вызовам ОС. Каждому набору критических данных ставится
в соответствие двоичная переменная, которой поток присваивает значе-
ние 0, когда он входит в критическую секцию, и значение 1, когда он ее
покидает.
На рис. 18 показан фрагмент алгоритма потока, использующего для
реализации взаимного исключения доступа к критическим данным D
блокирующую переменную F(D). Перед входом в критическую секцию
поток проверяет, не работает ли уже какой-нибудь другой поток с дан-
ными D. Если переменная F(D) установлена в 0, то данные заняты и
проверка циклически повторяется. Если же данные свободны (F(D) = 1),
то значение переменной F(D) устанавливается в 0 и поток входит в кри-
тическую секцию. После того, как поток выполнит все действия с дан-
ными D, значение переменной F(D) снова устанавливается равным 1.