Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OS.DOC
Скачиваний:
18
Добавлен:
28.10.2018
Размер:
653.82 Кб
Скачать
    1. Программные каналы (Pipes)

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

Возможности программных каналов (pipes) в UNIX существовали всегда, с момента ее зарождения. Однако в новых версиях UNIX появилось много новых полезных особенностей:

1. Снята проблема взаимодействия (как по сигналам, так и по программным каналам) только "процессов-родственников", что принципиально ограничивало общность средств взаимодействия процессов.

2. В добавление к pipes появились новые средства в виде очередей сообщений и разделяемых областей памяти.

По сути, pipe - это некоторый специальный файл, в который можно писать информацию или читать из него. Это укладывается в общую концепцию ввода/вывода в UNIX. Выборка и помещение информации в такой особый файл должна происходить по стратегии FIFO (First In/First Out).

При вводе/выводе всегда используется потоковая модель данных. Это означает, что:

  1. Передаваемые через pipe данные никак не интерпретируются.

  2. Длина передаваемых сообщений не контролируется.

  3. Сразу несколько "процессов-клиентов могут писать в канал, а один процесс-сервер может читать из него и обмениваться с "клиентами" сообщениями.

  4. При этом сообщения никак не отделяются друг от друга и сервер сам должен определять, кто из "клиентов" и какое сообщение прислал ему.

В старых версиях UNIX сообщениями могли обмениваться только "процессы-родственники". Сейчас это ограничение снято при помощи именованных программных каналов.

Существует два вида программных каналов:

  • неименованные программные каналы;

  • именованные программные каналы.

Именованные программные каналы отсутствуют в старых версиях UNIX.

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

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

НАПРИМЕР: Можно создать с системной консоли именованный программный канал по команде mknod name p

После этого запишите что-нибудь в канал:

cat proba.txt > p

Зарегистрируйтесь на любом подключенном к UNIX терминале:

login: username

password: password

И после того, как вы получите подсказку ОС для ввода команд, например вида $, немедленно введите следующую команду:

Cat p.

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

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

Программный канал

Рис.6. Схема программного канала

После создания программного канала и начала работы с ним система ввода/вывода обеспечивает приостановку процессов, если канал заполнен информацией (его объем обычно 4096 байт), т. е. при записи операция write или успешно проходит, если в pipe имеется свободное пространство, или переходит в состояние ожидания, если труба забита информацией и с нее никто не читает, а в процессе чтения все происходит наоборот: операция read "подвисает", если канал пуст, или успешно завершается, если в канале имеется информация.

Здесь следует рассмотреть две особенности:

1. Процесс запрашивает через read больший объем данных, чем имеется в канале. В результате процессу будет передано только то, что имелось в канале с завершением операции по фактическому количеству считанных данных.

2. Если при открытии файла был использован флаг ON_DelAY (в именованном канале), то при обнаружении пустого канала процесс, выдавший read, не переводится в состояние ожидания. Ему сразу передается управление после read с результатом работы read, равным нулю.

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

Рис. 5 Сетевая структура программных каналов

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

proc1 | рrос2 | рrосЗ рассматривается Shell как состоящая из трех его "процессов-сыновей": proc1, рrос2, рrосЗ. По мере их порождения Shell устанавливает программные каналы от рrос1 к рrос2 и от рrос2 к рrосЗ.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]