Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Операционные системы Лекция 05(Механизмы синхро...doc
Скачиваний:
7
Добавлен:
16.09.2019
Размер:
134.66 Кб
Скачать

3. Рандеву

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

Модель требует, чтобы, в случае когда процесс А намерен передать данные процессу В, оба процесса должны выразить свою готовность установить связь, выдав заявки соответственно на передачу и получение:

send (отправить) — для посылки сообщения

receive (получить) — для получения сообщения.

  • Если получится так, что процесс А выдаст заявку на передачу первым (send), то его выполнение приостанавливается до тех пор, пока процесс В не выдаст заявку на получение(receive).

  • Аналогично, если первым выдаст заявку на получение процесс В, то он также приостанавливается до тех пор, пока процесс А не выдаст заявку на передачу.

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

Такую синхронизацию называют рандеву.

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

4. Программные каналы (конвейеры)

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

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

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

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

На самом деле конвейеры не являются файлами на диске, а представляют собой буферную память, работающую по принципу FIFO (FIFO — акроним «First In, First Out» (англ. ). Принцип «первым пришёл - первым ушёл», обратен принципу LIFO.).

Конвейер имеет определенный размер, который не может превышать 64 Кбайт и работает циклически.

  • Имеется некий массив и два указателя: один показывает на первый элемент (head), а второй - на последний (tail).

  • В начальный момент оба указателя равны нулю.

  • Добавление самого первого элемента в пустую очередь приводит к тому, что указатели head и tail принимают значение, равное 1 (в массиве появляется первый элемент).

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

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

  • В результате операций записи (добавления) и чтения (удаления) элементов в массиве, моделирующем очередь элементов, указатели будут перемещаться от начала массива к его концу.

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

Как информационная структура канал описывается

идентификатором,

размером,

двумя указателями.

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

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

системные вызовы для работы с каналами

  • Функция создания канала:

- описатель для чтения из канала,

- описатель для записи в канал,

- размер канала.

  • Функция чтения из канала:

- описатель для чтения из канала,

- переменная любого типа,

- размер переменной,

- количество прочитанных байтов.

Данная функция при обращении к пустому каналу будет ждать, пока в канале не появится информация для чтения.

  • Функция записи в канал:

- описатель для записи в конвейер,

- количество записанных байтов.

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

Дополнительно

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

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

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

Задача синхронизации, в общем случае, состоит в следующем.

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

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

Мониторы Хоара

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

monitor make_pizza {

condition c[3];

make_item(int i){

if(i != 0 )c[i-1].wait;

<выполнить свою работу>

if(i != 3)c.signal;

else <выставить на продажу>

}

}

Процесс i-й работник i = 0,1,2,3; i=3 — соответствует отцу

While (1) {

make_pizza.make_item(i);

}

Что может произойти в результате такого моделирования?

- посетитель может не дождаться пиццы из-за возникновения тупиковой ситуации;

- посетитель может получить пиццу без какого-либо ингредиента;

- будут накапливаться забытые недоделанные пиццы.