Virtueller und Physikalischer Speicher

Der Speicher

Der Begriff „RAM“ ist bei vielen Menschen vom Computerkauf oder aus der Werbung bekannt. Es ist die Abkürzung für „Random Access Memory“, was soviel bedeutet wie „Speicher, in dem man schreiben und lesen kann wo und wie man will“. Unter Programmierern wird der Begriff aber kaum verwendet. Stattdessen nennt man ihn meistens „Hauptspeicher“ oder einfach nur „Speicher“. Das hat nichts mit der Festplatte zu tun; Programmierer haben eigentlich nur einen Speicher und das ist der „RAM“. Die Festplatte ist für einen Programmierer etwas Externes und Langsames, was nicht so ganz zu seinem Programm gehört. Ein älterer Begriff ist auch noch „Core“. Die Speicherriegel 1) bestanden früher nämlich aus Eisen. Heute lebt „Core“ noch in dem Begriff „Core Dump“ 2).

2 Arten von Speicher

Unter dem Begriff „Speicher“ versteht man heutzutage eigentlich 2 verschiedene Arten:

  1. Virtueller Speicher
  2. Physikalischer Speicher

Um die Beziehung zwischen den beiden zu verstehen werde ich zuerst erklären, was der virtuelle Speicher ist.

Virtueller Speicher

Betrachten wir den Speicher aus der Sicht eines Programms: Es ist ein riesiges, fast unendlich großes Meer, mit viel Platz für sehr viele Variablen. Auf diesem Meer gibt es nur vereinzelt einige Inseln mit Variablen, die gerade benutzt werden.

Dieses Meer ist zwar fast unendlich - aber nicht ganz. Eigentlich ist es nur sehr groß, und es hat sogar eine bestimmte Größe. Diese Größe wird von den Werten bestimmt, die ein Zeiger fassen kann. Ein Zeiger hat meistens (eigentlich immer, aber man kann ja nie wissen) die Größe eines Prozessorregisters. Das ist auf einem 32-Bit-System - wie einem Intel Pentium - 32 Bit breit. Das bedeutet, der Speicherbereich reicht von der Adresse 0 bis 232 - 1, das ist in hexadezimaler Schreibweise 0x0 bis 0xFFFFFFFF 3), und in Dezimalschreibweise ist das 0 bis 4294967295. Das sind ziemlich viele Bytes! Und zwar 4 Gigabytes um genau zu sein. Das ist übrigens auch der Grund, wieso 32-Bit-Systeme nie über 4 Gigabyte Speicher verwenden können: Sie können einfach nicht mehr adressieren.

64-Bit-Systeme - wie ein AMD64 oder ein Intel Xeon - können aber noch viel mehr Speicher adressieren, und zwar theoretisch 264 Bits. Das sind ungefähr 1,8 mit 18 Nullen dahinter. Vorstellen kann man sich das nicht mehr, aber ich kann euch versichern, es ist SEHR viel.

Diesen adressierbaren Bereich nennt man auch den „Adressraum“ des Prozesses. Wenn ihr ein Betriebssystem mit Protected Mode habt (was sehr wahrscheinlich ist, wenn ihr nicht gerade DOS verwendet), dann hat jeder Prozess seinen eigenen Adressraum. Was bedeutet das?

  1. Jeder Prozess kann nur in seinen eigenen Adressraum schreiben und daraus lesen.
  2. Jeder Zeiger ist nur für einen einzigen Prozess gültig.
  3. Jedes Byte dieses Prozesses kann eindeutig adressiert werden.

Was bedeutet das für euch? Vor allem bedeutet das, dass ihr mit eurem Programm durch das Zugreifen auf Speicher, der euch nicht gehört, nicht das Betriebssystem oder andere Prozesse stören könnt - nur euer eigenes Programm.

Physikalischer Speicher

Wir haben gerade gesagt, dass ihr auf einem 32-Bit-System 4 GB an Speicher adressieren könnt. Das muss nicht bedeuten, dass ihr tatsächlich so viel habt. Den Speicher, den ein System tatsächlich zur Verfügung hat nennt man „physikalischer“ Speicher. Das sind die „RAM“-Riegel, die ihr tatsächlich eingebaut habt.

Ihr werdet euch fragen: „Wie geht das? Ich habe nur xyz MB Speicher in meinem System, kann aber viel mehr in meinem Programm verwenden!“ Nun, dafür sorgt ein Vorgang namens “page_14“. Euer Betriebssystem sorgt zusammen mit der MMU 4) dafür, dass im physikalischen Speicher nur die Speicherblöcke 5) geladen sind, die zurzeit verwendet werden.

Greift ein Programm auf einen Speicherbereich zu, der momentan nicht im physikalischen Speicher ist, so resultiert das in einem Hardwareinterrupt (die MMU gibt ein Signal, dass den Computer kurz anhält). Diesen nennt man „Page Fault“. Das ist aber keineswegs ein Fehler, sondern das Normalste der Welt. Das Betriebssystem kümmert sich nun darum, eine oder mehrere zurzeit unbenutzte Pages aus dem physikalischen Speicher zu nehmen und die benötigte Page in den Speicher zu laden.

Und wo kommen dann die gerade unbenutzten Pages hin? Ganz einfach: das ist dort, wo (aus Sicht des Programmierers) unendliche Speicherressourcen vorhanden sind: die Festplatte. Normalerweise hat jedes Betriebssystem einen Bereich, der speziell dafür ausgelegt ist, dass dort der Arbeitsspeicher abgelegt wird. Unter Unix-ähnlichen Systemen ist das meistens die „Swap-Partition“, und unter Windows ist es das „Page File“, auch bekannt als „Auslagerungsdatei“. Diesen Vorgang des Auslagerns einzelner „Pages“ auf die Festplatte, um den im Hauptspeicher freigewordenen Platz für gerade benötigte „Pages“ zu benutzen, nennt man “Swapping“.

Performance - oder: wieso ist ein Computer mit mehr Speicher schneller?

Nun, wir haben gerade gesehen, dass ein Programm 4 GB Speicher adressieren kann, und dass es mit Hilfe des Betriebssystems auch einen Großteil davon verwenden kann. Vielleicht fragt ihr euch: „Wieso habe ich dann extra einen neuen RAM - Riegel gekauft, wenn ich doch genug Platz auf der Festplatte habe?“.

Nun keine Sorge, umsonst war das nicht. Auf der Festplatte habt ihr zwar (fast) unendlich viel Speicher - doch dieser Speicher ist sehr langsam. Auch wenn ihr eine tolle Festplatte mit 100,000 Umdrehungen pro Minute habt oder eine SSD, so ist sie immer noch sehr, sehr viel langsamer als der Hauptspeicher. Der Hauptspeicher ist nämlich direkt mit dem Prozessor verbunden.

Damit der Prozessor aber an die Festplatte kommt, muss er erst einmal das Betriebssystem anrufen und das ruft dann mehrere Routinen auf. Nachdem das geschehen ist, setzt sich erst die Festplatte mit ihren unglaublich langsamen Platten und Leseköpfen in Bewegung, um die Daten in den physikalischen Speicher zu laden. Ihr könnt euch also denken: Je mehr physikalischen Speicher ihr besitzt, desto weniger muss das System auslagern und desto schneller ist es.


Autorendiskussion

1) oder in Mediamarkt-Sprache „RAM“
2) ein Abbild des Speichers
3) Hexadezimal ist die Schreibweise, wie sie für Zeiger und Speicher oft verwendet wird
4) Memory Management Unit, ein Prozessorbauteil das für die Speicherverwaltung zuständig ist
5) auch „Pages“ genannt