Warum kann das Linux-Preemption-Modell nicht durch Kernel-Parameter geändert werden?

Warum kann das Linux-Preemption-Modell nicht durch Kernel-Parameter geändert werden?

Der Linux-Kernel verfügt über eine große Anzahl vonParameterdie es Benutzern ermöglichen, das Kernelverhalten anzupassen, ohne es neu kompilieren zu müssen. Es scheint keinen Parameter zum Anpassen des Präemptionsmodells zu geben:

-*- Preemption Model
            No Forced Preemption (Server) (PREEMPT_NONE)
        --> Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
            Preemptible Kernel (Low-Latency Desktop) (PREEMPT)

Warum haben die Kernel-Entwickler keinen Schalter hinzugefügt, um zwischen ihnen zu wählen?

Antwort1

Preemption wird durch eine (große) Anzahl expliziter Preemption-Punkte (suchen Sie might_sleepim Kernel nach) implementiert, von denen sich viele in etwas heißen Pfaden befinden. Full Preemption ( CONFIG_PREEMPT) hat sogar noch größere Auswirkungen; Spinlocks beispielsweise prüfen die Anzahl der Preemption-Punkte (zumindest bei Nicht-SMP-Kerneln), ebenso wie IRQs.

Derzeit wird das gewählte Preemption-Modell zur Kompilierzeit angewendet. Ohne erzwungene Preemption bleibt daher kein Preemption-Code im Kernel erhalten und Sie erhalten maximalen Durchsatz. Ebenso verfügt ein Kernel mit freiwilliger Preemption über keine Preemption-Prüfungen in IRQ- und Kernel-Einstiegspunkten. Dies so zu ändern, dass die Preemption zur Laufzeit geändert werden kann, würde bedeuten, dass alle Konfigurationen die Preemption-Einstellung zumindest beim Booten prüfen müssten, was selbst im besten Fall einige Kosten verursachen würde (z.B, selbst wenn die Präemption eine Einstellung beim Systemstart wäre und die Einstellung „keine Präemption“ die relevanten Aufrufsites patchen könnte, würden Sie am Ende immer noch Nichtstun-Code haben, der wertvollen Platz in den Code-Caches einnimmt).

verwandte Informationen