2009-11-12 4 views
17

Ich bin nur daran interessiert, wie sleep(time in ms) in einer C-Bibliothek implementiert ist oder grundsätzlich auf OS-Ebene ...Wie wird Sleep auf Betriebssystemebene implementiert?

Ich vermute, ...

  1. die auf der Basis der Prozessorgeschwindigkeit Sie tun sein kann While-Schleife von nop's (Ich bin mir nicht sicher, ob die Ruhezeit genau sein wird) ...
  2. Jedes spezielle Register im Prozessor, wo Sie einen Wert schreiben und der Prozessor einfach für bestimmte Zeit anhält (dies wäre sehr ineffizient als die Prozessor kann nicht einmal andere Programme ausführen).

Irgendwelche Hinweise? Wahrscheinlich kann C-Bibliothek Quellcode erklären? Ich bin nicht sonderlich darüber, wie "C" es implementiert ... Ich frage mich im Allgemeinen, wie die "sleep()" - Funktion implementiert wird.

Antwort

14

Sleep() ist auf Betriebssystemebene implementiert. Der Prozessor dreht sich nicht, wenn eine Task/ein Thread/Prozess schläft. Dieser bestimmte Thread wird in eine ausstehende Warteschlange (der Thread ist nicht bereit zum Ausführen) versetzt, bis die Zeit abgelaufen ist. Zu diesem Zeitpunkt wird der Thread in die Bereitschaftswarteschlange gestellt.

In der Zwischenzeit werden andere ausführbare Threads ausgeführt.

Nur wenn keine Threads zur Ausführung bereit sind, geht das Betriebssystem in den Leerlauf-Thread, der im Allgemeinen Anweisungen zum Herunterfahren (oder ohnehin in einen stromsparenden Zustand) des Prozessors gibt, bis ein Hardwareinterrupt auftritt.

Nur für ein sehr einfaches System (wie das einfachste von eingebetteten Systemen), könnte Sleep() tatsächlich als nichts weiter als eine ausgelastete Warteschleife implementiert werden.

Jedes Betriebssystem Lehrbuch, wie "Modern Operating Systems" by Tanenbaum wird dies im Detail abdecken - so ziemlich alle von ihnen (auch eine alte, billige, gebrauchte).

+0

ahhh .. so dass ihr nicht nach der Zeit, um aufzuwachen garantiert .. Die an den Scheduler oder grundsätzlich andere Aufgaben im System ... ?? – FatDaemon

+3

Wie schnell nach Ablauf des Zeitlimits die Task erneut ausgeführt wird, hängt vom Scheduler ab. Das System kann garantieren, dass es ausgeführt wird, sobald das Zeitlimit abgelaufen ist, aber ich denke, die meisten werden es einfach an der entsprechenden Stelle in der Ready-to-Run-Warteschlange platzieren (die vorne liegt, wenn die Thread-Priorität größer ist als jede andere), und es wird ausgeführt, wenn es als nächstes geplant ist. –

+0

Viele Embedded-Prozessoren haben einen eigenen Schlaf Anweisung – mocj

2

Die Antwort auf Ihre Frage ist vollständig betriebssystem- und implementierungsabhängig.

Eine einfache Möglichkeit, darüber nachzudenken: Wenn Sie sleep() aufrufen, berechnet das Betriebssystem die Aufwachzeit und steckt Ihren Prozess dann irgendwo in eine Prioritätswarteschlange. Es plant dann einfach nicht Ihren Prozess, um Ausführungszeit zu erhalten, bis genug real Zeit für das Abspringen aus der Warteschlange überschritten wurde.

1

Sie tun nicht While-Schleifen, da sonst das System nicht in der Lage sein, etwas zu tun - reagiert nicht auf die Maus, Tastatur, Netzwerk usw.

die Regel, was die meisten Betriebssysteme tun ist, fügen Sie die Verzögerung des aktuellen Zeitstempels, um den Zeitstempel zu erhalten, wenn der Task, der die Verzögerung angefordert hat, wieder aufgenommen wird (vorausgesetzt, dass zu diesem Zeitpunkt keine Task mit höherer Priorität ausgeführt wird) und der [wakeupTimestamp, Taskzeiger] zu einer Liste hinzugefügt wird, die nach aufsteigend sortiert ist nach dem Zeitstempel. Danach führt das OS einen Kontextwechsel durch und führt die nächste verfügbare Task aus. Das System vergleicht regelmäßig den frühesten Zeitstempel auf der Sleepy-Liste mit dem aktuellen Zeitstempel und wenn der Deadline verstrichen ist, verschiebt es den Sleeping-Task in die Task-Warteschlange "bereit".

+0

Wie kommt es, dass Sie im zweiten Teil etwas Intelligentes sagen und im ersten Teil so dumm? Eine While-Schleife ist präemptiv und stört kein Mausereignis. –

2

In einem typischen Betriebssystem ruft Sleep den Kernel auf, der den Prozess so lange warten lässt, bis die angegebene Zeit verstrichen ist, und dann einen anderen Prozess ausführt. Wenn nichts Besseres zu tun ist, wird der Leerlaufprozess ausgeführt.Sobald die Zeit verstrichen ist, wird der Scheduler bemerken, dass der Schlafprozess gut ist und er wird ihn erneut planen.

+0

Absolut und es ist zu beachten, dass der Idle-Prozess ein Prozess ist, der den HLT-Befehl ausführt. In modernen CPUs wird es sehr komplex und abhängig von der Dauer der Ruhezeit wird es in CN-Modi gehen. (C0 wach, C1 kurz schlafen, ... C7 lang schlafen) –

1

Schlaf blockiert Ihre Aufgabe/Thread für den Zeitwert übergeben. Ihre Aufgabe wird für diesen Zeitraum oder solange, bis etwas anderes Interessantes passiert (wie ein Signal), nicht mehr ausführbar, je nachdem, was früher eintritt.

Es ist nicht ungewöhnlich für den Schlaf wählen() aufrufen und keine Deskriptoren passieren zu auf warten und ein Timeout-Wert gleich Ihre Schlafperiode.

Das System kann dies durch Einstellen eines Timer implementieren abzulaufen, nachdem die Zeit verging und dann auf einem Semaphor warten, die signalisiert wird, wenn dieser Timer abläuft. Somit ist es auf diesem Semaphor blockiert.