Составители:
Рис. 2.5. a) фрагменты программ А и В, разделяющих принтер и диск;
б) взаимная блокировка (клинч); в) очередь к разделяемому диску;
г) независимое использование ресурсов.
2.4.1 Критическая секция
Критическая секция — это часть программы, результат выполнения
которой может непредсказуемо меняться, если переменные, относящиеся к
этой части программы, изменяются другими потоками в то время, когда
выполнение этой части еще не завершено.
Критическая секция всегда определяется по отношению к
определенным критическим данным, при несогласованном изменении
которых могут возникнуть нежелательные эффекты. В предыдущем примере
такими критическими данными являлись записи файла базы данных. Во всех
потоках, работающих с критическими данными, должна быть определена
критическая секция.
Чтобы исключить эффект гонок по отношению к критическим
данным, необходимо обеспечить, чтобы в каждый момент времени в
критической секции, связанной с этими данными, находился только один
поток. При этом неважно, находится этот поток в активном или в
приостановленном состоянии. Этот прием называют взаимным исключением.
Операционная система использует разные способы реализации взаимного
исключения. Некоторые способы пригодны для взаимного исключения при
вхождении в критическую секцию только потоков одного процесса, в то
время как другие могут обеспечить взаимное исключение и для потоков
разных процессов.
2.4.2 Блокирующие переменные
Для синхронизации потоков одного процесса прикладной программист
может использовать глобальные блокирующие переменные. С этими
переменными, к которым все потоки процесса имеют прямой доступ,
программист работает, не обращаясь к системным вызовам ОС.
Каждому набору критических данных ставится в соответствие
двоичная переменная, которой поток присваивает значение 0, когда он
входит в критическую секцию, и значение 1, когда он ее покидает.
На рис. 2.6 показан фрагмент алгоритма потока, использующего для
реализации взаимного исключения доступа к критическим данным D
блокирующую переменную F(D). Перед входом в критическую секцию поток
проверяет, не работает ли уже какой-нибудь поток с данными D. Если
переменная F(D) установлена в 0, то данные заняты и проверка циклически
повторяется. Если же данные свободны (F(D) = 1), то значение переменной
F(D) устанавливается в 0 и поток входит в критическую секцию. После того
42
Рис. 2.5. a) фрагменты программ А и В, разделяющих принтер и диск;
б) взаимная блокировка (клинч); в) очередь к разделяемому диску;
г) независимое использование ресурсов.
2.4.1 Критическая секция
Критическая секция — это часть программы, результат выполнения
которой может непредсказуемо меняться, если переменные, относящиеся к
этой части программы, изменяются другими потоками в то время, когда
выполнение этой части еще не завершено.
Критическая секция всегда определяется по отношению к
определенным критическим данным, при несогласованном изменении
которых могут возникнуть нежелательные эффекты. В предыдущем примере
такими критическими данными являлись записи файла базы данных. Во всех
потоках, работающих с критическими данными, должна быть определена
критическая секция.
Чтобы исключить эффект гонок по отношению к критическим
данным, необходимо обеспечить, чтобы в каждый момент времени в
критической секции, связанной с этими данными, находился только один
поток. При этом неважно, находится этот поток в активном или в
приостановленном состоянии. Этот прием называют взаимным исключением.
Операционная система использует разные способы реализации взаимного
исключения. Некоторые способы пригодны для взаимного исключения при
вхождении в критическую секцию только потоков одного процесса, в то
время как другие могут обеспечить взаимное исключение и для потоков
разных процессов.
2.4.2 Блокирующие переменные
Для синхронизации потоков одного процесса прикладной программист
может использовать глобальные блокирующие переменные. С этими
переменными, к которым все потоки процесса имеют прямой доступ,
программист работает, не обращаясь к системным вызовам ОС.
Каждому набору критических данных ставится в соответствие
двоичная переменная, которой поток присваивает значение 0, когда он
входит в критическую секцию, и значение 1, когда он ее покидает.
На рис. 2.6 показан фрагмент алгоритма потока, использующего для
реализации взаимного исключения доступа к критическим данным D
блокирующую переменную F(D). Перед входом в критическую секцию поток
проверяет, не работает ли уже какой-нибудь поток с данными D. Если
переменная F(D) установлена в 0, то данные заняты и проверка циклически
повторяется. Если же данные свободны (F(D) = 1), то значение переменной
F(D) устанавливается в 0 и поток входит в критическую секцию. После того
42
Страницы
- « первая
- ‹ предыдущая
- …
- 40
- 41
- 42
- 43
- 44
- …
- следующая ›
- последняя »
