Шрифт:
Модули
Модули являются основными компонентами потока. Каждый модуль состоит из пары очередей — очереди чтения и записи, а также набора функций, осуществляющих обработку данных и их передачу вверх или вниз по потоку. Архитектура модуля представлена на рис. 5.16.
Рис. 5.16. Модуль STREAMS
Каждая очередь представлена структурой данных
q_qinfo | Указатель на структуру qinit , описывающую функции обработки сообщений данной очереди. |
q_first , q_last | Указатели на связанный список сообщений, ожидающих передачи вверх или вниз по потоку. |
q_next | Указатель на очередь следующего модуля вверх или вниз по потоку. |
q_ptr | Указатель на внутренние данные модуля (очереди). |
Помимо указанных полей, структура
Передача данных вверх или вниз по потоку осуществляется с помощью функций модуля, указатели на которые хранятся в структуре
Модуль должен иметь функцию
Оставшиеся поля структуры
module_info | В этой структуре хранятся базовые значения таких параметров, как ватерлинии, размер сообщений и т.д. Некоторые из этих параметров также находятся в структуре queue. Это дает возможность динамически изменять их, сохраняя при этом базовые значения. |
module_stat | Эта структура непосредственно не используется подсистемой STREAMS. Однако модуль имеет возможность осуществлять сбор разнообразной статистики своего участка потока с помощью полей этой структуры. |
Сообщения
В подсистеме STREAMS все данные передаются в виде сообщений. С помощью сообщений передаются данные от приложений к драйверу и обратно. Сообщения используются для взаимодействия модулей между собой. Модули могут также генерировать сообщения для уведомления прикладного процесса или друг друга о возникновении ошибок или непредвиденных ситуаций. Таким образом, сообщения являются единственным способом передачи информации между различными компонентами потока и потому занимают ключевое место в подсистеме STREAMS.
Сообщение описывается двумя структурами данных: заголовком сообщения
Заголовок сообщения
b_next , b_prev | Используются для формирования связанного списка сообщений и соответственно адресуют следующее и предыдущее сообщение очереди |
b_cont | Указывает на продолжение сообщения и используется для связывания различных частей одного сообщения |
b_datap | Указатель на заголовок блока данных |
b_rptr , b_wptr | Указатели, определяющие расположение (начало и конец) данных в буфере данных |
b_cont | Содержит ссылку на следующую структуру msgb |
Заголовок блока данных
db_base | Адрес начала буфера |
db_lim | Адрес ячейки памяти, следующей непосредственно за буфером. Таким образом, размер буфера равен db_lim - db_base |
db_type | Тип сообщения |
db_ref | Число заголовков сообщения, адресующих этот блок |