it-swarm.com.de

Was sind CPU-Register?

Diese Frage beschäftigt mich schon seit einiger Zeit und heute dachte ich, ich würde sie googeln. Ich habe einiges darüber gelesen und es schien dem sehr ähnlich zu sein, was ich immer als Prozessor bezeichnet habe Cache .

Gibt es einen Unterschied zwischen den beiden oder habe ich Recht, wenn ich denke, dass sie gleich sind? Muss sich ein Register tatsächlich in einer CPU befinden, damit es funktioniert?

Laut Wikipedia ist ein Register ein Ort in der CPU, an dem schnell auf Speicher zugegriffen und dieser geändert werden kann, bevor er an den RAM zurückgesendet wird. Habe ich das falsch verstanden oder sind der Cache und das Register tatsächlich gleich?

29
Jeroen

Sie sind nicht ganz gleich. Die Register sind die Stellen, an denen sich die Werte befinden, an denen die CPU tatsächlich arbeitet. Das CPU-Design ist so, dass es einen Wert nur dann tatsächlich ändern oder anderweitig bearbeiten kann, wenn er sich in einem Register befindet. Register können also logisch arbeiten, während Speicher (einschließlich Cache) nur Werte enthalten kann, aus denen die CPU liest und in die sie schreibt.

Stellen Sie sich einen Tischler bei der Arbeit vor. Er hat ein paar Gegenstände in der Hand (Register) und dann ganz in der Nähe auf seiner Werkbank (Cache) Dinge, an denen er häufig arbeitet, aber in diesem Moment nicht richtig verwendet, und dann in der Werkstatt (Hauptspeicher) Dinge, die dazu gehören das vorliegende Projekt, aber das ist nicht sofort wichtig genug, um auf der Werkbank zu sein.

EDIT : Hier ist eine einfache Erklärung für die Funktionsweise der Registerlogik.

Stellen wir uns vor, wir haben vier Register mit dem Namen R1..R4. Wenn Sie eine Anweisung kompilieren, die so aussieht:

x = y + z * 3;

der Compiler würde Maschinencode ausgeben, der (wenn er zerlegt wird) ungefähr so ​​aussieht:

LOAD  R1, ADDRESS_Z //move the value of Z into register 1
MUL   R1, 3         //multiply the value of register 1 by 3
LOAD  R2, ADDRESS_Y //move the value of Y into register 2
ADD   R1, R2        //adds the value in R2 to the value in R1
STORE R1, ADDRESS_X //move the value of register 1 into X

Da die meisten modernen CPUs Register mit einer Breite von 32 oder 64 Bit haben, können sie mit jedem Wert bis zu der Größe rechnen, die sie halten können. Sie benötigen keine speziellen Register für kleinere Werte. Sie verwenden lediglich spezielle ASM-Anweisungen, die festlegen, dass nur ein Teil des Registers verwendet werden soll. Und ähnlich wie der Schreiner mit nur zwei Händen können Register nur eine kleine Datenmenge gleichzeitig speichern, aber sie können wiederverwendet werden, indem aktive Daten ein- und ausgegeben werden, was bedeutet, dass "viele Register" dies nicht tun am Ende gebraucht werden. (Wenn viele verfügbar sind, können Compiler natürlich schnelleren Code generieren, dies ist jedoch nicht unbedingt erforderlich.)

62
Mason Wheeler

Tatsächlich ist ein Register in der CPU-Terminologie klein. Benannter Speicherblock In einem Mikroprozessor (CPU) verfügbar. Register haben bestimmte Namen, Größen und Funktionen, die von Prozessor zu Prozessor variieren. Wenn der 8085-Mikroprozessor beispielsweise ein 8-Bit-Prozessor mit 8 ist -bit-Register (A: Akkumulator-, B-, C-, D-, E-, H- und L-Register und ein Flag-Register sind alle 8-Bit). Zwei 16-Bit-Register PC und SP alle haben spezielle Funktionen und Funktionen werden während der Assembly-Programmierung angezeigt. Nur wenige Register steuern außerhalb des Programmiergeräts.

Wenn Sie einen anderen Prozessor verwenden, variieren die Register. Angenommen, 8086 ist ein 16-Bit-Prozessor, und AX, BX, CX und DX sind alle 16-Bit-, PC-, SP- und Flag-Register).

