Опубликован: 22.12.2006 | Доступ: свободный | Студентов: 1216 / 120 | Оценка: 4.73 / 4.45 | Длительность: 18:17:00
ISBN: 978-5-94774-546-7
Специальности: Программист
Лекция 11:

Синхронизация параллельных процессов

< Лекция 10 || Лекция 11: 123 || Лекция 12 >
Аннотация: Рассматриваются средства и задачи синхронизации параллельных процессов при использовании общих ресурсов во избежание коллизий и тупиковых ситуаций.
Ключевые слова: 1. Матрица следования, первый, параллельный процесс, работ, распараллеливание, сортировка, граф, 2. Механизм семафоров., двоичные семафоры, "открыт" и "закрыт", семафоры-счетчики, анализ, многопроцессорные вычислительные системы, комбинированный, счетчик, значение, "закрыт по считыванию", массив, "закрыть", "закрывается по записи", "открыть", "открывается по записи", ОБЪЯВИТЬ (С), список, тип переменной, ЗАКРЫТЬ (С), прерывание, очередь, процессор, инструкция, ЖДАТЬ (С), ЖУЖ (С), ЖДАТЬ (С,Т), время ожидания, ОТКРЫТЬ (С), ЗАКРЫТЬ, ЖДАТЬ, множества, ПРОПУСТИТЬ (С), ОТКРЫТЬ, Пример, ВС, управляющий процесс, супервизор, УПР0, УПР1, диаграмма, операции, значение семафора, постановка задачи, усложним пример, механизм семафоров, Децентрализованное диспетчирование, вершина, 3. Передача сообщений, "почтовый ящик", почтовый ящик, информация, опрос, (data flow), 4. Механизм закрытия адресов, "закрыть адрес (по считыванию)", адрес, SPMD, 5. Механизм активного ожидания., конфликт, 6. Монитор., монитор, программный компонент, локальные переменные монитора, процедуры монитора, разделяемая переменная, ресурс, переменная, CONDITION, WAIT, SIGNAL, ресурсы операции, процессы, ресурсы, разделяемые, критические ресурсы, критические интервалы (блоки, секции), взаимосвязанные, информационно-взаимосвязанные, взаимосвязанные по управлению, порядок выполнения процессов, синхронизация, правила синхронизации, механизмы (средства) синхронизации, Задача синхронизации, тупики (тупиковые ситуации). Тупик, общий тупик, локальный тупик, критический интервал, Выше был приведен пример, "Закрыть адрес по считыванию" a, "Считать по адресу" а, Здесь возможен локальный тупик — бесконечное выполнение команды (2), если другой процесс (на другом процессоре) или ОС не "откроет" адрес а, типичные задачи синхронизации, 1. Задача взаимного исключения, Решение с помощью механизма семафоров, механизм активного ожидания, 2. Задача "поставщики — потребители", кольцевой, бесконечный буфер, 3. Задача "читатели — писатели"., "ЧИТАТЕЛИ", "ПИСАТЕЛИ", "читателей", первая задача ЧП, "писателей". "Писатель", "писателя", вторая задача ЧП, комбинированного семафора, ОТКРЫТЬ ПО СЧИТЫВАНИЮ, ОТКРЫТЬ ПО ЗАПИСИ, ЗАКРЫТЬ ПО ЗАПИСИ, ЖДАТЬ ПО ЗАПИСИ, 4. Задача "обедающие философы", 5.Задача обновления данных, ЖДАТЬ, ЖУЖ

Средства синхронизации параллельных процессов

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

Например, пусть методом "разделяй и властвуй" производится распараллеливание сортировки слиянием. Известны оценки сложности такой сортировки (как функции параметра n — длины последовательности).

При разбиении последовательности на две можно построить граф G и его матрицу следования S (рис. 11.1).

Составление взвешенного информационного графа и матрицы следования

Рис. 11.1. Составление взвешенного информационного графа и матрицы следования

Здесь t — время совместного анализа двух элементов последовательности. Значит, веса вершин t1, t2, t3 определены при заданных n и t.

2. Механизм семафоров.Различают двоичные семафоры, имеющие значения "открыт" и "закрыт", и семафоры-счетчики. "Закрытие" увеличивает их на единицу, "открытие" — уменьшает на единицу.

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

\begin{center}
С:
\begin{tabular}{|c|c|}
\hline
Двоичный семафор Са &  Семафор-счетчик Сб\\
\hline
\end{tabular}
\end{center}

