Der Kernel übernimmt im normalen Betrieb recht häufig die Kontrolle:immer dann, wenn ein Prozess einen Systemaufruf aufruft, und immer dann, wenn ein Interrupt auftritt. Interrupts treten auf, wenn die Hardware die Aufmerksamkeit der CPU möchte oder wenn die CPU die Aufmerksamkeit des Kernels möchte, und ein bestimmtes Stück Hardware kann so programmiert werden, dass es regelmäßig Aufmerksamkeit anfordert (der Timer). So kann der Kernel sicherstellen, dass er periodisch aufgerufen wird, solange das System nicht so stark blockiert, dass keine Interrupts mehr generiert werden.
Als Ergebnis
wenn dieser Prozess eine extrem lang andauernde Berechnung ohne Ergebnis durchführt
ist kein Problem:Linux ist ein preemptives Multitasking-Betriebssystem, d.h. Es ist multitaskingfähig, ohne dass die Zusammenarbeit laufender Programme erforderlich ist.
Wenn es um das Töten von Prozessen geht, ist der Kernel ohnehin involviert. Wenn ein Prozess einen anderen Prozess beenden möchte, muss er den Kernel dazu aufrufen, damit der Kernel die Kontrolle hat. Wenn der Kernel entscheidet, einen Prozess zu beenden (z.B. der OOM-Killer, oder weil der Prozess versucht hat, etwas zu tun, was ihm nicht erlaubt ist, wie z. B. auf nicht zugeordneten Speicher zuzugreifen), hat er auch die Kontrolle.
Beachten Sie, dass der Kernel auf nicht konfiguriert werden kann eine Teilmenge der CPUs eines Systems selbst steuern (unter Verwendung des veralteten isolcpus
Kernel-Parameter) oder Aufgaben auf bestimmten CPUs selbst nicht zu planen (unter Verwendung von CPU-Sets ohne Lastausgleich, die vollständig in cgroup v1 und cgroup v2 integriert sind); aber mindestens eine CPU im System muss immer vollständig vom Kernel verwaltet werden. Es kann auch so konfiguriert werden, dass es die Anzahl der generierten Timer-Interrupts reduziert, je nachdem, wofür eine bestimmte CPU verwendet wird.
Es gibt auch keinen großen Unterschied zwischen Single-CPU-Systemen (Single-Core usw.) und Multi-CPU-Systemen. Hinsichtlich der Kernel-Steuerung gelten für beide die gleichen Bedenken:Jede CPU muss den Kernel regelmäßig aufrufen, wenn dies der Fall ist für Multitasking unter Kernel-Steuerung verwendet werden.
Linux und die meisten modernen Betriebssysteme verwenden preemptives Multitasking, was bedeutet, dass der Kernel die vollständige Kontrolle über die Zeit hat, in der jeder Prozess ausgeführt werden darf, und einen Prozess unterbindet, wenn er zu lange läuft, im Gegensatz zu kooperativem Multitasking, bei dem ein Prozess die Kontrolle übergibt, wann immer er möchte
Grundsätzlich wird der Kernel beim präemptiven Multitasking regelmäßig von einem Timer ausgelöst, und immer wenn der Kernel die Kontrolle hat (wenn der Timer-Interrupt auftritt oder ein Systemaufruf aufgerufen wird), speichert der Kernel den Kontext des aktuellen Prozesses und wechselt dann zum nächsten Prozess ' Kontext. Dies wird als Kontextwechsel bezeichnet, bei dem der gesamte Status des Prozesses einschließlich aller Thread-Informationen, Registerwerte ... gespeichert und wiederhergestellt wird, damit der Prozess genau an dem Punkt weiterläuft, an dem er unterbrochen wurde, ohne zu wissen, dass er nicht kontinuierlich ausgeführt wurde. Daher werden viele Prozesse erscheinen gleichzeitig in einem einzelnen CPU-Kern ausgeführt werden, obwohl in Wirklichkeit zu jedem Zeitpunkt nur 1 Prozess ausgeführt wird. Der Kernel ist auch nur ein spezieller Prozess, der die gesamte Prozess- und Ressourcenverwaltung übernimmt. Es wird nicht von einem separaten Kern ausgeführt, nur um andere Prozesse zu überwachen
Siehe auch Was bedeutet die Aussage „Linux-Kernel ist präventiv“?