Книга: Операционная система UNIX
Мультиплексирование
Мультиплексирование
Подсистема STREAMS обеспечивает возможность мультиплексирования потоков с помощью мультиплексора, который может быть реализован только драйвером STREAMS. Различают три типа мультиплексоров — верхний, нижний и гибридный. Верхний мультиплексор, называемый также мультиплексором N:1, обеспечивает подключение нескольких каналов вверх по потоку к одному каналу вниз по потоку. Нижний мультиплексор, называемый также мультиплексором 1:M, обеспечивает подключение нескольких каналов вниз по потоку к одному каналу вверх по потоку. Гибридный мультиплексор, как следует из названия, позволяет мультиплексировать несколько каналов вверх по потоку с несколькими каналами вниз по потоку.
Заметим, что подсистема STREAMS обеспечивает возможность мультиплексирования, но за идентификацию различных каналов и маршрутизацию данных между ними отвечает сам мультиплексор.
Мультиплексирование каналов вверх по потоку осуществляется в результате открытия одного и того же драйвера с различными младшими номерами. Верхний мультиплексор должен обеспечить возможность одновременной работы с устройством с использованием различных младших номеров. Если два процесса открывают поток, используя различные младшие номера, ядро создаст отдельный канал для каждого из них, каждый из них будет адресоваться отдельным vnode, и процедура xxopen()
драйвера будет вызвана дважды. Драйвер при этом будет обрабатывать две пары очередей, каждая из которых отвечает за отдельный поток. Когда данные поступают от устройства, драйвер должен принять решение, в какую очередь чтения их направить. Обычно такое решение делается на основании управляющей информации, содержащейся в полученных данных. На рис. 5.23 представлен вид верхнего мультиплексора с двумя подключенными потоками.
Рис. 5.23. Верхний мультиплексор
Нижний мультиплексор представляет собой драйвер псевдоустройства. Вместо работы с физическим устройством он взаимодействует с несколькими каналами вниз по потоку. Для этого нижний мультиплексор обеспечивает работу с еще одной парой очередей — нижними очередями чтения и записи. Структура streamtab
нижнего мультиплексора адресует процедурный интерфейс работы с нижними очередями соответственно полями st_muxrinit
и st_muxwinit
.
Для работы с мультиплексированными потоками подсистема STREAMS поддерживает четыре команды ioctl(2):
I_LINK |
Используется для объединения потоков. При этом файловый дескриптор указывает на поток, подключенный к мультиплексору. Второй файловый дескриптор, передаваемый в качестве аргумента команды, указывает на поток, который необходимо подключить ниже мультиплексора. |
I_PLINK |
Используется для потоков, которое сохраняется при закрытии файлового дескриптора. В остальном аналогично команде I_LINK . |
I_UNLINK , I_PUNLINK |
Используются для разъединения потоков, созданных командами I_LINK и I_PLINK . |
Создание мультиплексированного потока происходит в два этапа. Поясним этот процесс на примере создания стека протокола IP, поддерживающего работу как с адаптером Ethernet, так и с адаптером FDDI. Для этого необходимо объединить драйвер адаптера Ethernet, драйвер адаптера FDDI и драйвер IP, который является нижним мультиплексором. Процесс должен выполнить следующие действия:
fdenet = open("/dev/le", O_RDWR);
fdfddi = open("/dev/fddi", O_RDWR);
fdip = open("/dev/ip", O_RDWR);
ioctl(fdip, I_LINK, fdenet);
ioctl(fdip, I_LINK, fdfddi);
Сначала процесс создает три независимых потока, адресуемых дескрипторами fdenet
, fdfddi
и fdip
(рис. 5.24, а) Для объединения потоков используется команда I_LINK
системного вызова ioctl(2). В результате получается конфигурация, представленная на рис. 5.24, б.
Рис. 5.24. Создание мультиплексированного потока
В результате объединения потоков очереди и процедурный интерфейс головного модуля нижнего потока (в данном случае, потока, подключенного к драйверу Ethernet или FDDI), реализованный самой подсистемой STREAMS, заменяются на нижние очереди и соответствующий процедурный интерфейс мультиплексора. Более детально процесс объединения потока IP и потока Ethernet показан на рис. 5.25.
Рис. 5.25. Объединение верхнего и нижнего потоков
Задачей нижнего мультиплексора является хранение информации обо всех подключенных ниже потоках и обеспечение правильной маршрутизации между ними.
- 13.1.5. Мультиплексирование с помощью epoll
- 13.1. Мультиплексирование входных и выходных данных
- 13.1.2. Мультиплексирование с помощью poll()
- 13.1.3. Мультиплексирование с помощью select()
- 6.8. Мультиплексирование сообщений
- Глава 6 Мультиплексирование ввода-вывода: функции select и poll
- Архитектура STREAMS