Wie ist das schlafen implementiert auf OS-Ebene?
Ich bin einfach nur interessiert, wie sleep(time in ms)
- Implementierung in einer C-Bibliothek oder grundsätzlich auf OS-Ebene...
Ich vermute...
- Werden können, die auf der Grundlage der Prozessor-Geschwindigkeit, die Sie tun, eine while-Schleife von nop ' s (ich bin nicht sicher, ob die Schlaf-Zeit wird genau sein)...
- Irgendein spezielles register im Prozessor, wo Sie schreiben, der Wert und der Prozessor einfach Stoppt nach der angegebenen Zeit (das wäre sehr ineffizient, da der Prozessor kann nicht ausgeführt werden, auch andere Programme).
Irgendwelche Hinweise? Wahrscheinlich C-Bibliothek-Quellcode erklären kann? Ich bin nicht allzu insbesondere darüber, wie "C" ist, es umzusetzen... ich Frage mich nur allgemein, wie Sie die "sleep ()" - Funktion ist implementiert.
InformationsquelleAutor FatDaemon | 2009-11-12
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sleep()
umgesetzt wird auf OS-Ebene. Der Prozessor nicht drehen, wenn ein task/thread/Prozess wird schlafen. Dass bestimmten thread, auf einem pending-queue (der thread ist nicht zur Ausführung bereit), bis die Zeit abgelaufen ist, an welchem Punkt der Faden wird auf das ready-to-run-queue.In der Zwischenzeit andere threads, die sind bereit zu laufen, ausgeführt werden.
Nur, wenn Sie keine threads, die zur Ausführung bereit sind, wird das OS wechseln in den idle-thread, der in der Regel Probleme, die Anweisungen zum Herunterfahren (oder in einen low-power-Zustand sowieso) den Prozessor, bis ein hardware-interrupt Auftritt.
Nur für ein sehr einfaches system (wie die meisten einfachen embedded systems), könnte
Sleep()
tatsächlich umgesetzt werden, nichts weiter ist als ein busy-wait Schleife.Jedem Betriebssystem lehrbuch, wie "Moderne Betriebssysteme" von Tanenbaum decken diese im detail - ziemlich viel jeder von Ihnen (sogar ein altes, billiges, gebrauchtes).
Die Antwort auf Ihre Frage ist völlig Betriebssystem und der jeweiligen Implementierung abhängig.
Einen einfachen Weg, daran zu denken: Wenn Sie anrufen
sleep()
, der OS berechnet die wakeup-Zeit, dann klebt Sie Ihren Prozess auf einer Warteschlange irgendwo. Es dann einfach nicht planen Sie Ihren Prozess für die Ausführung Zeit, bis genug real Zeit vergangen, in der es zu bekommen knallte aus der Warteschlange.In einem typischen Betriebssystem, sleep-Aufrufe in den kernel, wird der Prozess warten, bis die angegebene Zeit abgelaufen ist, und geht dann und findet einige andere Prozess ausgeführt werden kann. Fehlend nichts besseres zu tun, es wird führen Sie das "Leerlauf-Prozess". Sobald die Zeit abgelaufen ist, wird der scheduler in der beachten Sie, dass der schlafende Prozess ist gut zu gehen, und es wird wieder einplanen.
Tun Sie das nicht alle while-Schleifen, sonst wird das system nicht in der Lage sein, etwas zu tun - keine Reaktion auf Maus, Tastatur, Netzwerk, etc.
In der Regel, was die meisten Betriebssysteme tun ist, fügen Sie die Verzögerung, um den aktuellen Zeitstempel zu bekommen, das timestamp, Wann die Aufgabe verlangt die Verzögerung wieder aufgenommen werden (vorausgesetzt, es gibt keine höhere Priorität task laufen zu dieser Zeit), und fügen Sie den [wakeupTimestamp, task-Zeiger], um eine Liste, die sortiert wird aufsteigend vom Zeitstempel. Danach die OS führt einen context switch und führt die nächste Aufgabe zur Verfügung. In regelmäßigen Abständen, vergleicht das system die frühesten Zeitstempel auf dem sleepy-Liste mit dem aktuellen timestamp, und wenn die Frist abgelaufen ist, bewegt sich der schlafende task in den "bereit" - Warteschlange Aufgabe.
Schlafen Blöcke Ihre Aufgabe/thread den Wert für die Zeit verging. Ihre Aufgabe wird nicht ausführbar für diesen Zeitraum oder bis etwas anderes Interessantes passiert (wie ein signal), je nachdem, was früher Eintritt.
Es ist nicht ungewöhnlich für den Schlaf zu rufen, wählen Sie() und geben keine Deskriptoren zu warten, und einen timeout-Wert gleich Ihren Schlaf Zeitraum.
System zu implementieren, indem ein timer ausläuft, nach dem die Zeit vorbei ist und dann das warten auf ein semaphor, wird signalisiert, wenn dieser Zeitgeber abläuft. So ist es blockiert auf diesem semaphor.
cpu-Auslastung: 0%
Anforderungen:
create_gate (Set-bis der IRQ-Handler)
pic_mask_clear (Aktivieren bestimmter interrupts)
rtc_poll (einrichten RTC)
rtc_irq
smp_wake_up
smp_wake_up
rtc_irq:
Verwendung :
seine feine