Когда использовать ядровые потоки vs workqueues в ядре linux
Существует множество способов запланировать работу в ядре linux: таймеры, задачи, рабочие очереди и потоки ядра. Каковы рекомендации по использованию одного и другого?
Есть очевидные факторы: функции таймера и таблетки не могут спать, поэтому они не могут ждать мьютексов, переменных условий и т.д.
Каковы другие факторы при выборе того или иного механизма для нас в драйвере?
Каковы предпочтительные механизмы?
Ответы
Ответ 1
Как вы сказали, это зависит от поставленной задачи:
Рабочие очереди откладывают работу в поток ядра - ваша работа будет всегда выполняться в процессе
контекст. Они планируются и могут спать.
Обычно между рабочими очередями или sotftirqs/tasklets нет споров; если отложенная работа должна спать, используются рабочие очереди, в противном случае используются softirqs или tasklets. Задачи также более подходят для обработки прерываний (им предоставляются определенные заверения, такие как: тасклет никогда не запускается позже, чем на следующий тик, он всегда сериализуется по отношению к себе и т.д.).
Таймеры ядра хороши, когда вы точно знаете, когда хотите что-то произойти, и не хотите прерывать/блокировать процесс тем временем. Они запускают внешний контекст процесса, и они также асинхронны в отношении другого кода, поэтому они являются источником условий гонки, если вы не будете осторожны.
Надеюсь, что это поможет.
Ответ 2
softirqs : deferred work runs in interrupt context
tasklets : deferred work runs in interrupt context
work queues : deferred work runs in process context
softirqs : cannot run simultaneously on different CPU's
tasklets : cannot run simultaneously on different CPU's
work queues : can run simultaneously on different CPU's
softirqs : cannot go to sleep
tasklets : cannot go to sleep
work queues : can go to sleep
softirqs : cannot be preempted/schedule
tasklets : cannot be preempted/schedule
work queues : maybe be preempted/schedule
softirqs : not easy to use
tasklets : easy to use
work queues : easy to use
Ответ 3
Нити ядра являются основой для рабочих очередей. Они являются единственными типами вспомогательных подпрограмм ядра, которые выполняются в контексте процесса.