Использование тасклетов

Использование тасклетов

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

Объявление тасклетов

Тасклеты можно создавать статически и динамически. Какой вариант лучше выбрать, зависит от того, как необходимо (или желательно) пользователю обращаться к тасклету: прямо или через указатель. Для статического создания тасклета (и соответственно, обеспечения прямого доступа к нему) необходимо использовать один из двух следующих макросов, которые определены в файле <linux/interrupts.h>:

DECLARE_TASKLET(name, func, data);

DECLARE_TASKLET_DISABLED(name, func, data);

Оба макроса статически создают экземпляр структуры struct_tasklet_struct с указанным именем (name). Когда тасклет запланирован на выполнение, то вызывается функция func, которой передается аргумент data. Различие между этими макросами состоит в значении счетчика ссылок на тасклет (поле count). Первый макрос создает тасклет, у которого значение поля count равно нулю, и, соответственно, этот тасклет разрешен. Второй макрос создает тасклет и устанавливает для него значение поля count, равное единице, и, соответственно, этот тасклет будет запрещен. Можно привести следующий пример.

DECLARE_TASKLET(my_tasklet, my_tasklet_handler, dev);

Эта строка эквивалентна следующей декларации.

struct tasklet_struct my_tasklet = {

 NULL, 0, ATOMIC_INIT(0), tasklet_handler, dev

};

В данном примере создается тасклет с именем my_tasklet, который разрешен для выполнения. Функция tasklet_handler будет обработчиком этого тасклета. Значение параметра dev передается в функцию-обработчик при вызове данной функции.

Для инициализации тасклета, на который указывает заданный указатель struct tasklet_struct* t — косвенная ссылка на динамически созданную ранее структуру, необходимо использовать следующий вызов.

tasklet_init(t, tasklet_handler, dev); /* динамически, а не статически */

Написание собственной функции-обработчика тасклета

Функция-обработчик тасклета должна соответствовать правильному прототипу.

void tasklet_handler(unsigned long data);

Так же как и в случае отложенных прерываний, тасклет не может переходить в состояние ожидания (блокироваться). Это означает, что в тасклетах нельзя использовать семафоры или другие функции, которые могут блокироваться. Тасклеты также выполняются при всех разрешенных прерываниях, поэтому необходимо принять все меры предосторожности (например, может понадобиться запретить прерывания и захватить блокировку), если тасклет имеет совместно используемые данные с обработчиком прерывания. В отличие от отложенных прерываний, ни один тасклет не выполняется параллельно самому себе, хотя два разных тасклета могут выполняться на разных процессорах параллельно. Если тасклет совместно использует данные с обработчиком прерывания или другим тасклетом, то необходимо использовать соответствующие блокировки (см. главу 8, "Введение в синхронизацию выполнения кода ядра" и главу 9, "Средства синхронизации в ядре").

Планирование тасклета на выполнение

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

tasklet_schedule(&my_tasklet); /* отметить, что тасклет my_tasklet

                                  ожидает на выполнение */

После того как тасклет запланирован на выполнение, он выполняется один раз в некоторый момент времени в ближайшем будущем. Если тасклет, который запланирован на выполнение, будет запланирован еще раз до того, как он выполнится, то он также выполнится всего один раз. Если тасклет уже выполняется, скажем, на другом процессоре, то будет запланирован снова и снова выполнится. Для оптимизации тасклет всегда выполняется на том процессоре, который его запланировал на выполнение, что дает надежду на лучшее использование кэша процессора.

Указанный тасклет может быть запрещен с помощью вызова функции tasklet_disable(). Если тасклет в данный момент времени выполняется, то эта функция не возвратит управление, пока тасклет не закончит выполняться. Как альтернативу можно использовать функцию tasklet_disable_nosync(), которая запрещает указанный тасклет, но возвращается сразу и не ждет, пока тасклет завершит выполнение. Это обычно небезопасно, так как в данном случае нельзя гарантировать, что тасклет не закончил выполнение. Вызов функции tasklet_enable() разрешает тасклет. Эта функция также должна быть вызвана для того, чтобы можно было использовать тасклет, созданный с помощью макроса DECLARE_TASKLET_DISABLED(), как показано в следующем примере.

tasklet_disable(&my_tasklet); /* тасклет теперь запрещен */

/* Мы можем делать все, что угодно, зная,

   что тасклет не может выполняться. */

tasklet_enable(&my_tasklet); /* теперь тасклет разрешен */

