.
Начертательная геометрия Геометрическое черчение Инженерная графика Интегралы Математический анализ Матрицы Производные Векторная алгебра

 

5.2. Синхронизация процессов

 

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

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

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

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


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

Пример. Пусть программе А нужен ресурс R1. Она запрашивает его и получает. Программе В нужен ресурс R2. Она запрашивает его и получает (рис. 5.6). Далее, пусть программа А, не отпуская R1, запрашивает R2, а программа В, не отпуская R2, запрашивает R1. Налицо типичный клинч, если только один из ресурсов R1 или R2 не может быть освобожден до момента завершения обработки соответствующего процесса.

 

Рис. 5.6. Пример тупиковой ситуации

 

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

Простейший прием – стандартные операции типа WAIT (ЖДАТЬ) и SIGNAL (ОПОВЕСТИТЬ). Операция WAIT позволяет: временно заблокировать процесс, а SIGNAL информирует систему о необходимости разблокирования процесса, задержанного из-за невыполнения условия. Следует отметить такие приемы, как БЛОКИРОВКА ПАМЯТИ (для реализации взаимного исключения одному процессу разрешается выполнить операцию над памятью, а другому ждать, пока первый не завершит работу); ПРОВЕРКА и УСТАНОВКА (аппаратная операция, к которой обращаются с двумя параметрами: ЛОКАЛЬНЫЙ И ОБЩИЙ). Эти приемы хотя и решают задачу взаимного исключения, однако неэффективно используют процессорное время из-за необходимости пребывания в активном состоянии процесса, ожидающего разрешения продолжить работу. Наиболее эффективным и простым средством синхронизации процессов, исключающим состояние "активного" ожидания, является семафор.

5.2.1. Операции P и V над семафорами

 

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

Семафоры – это часть абстракции, поддерживающая очередь постоянно ожидающих процессов.

Операции P и V над семафором S могут быть определены следующим образом.

P(S):

1. Уменьшить значение S на 1, т. е. S : = S – 1.

2. Если S < 0, выполнить ОЖИДАНИЕ (S).

V(S):

1. Увеличить значение S на 1, т. е. S : = S + 1.

2. Если S ³ 0, выполнить ОПОВЕЩЕНИЕ (S).

Операция ОЖИДАНИЕ (S) (WAIT) блокирует обслуживание процесса, делает соответствующую отметку об этом и связывает процесс со значением переменной S.

Операция ОПОВЕЩЕНИЕ (S) (SIGNAL) просматривает связанный с переменной S список блокированных процессов. Если в списке есть процессы, ожидающие освобождения некоторого ресурса, управляемого (сигнализируемого) S, один из них переводится в состояние готовности, а в соответствующей ему записи делается отметка. С этого момента процесс становится опять доступным планировщику.

По определению, ожидание, связанное с операцией P(S), не является ожиданием "зависания", так как ожидающие процессы не используют центральный процессор. Так как несколько процессов могут ожидать операцию P(S) над отдельным семафором, во время приращения должен быть осуществлен выбор, какую контрольную точку процесса сделать доступной. Алгоритм выбора не определен, за исключением требования равнодоступности процессов, т. е. никакой процесс не может быть "забыт".

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

Наиболее употребительные операции над семафорами:

·    создать семафор;

·    запросить состояние семафора;

·    изменить состояние семафора;

·    уничтожить семафор.

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

Наиболее показательно аппарат семафоров можно применить на следующей задаче.

Три курильщика сидят за столом. У одного есть табак, у другого – бумага, у третьего – спички. На столе могут появиться извне два из трех упомянутых предмета. Появившиеся предметы забирает тот курильщик, у которого будет полный набор предметов. Он сворачивает папиросу, раскуривает ее и курит. Новые два предмета могут появиться на столе только после того, как он кончит курить. Другие курильщики в это время не могут начать курение.

Задание. Описать с помощью P и V – операций над семафорами – систему процессов, которая моделирует взаимодействия этих курильщиков.

