2010-01-27 23 views
29

Hay muchas maneras de programar el trabajo en el kernel de Linux: temporizadores, tareas, colas de trabajo e hilos del kernel. ¿Cuáles son las pautas para cuándo usar uno frente a otro?Cuándo usar hilos del kernel vs pistas de trabajo en el núcleo de Linux

Hay los factores obvios: funciones de temporizador y tasklets no pueden dormir, así que no pueden esperar en exclusiones mutuas variables de condición, etc.

¿Cuáles son los otros factores en la elección de qué mecanismo para nosotros en un conductor?

¿Cuáles son los mecanismos preferidos?

Respuesta

26

Como usted ha dicho, depende de la tarea en cuestión:

colas de trabajo difieren de trabajo en un hilo del núcleo - que su trabajo siempre se ejecutará en el proceso de contexto. Son programables y, por lo tanto, pueden dormir.

Normalmente, no hay debate entre colas de trabajos o sotftirqs/tasklets; si el trabajo diferido necesita dormir, se utilizan las colas de trabajo, de lo contrario se utilizan softirqs o tasklets. Los tasklets también son más adecuados para el manejo de interrupciones (se les da ciertas garantías tales como: un tasklet nunca se ejecuta más tarde que en el siguiente tic, siempre se serializa con respecto a sí mismo, etc.).

Los temporizadores de núcleo son buenos cuando sabes exactamente cuándo quieres que ocurra algo, y no quieres interrumpir/bloquear un proceso mientras tanto. Se ejecutan fuera del contexto del proceso, y también son asincrónicos con respecto a otro código, por lo que son la fuente de las condiciones de carrera si no tienes cuidado.

Espero que esto ayude.

+0

¿Cómo elegiría entre usar un hilo del núcleo y una cola de trabajo? –

+3

Bueno, la intención detrás de la creación de las workqueues era que reemplazarían parcialmente los hilos del kernel como un medio para programar tareas en el kernel (las últimas son las últimas). una caja se vuelve costosa de administrar. Teniendo esto en cuenta, creo que, en general, preferiría las pistas de trabajo sobre los hilos del kernel para la mayoría de los propósitos. –

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

en realidad, los softirq son infinitamente escalables, es decir, PUEDEN ejecutarse simultáneamente en diferentes CPU: "Softirqs puede ejecutarse simultáneamente en varias CPU, incluso si son del mismo tipo. Por lo tanto, los softirqs son funciones reentrantes y deben proteger explícitamente sus estructuras de datos con spin bloqueos. Tasklets del mismo tipo siempre se serializan: en otras palabras, el mismo tipo de tasklet no puede ser ejecutado por dos CPU al mismo tiempo ". ver: http://www.91kaifa.com/doc/ulk/0596005652/understandlk-chp-4-sect-7.html – user1284631

+4

editar: La serialización es, por supuesto, válida solo para tasklets de * del mismo tipo *. "Tasklets de diferentes tipos se pueden ejecutar al mismo tiempo en varias CPU". – user1284631

+2

axeoth es correcto. Y, un "elemento de trabajo" del mismo tipo en una cola de trabajo no puede ejecutarse simultáneamente en diferentes CPU desde agosto de 2012, porque la cola de trabajo no es reentrante ahora: http://lwn.net/Articles/511421/ – Dexuan

1

Los hilos del núcleo forman la base para las colas de trabajos. Son los únicos tipos de rutinas de kernel helper que se ejecutan dentro del contexto del proceso.

Cuestiones relacionadas