Ich bin also in letzter Zeit in ein bisschen Montage gekommen und ich bin ein Anfänger, also habe ich mich gefragt, ob jemand etwas klären könnte. Ich nehme an, jeder Prozess hat seinen eigenen Satz von Registern, und jeder Thread kann diese Register richtig modifizieren. Wie verwenden dann mehrere Threads die gleichen Register ohne Konflikte zu verursachen? Oder hat jeder Thread seinen eigenen Satz von Registern?
Ein Thread-Kontextwechsel beinhaltet das Speichern der Register des aktuellen Ausführungskontexts und das Laden der Register mit gespeicherten Werten aus dem Ausführungskontext, auf den umgeschaltet wird. (unter anderem). So hat jeder Thread effektiv seinen eigenen Satz von Registern. Auch ein eigener Stack, da ESP eines der Register ist.
Eine Möglichkeit, darüber nachzudenken, besteht darin, dass Sie Threads erhalten, indem Sie den aktuellen Registerzustand speichern und die Register in einen neuen Zustand laden. Wenn das nicht passiert, dann ist es kein Thread-Schalter. Wenn Sie auch zu einer anderen Gruppe von virtuellen Adresstabellen wechseln, haben Sie einen Prozess-Switch und keinen Thread-Switch.
Sie sagen:
Ich nehme an, dass jeder Prozess seine eigene Reihe von Registern hat, und jeder Thread kann diese Register richtig modifizieren?
Aber das ist nicht ganz richtig. Jeder CPU-Kern hat einen einzigen Satz von Registern. Diese Register werden geändert, wenn das Betriebssystem zu einem anderen Thread wechselt. Aber es gibt nur einen Thread, der gleichzeitig in einem CPU-Kern ausgeführt wird. Prozesse haben nicht wirklich eigene Register, verarbeiten eigene Threads (oder mindestens einen Thread), und Threads haben Register oder vielmehr einen Platz, um die Werte für die Register zu behalten, während der Thread darauf wartet, dass ein CPU-Kern verfügbar ist renne weiter.
In der Hardware gibt es nur einen Satz von Registern für jeden Prozessorkern. Aus diesem Grund kann immer nur ein Thread die Register verwenden. Mehrere Threads werden gleichzeitig auf einem einzelnen Kern ausgeführt, indem schnell von einem Thread zum anderen gewechselt wird. Planen, welcher Thread wann ausgeführt wird, ist der Job das Betriebssystem.
Beim Umschalten von einem Thread zum anderen wird der Inhalt der Register in einem speziellen Speicherbereich gespeichert, und die Register für den nächsten Thread werden zurück in den Prozessor kopiert. Dazu gehört der Befehlszeiger, sodass der Thread weiß, wo er weiter ausgeführt werden soll, wenn er die Kontrolle zurückerhält. Dieser Prozess wird Kontextwechsel genannt.
Da sich der Scheduler des Betriebssystems in einem anderen Thread befindet, kann er nur Prozesse planen, wenn er ausgeführt wird. Dies bedeutet, dass eine spezielle Hardware-Funktion - ein Interrupt - notwendig ist, um Kontext-Switches zu steuern. Nur das Betriebssystem kann Kontextwechselinterrupts planen.
Der Thread wird von einem Kernel oder einem Betriebssystem ausgeführt, daher sollte sich das Programm nicht darum kümmern. Wenn kein Kernel oder Betriebssystem verfügbar ist, müssen Sie es selbst implementieren. Dafür brauchst du:
Sie haben
Mit context switch tauscht Ihr Scheduler Thread-Daten aus, um die Ausführung an einen anderen zu übergeben.
Normalerweise ist ein Prozess schwerer als ein Thread und es gibt verschiedene Planungsansätze:
Jeder Thread hat seinen eigenen Kontext , der den Satz von Registern, CPU-Flags, Stapel usw. enthält.
Tags und Links assembly cpu-registers