Frage

Einfach nur neugierig. Wie funktioniert eigentlich die Funktion Sleep () Arbeit (in windows.h erklärt)? Vielleicht nicht nur, dass die Umsetzung, aber jeder. Damit meine ich - wie wird sie umgesetzt? Wie kann es den Code „Stop“ für eine bestimmte Zeit machen? Auch neugierig, wie cin >> und die tatsächlich Arbeit . Was tun sie genau das tun?

Den einzigen Weg, ich weiß, wie man „Block“ etwas aus fort ist mit einer while-Schleife zu laufen, aber wenn man bedenkt, dass das braucht eine große Menge an Rechenleistung im Vergleich zu dem, was passiert, wenn Sie Methoden sind der Aufruf von stdin zu lesen (vergleiche nur eine while (true) zu einem Lesevorgang von stdin), ich vermute, das ist nicht das, was sie tun.

War es hilfreich?

Lösung

Das Betriebssystem verwendet einen Mechanismus einen Scheduler genannt alle Threads zu halten oder verarbeitet es die Verwaltung gut zusammen verhalten.

mehrmals pro Sekunde, unterbricht die Hardware-Uhr des Computers die CPU, die das Betriebssystem des Scheduler verursacht aktiviert werden. Der Scheduler wird dann schauen Sie sich alle Prozesse, die zu laufen und entscheidet versuchen, die man für die nächste Zeitscheibe ausgeführt wird.

Die verschiedenen Dinge, die es nutzt, hängt von jedem Prozesse Zustand zu entscheiden, und wie viel Zeit es vorher hatte. Also, wenn der aktuelle Prozess der CPU stark ist verwenden, verhindert, dass andere Prozesse von Fortschritten machen, wird es die aktuellen Prozess warten und Swaps in einem anderen Prozess machen, so dass es einige Arbeit zu tun.

Häufiger aber die meisten Prozesse in einem Wartezustand sein werden. Zum Beispiel, wenn ein Verfahren zur Eingabe von der Konsole wartet, kann das Betriebssystem an den Prozessen Informationen schauen und sehen, welche Ports io seines gewartet. Es kann diese Ports überprüfen, um zu sehen, ob sie irgendwelche Daten für den Prozess zu arbeiten. Wenn sie das tun, kann es den Prozess erneut starten, aber wenn es keine Daten, dann wird dieser Prozess für die aktuelle Zeitscheibe übersprungen.

als für sleep(), jeder Prozess kann das Betriebssystem mitteilen, dass sie möchte für eine Weile warten. Der Scheduler wird dann aktiviert werden, noch bevor ein Hardware-Interrupt (das auch ist, was passiert, wenn ein Prozess eine Blockierung aus einem Stream gelesen zu tun versucht, die keine Daten bereit gelesen werden muss), und das Betriebssystem macht eine Notiz von dem, was der Prozess ist warten auf. Für einen Schlaf, wartet der Prozess für einen Alarm aus zu gehen, oder es kann nur ergeben wieder jedes Mal, wenn neu gestartet ist, bis der Timer abgelaufen ist.

Da das O nur Prozesse wieder aufnimmt, nachdem es etwas bewirkt einen laufenden Prozess, wie der Prozess präjudizieren Nachgeben oder die Hardware-Timer-Interrupt-i erwähnt, ist sleep() nicht sehr genau, wie genau auf dem O oder Hardware abhängig ist, aber es ist in der Regel in der Größenordnung von einem oder mehreren Millisekunden.

Wenn mehr Genauigkeit erforderlich ist, oder sehr kurze Wartezeiten, die einzige Möglichkeit ist, die damit beschäftigt Schleife zu verwenden, konstruieren Sie genannt haben.

Andere Tipps

Das Betriebssystem Zeitplan, wie Prozesse ablaufen (die Prozesse in Betracht laufen sind, in welcher Reihenfolge, ...). Sleep() wahrscheinlich einen Systemaufruf ausgibt, die den Kernel sagt „lass mich nicht den Prozessor verwenden für x Millisekunden“.

Kurz gesagt, Sleep () teilt das Betriebssystem den Prozess / Thread für eine Weile zu ignorieren.

‚cin‘ verwendet eine Tonne überladenen Operatoren. Die ‚>>‘, die in der Regel rechts Bit-Verschiebung ist, ist für so ziemlich jede Art von rechten Operanden in C ++ überlastet. Eine separate Funktion wird für jeden vorgesehen, die von der Konsole liest und wandeln die Eingabe in welcher auch immer Variablentyp Ihnen gegeben haben. Zum Beispiel:

std::cin::operator>> (int &rhs);

Das ist nicht wirkliche C ++ - Ich habe nicht mit Bächen und Überlastung in einer Zeit lang gearbeitet, so erinnere ich mich nicht den Rückgabetyp oder die genaue Reihenfolge der Argumente. Dennoch ist diese Funktion aufgerufen wird, wenn Sie cin >> einen Integer-Variable ausgeführt werden.

Die genaue zugrunde liegende Implementierung hängt vom Betriebssystem ab.

Die Antwort hängt vom Betriebssystem ab, aber im Allgemeinen, das Betriebssystemes entweder Pläne ein anderer Code an anderer Stelle in einem anderen Thread ausgeführt werden, oder wenn es buchstäblich nichts zu tun hat, wird es um die CPU zu warten, bis ein Hardware-Ereignis auftritt , was bewirkt, dass die CPU zu einem gewissen Code zu springen, ein Interrupt-Handler aufgerufen, der dann entscheiden kann, welcher Code ausgeführt werden.

Wenn Sie nach einer kontrollierteren Art und Weise der Sperrung eines Threads / Prozess in einem Multi-Threaded-Programm, haben einen Blick auf Semaphore, Mutexe, CriticalSections und Events suchen. Diese sind alle Techniken verwendet, um einen Prozess oder Thread blockiert (ohne die CPU über eine Zeit lang Konstrukt zu Laden).

Sie arbeiten im Wesentlichen aus einem Wait / Signal Idiom ab, wo der blockierten Thread wartet und weitere Prozesssignale um ihm zu sagen, wieder zu starten. Diese (zumindest in den Fenstern) können auch Timeouts haben, so dass eine ähnliche Funktionalität bietet Sleep ().

Bei einem niedrigen Niveau, hat das System eine Routine des „Scheduler“ genannt, das die Anweisungen aus allen laufenden Programmen in dem CPU Versendungen (n), die sie tatsächlich ausgeführt werden. Systemaufrufe wie „Sleep“ und „usleep“ Übereinstimmung zu Anweisungen, die den Planer sagen, dass Thread oder Prozess für eine bestimmte Zeit zu ignorieren.

Wie für C ++ Streams, die „cin“ verbirgt sich die eigentliche Datei-Handle (stdin und stdout sind tatsächlich solche Griffe) Sie zugreifen, und die „>>“ Operator für sie versteckt sich die zugrunde liegenden Anrufe lesen und zu schreiben. Seit seiner Schnittstelle kann die Implementierung sein O-spezifische, aber konzeptionell ist es immer noch Dinge wie printf und scanf unter der Haube zu tun.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top