Операционные системы. Курс лекций

       

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


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

Блокирующие переменные могут использоваться не только при доступе к разделяемым данным, но и при доступе к разделяемым ресурсам любого вида. Потоки могут прерывать ОС в любое время и в любом месте, в том числе в критической секции, но нельзя прервать поток между операциями проверки и установки блокирующей переменной, так как будет нарушен принцип взаимного исключения, что может привести к печальным последствиям. Во избежание таких ситуаций необходимо использовать специальные команды или соответствующий действия должны реализоваться специальными системными приложениями, которые запрещали бы прерывания на протяжении всей операции «проверка и установка».

Реализация взаимного исключения с помощью блокирующих переменных имеет существенный недостаток, так как поток, которому требуется занятый ресурс будет непрерывно опрашивать блокирующую переменную, используя при этом процессорное время. Для устранения этого недостатка в многих ОС предусматриваются специальные системные вызовы для работы с критическими секциями. В ОС Windows NT перед тем, как начать изменение критических данных, поток выполняет специальный вызов EnterCriticalSection.

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

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



Содержание раздела