Wenn sich ein Prozess im Benutzermodus befindet, kann er jederzeit unterbrochen werden (Umschalten in den Kernelmodus). Wenn der Kernel in den Benutzermodus zurückkehrt, prüft er, ob Signale anstehen (einschließlich derjenigen, die zum Beenden des Prozesses verwendet werden, wie z. B. SIGTERM
und SIGKILL
). Dies bedeutet, dass ein Prozess nur bei Rückkehr in den Benutzermodus abgebrochen werden kann.
Der Grund, warum ein Prozess im Kernelmodus nicht beendet werden kann, besteht darin, dass er möglicherweise die Kernelstrukturen beschädigen kann, die von allen anderen Prozessen auf demselben Computer verwendet werden (auf die gleiche Weise kann das Beenden eines Threads möglicherweise Datenstrukturen beschädigen, die von anderen Threads im selben Prozess verwendet werden). .
Wenn der Kernel etwas tun muss, das lange dauern kann (z. B. Warten auf eine Pipe, die von einem anderen Prozess geschrieben wurde, oder Warten, bis die Hardware etwas tut), schläft er, indem er sich als "Sleeping" markiert und den Scheduler aufruft, um zu einem anderen zu wechseln Prozess (wenn es keinen nicht schlafenden Prozess gibt, wechselt er zu einem "Dummy" -Prozess, der die CPU anweist, etwas langsamer zu werden, und sich in einer Schleife befindet - der Leerlaufschleife).
Wenn ein Signal an einen Ruhevorgang gesendet wird, muss es aufgeweckt werden, bevor es in den Benutzerbereich zurückkehrt und somit das anstehende Signal verarbeitet. Hier haben wir den Unterschied zwischen den beiden Hauptschlafarten:
TASK_INTERRUPTIBLE
, der unterbrechbare Schlaf. Wenn eine Aufgabe mit diesem Flag markiert ist, schläft sie, kann aber durch Signale geweckt werden. Dies bedeutet, dass der Code, der die Aufgabe als schlafend markiert hat, ein mögliches Signal erwartet und nach dem Aufwachen danach sucht und vom Systemaufruf zurückkehrt. Nachdem das Signal verarbeitet wurde, kann der Systemaufruf möglicherweise automatisch neu gestartet werden (und ich werde nicht näher darauf eingehen, wie das funktioniert).
TASK_UNINTERRUPTIBLE
, der ununterbrochene Schlaf. Wenn eine Aufgabe mit diesem Flag markiert ist, erwartet sie nicht, von etwas anderem als dem, worauf sie wartet, geweckt zu werden, entweder weil sie nicht einfach neu gestartet werden kann oder weil Programme erwarten, dass der Systemaufruf atomar ist. Dies kann auch für Schlafstörungen verwendet werden, von denen bekannt ist, dass sie sehr kurz sind.
TASK_KILLABLE
(erwähnt in dem LWN-Artikel, auf den durch die Antwort von ddaa verwiesen wird) ist eine neue Variante.
Dies beantwortet Ihre erste Frage. Zu Ihrer zweiten Frage: Sie können einen unterbrechungsfreien Schlaf nicht vermeiden, er ist eine normale Sache (dies geschieht beispielsweise jedes Mal, wenn ein Prozess von / auf die Festplatte liest / schreibt). Sie sollten jedoch nur einen Bruchteil einer Sekunde dauern. Wenn sie viel länger dauern, handelt es sich normalerweise um ein Hardwareproblem (oder ein Gerätetreiberproblem, das für den Kernel gleich aussieht), bei dem der Gerätetreiber darauf wartet, dass die Hardware etwas tut, was niemals passieren wird. Dies kann auch bedeuten, dass Sie NFS verwenden und der NFS-Server nicht verfügbar ist (er wartet auf die Wiederherstellung des Servers; Sie können auch die Option "intr" verwenden, um das Problem zu vermeiden).
Der Grund, warum Sie nicht wiederherstellen können, ist derselbe, warum der Kernel wartet, bis er in den Benutzermodus zurückkehrt, um ein Signal zu liefern oder den Prozess abzubrechen: Dies würde möglicherweise die Datenstrukturen des Kernels beschädigen (Code, der auf einen unterbrechbaren Ruhezustand wartet, kann einen Fehler erhalten, der ihn anzeigt um in den Benutzerbereich zurückzukehren, in dem der Prozess abgebrochen werden kann; Code, der auf einen unterbrechungsfreien Ruhezustand wartet, erwartet keinen Fehler).
TASK_UNINTERUPTIBLE
Zustand versetzt wird, wenn sich das System nicht im Ruhezustand befindet, wodurch zwangsweise Daten gesammelt werden, die auf die Übertragung warten, sobald der Superuser beendet wird? Dies wäre eine Goldmine für Hacker, um Informationen abzurufen, in den Zombie-Status zurückzukehren und Informationen im Leerlauf über das Netzwerk zu übertragen. Einige können argumentieren, dass dies eine Möglichkeit ist, eineBlackdoor
für die Mächte zu schaffen, jedes System wie gewünscht zu betreten und zu verlassen. Ich bin der festen