Assembly registriert Anfänger

7

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?

    
Dnaiel 09.03.2010, 01:50
quelle

6 Antworten

11

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.

    
John Knoeller 09.03.2010, 01:53
quelle
4

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.

    
Jeffrey L Whitledge 09.03.2010 02:05
quelle
2

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:

  • eine Funktion, die den Zustand speichert aller Register in Ihrer CPU (SP: Stack Zeiger, interner Registerwert, PC: Programmzähler etc ...) in einem anderer Speicherplatz, um zu einem neuen zu wechseln thread.
  • eine Funktion zum Laden einer Thread-Umgebung in Ihre CPU-Umgebung, stellen Sie den zuvor gespeicherten internen Registerwert in Ihrem CPU-Register wieder her.
Phong 09.03.2010 01:55
quelle
1

Je nach Prozessor gibt es nur einen Satz von Registern. Nicht eine Menge pro Thread.

Es gibt verschiedene Möglichkeiten, den Status aller Register zu speichern, so dass ein Thread dort beginnen kann, wo er aufgehört hat.

Einige Prozessoren erleichtern dies .

    
Peter K. 09.03.2010 01:55
quelle
1

Sie haben

  • Eine Menge von Prozessen , die die Ihres Betriebssystems ist,
  • Jeder Prozess hat einen Speicherplatz, der dynamisch zugewiesenen Speicher , statische Daten und Code-Assemblierung ,
  • Jeder Prozess enthält eine Liste von Threads
  • Jeder -Thread hat seine eigenen Registersätze , Programmzähler und Stack

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:

  • doing context schaltet nur intern ( green threads ) zu Ihrem Programm (Ihr Betriebssystem wird es nur als einen einzelnen Prozess betrachten, also: hard multi-core)
  • Sie können eine Reihe realer Prozesse zuweisen, um einen hybriden Ansatz zu haben, der eine einfache Mehrkernoptimierung ermöglicht.
Jack 09.03.2010 02:26
quelle
0

Jeder Thread hat seinen eigenen Kontext , der den Satz von Registern, CPU-Flags, Stapel usw. enthält.

    
code ex machina 09.03.2010 01:53
quelle

Tags und Links