Книга: Операционная система UNIX
Модули
Модули
Модули являются основными компонентами потока. Каждый модуль состоит из пары очередей — очереди чтения и записи, а также набора функций, осуществляющих обработку данных и их передачу вверх или вниз по потоку. Архитектура модуля представлена на рис. 5.16.
Рис. 5.16. Модуль STREAMS
Каждая очередь представлена структурой данных queue
. Наиболее важными полями queue
являются:
q_qinfo |
Указатель на структуру qinit , описывающую функции обработки сообщений данной очереди. |
q_first , q_last |
Указатели на связанный список сообщений, ожидающих передачи вверх или вниз по потоку. |
q_next |
Указатель на очередь следующего модуля вверх или вниз по потоку. |
q_ptr |
Указатель на внутренние данные модуля (очереди). |
Помимо указанных полей, структура queue
содержит параметры для обеспечения управления потоком данных — верхнюю и нижнюю ватерлинии очереди.
Передача данных вверх или вниз по потоку осуществляется с помощью функций модуля, указатели на которые хранятся в структуре qinit
. Модуль должен определить четыре процедуры для обработки каждой из очередей: xxput()
, xxservice()
, xxopen()
и xxclose()
, где xx, как и прежде, обозначает уникальный префикс драйвера. Эти функции адресуются указателями (*qi_putp)()
, (*qi_srvp)()
, (*qi_qopen)()
, (*qi_close)()
. Этих четырех функций достаточно для взаимодействия с соседними модулями, обработки и передачи данных. Функция xxopen()
вызывается каждый раз, когда процесс открывает поток или при встраивании модуля. Соответственно функция xxclose()
вызывается при закрытии потока или извлечении модуля. Функция xxput()
осуществляет обработку сообщений, проходящих через модуль. Если xxput()
не может передать сообщение следующему модулю (например, в случае, если очередь следующего модуля переполнена), она помещает сообщение в собственную очередь. Периодически ядро вызывает процедуру xxservice()
каждого модуля для передачи отложенных сообщений.
Модуль должен иметь функцию xxput()
для каждой очереди. Функция xxservice()
может не существовать, в этом случае xxput()
не имеет возможности отложить передачу сообщения и должна передать его немедленно, даже если очередь следующего модуля переполнена. Таким образом модули, не имеющие процедур xxservice()
, не обладают возможностью управления потоком данных. Эти аспекты мы подробнее рассмотрим в следующих разделах.
Оставшиеся поля структуры qinit
:
module_info |
В этой структуре хранятся базовые значения таких параметров, как ватерлинии, размер сообщений и т.д. Некоторые из этих параметров также находятся в структуре queue. Это дает возможность динамически изменять их, сохраняя при этом базовые значения. |
module_stat |
Эта структура непосредственно не используется подсистемой STREAMS. Однако модуль имеет возможность осуществлять сбор разнообразной статистики своего участка потока с помощью полей этой структуры. |
- Модули констукторов заданий
- Речевые модули для «холодного» звонка с целью назначить встречу
- Речевые модули для завершения продажи
- 3.3.3. Модули аутентификации
- 7.2. Модули
- Речевые модули для прохода секретаря
- Речевые модули для скрипта
- Речевые модули для работы с возражениями
- Речевые модули для объяснения секретарю причины и цели звонка
- Глава 16 Модули
- 10.2. Осторожно, за вами следят шпионские модули SpyWare!
- Модули в Python