Différence entre les SoftIRQs et les Tasklets

en étudiant la gestion des interruptions Linux, j'ai découvert que les Tasklets et les SoftIRQs sont deux méthodes différentes pour effectuer "la moitié inférieure" (travail moins prioritaire). Je comprends cela (besoin tout à fait authentique).

Différence étant, SoftIRQs sont re-entarant tandis qu'une Tasklet ne l'est PAS. Ce même SoftIRQ peut fonctionner sur différents CPU alors que ce n'est pas le cas avec les Tasklets.

bien que je comprenne cela de la surface mais je ne comprends pas les exigences des deux caractéristiques. Dans dans quels cas pouvons-nous utiliser ces installations ? Comment reconnaître que je devrais utiliser Tasklets maintenant et SoftIRQs alors.

Qu'entendons-nous par Tasklets sont fabriqués sur des SoftIRQs ? Dans un des livres que j'ai lu dans LKML il y avait des débats sur la suppression des tâches. Je suis complètement confus pourquoi proposer une telle fonctionnalité ? Une certaine myopie (sans vouloir vous offenser) ?

les pointeurs sur cela aidera beaucoup.

21
demandé sur manav m-n 2011-08-21 12:25:55

4 réponses

include/linux / interrompre.h

/* 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
};

Les principales différences entre softirq et tasklet:

Affectation

  • les Softirq sont statiquement attribués lors de la compilation. Contrairement aux tasklets, vous ne pouvez pas enregistrer dynamiquement et détruire les softirqs.
  • les tâches peuvent être attribuées statiquement en utilisant DECLARE_TASKLET(name, func, data) ou peut aussi être alloué dynamiquement et initialisé à l'exécution en utilisant tasklet_init(name, func, data)

concurrence

  • Softirqs peut fonctionner simultanément sur plusieurs CPU, même s'ils sont du même type car les softirqs sont reentrant et doivent protéger explicitement leurs structures de données avec des spinlocks.
  • Tasklets sont non-reentrant et les tasklets du même type sont toujours sérialisés: en d'autres termes, le même type de tasklet ne peut pas être exécuté par deux CPU en même temps. Cependant, tasklets de différentes les types peuvent être exécutés simultanément sur plusieurs CPU.

Traitement

  • les Softirqs sont activés au moyen du raise_softirq(). Les softirqs en attente sont traités par do_softirq() et ksoftirqd thread du noyau après avoir été activé par local_bh_enable() ou par spin_unlock_bh()
  • les Tasklets sont un mécanisme de la moitié inférieure construit sur le dessus des softirqs c.-à-d. les tasklets sont représentés par deux softirqs: HI_SOFTIRQ et TASKLET_SOFTIRQ. Les tâches sont en fait exécutées à partir d'un softirq. La seule vraie différence dans ces types est que le HI_SOFTIRQ les tasklets basés s'exécutent avant le TASKLET_SOFTIRQ tasklets. Donc, tasklet_schedule() en gros des appels raise_softirq(TASKLET_SOFTIRQ)
  • Notez que softirqs (et donc tasklets et compteurs) sont exécutées sur retour d'interruptions matérielles, ou au retour d'un appel système. En outre, dès que le fil qui a soulevé le softirq se termine, ce softirq simple (et sur d'autres) est exécuté pour minimiser softirq latency.
14
répondu manav m-n 2015-08-01 21:33:20

Sofirqs sont re-entrant , c'est-à-dire que les différents CPU peuvent prendre le même softirq et l'exécuter tandis que les Tasklets sont sérialisés qui est le même CPU qui exécute la tasklet a le droit de le compléter, aucun autre CPU ne peut le prendre(en cas de planification). consultez ce excellent l'article.

vous pouvez également activer / désactiver le traitement defer en utilisant le local_bh_enable () sur le CPU local qui rend en fait le _ _ _local_bh_count non zéro.

lu ce livre (téléchargement gratuit) Page numéro 131 - qui explique la différence ainsi que l'explication en utilisant l'exemple de code avec un faux/dispositif factice - rouleau.

11
répondu Raulp 2016-12-06 21:55:48

les Softirq sont statiquement attribués lors de la compilation. Contrairement aux tasklets, vous ne pouvez pas enregistrer dynamiquement et détruire les softirqs.Les Tasklets sont similaires aux softirqs (working) mais ils ont une interface plus simple. Les Softirqs ne sont nécessaires que pour les très hautes fréquences et les utilisations très filetées , alors que les tasklets sont parfaits dans tous les autres cas.

2
répondu Tejas 2014-10-01 05:09:24

les Tasklets sont implémentés en plus des softirq, donc ce sont des softirq. ils sont représentés par deux softirq "HI_SOFTIRQ & TASKLET_SOFTIRQ" la différence est prioritaire. Même s'ils sont implémentés en plus des softirq, ils diffèrent en:

  • les tâches peuvent être créées ou détruites statiquement ou dynamiquement, mais les softirq ne le sont que de manière statique.

  • deux tâches différentes peuvent être exécutées simultanément sur un même cpu. Mais deux tasklets du même type ne peut pas s'exécuter sur le même processeur. Alors que les softirq sont dans l'autre sens.

Softirq's sont réservés pour la plupart de temps critique et important traitement de la moitié inférieure sur le système.

1
répondu Nagi 2015-08-26 06:49:44