В каком контексте находятся 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 может работать в контексте прерывания или процесса.