Navigation überspringen

ARES


Seiteninhalt:

Wie ein Prozessor funktioniert

Funktionsweise eines Computers

Die Erklärungen auf dieser Seite sind so weit wie möglich vereinfacht, um denjenigen, die überhaupt keine Vorstellung von der Funktionsweise eines Computers haben, einen ungefähren Eindruck zu vermitteln, worum es eigentlich geht. Ich habe mich bemüht, alles so einfach wie nur möglich zu erklären, und unnötige Details weggelassen, trotzdem ist der folgende Text schon etwas anspruchsvoller. Wenn du aber die Erklärungen auf dieser Seite einmal verstanden hast, dann hast du das Tutorial eigentlich schon hinter dir, denn der Rest wird dann sofort einleuchtend sein.

Schon wieder Nulleinsnulleins

Wir Menschen rechnen mit zehn verschiedenen Ziffern. Das ist aber nicht zwingenderweise nötig - man kann eine beliebeige Anzahl von Zahlzeichen benutzen, zB. {0,1,2,3,4} oder {0,1,2,3,4,5,6,7,9,a,b,c,d,e,f} oder eben auch {0,1}. Wie das genau funktioniert, ist hier nicht wichtig, es zählt, daß es eigentlich keinen Unterschied ausmacht, mit wievielen Ziffern man etwas ausrechnet. Wenn man nun mit zwei Ziffern (0 und 1) arbeitet, dann wird das Rechnen sehr einfach - so einfach, daß man alle Rechenoperationen auch ersatzweise mit den logischen Gattern AND, OR und NOT darstellen kann (Boole'sche ArithmetikExternal Link). Diese Gatter kann man wiederum sehr leicht mit Relais oder Transistoren direkt realisieren, und dadurch auch Schaltungen, die binäre Berechnungen durchführen können.

Aufbau eines Prozessors (CPU)

Ein ProzessorExternal Link besteht aus vielen unterschiedlichen Schaltungen und beinhaltet eine sehr große Anzahl von logischen Gattern. Er kann damit im Wesentlichen nur ein paar Berechnungen durchführen, sowie Speicherinhalte kopieren und diese vergleichen. Wie das Kopieren und Vergleichen von Daten im technischen Detail funktionert, ist hier nicht weiter von Bedeutung, es reduziert sich jedenfalls auch auf ziemlich einfache Formeln in Boole'scher Arithmetik, die wiederum durch Gatter umgesetzt werden können. Ein Taktgeber erzeugt in regelmäßigen Abständen einen Stromimpuls, wodurch der Prozessor veranlaßt wird, eine weitere Operation durchzuführen. Die Geschwindigkeit, in der ein Prozessor mit solchen SignalenExternal Link versorgt wird, nennt man Taktfrequenz, die Zeitspanne zwischen den Signalen bezeichnet man als einen Takt-Zyklus (englisch: "Cycle").

ALU

Die eigentliche Rechenarbeit wird von einer Ansammlung unterschiedlich spezialisierter Schaltungen vorgenommen. So gibt es eine eigene Schaltung, die zwei Zahlen addiertExternal Link, eine weitere für Multiplikation, eine für das Kopieren von Daten aus dem Hauptspeicher in den Prozessor, eine andere für das Kopieren von Daten aus dem Prozessor in den Hauptspeicher, verschiedene andere für das Kopieren von Daten innerhalb des Prozessors, manche Schaltungen stellen fest, ob ein Wert größer ist als ein anderer, andere prüfen wieder auf Gleichheit, etc. Die ersten Homecomputer hatten etwa einhundert, moderne Prozessoren haben einige hundert solcher unterschiedlich spezialisierter Schaltungen. Die Gesamtheit dieser Schaltungen wird Arithmetic and Logic Unit (ALU) genannt.

Register

Um nicht ständig mit dem langsamen externen Hauptspeicher arbeiten zu müssen, benutzen die Schaltungen der ALU meistens sogenannte Register - das sind sehr kleine RAM-Speicher von jeweils nur wenigen Bytes Größe, die gemeinsam mit der ALU auf dem Chip untergebracht und passend "verdrahtet" sind.

Steuerwerk (Control Unit)

Jeder einzelnen Schaltung der ALU ist eine eindeutige Zahl zugeordnet. Damit der Prozessor die Funktionen der ALU sinnvoll einsetzen kann, benötigt er ein Programm. So ein "Maschinenprogramm" liegt als Zahlenfolge im Hauptspeicher vor. Das Steuerwerk holt sich diese Zahlen der Reihe nach aus dem Speicher und aktiviert dann die entsprechenden Teile der ALU. Diese Zahlenfolge des Programms nennt man auch "Maschinensprache". So könnte die Zahlenfolge 23,00,01,24,00,02,77 Folgendes bedeuten:
  MOV &0001, X   Kopiert Wert aus Hauptspeicher-Zelle Nr. 0001 in das X-Register
MOV &0002, Y Kopiere Wert aus Hauptspeicher-Zelle Nr. 0002 in das Y-Register
ADD X, Y Addiere den Wert im Y-Register zum X-Register
(Beispiel, Disassembly von Notepad.exe)

Der Instruction Pointer

Der IP ist ein besonders wichtiges Register - in ihm ist immer die Adresse derjenigen Hauptspeicher-Zelle abgelegt, die den nächsten Maschinencode beinhaltet. (Jede Speicherzelle hat eine fortlaufend zugeordnete Nummer, die "Adresse") Zuerst benutzt das Steuerwerk den IP, um den entsprechenden Machinen-Befehl aus dem RAM auszulesen. Nach Ausführung dieses Befehls durch die ALU erhöht das Steuerwerk den Inhalt des IP-Registers um eins, wodurch es auf den folgenden Befehl im RAM "zeigt". Nun kann der nächste Befehl aus dem Speicher geholt werden, usw.

Der JUMP Befehl

Einen besonderen Maschinensprachebefehl möchte ich hier kurz erläutern, den Programmsprung. Wie oben schon erwähnt, wird der IP nach Ausführung der Operation automatisch um eins erhöht. Die Anweisung
  JMP +100
bewirkt aber, daß die Zahl 100 zum IP addiert wird. Dadurch wird für den nächsten Befehl nicht die folgende Speicherzelle ausgelesen, sondern diejenige, die 100 Zellen weiter hinten im Speicher liegt. Es gibt auch sogenannte bedingte Sprünge, die nur unter bestimmten Umständen durchgeführt werden.

Multitasking und Task Queues

Wie wir nun wissen, führt ein Prozessor einen Befehl nach dem anderen aus. Aber moderne Computer können doch mehrere Programme "gleichzeitig" ausführen? Dabei handelt es sich nur um einen scheinbaren Effekt, denn in Wirklichkeit kann auch dein Computer immer nur einen Befehl nach dem anderen abarbeiten. Die Gleichzeitigkeit wird mit einem Trick erreicht: Das Programm des Betriebsystems schaltet sehr schnell zwischen den verschiedenen aktiven Programmen (Tasks, auch Prozesse genannt) um, jedes Programm bekommt eine "Zeitscheibe". In so einer Zeitscheibe werden dann ein paar Befehle durchgenommen, bis der nächste Task-Switch passiert. Moderne Prozessoren unterstützen die Betriebsysteme beim Multitasking. Für unsere Zwecke darfst du dir vereinfacht vorstellen, daß der Prozessor nicht nur ein einzelnes Instruction Pointer Register besitzt, sondern eine ganze Liste von IPs. Jedesmal, wenn ein Befehl durchgeführt wurde, wird der (inkrementierte) IP aber nicht einfach ins Register zurückgeschrieben, sondern er wird von unten in diese sogenannte Task Queue "hineingeschoben". Dadurch rückt der IP des nächsten Prozesses an oberste Stelle und kommt zur Ausführung. Je mehr Einträge die Task Queue hat, um so langsamer laufen natürlich die einzelnen Programme.

Assembler

Maschinensprache besteht nur aus Zahlen und diese Zahlen bedeuten auf unterschiedlichen Prozessoren auch unterschiedliche Befehle. Damit der Mensch leichter verstehen kann, was so ein Programm macht, gibt es die Assemblerschreibweise. Die Opcodes (Operation Codes, also die Befehle) werden mit dreibuchstabigen Kürzeln ("Mnemonics") angeschrieben, und falls vorhanden, die zugehörigen Werte. Diese Werte (Parameter) beziehen sich fast immer auf Speicherbereiche - entweder eine bestimmte Zelle des Hauptspeichers oder ein Register der CPU. Mitunter können auch konkrete Zahlenwerte zum Rechnen gemeint sein. Im Abschnitt "Steuerwerk" hatte ich den (erfundenen) Maschinencode noch einmal in Assemblerschreibweise wiedergegeben ("disassembliert").

Assembler ist also nur eine besser lesbare Darstellung von Maschinensprachen-Code.

Programme werden schon lange nicht mehr direkt in Maschinensprache eingegeben - man schreibt Assemblercode und läßt diesen dann von einem Programm, ebenfalls "Assembler" genannt, in Maschinencode übersetzen. Redcode ist ebenfalls eine Assemblersprache, allerdings eine vergleichsweise einfache, sie kennt nur 17 Opcodes. Ein simples Kampfprogramm ("Dwarf") zur Veranschaulichung, du mußt es jetzt aber noch nicht verstehen. Die Bezeichnungen vor den eigentlichen Instruktionen sind Sprungmarken (Labels), sie werden bei der Übersetzung durch passende Zahlen ersetzt:
  loop   MOV   bomb,   @ptr   kopiere DAT #0-"Bombe" an die Zieladresse
ADD #5, ptr erhöhe den Wert in ptr um 5
JMP loop Springe zurück - Endlose "Programmschleife"
ptr DAT #10 DAT darf nicht ausgeführt werden, speichert nur Daten
bomb DAT #0 Kopien dieses DAT Befehls werden als Bombe verwendet

Zusammenfassung

Ein Prozessor ist eine Anhäufung unterschiedlicher Gruppen von logischen Schaltungen. Das Maschinensprachenprogramm beschreibt, in welcher Reihenfolge diese Schaltungen aktiviert werden sollen. Durch Multitasking kann das "parallele" Verarbeiten von Programmen simuliert werden. Das wird erreicht, indem mehrere Instruction Pointer in einer Task Queue verwaltet werden. Ein Assembler ist ein Programm, das Assembler-Quellcode in Maschinencode umwandelt.

Für ganz Neugierige:

Moderne Prozessoren sind schon sehr komplex aufgebaut. Sie analysieren den Maschinencode und optimieren die Verarbeitung in Echtzeit. So gibt es etwa "Branch Prediction" - der Prozessor berechnet alle möglichen Sprungadressen noch während ein Vergleich durchgeführt wird, oder Befehle werden in Portionen zerlegt und parallel verarbeitet und Vieles mehr. Das Poster zeigt einen CPU-Die ("Chip") in starker Vergrößerung und Beschreibung der einzelnen Schaltgruppen:

ares/northwood.jpg
Aufbau eines Pentium-Prozessors

MARS-Prozessor

Content Management:

μCMS α1.6