
- •Введение
- •Понятие операционной системы. Типы операционных систем
- •Функции операционной системы
- •Структура операционной системы. Ос ms dos
- •Файлы и каталоги на дисках
- •Драйверы устройств
- •Базовая система ввода-вывода (bios)
- •Загрузчик операционной системы
- •Ядро ms dos
- •Командный процессор dos
- •Внешние команды dos
- •Файловая структура диска
- •Стартовый сектор
- •Каталоги
- •Область данных
- •Операционные системы Windows
- •Выбор платформы Windows
- •Термины
- •Архитектура Windows Режимы выполнения программного кода
- •Многозадачность
- •Управление памятью в Windows
- •Выполнение приложений
- •Интерфейс прикладного программирования Win32
- •Реестр Windows
- •Операционная система unix
- •Ядро и процессы unix
- •Диспетчер unix
- •Процессы unix
- •Дескриптор и контекст процесса
- •Иерархия процессов
- •Идентификаторы процесса
- •Группы процессов
- •Взаимодействие процессов
- •Процессы-«демоны»
- •Межпроцессные коммуникации unix
- •Сигналы
- •Сигналы unix по мере возрастания их значений:
- •Семафоры
- •Программные каналы (Pipes)
- •Очереди сообщений
- •Разделяемая память
- •Многопользовательская защита в unix
- •Идентификаторы пользователя и группы
- •Код защиты файла
- •Привилегированный пользователь
- •Эффективные и реальные идентификаторы
- •Свопинг и пейджинг в unix
- •Буфер кеш-памяти
- •Управление вводом/выводом
- •Специальные файлы
- •Взаимодействие драйверов с программной и аппаратной средой
- •Файловая система unix
- •Основные системные каталоги
- •Корневой каталог /
- •Каталог /var
- •Каталог /etc
- •Каталог /usr
- •Каталог /home (/export/home)
- •Каталог/opt (/opti, /opt2, ... /optn)
- •Команды управления swap
- •Команда mkfile
- •Специальные файлы
- •Класс устройства
- •Тип и номер
- •Связь физической и логической структур
- •Создание и монтирование файловой системы
- •Дисковые устройства в unix
- •Внутренняя структура файловой системы Распределение дискового пространства
- •Индексные дескрипторы
- •Системные вызовы unix для работы с файлами
- •Стандартные библиотечные функции ввода/вывода
- •Поточные функции ввода/вывода
- •Литература
- •Оглавление
-
Программные каналы (Pipes)
Программные каналы - это средство обмена потоками информации между процессами. Это средство синхронизации процессов, так как параллельные процессы не всегда могут корректно взаимодействовать между собой. Попытка записи в канал, который никто не читает, приведет к приостановке записывающего процесса ("процесса-писателя") до появления читающего процесса ("процесса-читателя"), и наоборот: попытка чтения из канала, в который никто не пишет, приведет к приостановке ''процесса-читателя" до появления "процесса-писателя".
Возможности программных каналов (pipes) в UNIX существовали всегда, с момента ее зарождения. Однако в новых версиях UNIX появилось много новых полезных особенностей:
1. Снята проблема взаимодействия (как по сигналам, так и по программным каналам) только "процессов-родственников", что принципиально ограничивало общность средств взаимодействия процессов.
2. В добавление к pipes появились новые средства в виде очередей сообщений и разделяемых областей памяти.
По сути, pipe - это некоторый специальный файл, в который можно писать информацию или читать из него. Это укладывается в общую концепцию ввода/вывода в UNIX. Выборка и помещение информации в такой особый файл должна происходить по стратегии FIFO (First In/First Out).
При вводе/выводе всегда используется потоковая модель данных. Это означает, что:
-
Передаваемые через pipe данные никак не интерпретируются.
-
Длина передаваемых сообщений не контролируется.
-
Сразу несколько "процессов-клиентов могут писать в канал, а один процесс-сервер может читать из него и обмениваться с "клиентами" сообщениями.
-
При этом сообщения никак не отделяются друг от друга и сервер сам должен определять, кто из "клиентов" и какое сообщение прислал ему.
В старых версиях 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осЗ.