Langsam nähern wir uns dem Ende des technischen Teils dieser Reihe. Das letzte mal wurde das Zweierkomplement erklärt und dargelegt, wie Subtraktion im Rechner funktioniert. Zusätzlich haben wir gesehen, wie ein einfaches Rechenwerk arbeitet; eine wichtige Grundlage der Funktionsweise sind hier die Steuersignale. Und deren Herkunft wollen wir heute klären.
Zuerst gibt es allerdings etwas Theorie.
Die Grundlage der Steuersignale sind sogenannte Instruktionen; eine Instruktion ist eine Bitkette, die eine bestimmte durch den Prozessor auszuführende Aufgabe codiert, zum Beispiel “addiere den Wert 5 auf den im Akkumulator gespeicherten Wert” (wir erinnern uns: der Akkumulator war ein spezielles Register, welcher Ergebnisse und Operanden für das Rechenwerk verwaltet). Eine Instruktion besteht in der Regel aus einem Opcode, welcher die eigentliche Operation (z.B. “addiere”) beschreibt, sowie einer optionalen Anzahl von Operanden (also etwa die zu addierenden Zahlen). Operanden können feste Werte sein, aber auch bestimmte Register beschreiben oder lediglich eine Adresse auf eine bestimmte Speicherzelle enthalten (dazu später noch etwas); die Interpretation der Operanden hängt immer vom Opcode ab. Die Länge einer Instruktion und der einzelnen Bestandteile muss übrigens nicht fest sein, sondern kann auch variabel sein, je nach zugrundeliegender Prozessorarchitektur.
Ein kurzes (fiktives) Beispiel: die Instruktion “0110110101” kann etwa in die Bestandteile 0110, 11 und 0101 unterteilt werden, wobei “0110” der Opcode ist und zum Beispiel die Anweisung “addiere einen festen Wert zu dem in einem Register gespeicherten Wert” codiert, “11” das zu benutzende Register (zum Beispiel den Akkumulator) beschreibt und “0101” schließlich den festen Wert, hier eine 5, codiert. Zusammengenommen ergibt die Bitkette also die Instruktion “addiere den Wert 5 auf den im Akkumulator gespeicherten Wert”.
Die Abarbeitung von Instruktionen durch das sogenannte Steuerwerk im Prozessor erfolgt bei der Von-Neumann-Architektur (welche die Grundlage der meisten modernen Rechner bildet) nach dem Von-Neumann-Zyklus. Dieser besteht üblicherweise aus 4 Phasen:
- Fetch: die nächste auszuführende Instruktion wird aus dem Speicher geladen und im sogenannten Instruktionsregister gespeichert
- Decode: die Instruktion im Instruktionsregister wird dekodiert, also grob gesagt in ihre Bestandteile “zerlegt”; konkret werden hier unter anderem die Steuersignale aus der Instruktion extrahiert
- Fetch Operands: eventuelle Operanden aus dem Speicher werden in die entsprechenden Register geladen
- Execute: die Anweisung wird ausgeführt
Soweit zur Theorie. Die klingt zwar immer recht schön, lässt aber offen, was nun in den einzelnen Phasen genau passiert. Schauen wir also einmal etwas genauer hinein; dazu benötigen wir noch einige neue Bauelemente, die jeweils an der entsprechenden Stelle näher beschrieben werden.
Phase 1: Fetch
Bevor eine Instruktion verarbeitet werden kann, muss sie erst einmal zur Verfügung stehen, da der Prozessor nur mit Werten arbeiten kann, die in einem seiner Register vorliegen. Jetzt ist die Anzahl der Register eines Prozessors in der Regel sehr begrenzt; es stehen auf keinen Fall genügend zur Verfügung, um viele Instruktionen (welche zusammen übrigens ein komplettes Programm ergeben!) aufzunehmen. Für die Speicherung von Instruktionen existiert im Prozessor ein separates Register (in modernen Rechnern sogar mehrere davon), welches Instruktionen speichert, das sogenannte Instruktionsregister. Die Instruktionen selbst stehen woanders, in der Regel im Cache oder im Arbeitsspeicher.
Ohne jetzt allzu sehr ins Detail zu gehen: der Cache ist ein kleiner, sehr schneller Speicher, der sich physikalisch in der Nähe des Prozessors (oder sogar in ihm) befindet und unmittelbar benötigte Daten aufnimmt. Je nach Nähe zum Prozessor werden verschiedene Cache-Level unterschieden; so haben moderne Prozessoren in der Regel einen Level-1-Cache, der direkt im Prozessor selber integriert ist, im gleichen Takt wie dieser läuft und eine Größe im Bereich von bis zu wenigen hundert Kilobyte hat. Dazu gibt es in der Regel noch mindestens einen Level-2-Cache außerhalb des Prozessors, der langsamer arbeitet und bis zu einigen Megabyte groß sein kann. Irgendwo weiter hinten in der Speicherhierarchie findet sich dann schließlich der Arbeitsspeicher, der langsamer als die Caches arbeitet, dafür aber auch bedeutend größer ist (momentan sind etwa 4 Gigabyte relativ üblich). Irgendwo in einem Speicher dieser Hierarchie steht auch die nächste Instruktion, die der Prozessor bearbeiten soll, und die gilt es zu finden. Hierfür steht ein separates Register zur Verfügung, der sogenannte Program Counter (PC). Dieser enthält die Adresse der nächsten Instruktion (in Form einer Bitkette), anhand derer die betreffende Instruktion im Speicher gefunden und ins Instruktionsregister geladen werden kann.
Kommentare (12)