linux kernel - Diferencia entre SoftIRQs y Tasklets
linux-kernel interrupt-handling (4)
Mientras estudiaba el manejo de interrupciones de Linux, descubrí que los Tasklets y los SoftIRQ son dos métodos diferentes para realizar la "mitad inferior" (trabajo de menor prioridad). Entiendo esto (necesidad bastante genuina).
La diferencia es que los SoftIRQ son re-entarantes mientras que un Tasklet NO lo es. Ese mismo SoftIRQ puede ejecutarse en diferentes CPU, mientras que este NO es el caso de Tasklets.
Aunque entiendo esto de la superficie, no logro comprender los requisitos de las dos características. ¿En qué caso (s) podemos utilizar estas instalaciones? Cómo reconocer que debería usar Tasklets ahora y SoftIRQ entonces.
También, ¿qué queremos decir con Tasklets que se crean en SoftIRQs? En uno de los libros que leí en LKML hubo debates sobre la eliminación de Tasklets. Me confundí por completo por qué uno traería tal característica? Alguna miopía (sin ofender)
Cualquier sugerencia sobre esto ayudará mucho.
Los Sofirqs son reingresantes, es decir, la CPU diferente puede tomar el mismo softirq y ejecutarlo, mientras que los Tasklets están serializados, es decir, la misma CPU que ejecuta el tasklet tiene el derecho de completarlo, ninguna otra CPU puede tomarlo (en caso de que de programación). Consulte este excellent artículo.
También puede habilitar / deshabilitar el procesamiento de diferimientos utilizando el local_bh_enable () en la CPU local, lo que en realidad hace que _ _local_bh_count no sea cero.
Lea también este libro (descargable de forma gratuita), página número 131, que explica la diferencia y explica cómo utilizar el código con un dispositivo falso / falso: rodillo.
Los Tasklets se implementan sobre softirq''s, por lo que son softirq''s. están representados por la diferencia "HI_SOFTIRQ & TASKLET_SOFTIRQ" de dos softirq es la prioridad. Aunque se implementan en la parte superior de softirq, se diferencian en:
Los Tasklets se pueden crear / destruir de forma estática o dinámica, pero los softirq son solo de forma estática.
Dos tasklets diferentes pueden ejecutarse simultáneamente en la misma CPU. Pero dos del mismo tipo de tasklets no pueden ejecutarse en la misma CPU. Mientras que los softirq son de otra manera.
Los softirq están reservados para el procesamiento de la mitad inferior de la mayoría del tiempo crítico e importante en el sistema.
Los softirqs se asignan estáticamente en tiempo de compilación. A diferencia de los tasklets, no puede registrar y destruir softirq dinámicamente. Los tasklets son similares a softirqs (en funcionamiento), sin embargo, tienen una interfaz más sencilla. Los softirqs son necesarios solo para aplicaciones de muy alta frecuencia y altamente subprocesos, mientras que, las herramientas de tareas funcionan bien en cualquier otro caso.
/* PLEASE, avoid to allocate new softirqs, if you need not _really_ high
frequency threaded job scheduling. For almost all the purposes
tasklets are more than enough. F.e. all serial device BHs et
al. should be converted to tasklets, not to softirqs.
*/
enum
{
HI_SOFTIRQ=0, /* High Priority */
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
BLOCK_IOPOLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq */
NR_SOFTIRQS
};
Las diferencias clave entre softirq
y tasklet
son:
Asignación
- Los softirqs se asignan estáticamente en tiempo de compilación. A diferencia de los tasklets, no puede registrar y destruir softirqs dinámicamente.
- Los Tasklets pueden asignarse estáticamente utilizando
DECLARE_TASKLET(name, func, data)
o también pueden asignarse dinámicamente e inicializarse en tiempo de ejecución utilizandotasklet_init(name, func, data)
Concurrencia
- Los softirqs pueden ejecutarse simultáneamente en varias CPU, incluso si son del mismo tipo porque los softirqs son funciones
reentrant
y deben proteger explícitamente sus estructuras de datos con los spinlocks. - Los Tasklets
non-reentrant
sonnon-reentrant
y los 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. Sin embargo, los tasklets de diferentes tipos pueden ejecutarse simultáneamente en varias CPU.
Tratamiento
- Los softirqs se activan mediante
raise_softirq()
. Los softirqs pendientes son procesados pordo_softirq()
yksoftirqd
subproceso del kernel después de ser habilitados porlocal_bh_enable()
o porspin_unlock_bh()
- Los Tasklets son un mecanismo de la mitad inferior construido sobre softirqs, es decir, los tasklets están representados por dos softirqs:
HI_SOFTIRQ
yTASKLET_SOFTIRQ
. Los Tasklets se ejecutan realmente desde un softirq. La única diferencia real en estos tipos es que lasHI_SOFTIRQ
basadas enHI_SOFTIRQ
ejecutan antes de lasTASKLET_SOFTIRQ
. Entonces,tasklet_schedule()
básicamente llamaraise_softirq(TASKLET_SOFTIRQ)
- Tenga en cuenta que los softirqs (y, por lo tanto, los tasklets y los temporizadores) se ejecutan en el retorno de interrupciones de hardware, o en el retorno de una llamada del sistema. También, tan pronto como el hilo que elevó el softirq termina, ese solo softirq (y en otro) se ejecuta para minimizar la
softirq latency
.