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

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

· Повышение эффективности работы ВС. Пока один процесс ждет наступления некоторого события, другие могут выполнять свои задачи на процессоре.

· Совместное использование данных. Для обеспечения целостности данных процессы должны согласовывать порядок действия с данными.

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

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

Взаимодействие процессов обычно приводит к изменению их поведения в зависимости от полученной информации.

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

1. Сигнальные − передается минимальное количество информации. 1 бит – «да», «нет». Используется для извещения процесса о наступлении событий.

2. Канальные – общение процессов происходит по каналам связи, которые формирует ОС. Чтобы осуществить передачу информации от А к В, процесс А должен открыть псевдофайл «канал», записать туда информацию, закрыть «канал». Процесс В должен открыть «канал», считать информацию и закрыть «канал».

3. Разделяемая память − выделение разделяемого адресного пространства (разделяемой памяти) для связи между процессами осуществляется под контролем ОС. Это наиболее быстрый способ взаимодействия процессов в пределах ОС.

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

Пренебрежение вопросами синхронизации процессов может привести к неправильному решению задачи.

Ситуация, когда два и более процесса обрабатывают разделяемые данные и конечный результат зависит от соотношения скоростей процессов, называются гонками, или состязаниями (racecondition). С понятием гонок связывают определение критической секции.

Критическая секция − это часть программы (процесса, потока), исполнение которой может привести к возникновению гонок.

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

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

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

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

Эти переменные, используемые для синхронизации вычислительных процессов, получили название семафоров Дейкстры.

Для работы с семафорами вводятся два примитива (обычно обозначаются как P и V).

Если переменная S представляет собой семафор, то действия примитивов P(S) и V(S) определяют следующим образом.

· V(S): Переменная S увеличивается на 1. Причем операция увеличения S является атомарной операцией, т. е. выборка, наращивание, запись не могут быть прерваны. Кроме того, к переменной S нет доступа из других потоков во время выполнения V(S).

· P(S): Переменная S уменьшается на 1. Если S = 0, то такое уменьшение невозможно. В этом случае поток, вызвавший операцию Р(S), ждет, пока операция Р(S) станет возможной. Успешная проверка и уменьшение S также является атомарной операцией.

Семафоры Дейкстры решают задачу синхронизации потоков более гибко, допуская к разделяемому ресурсу заданное количество потоков.

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

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

В зависимости от источника прерываний их делят на:

· Внешние.

· Внутренние.

· Программные.

Внешние прерывания (аппаратные) – возникают в результате действий пользователя (клавиатура, мышь) или в результате поступления сигналов от аппаратных устройств ВС (принтер, HDD, датчики ТУ). Этот класс прерываний является асинхронным к потоку команд прерываемой программы. Процессор работает таким образом, чтобы асинхронные прерывания обрабатывались процессором между выполнением двух соседних команд потока.

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

Программные прерывания – планируются программистами и возникают при выполнении определенной команды процессора, имитирующей прерывание. В Pentium такой командой является INT, в Motorola – trap.

Всем прерываниям присваивается (назначается) приоритет, по которому они ранжируются по степени важности и срочности.

ОС имеет специальные модули для работы с прерываниями − обработчики прерываний(InterruptServiceRoutine – ISR).

Существуют два основных способа предоставления процессору данных об устройствах, вызвавших прерывание:

· векторный;

· опрашиваемый.

В обоих случаях процессору предоставляется информация об уровне приоритета прерывания.

При векторном прерывании на шине данных выставляется комбинация сигналов, отображающая начальный адрес программы обработки прерывания. Вектор прерывания – обычно целое число в диапазоне 0-255.

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

При реализации системы приоритетов прерываний используются два класса приоритетов – абсолютные и относительные.

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

При относительных приоритетах обслуживание прерывания не может быть прервано, хотя в очереди и появилось прерывание с более высоким уровнем приоритета.

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

Вопросы для самопроверки по теме 3.4

1. Назовите основные причины для взаимодействия процессов.

2. Какова основная функция блокирующей переменной?

3. Каким образом исключаются гонки при обработке разделяемых данных несколькими потоками?

4. Какие основные способы представления информации об источниках прерывания используются в ОС?

5. В чем отличие внешних прерываний от внутренних?

Наши рекомендации