Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Системное ПО.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
89.38 Кб
Скачать

Тема 6. Средства синхронизации и взаимодействия процессов.

6.1. Проблемы синхронизации.

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

П

A1 – прочитать переем.

А2- поместить имя в спис.

A3 – нарастить NEXT

Принт-сервер

Печать файла из списка

роцесс А

NEXT

Файл

заказа

П

B1 – прочитать переем.

B2- поместить имя в спис.

B3 – нарастить NEXT

роцесс В

Программа печатает по очереди все файлы, имена которых в порядке поступления записывают в общедоступный файл заказов другие программы. Особая переменная NEXT, также доступная всем процессам – клиентам, содержит номер первой свободной для записи позиции файла заказов. Читается файл, записывается в файл заказа имя своего файла и наращивает значение NEXT на 1. Предположим, что в некоторый момент процесс А решил распечатать свой файл. Для этого он прочитал значение переменной NEXT, но поместить имя файла не успел, так как его выполнение было прервано. Очередной процесс B, желающий распечатать файл, прочитал значение переменной NEXT , поместил имя файла в файл заказов и тоже прервался. Когда в очередной раз будет передано управление процессу А и он продолжит свое выполнение, то он запишет имя файла в ту же позицию, что и процесс В. Таким образом, процесс B никогда не отправит свой файл на печать. Сложность проблемы синхронизации состоит в нерегулярности возникающих ситуаций. Так например, в рассмотренном случае возможны и другие варианты : будут потеряны файлы нескольких процессов, или напротив, распечатаются все. Все взаимными скоростями процессов и моментами их прерывания, поэтому отладка взаимодействующих процессов является сложной. Ситуация, когда 2 или более процессов разделяют данные, а конечный результат зависит от соотношения скоростей процессами, называются гонками.

6.2. Синхронизация с использованием блокирующих переменных.

Критическая секция – часть программы, в которой организуется доступ к разделяемым данным. Чтобы исключить эффект гонок по отношению к некоторому ресурсу, необходимо обеспечить, чтобы в каждый момент в критической секции, связанной с этим ресурсом, находилось не более одного процесса. Этот прием называют взаимным исключением. Одним из способов организации взаиного исключения является использование блокирующих переменных. С каждым разделяемым ресурсом связыв двоич переменная. Она равна 1 , если ресурс свободен, и 0, если ресурс занят. Рассмотрим фрагмент алгоритма процесса, использующего для взаиного исключения доступа к разделяемому ресурсу D переменную f(D)

F(D)=1?

Занять пространство f(D)=0

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

Работа с D

Освободить D f(D):=1

Запрос к D

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

6.3. Синхронизация с использованием событий.

Б

Запрос к D

Ресурс свободен?

Занять память D

Критическая секция программы

Освободить ресурс

Блокировка процесса с помощью WAIT(x),x – ресурс свободен

POST(x)

локирующие переменные имеют существенный недостаток. Пока один процесс находится в критической секции, другой процесс, которому требуется тот же ресурс, будет выполнять рутинные действия по опросу блокирующей переменной, растрачивая процессорное время. Для устранения таких ситуаций можно использовать аппарат событий, с помощью которого решаются не только проблемы взаимного исключения, но и более общие задачи синхронизации. В различных ОС аппарат событий реализуется по своему, но в любом случае используются системные функции аналогичного назначения, которое назовем WAIT(x) POST(x), где х – идентификатор некоторого события. Рассмотрим фрагмент алгоритма процесса, использующий эти функции

Если ресурс занят, то процесс не выполняет циклический запрос, а вызывает системную функцию WAIT(x), x – событие, заключающееся в освобождении ресурса. Функция WAIT(x) переводит активный процесс в состояние ожидания и делает отметку в его блоке управления о том, что процесс ожидает события х. Процесс, который в это время использует ресурс D, после выхода из критической секции выполняет функцию POST(x), в результате чего ОС просматривает очередь ожидающее Х процессов и переводит один из них в состояние готовности.

6.4. Синхронизация с использованием симофора.

