Arbeitsspeicher

FIXME: Bilder einfügen

Wer in C oder C++ programmiert, sollte ein klare Vorstellung haben, wie Computer arbeiten. Aus diesem Grund werden wir hier ein paar Gedankenspiele zum Arbeitsspeicher machen, was er ist und wie er im Computer funktioniert.

Einheiten

Computer speichern Ja/Nein-Informationen. Jede Ja/Nein-Information speichert man in einem Bit. Acht Bits werden zusammengefasst zu einem sogenannten Byte, alle heute üblichen Computer arbeiten mit 8-Bit Bytes, es gab allerdings auch Rechner mit 9 oder 10 Bit pro Byte.

In ein Byte kann man sich 28 unterschiedliche Werte merken. Wenn wir diese Werte als Zahlen auffassen, so lässt sich in einem Byte eine Zahl zwischen 0 und 255 speichern.

Gehen wir nun in einen Laden, um einen Riegel RAM zu kaufen, so erhalten wir (derzeit) Riegel mit 512 MB, 1 GB oder 2 GB Größe. 1 MB sind 1024 KB, und 1 KB sind 1024 Bytes. Ein MB sind also 1048576 Bytes, 1 GB 1073741824 Bytes. Ein Computer mit 1 GB Arbeitsspeicher kann sich also 8589934592 unterschiedliche Ja/Nein-Informationen merken. Dieser 1 GB Riegel enthält in der Regel 8 Chips, von denen jeder 1073741824 Bits speichern kann. Oftmals ist ein neunter Chip da, der prüft, ob die Werte auch korrekt gespeichert wurden.

Für den Prozessor ist das Byte die kleinste adressierbare Einheit. Jedes einzelne Byte kann man als Hausnummer verstehen, während die einzelnen Bits einem Briefkasten am Haus entsprechen.

Hausnummern und Briefkästen

Der Prozessor sieht seinen Arbeitsspeicher auf einer einzigen langen Straße und in jedem Haus wohnen 8 Personen. Die Hausnummern sind der Reihe nach durchnummeriert: 1, 2, 3, 4, 5… usw. Da es keine weiteren Straßen gibt, reicht diese Nummer aus, um ein Haus zu adressieren. Die Nummer wird daher auch als Adresse bezeichnet. Interessant dabei ist, dass die Straße immer als Kreis angeordnet ist. Entsprechend wieviel Speicher der Computer besitzt, soviele Häuser stehen auf dieser Straße.

Möchte man nun den Wert an der Adresse 80 lesen, so guckt der Prozessor in alle acht Briefkästen und liest daraus die 8 Bits heraus. Nun kennt er einen Wert, der sich aus 8 Ja/Nein-Informationen zusammensetzt, also zum Beispiel eine Zahl zwischen 0 und 255.

Alte 8-Bit-Computer konnten so nur mit Zahlen rechnen, die zwischen 0 und 255 groß waren. Das bedeutet, sie konnten auch nur Hausnummern von 0-255 berechnen. Ein 8 Bit Computer kann also eine Straße mit 256 Häusern verwalten. Man behalf sich seinerzeit mit zusätzlichen Tricks, um dann doch mehr Speicher adressieren zu können.

Um diesen Probleme zu entgehen erfand man 16 Bit-Prozessoren. Diese können nun etwas Neues: Man adressiert ein Haus, kann aber in einem Zug die 8 Briefkästen am Haus auslesen und gleichzeitig die 8 Briefkasten am Nachbarhaus. Während ein 8 Bit-Prozessor zweimal lesen musste, konnte ein 16 Bit-Prozessor das in einem Schritt machen. So ließ sich einfach mit 216 unterschiedlichen Werten rechnen (65536) und die Straße, die ein solcher Computer verwalten konnte, umfasste entsprechend bis zu 65536 Häuser. Auch hier wurde noch getrickst.

Aktuell sind 32-Bit-CPUs, die 232 unterschiedliche Werte verstehen. Sie können also die Briefkästen von 4 Häusern gleichzeitig auslesen und arbeiten mit Adressen und Werten zwischen 0 und 4294967296. Das entspricht einem maximalen Speicherausbau von 4 GB. 64 Bit CPUs sind im Anmarsch.

Wichtig für uns als Programmierer ist dabei weniger die Größe des Speichers, als die Tatsache, dass auf dieser Straße ein Haus neben dem anderen liegt und dass wir mit modernen CPUs die Briefkästen von 1, 2, 4 oder 8 Häuser gleichzeitig auslesen können.

Adressen und Zustände

Verabschieden wir uns nun von den Briefkästen. Wir fassen die Information, ob Briefkästen Post haben oder nicht zusammen und bezeichnen das als Zustand. Wenn in einem Haus kein Briefkasten Post enthält, so bezeichnen wir diesen Zustand als 0. Besitzt genau der unterste Briefkasten Post und alle anderen nicht, so bezeichnen wir das als Zustand 1. Diese Zustände kann man durchzählen, so dass man bei 8 Briefkästen wieder auf 256 Zustände kommt.

Ein Zustand kann vieles repräsentieren: eine Zahl, aber eben auch eine Farbe, oder einen Buchstaben. Dabei kann der Zustand 0 unterschiedliche Bedeutungen haben. Als Zahl betrachtet bedeutet 0 logischerweise 0. Als Farbe bedeutet 0 schwarz, als „Buchstabe“ Ende des Textes, also eine Markierung, dass ab hier kein weiterer Buchstabe kommt. Der Prozessor kann aber auch glauben, dass es sich um einen Teil eines Programms handelt, dann bedeutet 0 „Halt“: Der Prozessor bleibt stehen.

Wenn man sich das Speicherabbild eines Computer ansieht, versteht man meist nicht viel, weil man zwar die Zustände des Computers lesen kann, aber eben nicht weiß, welche Bedeutung sie in dieser Position haben.

Semantik

Man kann einen Zustand also nach belieben interpretieren, denn die Bedeutung eines Zustandes an irgendeiner Adresse wird vom Programmierer festgelegt. Daher muss der Programmierer seine Daten nach ihrer Bedeutung sortieren.

Eine wichtige Möglichkeit ist, dass man Adressen, also die Position, wo Daten liegen, auch als Daten speichern kann. So lassen sich Daten organisieren: Man kann sich an einer bekannten Adresse merken, wo man seine Daten hinterlegt hat.