Quand utiliser les threads du kernel contre les files de travail dans le kernel Linux

Il existe de nombreuses manières de planifier le travail dans le kernel Linux: timers, tasklets, files de travail et threads du kernel. Quelles sont les directives pour savoir quand utiliser l’un contre l’autre?

Il y a des facteurs évidents: les fonctions de timer et les tâches ne peuvent pas dormir, elles ne peuvent donc pas attendre les mutex, les variables de condition, etc.

Quels sont les autres facteurs dans le choix du mécanisme à nous dans un conducteur?

Quels sont les mécanismes préférés?

Comme vous l’avez dit, cela dépend de la tâche à accomplir:

Les files d’attente de travail reportent le travail dans un thread de kernel – votre travail s’exécutera toujours dans un contexte de processus. Ils sont programmables et peuvent donc dormir.

Normalement, il n’ya pas de débat entre les files d’attente ou les tâches / tâches; Si le travail différé doit être interrompu, des files d’attente de travail sont utilisées, sinon les softirqs ou les tasklets sont utilisés. Les tâches sont également plus adaptées à la gestion des interruptions (certaines garanties leur sont données: une tâche n’est jamais exécutée plus tard que la suivante, elle est toujours sérialisée par rapport à elle-même, etc.).

Les minuteurs du kernel sont bons lorsque vous savez exactement quand vous voulez que quelque chose se produise et que vous ne voulez pas interrompre / bloquer un processus entre-temps. Ils s’exécutent en dehors du contexte du processus et sont également asynchrones par rapport aux autres codes. Ils sont donc la source des conditions de concurrence si vous ne faites pas attention.

J’espère que cela t’aides.

 softirqs: le travail différé s'exécute dans un contexte d'interruption
 tasklets: le travail différé s'exécute dans un contexte d'interruption
 files d'attente de travail: le travail différé s'exécute dans un contexte de processus

 softirqs: ne peut pas s'exécuter simultanément sur différents processeurs
 tâches: ne peuvent pas s'exécuter simultanément sur différents processeurs
 files d'attente de travail: peuvent s'exécuter simultanément sur différents processeurs

 softirqs: ne peut pas aller dormir
 tâches: ne peut pas aller dormir
 files d'attente: peut aller dormir

 softirqs: ne peut pas être préempté / planification
 tâches: ne peuvent pas être préemptées / planification
 files d'attente de travail: peut-être être préempté / planification

 softirqs: pas facile à utiliser
 tasklets: facile à utiliser
 files d'attente: faciles à utiliser

Les threads du kernel constituent la base des files d’attente de travail. Ce sont les seuls types de routines d’assistance du kernel qui s’exécutent dans le contexte du processus.