В начале считывания из массива выполняется операция Сб := Сб+ 1 ; при окончании считывания — операция Сб := Сб - 1. Значение Сб \ne  0 означает: семафор C "закрыт по считыванию".

При записи в массив выполняется операция: Са := 1, "закрыть", т.е. семафор C "закрывается по записи". При окончании записи выполняется операция Cа := 0"открыть", т.е. семафор C "открывается по записи".

Однако удобства семафора-счетчика могут быть реализованы в процедурах над двоичными семафорами. Т.е. двоичный семафор в действительности более универсален.

Перечислим основные процедуры над семафорами, реализуемые в МВК "Эльбрус".

Процедура ОБЪЯВИТЬ (С) объявляет список семафоров, который рассматривается как описание, действующее внутри данного блока в алгоритмическом языке. Этим обеспечивается выделение памяти и тип переменной при трансляции.

Процедура ЗАКРЫТЬ (С) сначала присваивает семафорам, перечисленным в списке C, значение "закрыт". Затем для каждого семафора она проверяет, был ли он закрыт ранее. Если в списке C семафоров указан один или несколько семафоров, которые были закрыты до выполнения данной процедуры, происходит прерывание процесса (задачи). Процедура ОС, запустившаяся по прерыванию, ставит данный процесс в очередь к тем семафорам, которые были закрыты ранее. Таким образом, процесс задерживается до тех пор, пока другие процессы не откроют эти семафоры. После прерывания процесса и обработки прерывания процессор обращается к очереди для выборки следующего задания — "готового" процесса. Если до выполнения данной процедуры все семафоры из списка С были открыты, выполняется следующая инструкция программы.

Процедура ЖДАТЬ (С) в случае, если в C указаны семафоры со значением "закрыт", организует прерывание процесса. Процесс, ставший пассивным, дополняет очереди к закрытым семафорам из списка C. Концом выполнения процедуры является переход к анализу очереди "к процессору" для последующей загрузки процессора.

Процедура ЖУЖ (С) не переводит процесс в очереди к семафорам, а организует ожидание процессором, на котором выполняется процесс, момента открытия всех семафоров в режиме "жужжания" — непрерывного опроса семафоров, указанных в списке C.

Процедура ЖДАТЬ (С,Т) ограничивает время ожидания семафоров, указанных в списке C, значением T.

Процедура ОТКРЫТЬ (С) присваивает семафорам, указанным в списке C, значение "открыт". Процессы снимаются с очереди к указанным в C семафорам и, если они не стоят в очереди к другим семафорам, переводятся в очередь "к процессору" в соответствии с их приоритетом. Выполнение этих процессов на процессорах будет продолжено с повторного выполнения тех процедур ЗАКРЫТЬ (C') или ЖДАТЬ (C''), на которых ранее произошло прерывание данной задачи. Таким образом, если прерывание произошло при выполнении процедуры ЗАКРЫТЬ (C'), то всем семафорам, указанным в списке C', вновь присваивается значение "закрыт". При этом, если среди множества семафоров C' C \ne  \varnothing окажутся такие, которые ранее были закрыты, или другой процесс (на другом процессоре) успел закрыть семафор из C' раньше, то выполнение данного процесса вновь прервется и он станет в очередь к закрытым семафорам.

Процедура ПРОПУСТИТЬ (С) полностью соответствует упрощенной версии процедуры ОТКРЫТЬ (C). Семафорам, перечисленным в списке C, присваивается значение "открыт", и процессы из очередей к данным семафорам переводятся в очередь "к процессору". Если процессы находились в очереди к семафорам из С после прерывания в результате выполнения процедур ЗАКРЫТЬ или ЖДАТЬ, то повторного выполнения этих процедур не происходит; процессы выполняются со следующей инструкции.

Пример.

Пусть в однопроцессорной ВС в режиме реального времени решаются две задачи A и B с разной частотой решения. Задачи оформлены и запускаются как отдельные процедуры. Задача A решается в цикле длительности T0, задача B — в цикле длительности T1 = 4T0, но не ранее, чем в цикле длительности T1 будет решена один раз задача A. Можно предположить использование сигналов прерывания в моменты времени, кратные T0. Однако для организации временного режима решения задач мы воспользуемся возможностями операций над семафорами.

Будем полагать, что в моменты времени, кратные T0, но не кратные T1, запускается управляющий процесс (супервизор) УПР0, а в моменты времени, кратные T1, — управляющий процесс (супервизор) УПР1. Требуемая временная диаграмма решения задач представлена на рис. 11.2.

