Fortgeschrittene Speicherverwaltung
Lernziele und Kompetenzen
Sie lernen die weiterführenden Konzepte der Speicherverwaltung in modernen Betriebssystemen kennen,
verstehen wie Speichermanagement mittels einer Free List realisiert werden kann,
verstehen die Grundlagen des Pagings
Grundlegende Ćberlegung
Wie gehen wir mit groĆen AdressrƤumen um?
Zwischen Heap und Stack liegt ggf. viel (ungenützter) Speicher
Mit 32-Bit lassen sich 4 GB groĆe AdressrƤume ansprechen

Exkurs
Unter 32-Bit Windows waren die obersten 2 GB physikalischem Speicher für Windows Reserviert: max. 2 GB virtueller Adressraum
Unter 32-Bit Linux 1 GB physikalischem Speicher für Betriebssystem: max. 3 GB virtueller Adressraum

Lƶsung: Segmentierung
Ein Base- und Bounds-Paar pro logisches Speichersegment des Adressraums
Was ist eine Speichersegment?
ZusammenhƤngender Speicherbereich
In unserem Fall drei Segmente
Programm-Code
Heap
Stack

Hardware-Unterstützung
Folglich: Es müssen drei Base- und Bounds-Paare in der MMU unterstützt werden
Frage: Woher weiĆ die CPU welches Segment gemeint ist?
Lösung: Teile der virtuellen Speicheradresse werden für das Segment genutzt

Base- und Bounds Beispiel
Code
32K
2K
Heap
34K
3K
Segment
28K
2K

Segmentation Fault
Speicherzugriff auf illegale Adresse in segmentiertem (aber auch bei nicht-segmentiertem Speicher)
Wie kann dass passieren?
Typisch für C-Programmer.
Aufgrund von Pointer-Arithmetik ist es rechte einfach versehentlich eine Adresse zu Ā»berechnenĀ«, die auĆerhalb des gültigen Segments liegt
Adressierung von Code-Segmenten
Beispiel:
00 - Code Segment
01 - Heap Segment
10 - Stack Segment
Berechnung:
Offset + Base-Register: physikalische Speicheradresse
Zum Prüfen der Obergrenze, wir die GrƶĆe hinzuaddiert

Was ist mit dem Stack?
Hardware-Support durch zusƤtzliches Bit
Aus Effizienzgründen: Speicherbereiche können geteilt werden
Hardware-Support durch zusƤtzliches Protection-Bit
Segment kann somit in mehreren virtuellen AdressrƤumen genutzt werden
Code
32K
2K
1
Read-Execute
Heap
34K
3K
1
Read-Write
Stack
28K
2K
0
Read-Write
Segmentierung und das Betriebssystem
Bei Context Switch müssen Segment-Register ebenfalls gesichert/geladen werden
Was passiert wenn das Speichersegment nicht genügt?
malloc-Aufruf liefert Pointer auf Speicherbereich im Heap, Heap ist jedoch zu kleinsbrk-SysCall wird ausgeführt, um Heap zu vergrƶĆernBetriebssystem vergrƶĆert das Segment und aktualisiert die entsprechenden Register
Hinweis: VergrƶĆerung kann vom Betriebssystem zurückgewiesen werden (Programm hat bereits genügend Speicher oder es gibt keinen physikalischen Speicher mehr)
Fragmentierung
Speicherfragmentierung (engl. external fragmentation)
Ursprüngliche Annahme: Alle virtuellen AdressrƤume sind gleich groĆ, das ist leider in der RealitƤt nicht so
Für Segmente müssen passende Speicherbereiche gesucht werden
Physikalischer Speicher besteht somit schnell aus einer Vielzahl an belegten Speicherabschnitten und Lƶchern
Speicher muss vom Betriebssystem komprimiert werden
Exkurs: MS-DOS und EMM386.SYS
Unter MS-DOS gab es Anfangs ein 640KB Limit
Um den Speicher optimal auszunutzen musste der Speicher hƤndisch optimiert werden, z.B.
durch Nutzung zusƤtzlicher Tools zur Speicherverwaltung
händisches Anordnen der zu ladenden Treiber, um Lücken im
Speicher mƶglichst zu vermeiden (minimieren)
Hausaufgabe:
Lesen Sie The 640K memory limit of MS-DOS
config.sys
Paging
Bisher gelernt: Segmentierung führt früher oder spƤter dazu, dass der Speicher fragmentiertā¦
Glücklicherweise nutzen Betriebssysteme noch einen zweiten Mechanismus der Speicherverwaltung: Paging
Dabei wird der Speicher in fixe Einheiten aufgeteilt
Jede solche fixe Einheit heiĆt Page (dt. Speicherseite)
Der physikalische Speicher ist demnach eine Aneinanderreihung von gleichgroĆen Slots
Jeder solcher Slot heiĆt Page Frame (dt. Seitenrahmen)
Jeder Frame kann eine Page enthalten
Paging Beispiele
Hier ein einfaches Beispiel:
64-Byte virtueller Adressraum
4 Pages a 16-Byte Pages
Betriebssystem muss »nur« vier freie Page Frames finden
Dafür gibt es eine Free List mit freien Page Frames
Datenstruktur mit den EintrƤgen wo eine Page im physikalischen Speicher liegt, heiĆt Page Table (dt. Seitentabelle)
Es gibt eine Page Table pro Prozess
Zuordnung von Frames

Paging und Address Translation
Unser Beispiel zuvor hatte ein 64-Byte Adressraum
Nun versuchen wir Daten aus einer virtuellen Adresse
<virtual address>in das Registereaxzu ladenHierfür benötigen wir zwei Komponenten
Virtual Page Number (VPN)
Offset (innerhalb der Page)

In Assembler:
Wir haben 16-Byte Seiten in einem 64-Byte Adressraum
Es müssen 4 Seiten adressiert werden können
Daher die 2-Bit Virtual Page Number (VPN)
Die restlichen Bits kƶnnen zur Adressierung innerhalb der Seite verwendet werden (= Offset)
Beispiel:
Zugriff auf virtuelle Adresse 21
21 im Dezimalsystem in ist 010101 BinƤr, ist 15 im Hexadezimalsystem
Somit Zugriff auf Byte5 in Page 1
In Asssembler:
Die physikalische Adresse1 von Page 1 ist 7 (= 111)
Physical Frame Number (PFN) oder auch Physical Page Number (PPN)

Wo liegen Page Tables?
Page Tables können sehr groà werden
Pro Eintrag 20-Bit VPN + 12-Bit Offset für 4KB Pages
20-Bit VPN bedeuten 220 Adressberechnungen pro Prozess (ca. 1 Million)
100 Prozesse in einem 32-Bit System bedeuten ca. 400 MB nur für die Page Tables
In 64-Bit Systemen nochmals einiges mehr
Daher keine extra Hardware (Speicher) in der MMU
Anstelle dessen werden Sie im Hauptspeicher vorgehalten
Konkret im virtuellen Speicher des Betriebssystems vorgehalten
Beispiel: x86 Page-Table-Eintrag
Present Bit (P): Liegt die Page im Hauptspeicher oder auf Disk (Swapping kommt spƤter)
Read/Write Bit (R/W): Darf in die Page geschrieben werden
User/Supervisor Bit (U/S): Kann ein User-Mode Prozess auf die Page zugreifen
PWT, PCD, PAT u. G: Beschreiben Hardware-Caching
Accessed Bit (A): Wird für einen sog. āLeast recently used pageā-Algorithmus genutzt
Dirty Bit (D): Wurde der Speicherinhalt verƤndert
PFN: Page Frame Number

Last updated