Данная функция при обращении к пустому каналу будет ждать, пока в канале не появится информация для чтения.
Двумя указателями.
Размером,
Идентификатором,
Конвейеры представляют собой системный ресурс: чтобы начать работу с конвейером, процесс сначала должен заказать его у операционной системы и получить в свое распоряжение.
Процессы, знающие идентификатор конвейера, могут через него обмениваться данными.
системные вызовы для работы с каналами
- Функция создания канала:
- описатель для чтения из канала,
- описатель для записи в канал,
- размер канала.
- Функция чтения из канала:
- описатель для чтения из канала,
- переменная любого типа,
- размер переменной,
- количество прочитанных байтов.
- Функция записи в канал:
- описатель для записи в конвейер,
- количество записанных байтов.
Из-за ограничения на размер конвейера программисты сталкиваются и с ограничениями на размеры передаваемых через него сообщений.
Проблемы синхронизации параллельных процессов.
|
|
Функционирование мультипрограммной вычислительной системы характерно тем, что в её среде одновременно развиваются несколько параллельных процессов.
В своём развитии параллельные процессы часто используют одни и те же ресурсы системы, т. е. разделяют их. Часть таких разделяемых ресурсов требуют только последовательного использования со стороны процессов, т. е. в каждый момент времени только один процесс может использовать разделяемый ресурс. Такие ресурсы называются критическими. Для того чтобы обеспечить последовательное использование критических ресурсов необходимо синхронизировать доступ к ним.
Задача синхронизации, в общем случае, состоит в следующем.
Если несколько процессов хотят пользоваться критическим ресурсом в режиме разделения, им следует синхронизировать свои действия таким образом, чтобы такой ресурс всегда находился в распоряжении не более чем одного из них. Если один процесс пользуется в данный момент критическим ресурсом, то все остальные процессы, которым нужен этот ресурс, должны получить отказ в доступе и ждать, пока он не освободится.
Если в системе не предусмотрена защита от одновременного доступа процессов к критическим ресурсам, в ней могут возникать ошибки, которые трудно обнаружить и исправить. Основной причиной возникновения таких ошибок является то, что процессы развиваются с разными скоростями, причём эти скорости самим процессам неподвластны и неизвестны друг другу.
Мониторы Хоара
В маленьком ресторанчике, где готовят пиццу, работают отец и три его дочери. Приготовление пиццы требует трех ингредиентов: теста, соуса и сыра. Одна дочь должна непрерывно поставлять тесто, вторая - соус, третья - тертый сыр. Приготовление пиццы происходит следующим образом: первая дочь формирует из теста основу пиццы, после чего вторая дочь намазывает лепешку соусом, а третья - посыпает сыром. Отец берет подготовленную дочерьми пиццу и помещает ее в печь. Используя классические мониторы Хоар, программист предложил следующую модель приготовления пиццы с помощью четырех процессов: для отца и для каждой из дочерей.
|
|
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);
}
Что может произойти в результате такого моделирования?
- посетитель может не дождаться пиццы из-за возникновения тупиковой ситуации;
- посетитель может получить пиццу без какого-либо ингредиента;
- будут накапливаться забытые недоделанные пиццы.