Linux Kernel (Ядро линукса) (часть 1)


Softirq-функции и тасклеты

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

Linux справляется с этой проблемой с помощью двух типов прерываемых функций ядра, так называемых функций отложенного выполнения14 (softirq-функций и тасклетов), и функций, выполнение которых обеспечивается рабочими очередями Softirq-функции и тасклеты строго взаимосвязаны, потому что вторые реализованы поверх первых. На самом деле, термин "softirq", встречающийся в исходном коде ядра, нередко обозначает оба типа функций отложенного выполнения.

Другим широко используемым термином является контекст прерывания:

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

Softirq-функции выделяются статически (то есть определяются на этапе компиляции), а тасклеты могут быть также выделены и проинициализированы на этапе выполнения (например, при загрузке модуля ядра). Softirq-функции могут выполняться параллельно на нескольких процессорах, даже если имеют один тип. Иначе говоря, они являются реентерабельными функциями и должны явным образом защищать свои данные с помощью спин-блокировок. Тасклеты не беспокоятся по этому поводу, потому что их выполнение строже контролируется ядром. Тасклеты одного типа всегда сериализованы, т. е. не могут одновременно выполняться на разных процессорах. Что касается тасклетов разных типов, они могут выполняться параллельно на нескольких процессорах. Сериализация тасклетов облегчает жизнь разработчикам драйверов устройств, поскольку эти функции не обязаны быть реентерабельными.
Вообще говоря, над функциями отложенного выполнения могут быть произведены четыре операции:
-Инициализация — определяет новую функцию отложенного выполнения. Эта операция обычно выполняется, когда ядро инициализирует само себя или загружает модуль.
-Активизация— помечает функцию отложенного выполнения как "висящую", т. е. как подлежащую выполнению, когда ядро в следующий раз назначит раунд выполнения таких функций. Активизация может быть произведена в любой момент (даже во время обработки прерывания).
-Маскировка — избирательно запрещает запуск функции отложенного выполнения, так что ядро не станет ее выполнять, даже если она активизирована.
-Выполнение— выполняет висящую функцию отложенного выполнения, вместе с остальными висящими функциями того же типа. Выполнение происходит в строго определенное время, как описано в разд. "Softirq- функции" далее в этой главе.

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

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...