Указание. Выделить шесть процессов, три из которых соответствуют трем курильщикам X, Y, Z, а три других имеют следующее назначение: А – поставляет спички и бумагу, В – табак и спички, С – бумагу и табак.

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

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

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

 

5.2.2. Графическое представление процессов

 

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

Пример 1. Изобразим графически действия автомата, продающего билеты (рис. 5.7, а), и действия автомата, продающего билеты и расписание (рис. 5.7, б).


Рис. 5.7. Графическое изображение действий автомата:

а – автомат, продающий билеты; б – автомат, продающий билеты и расписание

 

На рис. 5.7 введены следующие сокращения: мон – опустить монету; бил – получить билет; расп – получить расписание.

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

Пример 2. Представим автомат, изображенный на рис.5.7, б в более компактной графической форме (рис. 5.8, а).

Доказать графически, что рис. 5.8, а и рис.5.8, б иллюстрируют в точности один и тот же процесс.

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

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

 

 

 

 

 

 

 

 

 


 

Рис. 5.8, а Рис. 5.8, б

 

 

 

Обычно протокол обозначают последовательностью символов, заключенных в угловые скобки: < > – пустая последовательность, не содержащая событий;

 

< x > – последовательность, содержащая единственное событие x;

< x,y > – последовательность, состоящая из двух событий: x и следующего за ним y.

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

< мон; бил; мон; бил >.

Протокол того же автомата перед тем, как второй покупатель вынул билет, будет

  < мон; бил; мон >.

Понятие протокола сегодня широко используется и в компьютерных сетях. Например, в сети Internet, состоящей из множества сетей различной природы: от ЛВС типа Token Ring до глобальных сетей типа NSFNET, базовым протоколом является TCP/IP (Transmission Control Protocol / Internet Protocol). TCP отвечает за доставку сообщений по указанному адресу, а IP поддерживает адресацию сетевых узлов.

Вообще говоря, TCP/IP – это семейство протоколов и прикладных
программ.

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

 

5.3.3. Почтовые ящики

 

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

Если процесс p1 желает послать процессу p2 некоторое сообщение, он записывает его в одно из гнезд почтового ящика, откуда p2 в требуемый момент времени может его извлечь. Иногда оказывается необходимым процессу p1 получить подтверждение, что p2 принял переданное сообщение. Тогда образуются почтовые ящики с двусторонней связью. Известны и другие модификации почтовых ящиков, в частности порты, многовходовые почтовые ящики и т. д. Для установления связей между процессами широко используются почтовые ящики. Примером такого применения может служить операционная система IPMX86 ВС фирмы Intel для вычислительных комплексов на основе микропроцессоров IAPX86 или IAPX88. Для целей синхронизации разрабатываются специальные примитивы создания и уничтожения почтовых ящиков, отправки и запроса сообщений.

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

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

 

5.3.4. Монитор Хоара

 

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

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

Монитор не является процессом, это пассивный объект, который приходит в активное состояние только тогда, когда какой-то объект обращается к нему за услугами. Часто монитор сравнивают с запертой комнатой, от которой имеется только один ключ. Услугами этой комнаты может воспользоваться только тот, у кого есть ключ. При этом процессу запрещается оставаться там сколь угодно долго. Другой процесс должен ждать до тех пор, пока первый не выйдет из нее и передаст ключ.

В качестве примера программы-монитора может выступать планировщик ресурсов. Действительно, каждому процессу когда-нибудь понадобятся ресурсы и он будет обращаться к планировщику. Но планировщик одновременно может обслуживать только один ресурс.

Иногда монитор задерживает обратившийся к нему процесс. Это происходит, например, в случае обращения за занятым ресурсом. Монитор блокирует процесс с помощью команды "ЖДАТЬ", а в случае освобождения ресурса выдает команду "СИГНАЛ". При этом освободившийся ресурс предоставляется одному из ожидавших его процессов вместе с разрешением на продолжение работы. Управление передается команде монитора, непосредственно следующей за операцией "ЖДАТЬ".

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

 

