Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Дубаков А.А. Операционные системы. Томск, 1999.....doc
Скачиваний:
19
Добавлен:
07.11.2018
Размер:
1.46 Mб
Скачать

Глава 4 управление асинхронными параллельными процессами

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

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

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

При управлении асинхронными параллельными процессами возникает две проблемы:

1. Проблема синхронизации параллельных процессов;

2.Проблема взаимной блокировки – тупика («смертельное объятие»-deadlock)

Пример 1. Писатели – читатели.

Пренебрежение вопросами синхронизации процессов, выполняющихся в режиме мультипрограммирования, может привести к их неправильной работе или даже к краху системы. Рассмотрим, например, программу печати сообщений (принт-сервер) (рис.4.1). Эта программа печатает по очереди все сообщения, которые последовательно в порядке поступления записывают в специальный общедоступный файл другие программы. Особая переменная N, также доступная всем процессам-клиентам, содержит номер первого свободного для записи сообщения. Процессы-клиенты читают эту переменную, записывают в соответствующую позицию сообщение и наращивают значение N на единицу.

Предположим, что в некоторый момент процесс R решил распечатать сообщение, для этого он прочитал значение переменной N (для определенности сделаем его равным 4). Процесс запомнил это значение, но поместить сообщение не успел, так как его выполнение было прервано (например, вследствие исчерпания кванта). Очередной процесс S, желающий распечатать сообщение, прочитал то же самое значение переменной N, поместил в четвертую позицию свое сообщение и нарастил значение переменной на единицу. Когда в очередной раз управление будет передано процессу R, то он, продолжая свое выполнение, в полном соответствии со значением текущей свободной позиции, полученным во время предыдущей итерации, запишет сообщение также в позицию 4, поверх сообщения процесса S.

Таким образом, процесс S никогда не увидит свое сообщение распечатанным.

Особенности взаимодействия:

  1. Процессы автономны, но должны кооперироваться во время выполнения работы (писать - читать). Проблема: очередь пустая / буфер заполнен.

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

Рис. 4.1. Кооперация программ при работе с общим ресурсом.

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

Пример 2. Распределение ресурсов между параллельными процессами

Простая тупиковая ситуация возникает для группы общих ресурсов (тупик - "смертельное объятие"). Программа 1, захватив ресурс 1, для продолжения работы нуждается в ресурсе 2, который захватила и удерживает программа 2, для завершения работы которой, в свою очередь, требуется ресурс 1, удерживаемый программой 1 (рис.4.2).

Рис.4.2. Тупиковая ситуация

Таким образом, подсистема УП асинхронными параллельными процессами должна обеспечить решение двух следующих задач:

1.Синхронизацию и кооперирование процессов.

2.Предотвращение взаимной блокировки процессов по ресурсам.

Задача синхронизации АПП в ОС решается методом взаимоисключения процессов при выполнении их на критических участках. Для взаимоисключения процессов на критических участках используется три средства:

1.Примитивы взаимоисключения.

2.Семафоры.

3.Мониторы.

Примитивы взаимоисключения используются для обработки критических участков программы и определяются совокупностью логической переменной I, представляющей общий ресурс и принимающей два значения: 0 - свободен, 1 - занят, и командой TS, TS,I,B01 (проверить и установить).

а) читает логическую переменную I;

б) проверяет ее значение;

в) устанавливает новое значение I.

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

Ниже в примере 3 перед входом в критическую секцию процесс проверяет, свободен ли ресурс. Если он занят, то проверка циклически повторяется, если свободен, то значение переменной I устанавливается в 0, и процесс входит в критическую секцию. После того, как процесс выполнит все действия с разделяемым ресурсом D, значение переменной I снова устанавливается равным 0.

Пример 3.

A. B.

Do while (TS I,B’1’) Do while (TS I,B’1’)

END END

<критический участок> <критический участок>

TS I,B0’ TS I,B0’

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

Недостатки:

  1. Циклический опрос переменной I и бессмысленное расходование времени ЦП.

  2. Не исключено бесконечное ожидание ресурса, хотя вероятность невелика.

  3. Работает с одним ресурсом.

Для устранения расходования времени ЦП может быть использован так называемый аппарат событий. С помощью этого средства могут решаться не только проблемы взаимного исключения, но и более общие задачи синхронизации процессов. В разных операционных системах аппарат событий реализуется по - своему, но в любом случае используются системные функции аналогичного назначения, которые условно назовем WAIT(x) и POST(x), где x - идентификатор некоторого события. Если ресурс занят, то процесс не выполняет циклический опрос, а вызывает системную функцию WAIT(I), здесь I обозначает событие, заключающееся в освобождении ресурса I. Функция WAIT(I) переводит активный процесс в состояние ОЖИДАНИЕ и делает отметку в его дескрипторе о том, что процесс ожидает события I. Процесс, который в это время использует ресурс I, после выхода из критической секции выполняет системную функцию POST(I), в результате чего операционная система просматривает очередь ожидающих процессов и переводит процесс, ожидающий события I, в состояние ГОТОВНОСТЬ

Семафор развивает механизм примитивов и обобщает его. Автор –

Е. Дейкстра. Семафор - это целочисленная неотрицательная переменная S – счетчик ресурса, которую можно менять и опрашивать при помощи операций P и V, и очередь процессов к ресурсу Q(S). Над переменной определено три операции:

  • инициализация ресурса I(S) - задает число доступных ресурсов;

  • P(S) - захват ресурса;

  • V(S) - освобождение ресурса.

Операция P(S) выполняется следующим образом:

IF S>0 есть ресурс?

THEN S:=S-1 выдать ресурс

ELSE Q(S) ожидать очереди);

Операция V(S):