2017-03-21 3 views
1

Meine Frage bezieht sich auf Threads im Allgemeinen (zB: in Java).Mindestzeit für einen Thread

Das Problem: Wenn ein Thread gerade läuft (Runnable - state) - dh: ausgeführt wird und eine Anweisung gibt (zB durch Aufruf der Methode addOneToX(int x)), kann der Thread beendet oder gestoppt werden seine Arbeit vor Abschluss der Anweisung, aber nachdem sie mit der Ausführung begonnen hat. mit anderen Worten werden die meisten Befehle in Hochsprachen in die maschinenspezifische Sprache decodiert und in der CPU in eine Anzahl von Maschinentakten (Taktzyklen) zerlegt. Also ich denke, es ist klar, entsprechend:

1> Was ist die Mindestzeit für einen Thread in den Zustand Runnable geben?

2> Wie speichert der Thread seinen Status, damit er später darauf kommt? (d. h. wenn es den Zustand Runnable beendet und später zu dem Punkt zurückkehrt, an dem es angehalten wurde)

+0

1) Es gibt kein Minimum. 2) Viel zu kompliziert um hier abzudecken. Ist es wichtig, wie das Betriebssystem die Register der CPU speichert und wiederherstellt, wenn Ihre bevorzugte Sprache (Java) so weit von den Maschinenbefehlen entfernt ist? – Andreas

+3

Sie müssen ein gutes Buch über Betriebssysteme, Zeitplanung, Zeitaufteilung, Kontextwechsel und dergleichen lesen. Für StackOverflow ist dies zu weit gefasst. – RealSkeptic

+0

Related: http://stackoverflow.com/questions/16401294/how-to-know-linux-scheduler-time-slice –

Antwort

2

Es gibt keine garantierte Mindestzeit.

Der Scheduler entscheidet, was die Zeitscheibe sein wird. Normalerweise könnte man alles von Bruchteilen einer Millisekunde bis etwa 100 ms erwarten. Aber oft wird dieser Wert dynamisch sein. Außerdem könnte ein Thread sogar auf ein Extrem stoßen, wenn nur ein Befehl ausgeführt wird, bei dem es sich um E/A handelt, auf dem der Thread blockiert und aus der CPU herausgedrückt wird.

Die Hochsprachenbefehle werden eventuell in (möglicherweise) mehrere CPU-Anweisungen übersetzt. Der CPU-Befehl ist der atomare Teil, der ohne Unterbrechung ausgeführt wird, außer dass das Programm an irgendeiner Stelle zwischen zwei Befehlen unterbrochen werden kann, selbst in der Mitte eines Hochsprachenbefehls. Beachten Sie, dass es bestimmte CPU-Anweisungen gibt (wie atomare Get-and-Set oder Get-and-Increase), die für die Thread-Synchronisierung verwendet werden können.

Die grundlegende (viel vereinfachte) Idee des Speicherns des Thread-Status ist: Speichern Sie die Register im RAM und speichern Sie den Zeiger auf den aktuellen Befehl.

+0

Thx, sehr gute Antwort. –

1

Was ist die Mindestzeit, die einem Thread im Runnable-Zustand zur Verfügung steht?

praktischste Java-Implementierungen verwenden nativen-Themen: Das heißt, sie die Betriebssystem-Threads kümmern sich um die Details der Planung ermöglichen. Die meisten modernen Betriebssysteme bieten eine Auswahl verschiedener Thread-Scheduling-Algorithmen, und die meisten Algorithmen bieten eine Reihe von konfigurierbaren Parametern. Es gibt keine einzige Antwort auf Ihre Frage.

Fast sicher, es wird weniger als eine Sekunde sein. Sehr wahrscheinlich weniger als 100 Millisekunden. Ansonsten ist es schwer zu sagen.

Wie speichert der Thread seinen Status, damit er später dazu kommt?

Der Zustand eines Threads (in den meisten Programmiersprachen, Java enthalten) besteht aus seinem Aufrufstapel, und es ist Registern CPU. Die CPU-Register enthalten eines, das auf den Anfang des Aufrufstapels zeigt, eines, das auf den aktuellen Befehl zeigt, und normalerweise andere.

Wenn es Zeit ist, Threads zu wechseln, unterbricht das OS den Prozessor (ein Interrupt erzwingt grundsätzlich einen sofortigen Funktionsaufruf) und die Interrupt-Handler-Routine speichert alle CPU-Register an einem Speicherort, der für den aktuellen Thread reserviert ist. Dann stellt es die Register für einen anderen Thread wieder her und "kehrt" im Grunde dorthin zurück, wo der andere Thread unterbrochen wurde.

Verwandte Themen