Frage

Ich weiß ein wenig über die Versammlung und es gibt ungefähr 4 oder 8 allgemeine Register. Wie funktionieren alle Programme auf einem Computer mit nur dieser Anzahl von Registern, insbesondere mit Multithreading und allem?

War es hilfreich?

Lösung

Multi-Threading selbst beeinflusst nicht die Anzahl der verwendeten Register. Wenn ein Faden ausgetauscht wird, wird im Allgemeinen seine Register im Speicher gespeichert, und der nächste zu ausgeführte Thread wird diese Register aus seiner vorherigen Speicherung geladen.

Ein Beispiel ist ein System mit einer Fadensteuerungsblockstruktur (TCB). Diese Struktur würde (während der Thread nicht ausgeführt wurden), dem gespeicherten Befehlszeiger, dem Stapelzeiger, dem Allzweckregister, dem schwimmenden Punktregister, der Fadenstatistik usw. Kurz gesagt, alles brauchte, um den Faden in den Staat, in dem er sich befand, völlig wiederherzustellen, als er ausgetauscht wurde, damit ein weiterer Thread ausgeführt wurde.

Und nicht alles, was in einem Computer vor sich geht, wird in Registern gemacht. Moderne Compiler können den Code so optimieren, dass die am meisten verwendeten Datenelemente in Registern gehalten werden, aber die überwiegende Mehrheit der Daten wird im Speicher gehalten und nur bei Bedarf in Register gekauft.

Das beste Buch, das ich je zu diesem Thema gelesen habe, ist Tanenbaum "Strukturierte Computerorganisation" Dies untersucht Computer in Bezug auf die Ebenen von der digitalen Logikebene bis zur Betriebssystemebene, wobei jedes Level auf dem vorherigen aufbaut.

           alt text

Beiseite: Mein Traum ist es, eines Tages ein Buch wie dieses zu schreiben, das abdeckt alles, von Quark Level bis hin zu EMACs :-)

Andere Tipps

Die anderen Variablen und Fadenstapel werden normalerweise im geschützten Speicherplatz gespeichert, wo sie bei Bedarf in Register gerufen werden können.

Möglicherweise möchten Sie sich das Buch ansehen Die Elemente von Computersystemen Für ein gutes Verständnis dafür, wie die CPU Ihres Computers funktioniert. Das Buch ist als eine Reihe von Projekten eingerichtet, bei denen Sie von einem NAND -Tor zu einer CPU, einem Assembler, einem einfachen Compiler und zu einem kleinen Betriebssystem arbeiten. Es ist von unschätzbarem Wert, zu verstehen, wie alle Teile Ihres Computers zusammenpassen.

Jedes Mal, wenn ein Faden (oder ein Prozess) ausgeht, werden alle Register vom Kernel des Betriebssystems in eine Datenstruktur auf den Stapel gedrückt, die normalerweise als Prozesssteuerblock bezeichnet werden. Wenn sich dann der Thread/Process wieder einmischt, werden die Daten des Registers von PCB gelesen und vom Stapel an die Register abgebaut.


Es gibt auch interne Register und eine Mapping -Tabelle, über die der X86 intern eine virtuelle Registeretabelle eingerichtet ist, um die IA32 -Anleitungs -Set -Architektur zu erhalten und gleichzeitig eine größere Flexibilität für die Gestaltung von Superscalarar -Architekturen und anspruchsvollen Anweisungs -Planungsalgorithmen zu erhalten.

Auch Anweisungssätze haben normalerweise eine Belastung und Laden Anweisungen, der in Verbindung mit Zeigern auf Speicher verwendet wird und die Daten von Registern in den Speicher gespeichert werden können. Aus diesem Fall stammt der Begriff Last-Store-Computer, dh ein Computer, der keine Anweisungen enthält, die direkt im Speicher arbeiten.

Einige Computer haben Anweisungen, die auf Speicher arbeiten. Einige basieren auf Stack. Es hängt von den Designern und den Einschränkungen ab, die auf die Hardware platziert werden.

