Рандеву
При решении проблемы межпроцессной связи передачу данных и синхронизацию можно рассматривать как одну неразделяемую задачу.
Модель требует, чтобы, в случае когда процесс А намерен передать данные процессу В, оба процесса должны выразить свою готовность установить связь, выдав заявки соответственно на передачу и получение:
send (отправить) — для посылки сообщения
receive (получить) — для получения сообщения.
- Если получится так, что процесс А выдаст заявку на передачу первым (send), то его выполнение приостанавливается до тех пор, пока процесс В не выдаст заявку на получение(receive).
- Аналогично, если первым выдаст заявку на получение процесс В, то он также приостанавливается до тех пор, пока процесс А не выдаст заявку на передачу.
- Когда таким образом синхронизируются оба процесса, происходит передача данных, и каждый из процессов возобновляет свою деятельность.
Такую синхронизацию называют рандеву.
Фактическая передача данных между процессами происходит без использования буфера, поэтому передача данных между асинхронными процессами должна программироваться с привлечением буферного процесса, работающего между ними.
|
|
Конвейер (pipe - программный канал (связи), или, как его иногда называют транспортер) является средством, с помощью которого можно производить синхронизацию и обмен данными между процессами.
Принцип работы конвейера основан на механизме ввода/вывода, который используется для работы с файлами в UNIX, то есть процесс, передающий информацию, действует так, как будто он записывает данные в файл, в то время как процесс, для которого предназначается эта информация, читает ее из этого файла.
Операции записи и чтения осуществляются не записями, как это делается в обычных файлах, а потоком байтов, как это было принято в UNIX-системах,
Таким образом, функции, с помощью которых выполняется запись в канал и чтение из него, являются теми же самыми, что и при работе с файлами. По сути, канал представляет собой поток данных между двумя (или более) процессами.
На самом деле конвейеры не являются файлами на диске, а представляют собой буферную память, работающую по принципу FIFO (FIFO — акроним «First In, First Out» (англ.). Принцип «первым пришёл - первым ушёл», обратен принципу LIFO.).
Конвейер имеет определенный размер, который не может превышать 64 Кбайт и работает циклически.
- Имеется некий массив и два указателя: один показывает на первый элемент (head), а второй - на последний (tail).
- В начальный момент оба указателя равны нулю.
- Добавление самого первого элемента в пустую очередь приводит к тому, что указатели head и tail принимают значение, равное 1 (в массиве появляется первый элемент).
- В последующем добавление нового элемента вызывает изменение значения второго указателя, поскольку он отмечает расположение именно последнего элемента очереди.
- Чтение (и удаление) элемента (читается и удаляется всегда первый элемент) приводит к необходимости модифицировать значение указателя head.
- В результате операций записи (добавления) и чтения (удаления) элементов в массиве, моделирующем очередь элементов, указатели будут перемещаться от начала массива к его концу.
- При достижении указателем значения индекса последнего элемента массива значение указателя вновь становится единичным (если при этом не произошло переполнение массива, то есть количество элементов в очереди не стало больше числа элементов в массиве). Можно сказать, что мы как бы замыкаем массив в кольцо, организуя круговое перемещение указателей head и tail, которые отслеживают первый и последний элементы в очереди. Так функционирует конвейер.
Как информационная структура канал описывается
|
|