2010-03-09 8 views
7

So habe ich in letzter Zeit in ein bisschen Montage und ich bin ein Anfänger, also fragte ich mich, 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 seine eigenen Register?Assembly Register Anfänger

Antwort

11

Ein Thread-Kontextwechsel umfasst das Speichern der Register des aktuellen Ausführungskontextes 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 mit einem neuen Status 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 jeder Prozess seinen eigenen Satz von Registern hat, und jeder Thread diese Register rechts ändern kann?

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 weiterlaufen.

+0

nette info danke! so ziemlich vor einem Kontextwechsel würde der aktuelle Thread pushfd und pushad? Dann nach dem Pop-up zurück und weg geht es? – Dnaiel

+0

@Dnaiel: Ich weiß nicht, ob sie tatsächlich diese Anweisungen verwenden, aber das ist die Grundidee, ja. –

0

Jeder Thread seinen eigenen Kontext hat, die den Satz von Registern umfasst, CPU-Flags, Stapeln usw.

1

Abhängig von dem Prozessor, gibt es nur einen Satz von Registern. Nicht ein Satz pro Thread.

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

Some processors facilitate this.

2

Der Thread wird von einem Kernel oder einem Betriebssystem ausgeführt, so dass das Programm nicht darauf achten sollte. Wenn kein Kernel oder Betriebssystem verfügbar ist, müssen Sie es selbst implementieren. für die Sie benötigen:

  • eine Funktion, die die sate aller Register in der CPU sparen (SP: Stack Zeiger, internen Registerwert, PC: Programmzähler etc ...) in einem anderer Speicherplatz, um zu einem neuen Thread zu wechseln.
  • eine Funktion zum Laden einer Thread-Umgebung in Ihre CPU-Umgebung, stellen Sie den zuvor gespeicherten internen Registerwert in Ihrem CPU-Register wieder her.
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 Wechsel 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 in den Prozessor zurückkopiert. 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 Prozesse nur dann 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.

1

Sie haben

  • ein Reihe von Prozessen, die die Ihres Betriebssystems ist,
  • jeder Prozess einen Speicherplatz hat, die dynamisch zugewiesenen Speicher, statische Daten enthält und code assembly,
  • alle prozess hat eine Liste von Threads
  • jedes Gewinde seinen eigenen Satz von Registern hat, Programmzähler und Stapel

mit Kontextschaltern Ihre Scheduler-Thread Daten austauscht passieren die Ausführung zu einem anderen.

Normalerweise wird ein Prozess ist schwerer als ein Faden und verschiedene Planungsansätze bestehen:

  • Kontext tun schaltet nur intern (grüne Fäden) zu Ihrem Programm (Ihr Betriebssystem wird es für nur ein single process so: hard multi-core)
  • Sie können eine Reihe von realen Prozessen zuweisen, um einen Hybrid-Ansatz zu haben, der eine einfache Multi-Core-Optimierung ermöglicht.