Из очереди тасклетов, ожидающих на выполнение, тасклет может быть удален с помощью функции tasklet_kill(). Эта функция получает указатель на соответствующую структуру tasklet_struct в качестве единственного аргумента. Удаление запланированного на выполнение тасклета из очереди очень полезно в случае, когда используются тасклеты, которые сами себя планируют на выполнение. Эта функция сначала ожидает, пока тасклет не закончит выполнение, а потом удаляет его из очереди. Однако это, конечно, не может предотвратить возможности, что другой код запланирует этот же тасклет на выполнение. Так как данная функция может переходить в состояние ожидания, то ее нельзя вызывать из контекста прерывания.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Использование

Из книги Разгони свой сайт автора Мациевский Николай

Использование Во-первых, мы сперва должны подключить библиотеку cssexpr.js (о ней речь чуть ниже) и только потом вызывать нашу функцию constExpression.<script type="text/javascript" src="cssexpr.js"></script>После этого можно использовать constExpression в любом задаваемом блоке стилей (<style>), или любом


3.1.3. Использование yum

Из книги Fedora 8 Руководство пользователя автора Колисниченко Денис Николаевич

3.1.3. Использование yum Управлением пакетами в Fedora занимается программа yum (Yellow dog Updater Modified) - это и есть менеджер пакетов. С его помощью вы можете устанавливать и удалять пакеты, а также обновлять уже установленные пакеты.Программа yum не обладает графическим интерфейсом,


19.7.2. Использование erb

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл


Использование tar

Из книги Сетевые средства Linux автора Смит Родерик В.

Использование tar Утилита tar — одна из самых популярных программ, используемых для резервного копирования в системах Linux и UNIX. Она объединяет несколько файлов в один файл архива, что упрощает передачу информации по сети и сохранение ее на резервном носителе. Название


Использование tc

Из книги Технология XSLT автора Валиков Алексей Николаевич

Использование tc Утилита tc использует средства ядра, которые активизируются посредством опций меню QoS and/or Fair Queueing. Данная программа управляет исходящим трафиком, в частности, не позволяет одному типу трафика монополизировать пропускную способность линии связи. В


Использование VPN

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

Использование VPN VPN позволяет расширить локальную сеть за счет взаимодействия с внешними компьютерами. Очевидно, что если локальная сеть подключена к Internet, внешние пользователи могут обращаться к ней без VPN. Однако VPN имеет ряд преимуществ перед обычными типами сетевого


Использование

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Использование Так как MSXML уже давно превратился в стандартный компонент Windows, использовать его можно разными способами - например, в собственных приложениях или как ISAPI-расширение. При разработке XSLT-преобразований MSXML, как правило, применяется либо совместно с браузером


Использование

Из книги Разработка ядра Linux автора Лав Роберт

Использование По сути дела, Xalan Java и Xalan C++ — это библиотеки, позволяющие использовать XSLT-преобразования в собственных проектах. Xalan Java поддерживает набор интерфейсов TrAX (от англ. transformation API for XML — программный интерфейс преобразований для XML), определяющий стандартные


Использование

Из книги автора

Использование Легкий вариант, Instant Saxon представляет собой утилиту командной строки saxon.exe, с помощью которой можно применять преобразования к XML-документам:saxon.exe -о result.xml source.xml stylesheet.xslПолная версия Saxon (включающая также исходный код) тоже может использоваться как утилита


Использование

Из книги автора

Использование Главной областью применения Oracle XSLT Processor является его использование совместно с технологиями XSQL и XSU для обеспечения Web-доступа к реляционным данным. Кроме этого, Oracle XSLT Processor легко интегрируется в другие приложения и также может выполняться из командной


Использование

Из книги автора

Использование Как и любой другой XSLT-процессор, написанный на Java, xt можно без труда использовать в Java-проектах. Помимо этого, xt можно использовать в качестве сервлета и из командной строки.Сервлет-версия xt реализована в классе com.jclark.xsl.sax.XSLservlet и может выполняться на


Использование

Из книги автора

Использование Прежде всего, как C-библиотеку, libxslt можно подключать к собственным модулям посредством документированного API, а также при помощи разработанных врапперов использовать в Perl и Python-программах. Поскольку по степени совместимости и разработанности libxslt явно


14.7.1. Использование ftw()

Из книги автора

14.7.1. Использование ftw() #include <ftw.h>int ftw(const char *dir, ftwFunctionPointer callback, int depth);Функция ftw() начинает с каталога dir и вызывает указанную в callback функцию для каждого файла в этом каталоге и его подкаталогах. Функция вызывается для всех типов файлов, включая символические ссылки и


29.4.3. Использование SSI

Из книги автора

29.4.3. Использование SSI Использование сценариев cgi, открывающих Web–страницы с целью отображения небольшого количества сведений, не всегда является оправданным. Например, была отображена дата, но также был создан сценарий cgi, который тоже отображает дату. Не лучше ли было бы


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

Из книги автора

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