В каком контексте находятся softirq и tasklet?

Я знаю, что есть контекст процесса и контекст прерывания, но я не понимаю, когда выполняется softirq или тасклет, в каком контексте он запускается.

Я видел, как некоторые люди используют термин "контекст нижних половин", если такой термин есть, в чем разница по сравнению с другими.

Другой вопрос к softirq и тасклету заключается в том, почему не разрешается спать во время выполнения??

Может кто-нибудь помочь мне определить эти вопросы, спасибо!

3 ответа

Решение

Softirq и тасклет оба являются механизмом нижних половин. Сон не разрешен, потому что они работают в контексте прерывания, а не в контексте процесса. Если режим сна разрешен, Linux не может их запланировать и, наконец, вызвать панику ядра с ошибкой dequeue_task. Контекст прерывания даже не имеет структуры данных, описывающей информацию о регистре, поэтому они никогда не могут планироваться linux. Если он разработан с такой структурой и может быть запланирован, производительность процесса обработки прерываний будет затронута.

@kai: ваш qs reg, в каком контексте выполняются нижние половины?

Технически, softirq работает в контексте прерывания - контекст "softirq"; просто это не "hard-irq" контекст (который является контекстом, когда происходит аппаратное прерывание).

Итак, в обработчике softirq в терминах макросов lookup Linux предоставляет:

in_interrupt: да | in_irq: нет | in_softirq: да | in_serving_softirq: да

Но имейте в виду (будьте осторожны!!!:): "все ограничения, которые применяются к обработчикам прерываний, также применяются к нижним половинам. Таким образом, нижние половины не могут спать, не могут получить доступ к пользовательскому пространству и не могут вызывать планировщик". - LDD3.

Джермейн отвечает на остальную часть вашего вопроса.

[Обновление] Кроме того, я хотел бы отметить, что можно определить простые и элегантные макросы, которые помогают печатать отладочную информацию по мере необходимости. За эти годы я поместил эти макросы и вспомогательные процедуры в заголовочный файл; Вы можете проверить это и скачать здесь: "Удобный заголовок".

Есть макросы / функции для:

  • производить отладочную печать вместе с funcname / line# info (через обычные printk() или trace_printk()) и только если включен режим DEBUG
    • выгрузить стек режима ядра
    • печатать текущий контекст (обрабатывать или прерывать вместе с флагами в форме, которую использует ftrace)
    • простой макрос assert() (!)
    • DELAY_LOOP с интенсивным использованием процессора (полезно для тестовых установок, которые должны вращаться на процессоре)
    • эквивалент пользовательского режима сна
    • функция для расчета дельты времени по двум временным меткам (временные структуры)
    • преобразовать десятичную в двоичную и
    • еще несколько.

Вот так:-)

Я согласен с принятым ответом и ответом Кайвана, но они не упомянули ksoftirqd. Если ЦП находится под большой нагрузкой программных и / или тасклетов, он планирует свой поток ksfotirqd, который обрабатывает поднятые программные компоненты и тасклеты в контексте процесса.

Поэтому я думаю, что ответом на вопрос OP было бы: softirqs может работать в контексте прерывания или процесса.

Другие вопросы по тегам