wie Sie in der Frage zitiert haben, sollen sie die Programmausführung beschleunigen und als Prozessor-Cache fungieren, aber jetzt hat sich die Prozessorarchitektur eines Tages geändert und sie (Intel) fügen viel Speicher hinzu, der den Prozessor-Cache aufruft

es gibt jedoch einen geringfügigen Unterschied zwischen Prozessor- (CPU-) Cache- und Prozessor- (CPU-) Registern, Registern, die tatsächlich für einige spezielle Aktivitäten wie Speicherzeiger, Programmstatus usw. benötigt werden. Beispiel: PC: Programmzähler, der als Speicherzeiger im Programmspeicher fungiert. SP: Stapelzeiger, der als Speicherzeiger im Stapelspeicher fungiert. und Akkumulator ist Puffer und Hauptregister, um auf ALU für arithmetische Operationen zuzugreifen ...

Sie können Mason Wheeler Erklärung für Beispiele sehen

3

Ich denke, es hilft zu denken, dass Register kein Gedächtnis sind und nicht als solches betrachtet werden sollten.

Denken Sie eher an OO - Register ist eine Klasse, die nicht aus dem Speicher abgeleitet ist, und Memory ist eine Klasse, die nicht aus dem Register abgeleitet ist, aber die Register-Klasse verfügt über Methoden (Machine Op) = Codes), um seine Daten in und aus dem Speicher zu konvertieren. Der Speicher hingegen weiß nichts über Register und kann keine Aktionen auf diese aufrufen. Infolgedessen werden alle CPU-Operationen von Registern ausgeführt, die häufig auf den Speicher zugreifen.

Es ist nicht ungewöhnlich, dass nur Register geschrieben werden - kaum ein Attribut des Speichers. Es ist auch möglich, dass sich ein Registerwert ändert, ohne darauf zu schreiben - wiederum nicht das Verhalten, das Sie vom Speicher erwarten.

1
mattnz

Die Antwort von @Mason Wheeler war korrekt, aber ich denke, es ist möglich, Ihre Frage unter eine andere Perspektive zu stellen. Nach Ihrer Frage zu urteilen, klingt für mich das Konzept, das Sie benötigen, um den Unterschied zwischen einem Cache und einem Register perfekt zu verstehen, der Datenpfad. Wie Mason richtig hervorhob, ist die Logik der CPU (d. H. Ihr Datenpfad) so ausgelegt, dass die Speicherinformationen nicht direkt von der CPU verarbeitet werden können, und deshalb existieren die Register. Tatsächlich ist die CPU nicht einmal in der Lage, den aktuellen Befehl des von ihr ausgeführten Programms zu decodieren, wenn dieser Befehl nicht zuerst in das richtige Register geladen wurde (normalerweise das mit dem Namen IR, "Befehlsregister").

Dies hängt mit der Art und Weise zusammen, wie die CPU verdrahtet ist. Es gibt keinen physischen Pfad zwischen dem Speicher und der ALU. Alle an die ALU gelieferten Daten müssen irgendwie in einem Register gepuffert werden. Es könnte anders sein, aber die Schaltung, die erforderlich ist, um den Speicher direkt mit der ALU zu verbinden, wäre zu komplex: Es ist einfacher und effizienter, die gesamte Kommunikation zwischen dem Speicher und der ALU über die Registerdatei zu vermitteln. wie durch den oben genannten Datenpfad bestimmt. Selbst wenn ein gegebener Befehl eine Speicherposition als Operanden angibt (ein Adressierungsmodus, bekannt als direkte Adressierung), wird die entsprechende Dateneinheit in ein Register geladen, das als MBR (Memory Buffer Register, bekannt ist). manchmal auch als MDR (Memory Data Buffer) bezeichnet.

Beachten Sie, dass es aus Sicht der CPU nicht wirklich wichtig ist, ob die Informationen (Daten oder Code) aus dem Hauptspeicher oder dem Cache stammen, letzterer jedoch viel schneller ist. Caches existieren aus Leistungsgründen, Register existieren aufgrund des CPU-Designs (d. H. Wegen des Datenpfads). Clevere Programmierer (eigentlich clevere Compiler) versuchen, die Verwendung von Registern zu maximieren, um Speicherzugriffe zu minimieren (Register sind schneller als Cache oder Speicher). Dies ist gerechtfertigt, da in Registern gespeicherte Informationen in der Regel mehrfach verwendet werden und dies in der Tat eines der Prinzipien der RISC-Philosophie ist.