Разница между SoftIRQ и тасклетами

Изучая обработку прерываний в Linux, я обнаружил, что Tasklets и SoftIRQ — это два разных метода выполнения «нижней половины» (работы с меньшим приоритетом). Я это понимаю (совершенно неподдельная потребность).

Разница в том, что SoftIRQ повторно входят в систему, а тасклет - нет. Один и тот же SoftIRQ может работать на разных процессорах, чего нельзя сказать о тасклетах.

Хотя я понимаю это с поверхности, но я не понимаю требований двух функций. В каких случаях мы можем использовать эти средства? Как распознать, что сейчас мне следует использовать тасклеты, а потом — SoftIRQ.

Кроме того, что мы подразумеваем под тасклетами, созданными на основе SoftIRQ? В одной из книг, которые я читал по LKML, были дебаты по поводу удаления тасклетов. Я совершенно запутался, зачем вводить такую ​​​​функцию? Какая-то недальновидность (без обид)?

Любые указатели на это очень помогут.


person ultimate cause    schedule 21.08.2011    source источник
comment
lwn.net/Articles/240085   -  person Robert Harvey    schedule 31.07.2012


Ответы (4)


include/linux/interrupt.h

/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
   frequency threaded job scheduling. For almost all the purposes
   tasklets are more than enough. F.e. all serial device BHs et
   al. should be converted to tasklets, not to softirqs.
 */

enum
{
        HI_SOFTIRQ=0,    /* High Priority */
        TIMER_SOFTIRQ,
        NET_TX_SOFTIRQ,
        NET_RX_SOFTIRQ,
        BLOCK_SOFTIRQ,
        BLOCK_IOPOLL_SOFTIRQ,
        TASKLET_SOFTIRQ,
        SCHED_SOFTIRQ,
        HRTIMER_SOFTIRQ,
        RCU_SOFTIRQ,    /* Preferable RCU should always be the last softirq */

        NR_SOFTIRQS
};

Ключевые различия между softirq и tasklet заключаются в следующем:

Распределение

  • Softirqs статически распределяются во время компиляции. В отличие от тасклетов, вы не можете динамически регистрировать и уничтожать программные прерывания.
  • Тасклеты могут быть размещены статически с помощью DECLARE_TASKLET(name, func, data) или также могут быть выделены динамически и инициализированы во время выполнения с помощью tasklet_init(name, func, data)

параллелизм

  • Программные прерывания могут выполняться одновременно на нескольких ЦП, даже если они одного типа, потому что программные прерывания являются reentrant функциями и должны явно защищать свои структуры данных спин-блокировками.
  • Тасклеты non-reentrant, а тасклеты одного и того же типа всегда сериализуются: другими словами, тасклеты одного и того же типа не могут выполняться двумя процессорами одновременно. Однако тасклеты разных типов могут выполняться одновременно на нескольких процессорах.

Обработка

  • Softirqs активируются с помощью файла raise_softirq(). Отложенные отложенные прерывания обрабатываются потоками ядра do_softirq() и ksoftirqd после включения local_bh_enable() или spin_unlock_bh().
  • Тасклеты — это механизм нижней половины, построенный поверх программных прерываний, т. е. тасклеты представлены двумя программными прерываниями: HI_SOFTIRQ и TASKLET_SOFTIRQ. Тасклеты на самом деле запускаются из softirq. Единственная реальная разница между этими типами заключается в том, что тасклеты на основе HI_SOFTIRQ запускаются до тасклетов TASKLET_SOFTIRQ. Итак, tasklet_schedule() в основном звонит raise_softirq(TASKLET_SOFTIRQ)
  • Обратите внимание, что отложенные прерывания (и, следовательно, тасклеты и таймеры) запускаются при возврате из аппаратного прерывания или при возврате из системного вызова. Кроме того, как только поток, вызвавший отложенное прерывание, завершается, запускается одно отложенное прерывание (и другие) для минимизации softirq latency.
person manav m-n    schedule 29.07.2015

Sofirq являются повторно входящими, то есть другой ЦП может взять один и тот же программный прерывание и выполнить его, в то время как тасклеты сериализованы, то есть тот же ЦП, на котором запущен тасклет, имеет право на его выполнение, никакой другой ЦП не может его выполнить (в случае планирования). обратитесь к этой отличной статье.

Также вы можете включить/отключить отложенную обработку, используя local_bh_enable() на локальном ЦП, что фактически делает _ _local_bh_count отличным от нуля.

Также прочитайте эту книгу (бесплатно загружаемый) Номер страницы 131 - который объясняет разницу, а также объяснение с использованием примера кода с поддельным / фиктивным устройством - роликом.

person Raulp    schedule 31.05.2012
comment
Привет @Raul, я знаю, что этот ответ был опубликован давно. Но теперь ссылка на книгу, на которую вы ссылались, больше недоступна. Не могли бы вы вспомнить, о какой книге вы говорили? опубликуйте его имя и, возможно, обновите ссылку? Благодарю. - person hebbo; 06.12.2016

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

person Tejas    schedule 01.10.2014

Тасклеты реализованы поверх программных прерываний, поэтому они являются программными прерываниями. они представлены двумя программными прерываниями «HI_SOFTIRQ & TASKLET_SOFTIRQ», разница в приоритете. Несмотря на то, что они реализованы поверх softirq, они отличаются:

  • Тасклеты могут быть созданы/уничтожены статически или динамически, но softirq только статическим способом.

  • Два разных тасклета могут работать одновременно на одном процессоре. Но два однотипных тасклета не могут работать на одном процессоре. В то время как softirq работает по-другому.

Softirq зарезервированы для наиболее критичной по времени и важной обработки нижней половины в системе.

person Nagi    schedule 16.06.2015