GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum das Deaktivieren von Interrupts die Kernel-Preemption deaktiviert und wie die Spin-Sperre die Preemption deaktiviert

Ich bin kein Planer-Guru, aber ich möchte erklären, wie ich es sehe. Hier sind einige Dinge.

  1. preempt_disable() deaktiviert IRQ nicht . Es erhöht nur ein thread_info->preempt_count variabel.
  2. Durch das Deaktivieren von Interrupts wird auch die Präemption deaktiviert, da der Scheduler danach nicht mehr funktioniert - aber nur auf einem Computer mit einer CPU. Auf dem SMP reicht es nicht, denn wenn Sie die Interrupts auf einer CPU schließen, tun die anderen / die anderen immer noch / etwas asynchron.
  3. Das Big Lock (bedeutet - das Schließen aller Interrupts auf allen CPUs) verlangsamt das System dramatisch - deshalb wird es nicht mehr verwendet. Das ist auch der Grund, warum preempt_disable() den IRQ nicht schließt.

Sie können sehen, was preempt_disable() ist. Versuchen Sie Folgendes:1. Holen Sie sich ein Spinlock.2. Zeitplan aufrufen()

In der dmesg sehen Sie so etwas wie "BUG:Scheduling While Atomic". Dies geschieht, wenn der Scheduler feststellt, dass sich Ihr Prozess in einem atomaren (nicht präventiven) Kontext befindet, sich jedoch selbst plant.

Viel Glück.


In einem Test-Kernel-Modul, das ich geschrieben habe, um eine Aufgabe zu überwachen/profilieren, habe ich versucht, Interrupts zu deaktivieren durch:

1 - Verwendung von local_irq_save()

2 - Verwendung von spin_lock_irqsave()

3 - Deaktiviere manuell_irq() für alle IRQs in /proc/interrupts

In allen 3 Fällen konnte ich immer noch den hrtimer verwenden, um die Zeit zu messen, obwohl IRQs deaktiviert waren (und eine Aufgabe, die ich überwachte, wurde ebenfalls verhindert).

Ich finde das veeeeerrrryyyy seltsam ... Ich persönlich habe erwartet, was Sebastian Mountaniol darauf hingewiesen hat -> Keine Unterbrechungen - keine Uhr. Keine Uhr - keine Timer...

Linux-Kernel 2.6.32 auf einem einzelnen Kern, einer einzelnen CPU... Kann jemand eine bessere Erklärung haben?


Linux
  1. Benutzerdefinierte Kernel in Ubuntu/Debian – wie, wann und warum

  2. Redis als Cache:Wie es funktioniert und warum man es verwendet

  3. Warum erhalten Sie cp:Weglassen des Verzeichnisfehlers in Linux und wie Sie ihn lösen können

  4. So sperren und entsperren Sie Benutzer in Linux

  5. Wie debuggt man den Linux-Kernel mit GDB und QEMU?

Virtuelle Dateisysteme in Linux:Warum wir sie brauchen und wie sie funktionieren

So laden und entladen Sie Kernel-Module in Linux

Linux-Grundlagen:So verstecken, sperren, verschlüsseln und sichern Sie Ihre Dateien unter Linux

Linux Kernel 5.9:Was ist neu und wie man aktualisiert

Was sind Firefox Multi-Account-Container? Warum und wie wird es verwendet?

Wie und warum Linux zur Installation von Telnet verwendet wird