2010-08-04 8 views
14

Ich weiß ein wenig über die Montage, und dass es 4 oder 8 oder so allgemeine Register gibt. Wie arbeiten alle Programme auf einem Computer mit so vielen Registern, insbesondere mit Multithreading und allem?Wie benutzt ein Computer nur ein paar Register?

+2

Ich mag Register als lokale Variablen für den Prozessor zu denken. Ich habe nicht eine Menge Variablen im Rahmen der aktuellen Funktion. Die meisten von ihnen sind irgendwo im Speicher, in irgendeinem anderen Teil des Programms. –

+0

@Merlyn: True, aber möglicherweise ein bisschen irreführend, da Einheimische (in Ermangelung von Compiler-Optimierungen) in der Regel auf dem Stapel gespeichert sind. – bcat

+0

@bcat: Ja, das Konzept wird nicht perfekt abgebildet. Unterschiedliche Architekturen werden auch unterschiedliche Verhaltensweisen haben (obwohl dies als Compiler-Optimierung abgetan werden kann). –

Antwort

11

Multi-Threading selbst nicht die Anzahl der Register in Gebrauch nicht beeinträchtigt. Wenn ein Thread ausgelagert wird, werden seine Register im Allgemeinen im Speicher gesichert, und der nächste Thread, der ausgeführt wird, hat diese Register von seinem vorherigen Speicher geladen.

Ein Beispiel ist ein System, eine Fadensteuerblockstruktur (TCB). Diese Struktur enthält (während der Thread nicht ausgeführt wurde) den gespeicherten Befehlszeiger, Stapelzeiger, Allzweckregister, Gleitkommaregister, Threadstatistiken und so weiter. Kurz gesagt, alles, was benötigt wurde, um den Thread vollständig in den Zustand zurückzuversetzen, in dem er sich befand, als er ausgetauscht wurde, damit ein anderer Thread ausgeführt werden konnte.

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

Das beste Buch, das ich jemals zu diesem Thema gelesen habe, ist Tanenbaum's"Structured Computer Organization", die Computer in Bezug auf Schichten untersucht, von der digitalen Logikebene bis zur Betriebssystemebene, wobei jede Ebene auf der vorherigen Ebene.

                      alt text http://ecx.images-amazon.com/images/I/51PAGENX36L._SL500_AA300_.jpg

Abgesehen: mein Traum, eines Tages ein Buch schreiben, genau wie dieser, die alles, aus dem Quark Ebene deckt bis zu Emacs :-)

+0

+1 für Tanenbaum, nicht weil er Tanenbaum ist, sondern weil das Buch wirklich genial ist. – bcat

+0

Es gibt wenige Leute in der Industrie, die ich so hoch einschätze wie Tanenbaum (Knuth ist der einzige, der sofort in den Sinn kommt). Beide haben viel mit ihren produktiven Büchern und Software beigetragen. Ich habe immer noch die 2/E dieses Buches, die ich zurück in Uni (a _looong_ Zeit) bekam. – paxdiablo

+0

Oh, ich stimme völlig zu. Ich meinte nur, dass ich das Buch für seinen eigenen Wert mag, nicht nur weil sein Autor eine sehr wichtige Figur in CS ist (was Tanenbaum sicherlich ist). Und ja, ich musste das Buch auch im College lesen, und ich bin so froh, dass mein Professor es über ein anderes Computer-System-Buch gewählt hat. Ich bin immer noch erstaunt, wie klar es das Material darstellt, ohne es im geringsten zu verdummen. – bcat

1

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

2

Jedes Mal, wenn ein Faden (oder ein Verfahren) auslagert, alle Register werden auf den Stapel durch den Betriebssystemkern in eine Datenstruktur in der Regel der Prozeßsteuerblock genannt geschoben. Dann, wenn der Thread/Prozess wieder eingewechselt wird, werden die Daten des Registers von der PCB gelesen und von dem Stapel zu den Registern ausgegeben.


Es gibt auch interne Register und eine Zuordnungstabelle, die die x86-intern hat diese Art von virtueller Registertabelle eingerichtet, um die IA32-Befehlssatzarchitektur zu erhalten und gleichzeitig eine größere Flexibilität superskalare Architekturen zu entwerfen und anspruchsvolle Instruction Scheduling Algorithmen.

Auch Befehlssätze in der Regel einen Last und Speicher Befehl, der mit Zeigern in den Speichern in Verbindung verwendet wird, so dass Daten aus den Registern in dem Speicher gespeichert werden. Von hier stammt der Begriff Load-Store-Maschine, dh ein Computer, der keine Befehle hat, die direkt im Speicher arbeiten.

