Computer

Ein Computer ist im Prinzip eine programmierbare Rechenmaschine.

Ein Programm, das sich im Arbeitsspeicher des Computers befindet wird gestartet. Während der Ausführung des Programms fallen Daten an, die zwischengespeichert werden müssen.

Die zentrale Schaltstelle ist die CPU.

CPU mit zusätzlicher Hardware

Schaltplan
Minimalkonfiguration eines Computers

Die CPU alleine genügt noch nicht, für einen sinnvoll funktionierenden Computer. Es wird noch ein Minimum an zusätzlicher Hardware benötigt. Dazu gehört der Arbeitsspeicher und eine Möglichkeit mit der CPU zu kommunizieren (I/O-Schnittstelle).

Der Arbeitsspeicher

Neben der CPU spielt der Arbeitsspeicher in einem Computersystem die zentrale Rolle. Hier werden Programmcode und Daten gespeichert. Die CPU muss bei fast allen Befehlen, teilweise mehrfach, auf den Speicher zugreifen.

Der Arbeitsspeicher heutiger Computer besteht aus einem mehr oder weniger großen Halbleiterspeicher. Wesentlich ist, dass auf jede Speicherzelle wahlfrei zugegriffen werden kann (Random Access). Nur so können Sprünge im Programmcode schnell und effizient ausgeführt werden. Bei früheren Computersystemen, deren Programme und Daten auch während der Laufzeit auf Lochstreifen oder Magnetband gespeichert waren, war ein wahlfreier Zugriff nicht ohne große Latenzzeiten möglich. Komplexe Programme mit zahlreichen Subroutinen waren damals nicht möglich oder sehr langsam.

Organisation des Arbeitsspeichers

Der Arbeitsspeicher wird üblicherweise in Bytes organisiert. Ein Byte besteht aus 8 Bits.
Ein Bit kann eine binäre Informationseinheit („An“ oder „Aus“ bzw. „1“ oder „0“) speichern.
Abweichungen vom Byte-Muster gibt es bei Harvard-Systemen. Der Programmspeicher ist bei solchen Systemen häufig in andere Einheiten unterteilt, die für das betreffende System besser geeignet sind.

Unterschied zwischen Arbeitsspeicher und Registern

Sowohl beim Arbeitsspeicher, als auch bei Registern, handelt es sich um Halbleiterspeicher.
Register sind jedoch mit der CPU oder Teilen der CPU direkt verbunden. Sie sitzen beispielsweise an den Ein- oder Ausgängen der ALU oder sind als Funktionsregister direkt mit der CPU verbunden.
Der Arbeitsspeicher besteht im aus vielen Speichereinheiten (Bytes), auf die wahlfrei zugegriffen werden kann. Für die Verarbeitung der Inhalte dieser Einheiten, müssen diese jedoch zunächst über den Datenbus (Programmbus) an die CPU übertragen werden. Sie werden in den meisten Fällen in Registern auf der CPU für die Verarbeitung zwischengespeichert. Eine direkte Verbindung der Speicherzellen des Arbeitsspeichers zur CPU wäre schaltungstechnisch nicht machbar.

Unterschiedliche Speichertechnologien

Beim Arbeitsspeicher (RAM: Random Access Memory) kann zwischen den Kategorien Volatile Memory (flüchtiger Speicher) und Non-volatile Memory (nicht flüchtiger Speicher) unterschieden werden. Der klassische Festwertspeicher, der nur einen Lesezugriff erlaubt aber nicht verändert werden kann, spielt inzwischen eine sehr untergeordnete Rolle.

Volatile Memory

Volatile Memory verliert die Information, wenn die Betriebsspannung abgeschaltet wird. Es existieren im Wesentlichen zwei Technologien:

  • DRAM (Dynamic RAM): Die Information wird in einem kleinen Kondensator gespeichert und muss regelmäßig aufgefrischt werden (Refresh-Zyklus)
  • SRAM (Static RAM): Die Information wird in FlipFlops gespeichert. Ein Refresh ist nicht nötig.

DRAM benötigt auf einem Halbleiter-Chip weniger Fläche pro Informationseinheit als SRAM. Daher wird bei großen Speichereinheiten auf die DRAM-Technologie gesetzt. SRAM benötigt zwar mehr Platz pro Informationseinheit. Allerdings ist SRAM meistens schneller als DRAM und muss nicht regelmäßig refreshed werden. Register und Caches auf der CPU sind in SRAM-Technologie ausgeführt.

Non-volatile Memory

Non-volatile Memory verliert die Information nicht, wenn die Betriebsspannung abgeschaltet wird. Flash-Speicher und EEPROMs sind nichtflüchtige Speicher, die auch mehrfach neu beschrieben werden können.

Auch im Massenspeicher-Bereich verdrängt die Halbleiter-Technologie zunehmend die magnetischen und optischen Technologien wie Festplatten und CD/DVD-ROM. Vorteile der Halbleiter-Technologie sind die Zugriffsgeschwindigkeit bei sehr geringen Latenzzeiten und die Tatsache, dass keine beweglichen (mechanischen) Komponenten nötig sind. Allerdings ist die Anzahl an Lösch- und Schreibzyklen begrenzt. Daher sind diese Technologien für Massenspeicher, deren Inhalt dauernd geändert wird, nicht so gut geeignet.

Trennung von Programm und Daten

Sowohl der Programmcode, als auch die während der Laufzeit anfallenden Daten, müssen irgendwo in einem Speicher abgelegt werden. Programmcode und Daten dürfen sich nicht ins Gehege kommen.

Bei der Harvard-Architektur liegen diese auf physikalisch voneinander getrennten Speicherbereichen. Die meisten Mikrocontroller sind auf diese Art aufgebaut.

