Выделение трех объектов в индивидуальном порядке является неэффективным и медленным. Подсистема STREAMS предлагает альтернативный выход на основе структур данных под названием mdbblock. Каждая структура имеет размер 128 байтов и содержит msgb, datab и указатель на обработчик открепления (release handler), о котором будет рассказано в следующем разделе. Оставшиеся байты структуры могут быть использованы для буфера данных.
Посмотрим, что происходит при вызове модулем процедуры allocb() с целью выделения сообщения. Процедура allocb() вызывает kmem_aLloc() для размещения структуры mdbblock, передавая ей флаг N0_SLP. Этот флаг показывает на необходимость возврата kmem_alloc() с ошибкой вместо блокировки, если процедура не в силах выделить память незамедлительно. Если размещение прошло успешно, процедура allocb() проверяет, поместится в структуре mdbblock информация указываемого размера. При положительном ответе процедура производит инициализацию структуры и возвращает указатель на msgb
В рассматриваемом случае единственный вызов kmem_ alloc() производит выделение msgb, datab и буфера.
Если запрашиваемый размер окажется больше, allocb() вызывает kmem_ alloc() повторно для выделения буфера. В этом варианте оставшиеся байты mdbblock не используются. Если вызов kmem_alloc() возвращает ошибку, процедура allocb() освобождает все ранее полученные ресурсы и возвращает NULL, что свидетельствует о сбое.
Сбой выполнения allocb() должен обрабатываться модулем или драйвером. Одним из возможных вариантов является сброс данных. Такой подход используется многими сетевыми драйверами при невозможности обработки всего входящего трафика. Однако модулю часто приходится ожидать появления свободной памяти. Процедуры модуля put и service не должны быть блокирующими, поэтому необходимо другое решение проблемы ожидания свободной памяти.
Для этой цели STREAMS предлагает процедуру под названием bufcall(). Если модуль не может выделить сообщение, то он вызывает bufcall(), передаетей указатель на функцию возврата и размер создаваемого сообщения. Подсистема STREAMS добавляет функцию возврата во внутреннюю очередь. После того, как освободится достаточное количество памяти, подсистема обработает очередь и вызовет каждую содержащуюся в ней функцию возврата.
Часто функция возврата имеет собственную процедуру service. Однако она не обладает информацией о наличии свободной памяти. При выполнении функции возврата другие процессы могут снизить количество доступной памяти. В этом случае модуль обычно производит повторную загрузку bufcall().
Опубликовал katy
June 24 2015 21:39:49 ·
0 Комментариев ·
2101 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.