Einige Computer haben Anweisungen, die auf Speicher funktionieren; einige sind stapelbasiert. Das hängt von den Designern und den Einschränkungen ab, die der Hardware auferlegt werden.

5

Die anderen Variablen und Thread-Stacks werden normalerweise im geschützten Speicherbereich gespeichert, wo sie bei Bedarf in Register abgerufen werden können.

Sie sollten sich das Buch The Elements of Computing Systems ansehen, um zu erfahren, wie die CPU Ihres Computers funktioniert. Das Buch ist eine Serie von Projekten, in denen Sie von einem NAND-Gatter zu einer CPU, einem Assembler, einem einfachen Compiler und einem kleinen Betriebssystem aufarbeiten. Es ist von unschätzbarem Wert, um zu verstehen, wie alle Teile Ihres Computers zusammenpassen.

+0

Upvoted für die Beantwortung und weiterführende Lektüre. – mnuzzo

0

Das ist einer der Dinge, die der andere Speicher des Computers, insbesondere der RAM, für Folgendes verwendet: Speichern und Wiederherstellen von Datenbits in und aus Registern.

Wenn ein Thread ausgeschaltet wird, kann ein anderer Thread ausgeführt werden. Der erste Thread-Registerzustand wird irgendwo gespeichert (auf dem Stapel oder einer anderen Datenstruktur), und der Registerstatus des Sekunden-Threads wird von dem Ort wiederhergestellt, an dem er zuvor gespeichert wurde. RAM ist schnell genug, dass Tausende von diesen Switches in einer Sekunde auftreten können, nimmt jedoch genügend Zeit in Anspruch, dass, wenn Sie Threads unnötig austauschen, die Leistung beeinträchtigt werden kann.

Ein weiteres, sehr häufiges Vorkommnis sind lokale Variablen - wenn eine lokale Variable für eine ausreichend kurze Zeitspanne verwendet wird, darf sie niemals außerhalb eines Registers existieren. In vielen Fällen muss jedoch möglicherweise eine lokale Variable aus dem Register in einen Speicherort gespeichert werden, so dass ein anderer Wert in ein Register geladen und dort bearbeitet werden kann. Das selbe passiert tatsächlich für so ziemlich alle Variablen, nicht nur für lokale (aber es ist viel wahrscheinlicher, dass ein lokaler niemals eine Existenz im Speicher hat).

1

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

Es ist wirklich schlaue Programmierung auf Assembly-Ebene (in der Regel wegen unglaublich schlauen Compiler), die so wenig Register so effizient verwendet werden können.

Wenn ein Problem nur mit den wenigen verfügbaren Registern gelöst werden kann, "verschüttet" das Programm seine Register in der Regel im Hauptspeicherstapel. Indem wir uns daran erinnern, wo wir unsere verschütteten Register auf dem Stapel abgelegt haben, können wir sie leicht wieder zurückholen.

Wenn wir die Register nicht mehr benötigen, speichern wir sie einfach auf dem Stack, was uns mehr Platz gibt, als die meisten von uns für unsere Programme benötigen.

Im speziellen Fall von Multithreading speichern wir nur alle unsere Register im Speicher, dann haben wir eine saubere Weste für die anderen Threads.

0

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

In den guten alten Tagen hatten Sie recht - es gab tatsächlich nur ein paar allgemeine Register. Heutzutage spielen die CPU und der Compiler ein Spiel von "three-card-monte" mit Ihren Allzweckregistern durch Techniken wie register renaming.

Obwohl es bei einfachen Architekturen richtig ist, dass Register in einen [Cache-] Speicher kopiert werden, wenn ein Kontextwechsel stattfindet, "täuschen" Techniken wie SMT das Betriebssystem dahin, dass es mehr Kerne gibt als sie tatsächlich sind.

Aber die allgemeinste Antwort auf Ihre Frage ist, dass Daten in und aus den Registern verschoben werden viel. Und deshalb ist ein großer Teil der Anweisungen, die Sie in einem gegebenen Montageprogramm sehen, "MOV" -Anweisungen.CPU- und Compilerdesigner verbringen viel Zeit und Geld damit, ihre Designs zu optimieren, so dass Sie keine Daten aus dem Hauptspeicher (langsam) in Register verschieben - sie versuchen, die Daten so gut wie möglich zwischenzuspeichern. Diese große Anzahl von "MOV" -Anweisungen ist der Grund, warum die Speicherlatenz und die Busgeschwindigkeit für die Leistung des gesamten Computers so entscheidend sind.