Eine kleine Diskussion vor der Frage. Der Kernel von Linux 2.4 ist nicht präemptiv. Wenn also im Kernelmodus ein Systemaufruf procedent wird, setzen wir nur set_need_resched, um ein Flag zu setzen, und dann, wenn wir zurück in den Benutzermodus gehen, prüfen wir das flag und mache Kontextwechsel.Linux 2.6 Planung und Vorkaufsrecht - preempt_count Verwendung
Lässt man das mit Linux 2.6 vergleichen, das preemptive Kernel hat. Wir können nicht einfach Kernel 2.4 nehmen und set_need_resched (raising flag) in schedule() umwandeln (also in linux kernel 2.6 gibt es einen Zähler preempt_count, der sich jedes Mal bei spin_lock() erhöht und verringert auf spin_unlock().
Eigentlich, dieses Feld "preempt_count" bestimmen, ob der Kernel ausgeschlossen werden kann. Zum Beispiel auf einem von der Uhr Rückkehr unterbrechen, wenn die Bedingung:
(current->need_resched == 1) && (current->preempt_count == 0)
wahr ist, dann der Kern führt kontext Schalter.
Die Frage ist, warum der Kernel von Linux 2.6 Preemption verhindert, wenn eine Sperre vom Typ Spinlock gehalten wird.
Was ist das Szenario, das passieren könnte, wenn der Kernel die Vorbelegung nicht verhindert? Können Sie mir so detailliert wie möglich ein konkretes Beispiel geben?
Vielen Dank.
Mögliche Duplikate von [Warum deaktiviert Linux Kernel-Vorkauf, nachdem der Kernel-Code einen Spinlock hält?] (Https://stackoverflow.com/questions/18254713/why-linux-disables-kernel-preemption-after-the-kernel- Code-Hold-a-Spinlock) – Tsyvarev