Симофоры - обобщающее средство синхронизации процессов, для реализации которых вводятся 2 новых примитива, в общем случае обозначаемые P V. Эти примитивы оперируют над неотрицательными переменными, называемыми симофорами. Пусть S такой симофор. Операции определяются следующим образом: V(S) – переменная S увеличивается на 1 одним неделимым действием. Выборка, увеличение и запоминание не могут быть прерваны, и к S нет доступа во время выполнения этой операции; P(S)- уменьшение S на 1, если это возможно. Если S=0, то процесс, вызвавший P(S), ждет, пока уменьшение станет возможным. P(S) также является неделимой. В частном случае, когда симофор S может принимать только 0 и 1 , он превращается в блокирующую переменную. Операция P заключает в себе потенциального процесса перехода процесса в состояние ожидания, а операция V – может активировать другой процесс, приостановленный операцией P. Рассмотрим использование симофоров на примере 2 процесс, один из которых пишет данные в буферный кул, а другой считывает данные из него. Пусть состоит из n буферов. Процесс писатель должен остановиться, когда пул заполнен , и активизироваться при освобождении хотя бы одного буфера. Процесс-читатель, напротив, останавливается , когда все буферы пусты, и активизируется при наличии хотя бы 1 записи. 2 симофора –e – число пустых буфера, f – заполненных. Введем также двоичный симофор B, используемый для взаимного исключения. Предположим, что запись и считывание из пула является критическими секциями:

N=256; e=N f=0 b=1

CreateThread Writer

Writer.Run

CreateThread Reader

Reader.Run

Writer.Run

PrepareNextRecord();// Подготовка следующих записей

P(e);

P(b);//Вход в критическую секцию

AddToBuffer();//Добавить запись в буфер

V(b);

V(f);//увеличиваем кол-во записей

Reader.Run

P(f);

P(b);

GetFromBuffer();//считываем из буфера

V(b);

V(f);

ProcessRecord();//обработка записей.

6.5. Тупики.

Приведенные в пункте 6.1 пример иллюстрирует еще одну проблему синхронизации – взаимные блокировки, называемые также deadlock, clinches – клинчи, или тупиками. Рассмотрим пример тупика. Пусть 2 процессам, выполняющимся в режиме мультипрограммирования для работы требуется 2 ресурса, например, принтер и диск.

П

Занять принтер

Занять диск

Освободить принтер

Освободить диск

Занять диск

Занять принтер

Освободить диск

Освободить принтер

A1

B1 B2

A2 блокировка

роцесс А

После того, как процесс А занял принтер, он был прерван. Управление получил процесс B , который сначала занял диск, но при выполнении следующей команды был заблокирован, так как принтер уже занят процессом А. Управление снова получил процесс А, который в соответствии со своей программой принял попытку занять диск, и был заблокирован, так как диск распределен процессу B. В таком положении процессы А и В могут находиться сколь угодно долго. Все зависит от соотношения скоростей. Они могут либо совершенно независимо использовать разделяемые ресурсы (сценарий В), либо образовывать очереди к разделяемым ресурсам(сценарий Б), либо блокировать друг друга(А). В рассмотренных примерах тупик был образован 2 процессами, но взаимно блокировать могут и большее число процессов. Проблема тупиков включает в себя следующие задачи – предотвращение тупиков, распознавание тупиков, и восстановление системы после тупиков. Тупики могут быть предотвращены при создании программ, т.е. программы должны быть написаны таким образом, чтобы тупик не мог возникнуть ни при каком соотношении взаимных скоростей процессов. Так, если в предыдущем примере процесс А и процесс В запрашивают ресурс в одинаковой последовательности, то тупик невозможен. Второй подход к предотвращению тупиков называется динамическим и заключает в использовании определенных правил при назначении ресурсов процесса. Например, ресурсы могут выделяться в определенной последовательности, общей для всех процессов.