5.3.5. Проблема тупиков

 

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

Подобную ситуацию можно хорошо продемонстрировать на примере работы двух процессов p1 и p2 с одним читающим R1 и одним печатающим R2 устройствами.

Тупиковая ситуация возникает при мультипроцессировании, когда процессы p1, p2, ... , pn, заблокированные по одному и тому же ресурсу Zm, не могут быть разблокированы, так как их запросы на этот ресурс никогда не могут быть удовлетворены. Подобные конфликтные ситуации разрешаются либо ликвидацией процессов, зашедших в тупик, либо освобождением ресурса принудительным образом.

Комплекс программ, объединенных под общим названием ОБРА-БОТКА ТУПИКОВ (ОТП), как правило, выполняет следующие функции:

·    анализирует возможности избежания тупиков и предотвращает их, если возможно;

·    определяет множество процессов, находящихся в состоянии тупика;

·    определяет способы и принимает меры для выхода из тупика.

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

5.3.6. Тупик в случае повторно используемых ресурсов

 

Повторно используемые ресурсы SR (Second hand resource) – это конечное множество одинаковых ресурсов, обладающихследующими свойствами:

·        количество единиц ресурсов постоянно;

·        каждая единица ресурса или распределена, или доступна только одному процессу;

·        процесс может освободить единицу ресурса (или сделать его доступным) при условии, если он ранее получал эту единицу.

Примеры SR-ресурсов: ОП, ВнП, периферийные устройства и, возможно, процессоры, а также такое ПО, как файлы данных, таблицы и "разрешение войти в критическую секцию".

Графы SR. В случае SR-ресурсов граф типа "процесс-ресурс", отображающий состояние OS, называют графом повторно используемых ресурсов. Направленный граф – это пара < N, E >, где N – множество вершин, а E – множество упорядоченных пар (a, b), называемых ребрами, a, bÎN. В случае SR интерпретация графа следующая.

1. Множество N разделено на два непересекающихся класса:= {p1p2, ..., pn} – множество вершин для отображения процессов иr = {R1, R2, ..., Rm} – множество вершин для представления ресурсов.

2. Граф является двудольным по отношению к P и r. Каждое ребро e Ì E соединяет вершину из P с вершиной из r. Если e = (pi, Rj), то e – ребро запроса от процесса pi на единицу ресурса Rj. Если же e = (Rjpi), то e – ребро назначения единицы ресурса Rj процессу pi.

3. Для каждого RiÎr целое неотрицательное число ti, обозначает количество единиц ресурса Ri.

Пусть | (a, b) | – число ребер, направленных от вершины a к вершине b. Тогда система должна работать всегда при следующих ограничениях:

·    может быть сделано не более чем ti назначений для Ri, т. е.   для всех i;

·    | (Ripj) | + | (pj, Ri) £ ti, для " i, j,

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

Состояние системы изменяется только в результате запросов, освобождений или приобретений ресурсов одним процессом.

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

Чтобы распознать состояние тупика, для каждого процесса необходимо определить, сможет ли он когда-либо снова развиваться. Наиболее благоприятные действия для незаблокированного процесса pi могут представляться сокращением (редукцией) графа SR.

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


Граф SR несокращаем, если он не может быть сокращен ни одним процессом. Граф SR полностью сокращаем, если существует последовательность сокращений, которые устраняют все ребра графа. Пример сокращения показан на рис. 5.9.

Рис. 5.9. Последовательность сокращений графа

 

Теорема. Состояние S есть состояние тупика тогда и только тогда, когда SR-граф в состоянии S не является полностью сокращаемым.

Следствие 1. Если S есть состояние тупика по SR-ресурсам, то по крайней мере два процесса находятся в тупике в S.

Следствие 2. Процесс pi не находится в тупике тогда и только тогда, когда серия сокращений приводит к состоянию, в котором pi не заблокирован.

На главную