Разница между SoftIRQ и тасклетами - PullRequest
21 голосов
/ 21 августа 2011

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

Разница в том, что SoftIRQ являются реентератными, а тасклет - НЕ.Тот же SoftIRQ может работать на разных процессорах, хотя это не относится к тасклетам.

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

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

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

Ответы [ 4 ]

16 голосов
/ 29 июля 2015

включить / 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:

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

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

параллелизм

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

Обработка

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

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

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

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

2 голосов
/ 01 октября 2014

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

1 голос
/ 16 июня 2015

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

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

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

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

...