GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi la désactivation des interruptions désactive la préemption du noyau et comment le verrou tournant désactive la préemption

Je ne suis pas un gourou de l'ordonnanceur, mais je voudrais expliquer comment je le vois. Voici plusieurs choses.

  1. preempt_disable() ne désactive pas l'IRQ . Il augmente juste un thread_info->preempt_count variables.
  2. La désactivation des interruptions désactive également la préemption car le planificateur ne fonctionne plus après cela, mais uniquement sur une machine à un seul processeur. Sur le SMP, ce n'est pas suffisant car lorsque vous fermez les interruptions sur un processeur, l'autre / les autres font toujours / font quelque chose de manière asynchrone.
  3. Le Big Lock (signifie - fermer toutes les interruptions sur tous les processeurs) ralentit considérablement le système - c'est pourquoi il n'est plus utilisé. C'est aussi la raison pour laquelle preempt_disable() ne ferme pas l'IRQ.

Vous pouvez voir ce qu'est preempt_disable(). Essayez ceci :1. Obtenez un spinlock.2. Planification des appels()

Dans le dmesg, vous verrez quelque chose comme "BUG :planification pendant qu'atomique". Cela se produit lorsque le planificateur détecte que votre processus est dans un contexte atomique (non préemptif) mais qu'il se planifie lui-même.

Bonne chance.


Dans un module de test du noyau que j'ai écrit pour surveiller/profiler une tâche, j'ai essayé de désactiver les interruptions en :

1 - Utilisation de local_irq_save()

2 - Utiliser spin_lock_irqsave()

3 - Désactiver manuellement_irq() à tous les IRQ dans /proc/interrupts

Dans les 3 cas, je pouvais toujours utiliser le hrtimer pour mesurer le temps même si les IRQ étaient désactivés (et une tâche que je surveillais a également été préemptée).

Je trouve cela étrange veeeeerrrryyyy ... Personnellement, j'anticipais ce que Sebastian Mountaniol a souligné -> Pas d'interruption - pas d'horloge. Pas d'horloge - pas de minuteries...

Noyau Linux 2.6.32 sur un seul cœur, un seul CPU... Quelqu'un peut-il avoir une meilleure explication ?


Linux
  1. Redis comme cache :comment ça marche et pourquoi l'utiliser

  2. Pourquoi Scp est-il si lent et comment le rendre plus rapide ?

  3. Comment déboguer le noyau Linux avec GDB et QEMU ?

  4. Comment lire, comprendre, analyser et déboguer une panique du noyau Linux ?

  5. Comment puis-je vérifier ma configuration de préemption du noyau ?

Systèmes de fichiers virtuels sous Linux :pourquoi nous en avons besoin et comment ils fonctionnent

Comment charger et décharger les modules du noyau sous Linux

Principes de base de Linux :comment masquer, verrouiller, chiffrer et sécuriser vos fichiers sous Linux

Noyau Linux 5.9 :nouveautés et mise à niveau

Qu'est-ce que les conteneurs multi-comptes Firefox ? Pourquoi et comment l'utiliser ?

Comment et pourquoi utiliser Linux pour installer Telnet