Параллельное программирование: Учебное пособие, страница 38

2.4.2  Синхронизация и неделимость операторов обмена

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

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

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

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

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

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

2.4.3  Способы защиты и ограждения критических секций.

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

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

begin integer ф; ф:=1;

parbegin

процесс 1: begin

L1: if ф=2 then goto L1;

критическая секция 1;

ф:=2;

остаток циклического сегмента 1;

goto L1

end;

процесс 2: begin

L2: if ф=1 then goto L2;

критическая секция 2;

ф:=1;

остаток циклического сегмента 2;