Вход/Регистрация
Разработка ядра Linux
вернуться

Лав Роберт

Шрифт:

Главная причина использования отложенных прерываний — масштабируемость. Если нет необходимости масштабироваться на бесконечное количество процессоров, то лучше использовать механизм тасклетов. Тасклеты — это отложенные прерывания, для которых обработчик не может выполняться параллельно на нескольких процессорах.

Генерация отложенных прерываний

После того как обработчик добавлен в перечень и зарегистрирован с помощью вызова

open_softirq
, он готов выполняться. Для того чтобы отметить его как ожидающего исполнения и, соответственно, чтобы он выполнился при следующем вызове функции
do_softirq
, необходимо вызвать функцию
raise_softirq
. Например, сетевая подсистема должна вызвать эту функцию в следующем виде.

raise_softirq(NET_TX_SOFTIRQ);

Этот вызов сгенерирует отложенное прерывание с индексом

NET_TX_SOFTIRQ
. Соответствующий обработчик
net_tx_action
будет вызван при следующем выполнении программных прерываний ядром. Эта функция запрещает аппаратные прерывания перед тем, как сгенерировать отложенное прерывание, а затем восстанавливает их в первоначальное состояние. Если аппаратные прерывания в данный момент запрещены, то для небольшой оптимизации можно воспользоваться функцией
raise_softirq_irqoff
, как показано в следующем примере.

/*

* прерывания должны быть запрещены!

*/

raise_softirq_irqoff(NET_TX_SOFTIRQ);

Наиболее часто отложенные прерывания генерируются из обработчиков аппаратных прерываний. В этом случае обработчик аппаратного прерывания выполняет всю основную работу, которая касается аппаратного обеспечения, генерирует отложенное прерывание и завершается. После завершения обработки аппаратных прерываний ядро вызывает функцию

do_softirq
. Обработчик отложенного прерывания выполняется и подхватывает работу с того места, где обработчик аппаратного прерывания ее отложил. В таком примере раскрывается смысл названий "верхняя половина" и "нижняя половина".

Тасклеты

Тасклеты — это механизм обработки нижних половин, построенный на основе механизма отложенных прерываний. Как уже отмечалось, они не имеют ничего общего с заданиями (task). Тасклеты по своей природе и принципу работы очень похожи на отложенные прерывания. Тем не менее они имеют более простой интерфейс и упрощенные правила блокировок.

Решение о том, стоит ли использовать тасклеты, принять достаточно просто: в большинстве случаев необходимо использовать тасклеты. Как было показано в предыдущем разделе, примеры использования отложенных прерываний можно посчитать на пальцах одной руки. Отложенные прерывания необходимо использовать только в случае, когда необходима очень большая частота выполнений и интенсивно используется многопоточная обработка. Тасклеты используются в очень большом количестве случаев — они работают достаточно хорошо и их очень просто использовать.

Реализация тасклетов

Так как тасклеты реализованы на основе отложенных прерываний, они тоже являются отложенными прерываниями (softirq). Как уже рассказывалось, тасклеты представлены двумя типами отложенных прерываний:

HI_SOFTIRQ
и
TASKLET_SOFTIRQ
. Единственная разница между ними в том, что тасклеты типа
HI_SOFTIRQ
выполняются всегда раньше тасклетов типа
TASKLET_SOFTIRQ
.

Структуры тасклетов

Тасклеты представлены с помощью структуры

tasklet_struct
. Каждый экземпляр структуры представляет собой уникальный тасклет. Эта структура определена в заголовочном файле
<linux/interrupt.h>
в следующем виде.

struct tasklet_struct {

 struct tasklet_struct *next; /* указатель на следующий

тасклет в списке */

 unsigned long state; /* состояние тасклета */

 atomic_t count; /* счетчик ссылок */

 void (*func)(unsigned long); /* функция-обработчик тасклета */

 unsigned long data; /* аргумент функции-обработчика тасклета */

);

Поле

func
— это функция-обработчик тасклета (эквивалент поля
action
для структуры, представляющей отложенное прерывание), которая получает поле
data
в качестве единственного аргумента при вызове.

Поле

state
может принимать одно из следующих значений: нуль,
TASKLET_STATE_SCHED
или
TASLET_STATE_RUN
. Значение
TASKLET_STATE_SCHED
указывает на то, что тасклет запланирован на выполнение, а значение
TASLET_STATE_RUN
— что тасклет выполняется. Для оптимизации значение
TASLET_STATE_RUN
может использоваться только на многопроцессорной машине, так как на однопроцессорной машине и без этого точно известно, выполняется ли тасклет (действительно, ведь код, который выполняется, либо принадлежит тасклету, либо нет).

  • Читать дальше
  • 1
  • ...
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: