Das "Erfolgsgeheimnis" des Computers liegt darin, daß mit diesem Gerät erstmalig in der Geschichte eine universelle (Rechen-)Maschine geschaffen wurde. D.h. die Hardware eines Computers ist mächtig genug, daß er zusammen mit der beliebig änderbaren Software eine Vielzahl von Aufgaben erledigen kann. Je nach gerade ausgeführtem Programm erscheint der Computer als eine Rechenmaschine für verschiedenste mathematische Aufgabenstellungen, als eine leistungsfähige Schreibmaschine, ein technischer Zeichentisch, eine Datenbank und so weiter. Gleichgültig, welche Maschine momentan in der black box Computer zu stecken scheint, bleibt ein allgemeines Prinzip stets für alle Rechner bestehen: Der Computer benötigt eine Eingabe, reagiert auf diese mit deren Verarbeitung und liefert eine Ausgabe. Beispiele:
Eingabe |
Verarbeitung |
Ausgabe |
laufende Nummer eines Datensatzes | Berechnung eines Zeigers, Dateizugriff | Inhalt des zugehörigen Datensatzes |
(3+4) . (7+8) | Zwei Additionen, eine Multiplikation, Verwaltung von Zwischenergebnissen | 105 |
Tastendruck | Holen des Aussehens des Buchstabens aus einer Tabelle, Schreiben in den Bildschirmspeicher | Buchstabe auf Bildschirm |
Diese Universalität des Computers ist möglich, weil er eine festgelegte Menge an - für sich genommen
sehr einfachen - Befehlen beherrscht. Die Menge aller möglichen Befehle in ihren möglichen Abwandlungen
nennt man die Maschinensprache eines bestimmten Rechners. Jedes Programm besteht (nur) aus diesen Maschinenbefehlen.
Wenn ein Computer variabel einsetzbar sein soll, darf ihn die Maschinensprache nicht bereits einschränken.
Das Prinzip Eingabe-Verarbeitung-Ausgabe begegnet uns in konkretisierter Form als Laden-Verarbeiten-Speichern
auch auf der Ebene einzelner Maschinenbefehle. Was diese drei Termini bedeuten, soll im Folgenden geklärt
werden. Eines sei aber vorweg gesagt: Von einer höheren Ebene aus gesehen, ist jeder Maschinenbefehl für
Laden,Verarbeiten oder Speichern zuständig (auch wenn es Überschneidungen gibt). Dennoch werden
aber bei der Ausführung jedes Maschinenbefehls alle drei Phasen durchlaufen.
Trotz der Einleitung müssen wir an dieser Stelle leider etwas weiter ausholen
- bis zur Speicherhierarchie (Kapitel 5 wird später
auf sie im Detail eingehen):
Wie jeder PC-Besitzer weiß, kann ein Computer nie genug Speicher haben, sei es Hauptspeicher oder Festplattenplatz.
Dabei findet aus Kostengründen immer eine Abwägung zwischen Kapazität (Größe)
und Geschwindigkeit statt (zumindest bei Festplatten ist halbwegs eine Abhängigkeit zwischen Preis
und Geschwindigkeit zu erkennen). Sobald wir uns vom PC-Massenmarkt abwenden, der durch die große Anzahl
kostenbewußter Käufer schon sehr am Preis-/Leistungsverhältnis orientiert ist, erkennen wir, daß
ein Rechner mit z.B. 2 Gigabyte batteriegepuffertem Hauptspeicher aber ohne Festplatte technisch durchaus möglich
wäre. Und warum soll man sich mit heute üblichen DRAMs mit 60 ns Zugriffszeit bescheiden, wo doch jeder
die tollen Cache-RAMs mit 15ns und weniger Zugriffszeit kennt, die also mindestens viermal so schnell sind? Die
Antwort ist natürlich der Preis - ein so ausgestatteter Computer wäre unglaublich teuer.
Wie erreicht man nun möglichst große Leistung zu einem möglichst kleinen Preis? Die Lösung
liegt nicht etwa darin, auf alle schnelleren Speicherarten zu verzichten, und nur die preisgünstigste einzusetzen
- käme es nur auf Mark/Megabyte an, würden heutige PCs jedes Bit qualvoll lange auf einem Bandlaufwerk
durch Hin- und Herspulen suchen (eine DAT-Cassette für bis zu 8 Gigabyte kostet ca. 10 DM, die zugehörigen
Laufwerke wären bei Massennachfrage bald ähnlich billig wie Videorecorder oder CD-Spieler). Es kann auch
keine befriedigende Lösung sein, nur einen Speichertyp als Kompromiß zwischen Kosten, Größe
und Geschwindigkeit zu wählen - wofür soll man sich auch in unserem Standard-PC entscheiden: Lieber eine
Festplatte (100mal größer) oder lieber DRAMs (je nach gemessenem Aspekt 10mal bis 1000.000mal schneller)?
Die Lösung, die jeder kennt, lautet natürlich: Von jedem etwas, vom Teureren etwas weniger, vom Billigeren
etwas mehr. Im PC heißt das: Auf unserer Festplatte, die praktischerweise die Daten auch nach dem Abschalten
bewahrt, lagern vielleicht Hunderte von Programmen, doch die Handvoll davon , die wir gleichzeitig ausführen
lassen wollen, passt zusammen in den Hauptspeicher in DRAM-Technologie. Jedes Programm wird vor der Ausführung
von der Festplatte in das RAM geschafft und, einmal dort eingetroffen, wesentlich schneller ausgeführt, als
es auf einer Magnetplatte alleine möglich wäre. Das RAM wirkt somit als ein "Beschleuniger"
für den Speicher namens Festplatte. Das funktioniert, weil wir eben nur einen Teil der Festplattenkapazität
zur Zeit benötigen und dieser Teil (hoffentlich) in das RAM paßt . Dennoch müssen wir nicht
auf eine große "Lagerkapazität" (auf der gesamten Festplatte) verzichten. Damit haben wir
eine erste, zweistufige Speicherhierarchie kennengelernt (in Wirklichkeit hat sie schon im Standard-PC viel mehr
Stufen).
Wir definieren also als Speicherhierarchie: Eine Speicherhierarchie besteht
aus mindestens zwei Speichern, den sogenannten Stufen. Stufe 1 sei der kleinste und schnellste Speicher von allen,
Stufe n sei immer größer und langsamer als Stufe n-1. Alle Stufen sind logisch ineinander geschachtelt,
d.h. Stufe n-1 deckt einen Teil der Adressen von Stufe n ab. Ein Rechner versucht sich ein Binärwort zunächst
immer von Stufe 1 schicken zu lassen. Ist dieses Wort nicht in Stufe 1 gevorhanden, wird bei Stufe 2 angefragt
usw. Kann Stufe n liefern, wird das Binärwort in allen Stufen mit kleineren Nummern abgelegt (weil es wahrscheinlich
ist, daß es bald noch einmal benötigt wird); dieses Übertragen eines Binärwortes von Stufe
n in eine höhere Stufe (n-1 etc.) ist das Laden aus Laden-Verarbeiten-Speichern. Nichtsdestotrotz spricht
man auch bei Binärworttransfer in die umgekehrte Richtung von Laden, also z.B. "das RAM wird mit
dem Wert aus Register Nr. 3 geladen".
Typische Stufen der Speicherhierarchie eines mainstream-PCs:
Stufe | typische Größe | relative Geschwindigkeit (lineares Lesen) |
DM pro MByte |
Register im Hauptprozessor | 4 - 32 Stück á 4 Byte | >= 30000 | sehr viele |
Zwischenspeicher im Hauptprozessor (first level cache) |
8 - 32 KByte | ca. 30000 | > 1000 |
Zwischenspeicher in schnellem SRAM (second level cache) |
256 KByte | 2250 | 120 |
Hauptspeicher in DRAM (RAM) |
8 - 32 MByte | 1500 | 8 |
Festplatte | 1 - 2 GByte | 100 - 200 | 0,25 |
Auswechselbarer Speicher, z.B. Disketten, magneto-optische Medien, Magnetbänder | beliebig | 1 (HD-Diskette) | < 0,25 (DAT-Band ca. 10-3) |
Auf der von uns betrachteten Registertransferebene kommt Laden
so vor: Größter/langsamster Speicher ist ein RAM, unter Vorgriff
auf das Konzept des Von-Neumann-Rechners (Kapitel 3) sei verraten: Dieser Speicher
enthält die Befehle, die zusammen das Programm ergeben, und die Operanden, also die Daten,
die das Programm verarbeiten soll.
Warum gibt es hier noch eine höhere Ebene der Speicherhierarchie? Kann das Programm nicht direkt im RAM ausgeführt
werden? Die Gründe, warum dies nicht getan wird, sind wieder Kosten und Leistung (Performance) des Rechners:
Wir können also sagen: Der Einsatz einer Speicherhierarchie ist wirtschaftlich, Laden also notwendig. Wenn wir nun nicht darum herumkommen, wo tritt es dann auf?
Nur für einen reinen Von-Neumann-Rechner ist also folgende Betrachtung uneingeschränkt richtig:
Bei allen Rechenbefehlen mit zwei Operanden kommt ein Operand aus dem RAM, der andere ist der Wert des Akkumulators. Auch das Ergebnis wird immer im Akkumulator abgelegt. Für eine Addition sind somit meistens drei Maschinenbefehle erforderlich ("a := b" bedeutet "a soll den Wert von b annehmen"):
Daß eine solche "Sparmaschine" nicht besonders effektiv arbeitet, liegt auf der Hand. Jetzt
wird außerdem deutlich, daß ein Unterschied zwischen der "Aufgabe" eines Maschinenbefehls
und den zu seiner Ausführung notwendigen Schritten besteht:
Der so einfach klingende Befehl "c := a + b" muß im Von-Neumann-Rechner in drei Maschinenbefehle
zerlegt werden, einen Ladebefehl, einen Rechenbefehl (Verarbeitungsbefehl) und einen Speicherbefehl.
Jeder der drei Befehle für sich aber durchläuft eine Ladephase (das Befehlswort wird aus dem RAM
in das Befehlsregister geholt), um überhaupt ausgeführt werden zu können; der Rechenbefehl tritt
danach in die Verarbeitungsphase ein, in der er die ALU zum Addieren benutzt und endet schließlich mit
der Speicherphase, in der der Akkumulator seinen neuen Wert bekommt. Bei Lade- und Speicherbefehl kann man sich
streiten, ob deren eigentliche Aufgabe (das Übertragen eines Binärwortes vom RAM in ein Register
bzw. umgekehrt) zur Verarbeitungs- oder Speicherphase gehört.
Dies ist die "exekutive" Phase jedes Maschinenbefehls; an ihr können verschiedene Komponenten des
Rechners beteiligt sein:
Bei den Befehlen 1 und 3 findet eine Verarbeitung der bewegten Binärwörter nur durch die Identitätsfunktion
statt; sie gehören zur Klasse der Lade- und Speicherbefehle, die Daten nur in Raum (Kopieren) und Zeit (Speichern
im Sinne von Aufbewahren) bewegen, aber nicht verändern und deswegen in der Verarbeitungsphase keine Register
oder RAMs benötigen, um Operanden zu liefern.
Wir haben bereits gesehen, daß es Klassen von Maschinenbefehlen gibt, zu denen auch die Lade-/Speicherbefehle gehören. Aufgabe eines Ladebefehls ist es, ein Binärwort von Stufe n zu Stufe n-1 zu übertragen, ein Speicherbefehl kopiert dementsprechend von Stufe n-1 nach Stufe n (das Wort wird im langsameren, aber größeren, bei Festplatten/Disketten/Bändern auch sichereren, Speicher einer niedrigeren Stufe quasi eingelagert).
Aber auch beim Transfer von Stufe n zu Stufe n oder n-1 spricht man von Speichern. Dies kann der Fall sein, wenn ein Maschinenbefehl (nicht unbedingt ein Speicherbefehl!) in seine Speicherphase eintritt. Ein Additionsbefehl hat bis dahin z.B. bereits eine ALU mit zwei Operanden versorgt und ihr den Befehl zum Berechnen der richtigen Funktion gegeben, das Ergebnis der Berechnung steht in der ALU bereit. Da die ALU meistens keine Werte speichern kann, muß das Wort nun irgendwo abgelegt werden, beim Von-Neumann-Rechner z.B. zwingenderweise im Akkumulator. Dies ist die Aufgabe der Speicherphase. Man beachte, daß in diesem Fall die Daten auf Stufe 1 bleiben.
Um dieser Verwirrung Herr zu werden wird die Speicherphase oft in weitere Phasen unterteilt: In einer Phase wird nur das RAM ausgelesen oder beschrieben, eine andere dient nur zum Sichern von Ergebnissen in Registern.
Carsten Kelling 1996 (); letzte Änderung: 17. September 1997 |