Warum jedes Programm eigene Adressen hat
Virtueller Speicher gibt jedem Prozess einen eigenen, zusammenhängend wirkenden Adressraum, den das Betriebssystem auf den echten Arbeitsspeicher abbildet. Das schützt Prozesse voreinander und erlaubt, mehr Speicher zu versprechen, als eingebaut ist.
Eine Hochschulbibliothek macht es ähnlich. Sie bestellen ein Buch mit der Signatur aus dem Katalog, und das Personal weiß, in welchem Regal es steht. Der Katalog ist hier die Seitentabelle.
Am Ende dieser Lektion
Notiz
Ich kann mit einer Seitentabelle eine virtuelle Adresse in eine physische Adresse umrechnen.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Virtuelle Adresse | die Adresse, die ein Programm benutzt | |
| Physische Adresse | die echte Stelle im Arbeitsspeicher | |
| Seite | ein Block des virtuellen Speichers fester Größe | 4096 Bytes |
| Rahmen | ein Block des echten Speichers, so groß wie eine Seite | |
| Seitentabelle | die Tabelle, die jede Seite ihrem Rahmen zuordnet | |
| Offset | der Abstand vom Anfang einer Seite |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jeder Prozess sieht seinen eigenen Adressraum
Ein Programm liest und schreibt an Adressen. Würden alle Prozesse echte Adressen benutzen, könnte ein fehlerhaftes Programm den Speicher eines anderen überschreiben. Deshalb arbeiten Programme mit virtuellen Adressen. Jeder Prozess beginnt bei seiner eigenen Adresse 0.
Die Hardware übersetzt bei jedem Zugriff die virtuelle in eine physische Adresse. Das ist die echte Stelle im Arbeitsspeicher. Das Bauteil dafür heißt Speicherverwaltungseinheit, kurz MMU.
Virtuell ist oft größer als echt belegt
Linux zeigt in der Datei status zwei Größen eines Prozesses. VmSize ist der virtuelle Adressraum, den der Prozess angefordert hat. VmRSS ist der Teil, der wirklich im Arbeitsspeicher liegt.
VmSize ist meist deutlich größer als VmRSS. Der Befehl unten zeigt beide Zeilen für das Programm grep selbst. Die Zahlen sind in Kilobyte und auf jeder Maschine anders.
Virtuelle und echte Größe von grep
grep -E "VmSize|VmRSS" /proc/self/statusHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Der Speicher wird in Seiten und Rahmen zerlegt
Das System schneidet den virtuellen Speicher in gleich große Stücke, die Seiten. Den echten Speicher schneidet es in gleich große Stücke, die Rahmen. Eine Seite passt genau in einen Rahmen. Unter Linux ist die Größe meist 4096 Bytes.
Eine Adresse besteht aus zwei Teilen: der Seitennummer und dem Offset, dem Abstand vom Anfang der Seite. Der Offset bleibt bei der Übersetzung gleich.
Die Seitengröße abfragen
getconf PAGESIZEHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Beispiel: eine Seitentabelle mit vier Seiten
| Seite | Rahmen | Im Speicher? |
|---|---|---|
| 0 | 3 | ja |
| 1 | kein Rahmen | nein |
| 2 | 5 | ja |
| 3 | 1 | ja |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Beispiel: Adresse 700 übersetzen, Seitengröße 256
| Schritt | Rechnung | Ergebnis |
|---|---|---|
| Seitennummer | 700 geteilt durch 256, ohne Rest | 2 |
| Offset | der Rest dieser Teilung | 188 |
| Rahmen laut Tabelle | Eintrag für Seite 2 | 5 |
| Physische Adresse | 5 mal 256, plus 188 | 1468 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Seitennummer und Offset von Adresse 700
python3 -c "a = 700; print(a // 256, a % 256)"Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Fehlt eine Seite, gibt es einen Seitenfehler
Steht in der Seitentabelle, dass die Seite nicht im Speicher ist, löst die Hardware einen Seitenfehler aus. Das Betriebssystem übernimmt: Es holt die Seite von der Festplatte in einen freien Rahmen und trägt sie in die Tabelle ein. Dann wiederholt das Programm den Zugriff.
Deshalb dürfen alle Seiten eines Prozesses zusammen größer sein als der Arbeitsspeicher. Nur die gerade genutzten müssen darin liegen.
Ein häufiger Fehler
Warnung
Viele halten einen Seitenfehler für einen Programmabsturz. Er ist aber normal und wird vom System unbemerkt behoben. Ein Absturz (Segmentation fault) droht nur, wenn die Adresse zu keiner gültigen Seite gehört oder die Rechte verletzt.
Die Seitentabelle schützt Prozesse voreinander
Jeder Prozess hat seine eigene Seitentabelle. Seite 2 von Prozess A und Seite 2 von Prozess B zeigen auf verschiedene Rahmen. Ein Prozess kann den Speicher eines anderen deshalb nicht einmal ansprechen.
Jeder Eintrag enthält auch Rechte: lesen, schreiben, ausführen. In /proc/self/maps listet Linux die Bereiche des eigenen Adressraums auf, jede Zeile mit Adressbereich und Rechten.
Die ersten Bereiche von head ansehen
head -n 3 /proc/self/mapsHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.