Sie müssen erkennen, dass Tausende bis Millionen Montageanweisungen für selbst einfache Dinge ausgeführt werden. Diese Register lassen ihre Werte oft ausgetauscht.

Es ist eigentlich ziemlich interessant, wie der Computer in der Lage ist, so wenige Register zu verwenden, um alles zu erreichen, was er tut.

Es ist wirklich clevere Programmierung auf Montagestufe (normalerweise aufgrund von sehr cleveren Compilern), mit denen so wenige Register so effizient verwendet werden können.

Wenn ein Problem nicht mit nur den wenigen bereitgestellten Registern ausgeschlossen ist, wird das Programm seine Register normalerweise in den Hauptspeicherstapel "verschütten". Indem wir uns daran erinnern, wo wir auf dem Stapel unsere verschütteten Register setzen, können wir sie leicht zurückholen.

Wenn uns die Register ausgehen, die wir brauchen, speichern wir sie einfach auf dem Stapel, was uns gibt WEIT Mehr Platz als die meisten von uns für unsere Programme brauchen.

Im speziellen Fall von Multi-Threading speichern wir nur alle unsere Register im Gedächtnis, dann haben wir einen sauberen Schiefer für die anderen Fäden.

Dies ist eines der Dinge, für die der andere Speicher des Computers, insbesondere der RAM, verwendet wird: Datenbits in und aus Registern zu speichern und wiederherzustellen.

Wenn ein Faden weggeschaltet ist, damit ein weiterer Faden ausgeführt werden kann. Der erste Threads Register -Status wird irgendwo (auf dem Stapel oder einer anderen Datenstruktur) gespeichert, und der Registerstatus des Sekunden -Threads wird von wo immer er zuvor gespeichert. Der RAM ist schnell genug, dass Tausende dieser Schalter in einer Sekunde auftreten können, dauert jedoch genügend Zeit, wenn Sie Threads unnötig austauschen können, die Leistung beeinflussen kann.

Ein weiteres, sehr häufiges Ereignis sind lokale Variablen - wenn eine lokale Variable für einen kurzen Zeitraum verwendet wird, existiert sie möglicherweise nie außerhalb eines Registers. In vielen Fällen muss jedoch möglicherweise eine lokale Variable aus dem Register auf einen Speicherort gespeichert werden, sodass ein anderer Wert in ein Register geladen und manipuliert werden kann. Das Gleiche passiert für so ziemlich alle Variablen, nicht nur für Einheimische (aber es ist viel wahrscheinlicher, dass ein lokaler Ort niemals eine Existenz im Gedächtnis hat).

Das ist eine ziemlich involvierte Frage und die Antwort hängt von Ihrer CPU -Architektur ab.

In den guten alten Tagen hatten Sie Recht - es gab in der Tat nur wenige allgemeine Register. Heutzutage spielen die CPU und der Compiler ein Spiel von "Drei-Karten-Monte"Mit Ihren Allgemeinen registriert sich durch Techniken wie Umbenennen registrieren.

Obwohl es bei einfachen Architekturen wahr ist, dass Register in [Cache] Speicher kopiert werden, wenn ein Kontext-Schalter stattfindet, mögen Techniken wie SMT "Dummkopf" das Betriebssystem in der Meinung, dass es mehr Kerne gibt, als sie tatsächlich sind.

Die allgemeinste Antwort auf Ihre Frage ist jedoch, dass Daten in und aus Registern verschoben werden viel. Und deshalb sind zahlreiche Anweisungen, die Sie in einem bestimmten Assembly -Programm sehen, "MOV" -Anweisungen. CPU- und Compiler -Designer verbringen viel Zeit und Geld damit, ihre Entwürfe zu optimieren, damit Sie Daten nicht aus dem Hauptspeicher (langsam) in Register bewegen - sie versuchen, die Daten so weit wie möglich zwischenzuspeichern. Diese große Anzahl von "MOV" -Anweisungen ist der Grund, warum Speicherlatenz und Busgeschwindigkeit für die Leistung des Gesamtcomputers so wichtig sind.

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