Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы СисПО.doc
Скачиваний:
14
Добавлен:
27.09.2019
Размер:
2.93 Mб
Скачать
  1. Синхронизация процессов и потоков: критическая секция, блокирующие

Критические секции

Критическая секция – часть программы, результат выполнения которой может непредсказуемо меняться, если переменные, относящиеся к этой части программы изменяются другими потоками, в то время, когда выполнение этой части ещё не завершено.

Критическая секция всегда определяется по отношению к определённым критическим данным, при несогласованном изменении которых могут возникнуть нежелательные эффекты

Во всех потоках, работающих с критическими данными ОС должна определить

Чтобы исключить эффект гонок (эффект нежелательного результата) по отношению к критическим данным необходимо обеспечить, чтобы в каждый момент времени в критической секции, связанной с этими данными, находился только один поток – такой приём называется взаимным исключением

Возможные условия для обеспечения взаимного исключения поясняется рис. 3

PR2

Рис. 3. К пояснению проблемы организации

взаимного исключения

В этом случае, для попеременного входа в свои критические секции для процесса 1 и процесса 2 необходимо потребовать одинаковой длины процесса 1 и процесса 2 и одинаковой скорости их выполнения, что на практике практически невозможно, поэтому проблема взаимного исключения является далеко не простой, и разными ОС решаются по-разному

Самый простой и самый неэффективный способ обеспечить взаимное исключение состоит в том, что ОС позволяют потоку запрещать любые прерывания на время его прохождения в критической секции

Блокирующие переменные

Для синхронизации потоков одного процесса прикладной программист может использовать глобальные блокирующие переменные

Каждому набору критических данных ставится в соответствие двоичная переменная, которой поток присваивает значение 0, когда он входит в критическую секцию, и значение 1, когда он её покидает

На рис. 4 поясняется алгоритм использование блокирующих переменных при работе с критическими секциями

Рис. 4. Реализация критических секций с использованием

блокирующих переменных

Использование блокирующих переменных гарантирует выполнение условий взаимного исключения, однако недостатком является то, что при нахождении из одного потоков в критической секции, все остальные потоки будут нерационально использовать своё процессорное время на опрос блокирующую переменную.

Кроме этого, существует ограничение на прерывание, т.е. нельзя прерывать поток между выполнением операции проверки и установки блокирующей переменной. Во избежание таких ситуаций в системе команд многих компьютеров предусмотрено неделимая команда анализа и присвоения значения логической переменной.

Однако, в ОС реализуются специальные системные примитивы, на случай отсутствия в процессоре таких команд

На рис. 5 показана реализация взаимного исключения с использованием системных функций входа и выхода из критической секции для ОС семейства Window NT

Рис. 5. Реализация взаимного исключения с использованием системных

функций входа в критическую секцию и выхода из нее

в ОС Windows NT

Таким образом, при использовании системных примитивов исключается непроизводительная потеря процессорного времени на циклическую проверку, освобождения занятого ресурса

Если критические секции небольших размеров, то более предпочтительными являются использование блокирующих переменных, а не системных примитивов из-за накладных расходов, связанных с системными вызовами