2010-01-27 2 views
29

Существует множество способов запланировать работу в ядре linux: таймеры, задачи, рабочие очереди и потоки ядра. Каковы рекомендации по использованию одного и другого?Когда использовать потоки ядра vs workqueues в ядре linux

Есть очевидные факторы: функции таймера и тасклеты не может спать, так что они не могут ждать мьютексы, условные переменные и т.д.

Какие другие факторы в выборе которых механизм нам в драйвере?

Каковы предпочтительные механизмы?

ответ

26

Как вы сказали, это зависит от поставленной задачи:

очереди работы отложить работу в нить ядра - ваша работа всегда будет работать в процессе контексте. Они планируются и могут спать.

Обычно не существует дебатов между рабочими очередями или sotftirqs/tasklets; если отложенная работа должна спать, используются рабочие очереди, в противном случае используются softirqs или tasklets. Задачи также более подходят для обработки прерываний (им предоставляются определенные заверения, такие как: тасклет никогда не запускается позже, чем на следующий тик, он всегда сериализуется по отношению к себе и т. Д.).

Таймеры ядра хороши, когда вы точно знаете, когда хотите что-то произойти, и не хотите прерывать/блокировать процесс тем временем. Они запускают внешний контекст процесса, и они также асинхронны в отношении другого кода, поэтому они являются источником условий гонки, если вы не будете осторожны.

Надеюсь, это поможет.

+0

Как бы вы выбрали использование потока ядра и рабочей очереди? –

+3

Ну, цель создания рабочих мест состояла в том, что они частично заменяли потоки ядра как средство планирования задач в ядре (ленивые рабочие места были последними усилиями для решения этого), поскольку в какой-то момент количество потоков ядра в коробка становится дорогостоящей для управления. Имея это в виду, я думаю, что я вообще предпочитаю работу над потоками ядра для большинства целей и задач. –

30
 
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 
+11

на самом деле, softirq являются бесконечно масштабируемыми, то есть они МОГУТ запускаться одновременно на разных ЦП: «Softirq могут работать одновременно на нескольких процессорах, даже если они одного типа. Таким образом, softirqs являются реентерабельными функциями и должны явно защищать свои структуры данных с помощью спин-блокировки. Задачи одного типа всегда сериализуются: другими словами, один и тот же тип таблеток не может выполняться одновременно двумя процессорами ». см .: http://www.91kaifa.com/doc/ulk/0596005652/understandlk-chp-4-sect-7.html – user1284631

+4

Редактирование: Сериализация, конечно, действительна только для таблеток * того же типа *. «Задачи разных типов могут выполняться одновременно на нескольких процессорах». – user1284631

+2

axeoth правильный. И, «рабочий элемент» того же типа в рабочей группе не может запускаться одновременно на разных ЦП с августа 2012 года, так как теперь рабочий вопрос не является реентерабельным: http://lwn.net/Articles/511421/ – Dexuan

1

Нити ядра являются основой для рабочих очередей. Они являются единственными типами вспомогательных подпрограмм ядра, которые выполняются в контексте процесса.

Смежные вопросы