Когда тупиковая ситуация образована несколькими процессами, использующими множество ресурсов, распознавание тупика является сложной задачей. Формальные методы распознавания тупиков основываются на ведении таблиц распределения ресурсов и запросов к занятым ресурсам. Анализ этих таблиц позволяет обнаружить взаимные блокировки. При возникновении тупиковой ситуации необязательно снимать с выполнения все заблокированные процессы. Можно снять только часть из них, и при этом освободить ресурсы, ожидаемые остальными процессами. Можно вернуть некоторые процессы в область свопинга (перенести из RAM на диск), можно совершить откат некоторых процессов до контрольной точки, в которой запоминается вся информация, необходимая для восстановления программы с данного места. Контрольные точки расставляются в тех местах, после выполнения которых возможно возникновение тупика. Таким образом, использовать симофоры и блокирующие переменные нужно крайне осторожно, так как одна незначительная ошибка может привести к останову системы. Чтобы облегчить написание корректных программ используются высокоуровневые средства синхронизации, называемые монитором. Монитор – набор специальных процедур, а также переменных и структур данных, которые используются процессами. Процессы могут вызывать процедуру монитора, но они не имеют доступа к внутренним данным монитора. Монитор имеет важное свойство для достижения взаимного исключения процесса – только один процесс может быть активным по отношению к монитору. Компилятор обрабатывает вызов процедур монитора особым образом. Обычно несколько первые несколько инструкций процедур монитора проверяют, не активен ли какой либо другой процесс по отношению к этому монитору. Если да, то вызывающий процесс приостанавливается, пока другой процесс не освободит монитор. Таким образом, исключение входа нескольких процессов в монитор реализуется компилятором, а не программистом, что делает ошибки менее вероятными. В распределенных системах, состоящих из нескольких процессоров, каждый из которых имеет свою собственную RAM, симофоры и мониторы оказываются неэффективными. В таких системах синхронизация процессов может быть реализована только с помощью обмена сообщениями.

6.6. Алгоритмы планирования процессов.

Планирование процессов включает в себя решение следующих задач:

1)Определение момента времени для смены выполняемого процесса

2)Выбор процесса на выполнение из очереди готовых процессов

3)переключение контекста

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

1)процесс завершился и покинул систему;

2)произошла ошибка;

3)процесс перешел в состояние ожидания

4)исчерпан квант процессорного времени, отведенный данному процессу

Процесс, который исчерпал свой квант, переводится в состояние готовности и ожидает, когда ему будет предоставлен новый квант. На выполнение в соответствии с определенным правилом выбирается другой процесс из очереди готовых. Выделяемые кванты могут быть как одинаковыми, так и различными для процесса. Кванты, выделяемые одному процессу, могут быть фиксированными , а могут изменяться в течении времени в жизни процесса. Процессы, которые не полностью использовали квант(из за прерывания), могут получить или не получить компенсацию в виде привилегий при следующем выполнении. По-разному может быть организована очередь готовых процессов: циклические, по правилу First In First Out(FIFO), Last In First Out (LIFO).

Другая группа использует понятие приоритет процесса. Приоритет – число, характеризующее степень привилегированности процесса при использовании ресурсов вычислительной системы, в частности процессорного времени. Чем выше приоритет, тем больше привилегий и тем меньше процесс будет простаивать в очередях за ресурсом. Приоритет может директивно назначаться администратором системы, в зависимости от важности работы, либо вычисляться самой операционной системой по определенным правилам. Приоритет может оставаться фиксированным на протяжении всей жизни процесса, либо изменяться во времени по некоторому закону (в этом случае приоритет называется динамическим). Существуют 2 разновидности приоритетных алгоритмов : основанные на относительных или абсолютных приоритетах. В обоих случаях выбор процесса на выполнения из очереди готовых осуществляется одинаково: по наивысшему приоритету. Однако в системах с относительными приоритетами активный процесс выполняется до тех пор, пока он сам не покинет процессор. В системах с абсолютными приоритетами выполнение активного процесса прерывается, если в очереди готовых процессов появляется процесс с наиболее высоким приоритетом. В этом случае прерванный процесс переходит в состояние готовности.

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