Bei einem von Neumann Rechner liegen Programmcode und Daten in einem gemeinsamen Speicher. Der User muss also sicherstellen, dass die Daten den Programmcode nicht überschreiben. Bei den heutigen Computersystemen übernimmt das Betriebssystem diese Aufgabe.

Der Stack

Speicherorganisation
Speicherorganisation

Für Daten, die während des Programmablaufs kurz zwischengespeichert werden müssen, hat sich die Aufteilung des Datenspeichers in den Stack (Stapelspeicher) und den Heap (übersetzt: Haufen) bewährt.

Der Stack ist ein Stapelspeicher. D.h. Daten werden auf dem Stack abgelegt und wieder heruntergenommen.
Das Ganze funktioniert wie ein Kartenstapel, bei dem die Karten oben aufgelegt und auch nur von oben heruntergenommen werden können. Die als letztes aufgelegte Information wird also als erstes wieder vom Stapel heruntergenommen. Dieses Prinzip wird auch als LIFO (last in first out) bezeichnet.

Der Stack ist eine dynamische Struktur, die wächst je mehr Daten auf dem Stack abgelegt werden und schrumpft, je mehr Daten vom Stapel heruntergenommen werden. Der Zugriff kann immer nur auf das oben aufliegende Element erfolgen. Die meisten Prozessoren kennen spezielle Befehle, die mit dem Stack arbeiten:

push

Der push-Befehl legt Daten auf dem Stack ab.

pop

Der pop-Befehl (manchmal auch als pull bezeichnet) nimmt Daten vom Stack herunter.

Der Stackpointer

Die Speicheradresse der obersten Speicherzelle des Stacks wird im Stackpointer gespeichert.
Bei manchen Prozessoren ist der Stackpointer ein als Hardware vorhandenes Register, das direkt von der CU gesteuert wird.

Bei den meisten Prozessoren beginnt der Stack bei hohen Speicheradressen und wächst in Richtung Speicheradresse 0. Mit Hilfe des Stackpointers kann auch während der Laufzeit überprüft werden, ob ein Speicherüberlauf (Stack-Overflow) stattgefunden hat. Dabei wächst der Stack so stark, dass er in den Bereich der Daten des Prozesses reicht und diese verfälscht. Dies muss während der Laufzeit natürlich vermieden werden, da es sonst zu einem nicht definierbaren Verhalten des Computersystems führt.

Unterfunktionen im Programmcode

Ein klassisches Einsatzgebiet für den Stack ist das Aufrufen einer Unterfunktion aus dem laufenden Prozess heraus.
Beim Ausführen einer (Unter-) Funktion wird in einer bestimmten Stelle des Programmcodes zu einer anderen Stelle im Programmcode gesprungen, wo der Programmcode der Funktion gespeichert ist. Dort wird der Programmcode fortgeführt. Ist die Funktion abgearbeitet wird wieder zurück an den Ausgangspunkt gesprungen. Dieser Ausgangspunkt muss natürlich zwischengespeichert werden. Dies geschieht üblicherweise auf dem Stack.

Ein Funktionsaufruf aus einem laufenden Programm läuft also wie folgt ab:

  1. Sichern des Programmzählers auf dem Stack
  2. Sprung an die Adresse der Unterfunktion (dabei wird der Programmzähler verändert)
  3. Ausführen der Unterfunktion
  4. Rücksprung an die Ausgangsadresse. (dabei wird der Programmzähler vom Stack genommen und der gespeicherte Wert wiederhergestellt)

Bussysteme

Die Anbindung von Arbeitsspeicher und Peripherie erfolgt über verschiedene Bussysteme. Ein Bus besteht aus mehreren elektrischen Leitungen, die parallel liegen und verschiedene Bauteile oder Baugruppen miteinander verbinden.

Dafür sind mindestens ein Datenbus und ein Steuerbus nötig.

Der Datenbus

Die eigentlichen Informationen, die von der CPU benötigt werden, werden über den Datenbus an den Arbeitsspeicher und die Peripherie verteilt. In den meisten Fällen hat der Datenbus die Breite der ALU.

Der Steuerbus

Auch die Funktion des Arbeitsspeichers und der Peripherie muss gesteuert werden. Dies geschieht normalerweise über einen separaten Steuerbus.

Der Adressbus

Computersystem optimiert
Optimiertes Computersystem (Von Neumann Rechner)

Besonders stark belastet wird der Bus beim Zugriff auf den Speicher. Dies ist gleichzeitig eine der häufigsten Operationen, die ein Computersystem ausführen muss.

Folgende Operationen müssen für einen Speicherzugriff stattfinden:

  1. Lesen / Schreiben (Steuerung)
    Die CU muss dem Speicher mitteilen, ob Daten aus dem Speicher gelesen werden sollen oder in den Speicher geschrieben werden sollen.
  2. Adresse der Speicherzelle (Adressierung)
    Die CU muss dem Speicher mitteilen, welche Speicherzelle gelesen oder geschrieben werden soll.
  3. Inhalt der Speicherzelle (Daten)
    Beim lesenden Zugriff muss Inhalt der betreffenden Speicherzelle vom Speicher an die CPU übertragen werden. Beim Schreibenden Zugriff muss der (künftige) Inhalt der Speicherzelle von der CPU an den Speicher übertragen werden.

Ein gemeinsamer Bus für die Adressierung und die Datenübertragung stellt sich als Bremsschuh für die Performance des Computers dar. Daher gibt es für die Adressierung der Speicherzellen einen eigenen Bus, den Adressbus. Die Breite des Adressbusses unterscheidet sich normalerweise von der Breite des Datenbusses. Die Breite des Adressbusses begrenzt auch die maximale Anzahl der adressierbaren Speicherzellen.