Синхронизация совместного решения задач в циклах разной длительности

Рис. 11.2. Синхронизация совместного решения задач в циклах разной длительности

Пусть предварительно объявлены семафоры D1, D2, A, B1, B2.

Тогда в каждом из процессов могут быть запланированы операции над семафорами, как показано на рис. 11.3.

Использование операций над семафорами

Рис. 11.3. Использование операций над семафорами

Предположим, первоначально t0 = t1 = 0. Тогда из первых команд УПР0 видно, что он включается в моменты

T0, 2T0, 3T0, 5T0,....

УПР1 включается в моменты

0, T1, 2T1,....

Начальные значения семафоров A и B1 — "закрыт", семафора В2 — "открыт". Первоначально задачи A и B находятся в очереди "к процессору". При их назначении на процессор и при выполнении первых процедур ЖДАТЬ (А) и ЖДАТЬ (В1, В2) произойдет прерывание. После него задача A находится в очереди к семафору A, задача B — к семафору В1. Пусть приоритет задачи A выше приоритета задачи B. (Задачи, решаемые с большей частотой, как правило, снабжаются более высоким приоритетом.)

В момент времени, кратный T1, задача УПР1 закрывает семафор B2, но открывает семафоры A и B1. Задача A переводится в очередь "к процессору". Пусть одного процессора достаточно для выполнения всех задач. Тогда с учетом приоритета в мультипрограммном режиме задача В решается в промежутки времени, не занятые решением других задач. После выполнения задачи УПР1 начинается выполнение задачи A с закрытия семафора A. Так как до выполнения процедуры ЗАКРЫТЬ(А) семафор А имел значение "открыт", то прерывания выполнения задачи A не произойдет и она будет решена до конца. В конце ее решения по процедуре ПРОПУСТИТЬ(В2) откроется семафор B2 и задача B перейдет в очередь "к процессору". Задача A организована по принципу зацикливания, т.е. после ее окончания управление передается на ее начало с процедуры ЗАКРЫТЬ(А). Так как к моменту выполнения этой процедуры семафор A закрыт в результате ее предыдущего выполнения, произойдет прерывание и постановка задачи A в очередь к семафору A. Этот семафор откроется только при выполнении задачи УПР0 после увеличения текущего времени на T0. При этом, т.к. открытие семафора A в задаче УПР0 производится процедурой ОТКРЫТЬ, а прерывание задачи A произошло по процедуре ЗАКРЫТЬ, то выполнение задачи A продолжится с выполнения процедуры ЗАКРЫТЬ(А). Таким образом, более чем однократное решение задачи A без прерывания вновь окажется невозможным.

Аналогично по принципу зацикливания организовано и решение задачи B. После однократного выполнения она будет прервана при повторном выполнении процедуры ЗАКРЫТЬ(В1). Семафор B1 откроется только при следующем выполнении задачи УПР1 после увеличения текущего времени на T. При этом выполнение задачи B продолжится с повторного выполнения процедуры ЗАКРЫТЬ(В1), т.к. семафор B1 открывается процедурой ОТКРЫТЬ. Однако продолжение выполнения задачи B станет возможным после открытия семафора B2. Он же окажется открытым только после однократного выполнения задачи A в цикле длительности T1 после выполнения процедуры ПРОПУСТИТЬ(В2) в конце решения задачи A. Использования этой процедуры в данном случае достаточно.

Таким образом, соблюдается требуемый порядок решения задач.

Теперь усложним пример. Предположим, что для решения задачи A одного процессора недостаточно и необходимо использовать возможности ее параллельного решения. Мы представляем эту задачу в виде частично упорядоченного множества информационно- взаимосвязанных работ — подзадач — и используем механизм семафоров для соблюдения порядка следования этих работ. При этом мы предполагаем, что в ВС реализовано децентрализованное диспетчирование, т.е. свободные процессоры обращаются за очередным заданием к очереди "к процессору". На рис. 11.4 представлена примерная граф-схема задачи на основе составляющих ее подзадач. Каждая вершина соответствует подзадаче. Стрелки определяют информационную преемственность. Процедура над семафорами, изображенная выше вершины, показывает, что соответствующая подзадача начинается с выполнения этой процедуры. Процедура, изображенная ниже вершины, показывает, что подзадача заканчивается выполнением этой процедуры.

Синхронизация параллельных вычислений с помощью семафоров

Рис. 11.4. Синхронизация параллельных вычислений с помощью семафоров

< Лекция 10 || Лекция 11: 123 || Лекция 12 >