Schlaf (Systemaufruf) - Sleep (system call)

Ein Computerprogramm ( Prozess , Task oder Thread ) kann in den Ruhezustand versetzt werden , wodurch es für einen bestimmten Zeitraum in einen inaktiven Zustand versetzt wird. Schließlich wird der Ablauf eines Intervallzeitgebers oder der Empfang eines Signals oder Interrupt bewirkt , daß das Programm zur Wiederaufnahme der Ausführung.

Verwendung

Ein typischer Sleep- Systemaufruf verwendet einen Zeitwert als Parameter, der die Mindestdauer angibt, die der Prozess in den Ruhezustand versetzt werden soll, bevor die Ausführung wieder aufgenommen wird. Der Parameter gibt normalerweise Sekunden an, obwohl einige Betriebssysteme eine feinere Auflösung bieten, z. B. Millisekunden oder Mikrosekunden.

Fenster

Unter Windows benötigt die Sleep()Funktion einen einzelnen Parameter der Anzahl der Millisekunden bis zum Ruhezustand. Die Sleep()Funktion ist in der kernel32.dll enthalten .

Die Sleep()Funktion hat eine Auflösung, die nicht höher ist als die aktuelle Timer-Auflösung, typischerweise 16 ms, aber mindestens 1 ms, einstellbar über die timeBeginPeriod()Familie der "Media Timer"-APIs. Für höhere Genauigkeiten ist es notwendig, eine Busy-Schleife over zu verwenden QueryPerformanceCounter(), wie sie in gnulib verwendet wird .

Unix

Auf Unix-ähnlichen und anderen POSIX- Betriebssystemen wird die sleep()Funktion aufgerufen, die einen einzelnen Parameter vom Typ vorzeichenlose Ganzzahl der Anzahl der Sekunden für den Ruhezustand bereitstellt. Eine Version mit höherer Genauigkeit ist die nanosleep()Funktion und die jetzt veraltete usleep. POSIX ermöglicht auch die Auswahl von Taktquellen über die erweiterte Version clock_nanosleep().

Eine Version von clock_nanosleep()wurde als Teil der Programmiersprache C vorgeschlagen , aber abgelehnt. Der UTC- Zeitteil desselben Vorschlags wurde zu C11 hinzugefügt .

C-Beispiele

In der Windows-API :

Sleep(2 * 1000);  // Sleep for 2 seconds

Bei Unix- oder POSIX-Systemaufrufen:

sleep(2);       // Sleep for 2 seconds

Low-Level-Funktionalität

Ruhezustand bewirkt, dass der Thread oder Prozess den Rest seiner Zeitscheibe aufgibt und für die angegebene Dauer im Zustand Nicht ausführbar bleibt . Während es im Allgemeinen eine Garantie für den Mindestzeitraum gibt, gibt es keine strikte Garantie dafür, dass der Thread nach Ablauf der angegebenen Zeit sofort oder bald oder sogar überhaupt ausgeführt wird. Es liegt im Ermessen des Schedulers und hängt von den Thread-Prioritäten und Implementierungsdetails wie Timer-Auflösungen ab, wann der schlafende Thread wieder ausgeführt wird.

Auf POSIX-Systemen sind der Nanoschlaf und die zugehörigen Systemaufrufe durch Signale unterbrechbar, wodurch die verbleibende Ruhezeit zurückgegeben wird. Die Sleep- Library-Funktion hingegen wird bei vielen älteren Systemen über den Alarm- Systemaufruf realisiert, funktioniert also nur durch die Abgabe eines Signals . Die Windows-Sleep-Funktion ist nicht unterbrechbar, da keine Signale vorhanden sind (außer dem Thread oder seinem Prozess, der beendet wird). schläft. Außerdem kann ein Thread technisch "unterbrochen" werden, wenn zB der Prozess aufgrund einer Ausnahme in einem anderen Thread beendet wird.

Verwendet

Einige Systemprogramme, die niemals terminieren, führen eine Ereignisschleife aus , gehen zu Beginn jedes Zyklus in den Ruhezustand und warten darauf, dass ein Ereignis sie aufweckt. Sobald ein Ereignis empfangen wurde, bedient das Programm das Ereignis und kehrt dann zum Anfang des nächsten Wartezyklus zurück.

Andere Programme fragen regelmäßig nach Ereignissen, indem sie in den Ruhezustand wechseln und die Ausführung nach einem bestimmten Zeitintervall wieder aufnehmen. Sobald die Ausführung wieder aufgenommen wurde, fragt das Programm nach Ereignissen oder Statusänderungen und verarbeitet dann alle, die während des Ruhezustands aufgetreten sind. Nach der Bedienung der Ereignisse geht das Programm dann für das nächste Zeitintervall wieder in den Ruhezustand. Bestimmte Arten von Heartbeat- Ereignissen oder Keep-Alive- Signalen können durch diese Art von Programmen erzeugt werden.

Der sleep()Funktionsaufruf kann für kurze Zeit wiederholt aufgerufen werden, um die Ausführung eines laufenden Programms oder Codes zu verlangsamen. Ein Drosselungscode auf diese Weise bietet einen groben Mechanismus, um die Auswirkungen einer Überhitzung der Hardware zu mildern oder Timing-Probleme für Legacy-Programme zu lindern. Der Nachteil von zyklischen Schlaf- und Laufzuständen, anstatt die Zyklusemulation (über einen Emulator) zu nutzen, um die Ausführungsgeschwindigkeit von Software zu steuern, besteht darin, dass interaktive Software ein bemerkenswertes Stottern bekommt, wenn zu wenig Zeit wach, zu viel Zeit mit Schlafen verbracht wird oder eine Kombination aus beidem.

Ununterbrochener Schlaf

Ein unterbrechungsfreier Ruhezustand ist ein Ruhezustand, der ein Signal nicht sofort verarbeitet. Es wird nur aktiviert, wenn eine auf eine gewartete Ressource verfügbar wird oder wenn während dieser Wartezeit eine Zeitüberschreitung auftritt (falls angegeben, wenn sie in den Ruhezustand versetzt wird). Es wird hauptsächlich von Gerätetreibern verwendet, die auf Festplatten- oder Netzwerk-E/A (Eingabe/Ausgabe) warten. Wenn der Prozess ununterbrochen schläft, werden während des Ruhezustands angesammelte Signale bemerkt, wenn der Prozess vom Systemaufruf oder Trap zurückkehrt.

In Unix-ähnlichen Systemen verwendet der Befehl ' ps -l' Code " D" für den unterbrechungsfreien Schlafzustand eines Prozesses. Solche Prozesse können nicht einmal beendet werden, SIGKILLund die einzige nicht ausgeklügelte Möglichkeit, sie loszuwerden, besteht darin, das System neu zu starten.

Siehe auch

Verweise