Kapitel 3: Speicherverwaltung 3.1 Einführung
Kapitel 3: Speicherverwaltung 3.1 Einführung
Kapitel 3: Speicherverwaltung 3.1 Einführung
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
1. <strong>Einführung</strong><br />
2. Swapping<br />
<strong>Kapitel</strong> 3: <strong>Speicherverwaltung</strong><br />
3. Virtueller Speicher<br />
4. Paging-Algorithmen<br />
5. Implementierung des Pagings<br />
6. Segmente<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 1<br />
<strong>3.1</strong> <strong>Einführung</strong><br />
• Programmierer wollen Speicher:<br />
– extrem groß<br />
– extrem schnell<br />
– permanent, d.h. Daten gehen nicht verloren<br />
• Zielannäherung durch Speicherhierarchie:<br />
– Caches: klein, schnell, teuer, nicht-permanent<br />
– Hauptspeicher (RAM): mittlere Größe und Geschwindigkeit,<br />
nicht-permanent<br />
– Plattenspeicher: groß, langsam, permanent<br />
• <strong>Speicherverwaltung</strong> verwaltet die Speicherhierarchie:<br />
– teilt Prozessen Speicher zu und gibt den Speicher frei<br />
– überträgt die Daten innerhalb der Hierarchie<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 2<br />
1
<strong>Speicherverwaltung</strong>sstrategien<br />
Wie kann der Speicher verwaltet werden?<br />
1. Statische <strong>Speicherverwaltung</strong>: Prozess wird einmal in den<br />
Speicher geladen und dort vollständig ausgeführt<br />
– Monoprogrammierung: 1 Programm im Speicher<br />
– Multiprogrammierung:<br />
• Speicher wird in feste Abschnitte unterteilt<br />
• In jede Partition wird ein Prozess geladen<br />
2. Dynamische <strong>Speicherverwaltung</strong>: Der Speicher wird<br />
dynamisch in Abschnitte unterteilt<br />
– Swapping: Abschnitt enthält den vollständigen Prozess<br />
– Virtueller Speicher: Abschnitt enthält einen Teil eines<br />
Prozesses<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 3<br />
<strong>3.1</strong>.1 Monoprogrammierung<br />
Mainframes und Minicomputer Handhelds und embedded Systeme DOS-Systeme<br />
Im Speicher: das Betriebssystem und 1 Benutzerprozess<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 4<br />
2
Alternativen bei Monoprogrammierung<br />
• Alternative a)<br />
– BS im unteren RAM-Speicherbereich<br />
– Benutzerprozess im oberen Bereich<br />
– Früher bei Mainframes und Minicomputer verwendet<br />
• Alternative b)<br />
– BS im oberen Speicherbereich (ROM-Speicher)<br />
– Benutzerprozess im unteren Bereich<br />
– Handhelds und embedded Systeme<br />
• Alternative c)<br />
– Gerätetreiber im ROM (oberer Bereich)<br />
– restliches BS im RAM (unterer Bereich)<br />
– dazwischen der Benutzerprozess<br />
– ersten DOS-Systeme<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 5<br />
Programmausführung<br />
bei Monoprogrammierung<br />
1. Benutzer gibt Kommando ein<br />
2. BS lädt das Programm von der Platte in den<br />
Hauptspeicher (das alte Programm wird<br />
überschrieben)<br />
3. Nach der Terminierung des Programms fordert<br />
das BS das nächste Kommando an<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 6<br />
3
4.1.2 Multiprogrammierung<br />
mit festen Partitionen<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 7<br />
Multiprogrammierung mit festen Partitionen<br />
• Mehrere Prozesse sind gleichzeitig im Speicher<br />
• Jeweils ein Prozess in einer Partition<br />
• Prozess blockiert an einer I/O-Operation: ein anderer<br />
Prozess erhält den Prozessor<br />
• Alternative a)<br />
– Prozesse werden anhand ihres Speicherbedarfs in die<br />
entsprechende Warteschlange eingefügt<br />
– Nachteil: Wenn eine Warteschlange leer ist, bleibt die Partition<br />
ungenutzt<br />
• Alternative b)<br />
– Nur eine Warteschlange<br />
– Prozesse in die freie Partition mit dem geringsten Speicherverlust<br />
einfügen<br />
– Nachteil: Eventuell zu viel Verschnitt<br />
– Dieser Ansatz wurde früher bei den Mainframes benutzt<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 8<br />
4
Probleme bei der Multiprogrammierung:<br />
Relokation und Schutz<br />
• Relokation:<br />
– Programme nacheinander mehrfach in unterschiedlichen<br />
Partitionen ausgeführt<br />
– Absoluten Speicheradressen werden in den Maschinenbefehlen<br />
angepasst<br />
– Durch das BS beim Laden des Programms<br />
• Schutz:<br />
– Prozesse können auf Partitionen anderer Prozesse zugreifen<br />
– Schutzcode im Programmstatuswort verhindert dies<br />
– Schutzcode darf nur vom BS geändert werden<br />
• Kombinierte Lösung:<br />
– HW bietet Basisregister und Limitregister<br />
– Basisregister wird automatisch auf die relativen Speicheradressen<br />
addiert<br />
– Resultierende Adresse muß kleiner als Wert im Limitregister sein<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 9<br />
Basis- und Limit-Register<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 10<br />
5
4.1.3 Dynamische <strong>Speicherverwaltung</strong><br />
Wie wird der Speicher verwaltet, wenn der<br />
Speicherbedarf der Prozesse größer als der<br />
Hauptspeicher ist oder eine sequentielle Ausführung<br />
der Prozesse nicht akzeptabel ist?<br />
1. Swapping:<br />
• Prozesse sind vollständig im Hauptspeicher<br />
• Prozesse laufen eine zeitlang und werden dann auf den<br />
Hintergrundspeicher ausgelagert (Swap-Bereich)<br />
2. Virtueller Speicher:<br />
• Nur die momentan benötigten Teile des Adressraums befinden<br />
sich im Hauptspeicher<br />
• Bei Bedarf werden fehlende Teile nachgeladen<br />
• Nicht mehr benötigte Teile werden verdrängt<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 11<br />
4.2 Swapping<br />
• Swapping: Anzahl und Größe der Partitionen dynamisch<br />
an den Speicherbedarf der Prozesse angepasst<br />
• Benachbarte, freie Speicherbereiche werden zusammen<br />
gefasst: Speicherverdichtung.<br />
• Der Speicherbedarf eines Prozesses kann bei der<br />
Ausführung wachsen<br />
– Datensegment: dynamisch erzeugte Objekte<br />
– Stacksegment: Prozeduraufrufkette<br />
– Strategie:<br />
• Einlagern eines Prozesses: mehr Hauptspeicher reservieren als<br />
momentan notwendig<br />
• Auslagern: nur der benutzte Speicher auf den Hintergrundspeicher<br />
übertragen<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 12<br />
6
4.2.1 Swapping mit dynamischen Partitionen<br />
Zeit<br />
A<br />
Betriebssystem<br />
(a)<br />
B<br />
A<br />
Betriebssystem<br />
(b)<br />
C<br />
B<br />
A<br />
Betriebssystem<br />
(c)<br />
Betriebssystem<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 13<br />
C<br />
B<br />
(d)<br />
C<br />
B<br />
D<br />
Betriebssystem<br />
(e)<br />
Partition Freispeicher<br />
C<br />
D<br />
Betriebssystem<br />
Wachsende Daten- und Stack- Segmente<br />
B<br />
A<br />
Betriebssystem<br />
(a)<br />
Wachsender Datenbereich<br />
eines Prozesses<br />
Raum zum<br />
Wachsen<br />
in Benutzung<br />
B-Stack<br />
B-Daten<br />
B-Programm<br />
A-Stack<br />
A-Daten<br />
A-Programm<br />
Betriebssystem<br />
(b)<br />
Wachsender Datenbereich<br />
und wachsender Stack<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 14<br />
(f)<br />
Raum zum<br />
Wachsen<br />
7
4.2.2 <strong>Speicherverwaltung</strong> beim Swapping<br />
Wie verwaltet das BS den dynamisch zugeteilten<br />
Speicher beim Swapping?<br />
Alternativen:<br />
1. Bitmaps<br />
– der Speicher wird in Einheiten fester Länge aufgeteilt<br />
– ein Bitvektor mit einem Bit pro Einheit<br />
– Frei: Bit == 0; Belegt: Bit == 1<br />
– Problem: Aufwendige Suche für große, freie<br />
Speicherbereiche<br />
2. Verkettete Listen<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 15<br />
<strong>Speicherverwaltung</strong> mit Bitmaps<br />
A B C D E ...<br />
0 8 16 24 32<br />
11111000<br />
11111111<br />
11001111<br />
11111000<br />
...<br />
Bitmap<br />
Speicher<br />
Speichereinheit, z.B. 128 Bytes<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 16<br />
8
<strong>Speicherverwaltung</strong> mit verketteten Listen<br />
• Jeder freie und jeder belegte Speicherbereich bildet jeweils<br />
ein Segment<br />
• Segmente können unterschiedlich groß sein<br />
• Pro Segment wird ein Element in einer verketteten Liste<br />
geführt mit:<br />
– Zustand: frei oder belegt<br />
– Anfangsadresse<br />
– Segmentlänge<br />
• Die Liste kann nach der Anfangsadresse geordnet sein<br />
(schnelles Finden eines Segments)<br />
• Benachbarte, freie Elemente werden zusammengefasst<br />
• Aus Effizienzgründen: zusätzlich eine Freiliste, die bzgl.<br />
der Segmentlänge sortiert ist<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 17<br />
Beispiel für eine verkettete Liste<br />
A B C D E ...<br />
0 8 16 24 32<br />
Kopf<br />
1 0 5<br />
0 5 3<br />
1 8 6<br />
1 14 4<br />
0 18 2<br />
1 20 6<br />
1 26 3<br />
0 29 3<br />
0 29 3<br />
Länge<br />
Anfangsadresse<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 18<br />
frei<br />
Speicher<br />
9
4.2.3 Algorithmen zur Speicherbelegung<br />
• First Fit:<br />
– Erstes passende Segment wird genommen<br />
– Segment wird aufgeteilt: belegt und frei<br />
– Kurze Suchzeiten, aber ev. viel Verschnitt<br />
• Next Fit:<br />
– Suche beginnt beim zuletzt bearbeiteten Segment<br />
– Vergleichbar mit First Fit<br />
• Best Fit:<br />
– Alle Segmente durchsuchen<br />
– Das kleinste passende Segment wird genommen<br />
– Zeitaufwendiger als First Fit<br />
• Quick Fit:<br />
– Zusätzliche Liste für freie Segmente<br />
– Findet freien Speicher extrem schnell<br />
– Aufwendiger bei der Speicherfreigabe und insbesondere bei der<br />
Verschmelzung benachbarter freier Segmente<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 19<br />
4.3 Virtueller Speicher<br />
Wie wird der Speicher bereitgestellt, falls ein Prozess zu<br />
groß für den Hauptspeicher ist?<br />
• Erste Lösung:<br />
– Prozess wird in mehrere Teile (Overlays) aufgeteilt<br />
– Nicht alle Overlays sind gleichzeitig im Speicher<br />
– BS verwaltete die Overlays<br />
– Anfangs: Der Programmierer legte die Overlays fest<br />
• Virtueller Speicher:<br />
– BS hält die momentan benötigten Teile im Hauptspeicher und den<br />
Rest auf Platte<br />
– BS verwaltet den momentanen Speicherbedarf von allen Prozessen<br />
– Prozess darauf wartet, dass ein Teil von ihm eingelagert wird: Prozess<br />
wartet er auf I/O (Plattenauftrag)<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 20<br />
10
1. Paging<br />
Virtueller Speicher<br />
2. Seitentabelle und Seitenfehler<br />
3. Mehrstufige Seitentabellen<br />
4. Translation Lookaside Buffer<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 21<br />
4.<strong>3.1</strong> Paging<br />
• Die meisten BS mit virtuellem Speicher benutzen als<br />
Technik das Paging<br />
– Die in einem Programm benutzten Adressen heißen virtuelle<br />
Adressen<br />
– Diese bilden den virtuellen Adressraum<br />
• Eine virtuelle Adresse<br />
– zeigt nicht sofort auf den Speicher<br />
– sondern wird von der MMU (Memory Management Unit) auf<br />
eine physikalische Speicheradresse abgebildet<br />
• Der virtuelle Adressraum ist in Einheiten fester Länge<br />
unterteilt: Seiten (Pages)<br />
• Die entsprechenden Einheiten im Hauptspeicher heißen<br />
Seitenrahmen oder Seitenkacheln (Frames)<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 22<br />
11
Memory Management Unit (MMU)<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 23<br />
Abbildung:<br />
virtuelle Adresse -> physikalische Adresse<br />
Seiten-Größe: 4.096 Bytes<br />
Rahmen-Größe: 4.096 Bytes<br />
Virtuelle Adresse: 20.500<br />
• Seite 5: [20.480 -> 24.575]<br />
• 20.500 = 20.480 + 20<br />
• Seite 5 -> Rahmen 3<br />
• Rahmen 3: [12.288 -> 16.383]<br />
• 12.288 + 20 = 12.308<br />
Physikalische Adr: 12.308<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 24<br />
12
4.3.2 Seitentabelle und Seitenfehler<br />
• Die Seitentabelle ordnet jeder Seite im Seitendeskriptor zu:<br />
– eine Seitenrahmennummer<br />
– ein present-Bit: Seite hat Rahmen oder nicht<br />
• Zugriff auf Seite mit present-Bit = 0 : Seitenfehler<br />
– BS sucht wenig benutzten Rahmen aus<br />
– BS schreibt den Rahmen auf Platte<br />
– Das present-Bit der entsprechenden Seite wird auf 0 gesetzt<br />
– BS lädt die Seite, die den Seitenfehler auslöste in den freien Rahmen<br />
– BS setzt in der Seitentabelle die Rahmennr. und das present-Bit<br />
– Der Zugriff auf die Seite wird noch einmal ausgeführt<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 25<br />
Seitengröße<br />
• Zur effizienten Verwaltung der Seitentabelle:<br />
– Seitengröße ist immer eine Zweierpotenz<br />
– z.B. 4 KB (Linux) oder 8KB<br />
• Aufteilung der virtuellen Adresse:<br />
– Seitennummer: Index in die Seitentabelle<br />
– Offset: Adresse innerhalb der Seite bzw. des Rahmens<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 26<br />
13
Beispiel einer Seitentabelle<br />
15 11 Offset 0<br />
Seiten-<br />
Nummer<br />
0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 0<br />
als Index<br />
benutzt<br />
Seitentabelle<br />
Present-Bit<br />
0<br />
1<br />
2<br />
3<br />
4<br />
5<br />
6<br />
7<br />
8<br />
9<br />
10<br />
11<br />
12<br />
13<br />
14<br />
15<br />
010 1<br />
001 1<br />
110 1<br />
000 1<br />
100 1<br />
011 1<br />
000 0<br />
000 0<br />
000 0<br />
101 1<br />
000 0<br />
111 1<br />
000 0<br />
000 0<br />
000 0<br />
000 0<br />
Eingehende virtuelle Adresse: 20.500<br />
14 11<br />
0<br />
0 1 1 0 0 0 0 0 0 0 1 0 1 0 0<br />
Seiten-<br />
Rahmen-<br />
Nummer<br />
Offset<br />
Übernahme<br />
des Offsets<br />
Ausgehende reale Adresse: 12.308<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 27<br />
Problem: Realisierung der Seitentabelle<br />
1. Die Seitentabelle kann extrem groß werden:<br />
– Jeder Prozess hat einen eigenen Adressraum<br />
– D.h. er braucht eine eigene Seitentabelle<br />
– Bei Seitengröße 4 KB benötigt 32-Bit-Adressraum<br />
eine Mio. Seiten<br />
– Bei 64-Bit und 4 KB Seitengröße: 2 52 Seiten<br />
2. Die Umrechnung muß sehr schnell sein:<br />
– Umrechnung bei jedem Speicherzugriff<br />
– Die meisten Maschinenbefehle haben<br />
Speicheroperanden<br />
Forderung: Hardware-Unterstützung<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 28<br />
14
Realisierungsalternativen<br />
1. Seitentabelle wird in HW-Registern gehalten:<br />
– Umrechnung ist extrem schnell<br />
– Prozesswechsel ist extrem langsam: alle Register<br />
werden aus dem Speicher geladen<br />
2. Seitentabelle wird im Hauptspeicher abgelegt:<br />
– HW hat nur 1 Register: Zeiger auf den Anfang der<br />
Seitentabelle<br />
– Prozesswechsel ist extrem schnell<br />
– Umrechnung ist extrem langsam: für jede<br />
Umrechnung mindestens ein weiterer Speicherzugriff<br />
auf die Seitentabelle<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 29<br />
4.3.3 Mehrstufige Seitentabellen<br />
Wie können riesige Seitentabellen im Speicher abgelegt<br />
werden?<br />
• Mehrstufige Seitentabellen:<br />
– Baumartige Struktur von Teiltabellen<br />
– Nur die letzte Stufe der Rahmenadressen hat Nutzdaten<br />
– Vorangegangenen Stufen enthalten Rahmenadressen von<br />
Teiltabellen<br />
• Nicht alle Teiltabellen werden gleichzeitig im Speicher<br />
gehalten<br />
• Nicht benötigte Teiltabellen sind ausgelagert<br />
• Unbenutzte Adressbereiche (z.B. zwischen Daten und<br />
Stack) belegen keinen Speicher (keine Teiltabellen)<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 30<br />
15
2-stufige Seitentabelle für 32 Bit-Adressen<br />
• Die erst 10 Bits zeigen<br />
auf die 1. Stufe,<br />
• die folgenden 10 Bits<br />
auf die 2. Stufe<br />
• die verbleibenden 12<br />
Bits sind der Offset<br />
innerhalb des 4 KB<br />
Rahmens<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 31<br />
4.3.4 Translation Lookaside Buffer (TLB)<br />
Wie kann die Umrechnung beschleunigt werden?<br />
• Beobachtung: in einem Programm existieren sehr viele<br />
Zugriffe auf wenige Seiten<br />
• Zur Beschleunigung der Umrechnung:<br />
– MMU erhält zusätzlich einen Assoziativspeicher (Translation<br />
Lookaside Buffer: TLB)<br />
– TLB bildet virtuelle Adresse ohne Umweg über die Seitentabelle<br />
auf die physikalische Adresse ab<br />
– Extrem schnell, da kein Zugriff auf den Hauptspeicher<br />
• Typischer TLB hat 8 bis 64 Einträge<br />
• Aufbau eines TLB-Eintrags entspricht dem eines<br />
Seitendeskriptors<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 32<br />
16
Beispiel für TLB<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 33<br />
Nutzung des TLB<br />
1. Virtuelle Adresse wird an die MMU geschickt<br />
2. MMU prüft, ob die entsprechende Seite im TLB ist<br />
3. Assoziativspeicher: alle TLB-Einträge gleichzeitig<br />
vergleichen<br />
4. Eintrag gefunden:<br />
1. Seitenrahmennummer aus dem TLB-Eintrag nehmen<br />
5. Kein Eintrag gefunden:<br />
1. Eintrag aus der Seitentabelle im Hauptspeicher holen<br />
2. Eintrag wird zusätzlich in den TLB geschrieben<br />
3. Ein alter Eintrag wird verdrängt<br />
4. Beim nächsten Zugriff steht die Seite schon im TLB<br />
6. Beim Prozesswechsel wird der TLB geleert<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 34<br />
17
4.4 Paging-Algorithmen<br />
Welche Seite wird aus dem Speicher entfernt, um Platz für<br />
eine neue Seite zu machen?<br />
• Optimaler Algorithmus für Entfernung einer Seite:<br />
– Kein Zugriff auf die Seite in der Zukunft oder<br />
– auf die Seite zu letzt in der Zukunft zugegriffen<br />
• Problem:<br />
– Optimaler Algorithmus ist nicht realisierbar<br />
– BS weiß nicht, auf welche Seite als nächste zugegriffen wird<br />
• Vielzahl von sub-optimalen Seitenersetzungs-Algorithmen<br />
• Das gleiche Problem tritt allgemein bei Caches auf:<br />
– Prozessor-Cache: Speicherwörter müssen verdrängt werden<br />
– Webserver-Cache: Webseiten müssen verdrängt werden<br />
– TLB: Adressabbildungen müssen verdrängt werde<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 35<br />
Alternative Algorithmen<br />
1. Not-Recently-Used-Algorithmus<br />
2. Second-Chance-Algorithmus<br />
3. Least-Recently-Used-Algorithmus<br />
4. Working-Set-Algorithmus<br />
Weitere Algorithmen werden in [Tanenbaum] beschrieben:<br />
– First In First Out-Algorithmus<br />
– Clock-Algorithmus<br />
– Not-Frequently-Used-Algorithmus<br />
– Aging-Algorithmus<br />
– Working-Set-Clock-Algorithmus<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 36<br />
18
4.4.1 Not-Recently-Used-Algorithmus (1)<br />
• Eine Seite wird verdrängt, wenn sie im vorangegangenen<br />
Zeitintervall nicht benutzt wurde<br />
• Hierfür werden im Seitendeskriptor 2 Status-Bits geführt:<br />
– R-Bit (Referenced): lesend oder schreibend zugegriffen<br />
– M-Bit (Modified): schreibend zugegriffen<br />
• Bei jedem Zugriff auf eine Seite setzt die HW das<br />
entsprechende Bit im Seitendeskriptor auf 1<br />
• Beim Uhren-Interrupt setzt das BS das R-Bit aller<br />
Seitendeskriptoren auf 0, d.h.<br />
– Alle Seiten, auf die seit dem letzten Uhren-Interrupt zugegriffen<br />
wurde, haben im R-Bit eine 1 stehen<br />
– Alle Seiten, auf die seit dem letzten Uhren-Interrupt nicht zugegriffen<br />
wurde, haben eine 0 im R-Bit<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 37<br />
4.4.2 Not-Recently-Used(2)<br />
• Bei Seitenfehlern werden die Seiten in 4 Klassen eingeteilt:<br />
– Klasse 0: R == 0 und M == 0<br />
– Klasse 1: R == 0 und M == 1<br />
– Klasse 2: R == 1 und M == 0<br />
– Klasse 3: R == 1 and M == 1<br />
• Es wird eine Seite aus der Klasse mit der kleinsten Nummer<br />
ausgelagert<br />
• D.h. wenn eine Seite in der Klasse 0 ist, wird diese<br />
genommen.<br />
• Bewertung von Not-Recently-Used:<br />
– Einfache, effiziente Implementierung<br />
– Nicht optimale, aber akzeptable Ergebnisse<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 38<br />
19
4.4.3 Second-Chance-Algorithmus<br />
• Alle Seiten sind in einer Liste nach FIFO (First In First<br />
Out) geordnet<br />
• Zusätzlich wird das R-Bit genutzt<br />
• Beim Seitenfehler wird folgende Seite verdrängt:<br />
1. Die älteste Seite gemäß FIFO, falls diese Seite R == 0 hat<br />
2. Falls R == 1, wird die Seite an das Ende der Liste gehängt und R<br />
= 0 gesetzt. Fortfahren mit 1.<br />
3. Die neue Seite kommt an das Ende der Liste<br />
• Die Auswertung von R verhindert, dass oft benutzte, alte<br />
Seiten ausgelagert werden (2. Chance)<br />
• Realisierungsaufwand und Ergebnisse sind akzeptabel<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 39<br />
4.4.4 Least-Recently-Used-Algorithmus<br />
• Annahme: In der letzten Zeit häufig genutzte Seiten<br />
werden auch in der Zukunft häufig genutzt<br />
• Beim Seitenfehler: die Seite ersetzt, die am längsten nicht<br />
genutzt wurde<br />
• Implementierung:<br />
– Liste mit Seiten, die nach der Zugriffszeit geordnet sind<br />
– Bei jedem Zugriff: Seite an das Ende der Liste stellen<br />
• Ergebnisse sind sehr gut<br />
• Aber:<br />
– Realisierung ist zu aufwendig<br />
– eine Listenoperation bei jedem Zugriff<br />
• Implementierung erfordert<br />
– entweder eine Spezial-HW<br />
– oder einen abgewandelten Algorithmus (siehe Literatur)<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 40<br />
20
4.4.5 Working-Set-Algorithmus<br />
• Annahme: Prozesse greifen die meiste Zeit auf eine relativ<br />
kleine Teilmenge ihrer Seiten zu: Working-Set<br />
• Eine Seite gehört zum Working Set, wenn sie in den<br />
letzten k Speicherzugriffen benutzt wurden<br />
• Beim Scheduling merkt sich das BS den Working Set des<br />
verdrängten Prozesses<br />
• Beim Einlagern eines Prozesses werden alle Seiten aus<br />
seinem Working Set bereitgestellt (Prepaging)<br />
• Tritt ein Seitenfehler auf, wird die zuletzt zugegriffene<br />
Seite aus dem Working-Set entfernt<br />
• Die Ergebnisse sind gut, aber aufwendige Realisierung (ev.<br />
mit HW-Unterstützung)<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 41<br />
4.5 Implementierungsentscheidungen<br />
Lokale oder globale Seitenersetzung?<br />
– Lokal: nur die Seiten des Prozesses mit dem Seitenfehler werden<br />
verdrängt<br />
– Global: alle Seiten können ausgelagert werden, d.h. alle Prozesse<br />
sind betroffen<br />
– Im Allgemeinen: globale Seitenersetzung bevorzugt<br />
Was ist die optimale Seitengröße ?<br />
– Seiten sehr groß: große unbenutzte Bereiche innerhalb der Seite<br />
– Seiten sehr klein: große Seitentabellen, da viele Einträge in der<br />
Seitentabelle<br />
– Existierende Systeme: Seitengröße zwischen 512 B und 8 KB,<br />
typisch: 4 KB.<br />
Wie kann die Last gesteuert werden?<br />
– Zu viele Seitenfehler: Prozesse werden ausgelagert, d.h. Paging<br />
mit zusätzlichem Swapping<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 42<br />
21
Paging im Lebenszyklus eines Prozesses<br />
• Bei der Prozesserzeugung:<br />
– Anhand des Programms (Text, Daten und Stack): Seitentabelle<br />
erzeugt und initialisiert<br />
– Text- und Daten-Segment werden auf Hintergrundspeicher kopiert<br />
• Bei der Aktivierung eines Prozesses durch den Scheduler:<br />
– MMU wird mit der Seitentabelle des Prozesses initialisiert<br />
– TLB wird geleert, da er den Inhalt des deaktivierten Prozesses hat<br />
• Beim Auftreten eines Seitenfehlers:<br />
– Die virtuelle Adresse wird ermittelt und gesichert<br />
– Ein Seitenrahmen wird gemäß Paging-Algorithmus verdrängt<br />
– Falls dieser modifiziert wurde, wird er auf die Platte geschrieben<br />
– Der benötigte Seitenrahmen wird von der Platte gelesen<br />
– Der Programmzähler wird auf die zuvor gesicherte Adresse gesetzt<br />
• Bei der Terminierung eines Prozesses:<br />
– Seitentabelle, Seitenrahmen und Plattenplatz werden freigegeben<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 43<br />
Behandlung von Seitenfehlern<br />
1. HW sichert den Programmzähler und Trap in den Kern<br />
2. Die Register werden im PCB gesichert<br />
3. BS ermittelt die virtuelle Adresse, die den Seitenfehler verursacht hat<br />
4. BS prüft, ob der Zugriff erlaubt ist und ermittelt Seitenrahmen, der<br />
verdrängt werden soll<br />
5. Falls der verdrängte Seitenrahmen modifiziert wurde, wird er auf Platte<br />
geschrieben (Scheduler aktiviert anderen Prozess)<br />
6. Die angeforderte Seite wird von der Platte in den Rahmen übertragen<br />
7. Update der Seitentabelle mit neuem Seitenrahmen<br />
8. Programmzähler wird auf den Befehl gesetzt, der den Seitenfehler<br />
ausgelöst hat<br />
9. Prozess mit Seitenfehler wird vom Scheduler aktiviert<br />
10. Register werden geladen und Rücksprung in den Benutzer-Modus<br />
11. Prozess setzt Ausführung fort<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 44<br />
22
Seiten auf dem Hintergrundspeicher<br />
• Ausgelagerte Seiten (nicht im Hauptspeicher) werden auf<br />
den Hintergrundspeicher geschrieben:<br />
– Auf dem Hintergrundspeicher existiert eine Swap-Partition<br />
– Die Swap Partition enthält den Speicher von allen momentan<br />
laufenden Prozessen<br />
• Für ausgelagerte Seiten enthält der Seitendeskriptor<br />
– eine Markierung „ausgelagert“<br />
– einen Zeiger auf den Block im Hintergrundspeicher<br />
• Wenn der Speicher eines Prozesses wächst, werden<br />
dynamisch weitere Blöcke auf dem Hintergrundspeicher<br />
anlegt<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 45<br />
Swap-Bereiche auf dem Hintergrundspeicher<br />
(a) Statische Zuordnung des Hintergrundspeichers<br />
(b) Dynamische Zuordnung über eine Zwischentabelle<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 46<br />
23
4.6 Segmente<br />
• Paging stellt eindimensionalen virtuellen Speicher bereit<br />
• Einige HW bieten Alternative an:<br />
– Speicher eines Prozesses wird in Segmente variabler Größe aufgeteilt<br />
– z.B. jeweils ein Segment für den Programm-Code, die Programm-<br />
Daten, die Konstanten und die Symboltabelle<br />
• Zweidimensionale, virtuelle Adressen:<br />
– Segmentnummer<br />
– linearen Adresse innerhalb eines Segments (Offset)<br />
• Vorteile:<br />
– Einfachere Vergrößerung von Speicherbereichen<br />
– Unterschiedlicher Schutz für unterschiedliche Segmente<br />
– Einfachere Einbindung von dynamischen Bibliotheken<br />
• Die CPU muß Segmente unterstützen, z.B. Pentium<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 47<br />
eindimensional:<br />
virt. Adresse<br />
v<br />
0<br />
v max<br />
Paging<br />
Paging und Segmente<br />
Segmentnummer<br />
zweidimensional:<br />
virt. Adresse<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 48<br />
s<br />
n<br />
0 0<br />
n 0<br />
0 s s max<br />
n s<br />
Segmente<br />
Offset<br />
0<br />
aus [Kröger] Vorlesung<br />
24
Beispiele für Segmente<br />
Mögliche Segmente für einen Compiler-Lauf:<br />
Segment<br />
0<br />
Symboltabelle<br />
Segment<br />
1<br />
Quellprogramm<br />
Segment<br />
2<br />
Konstanten<br />
Segment<br />
3<br />
Parse<br />
Tree<br />
Jedes Segment kann, unabhängig von allen<br />
anderen, wachsen und schrumpfen<br />
Segment<br />
4<br />
Stack<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 49<br />
Segmentierung mit Paging<br />
aus [Kröger] Vorlesung<br />
• Ein eingelagertes Segment muß nicht vollständig im Hauptspeicher sein<br />
• Jedes Segment besteht aus einer Folge von Seiten<br />
• Prinzipielle Adressierung:<br />
virt. Adresse<br />
s<br />
Segmentdeskriptoren<br />
page<br />
Segmenttabelle<br />
n<br />
offset<br />
Seitentabelle<br />
Seiten<br />
des<br />
Segments<br />
aus [Kröger] Vorlesung<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 50<br />
25
Zusammenfassung I<br />
1. Die <strong>Speicherverwaltung</strong> teilt den Prozessen den Speicher<br />
zu und sorgt für die Übertragung innerhalb der<br />
Speicherhierarchie (Cache, Hauptspeicher,<br />
Hintergrundspeicher).<br />
2. Statische <strong>Speicherverwaltung</strong> teilt den Speicher in feste<br />
Partitionen auf. Die Prozesse werden jeweils in eine<br />
Partition geladen und dort vollständig ausgeführt.<br />
3. Beim Swapping werden die Prozesse komplett zwischen<br />
Hauptspeicher und Hintergrundspeicher ein- und<br />
ausgelagert. Die Partitionsgröße hängt vom<br />
Speicherbedarf des einzelnen Prozesses ab.<br />
4. Beim virtuellen Speicher sind nur Teile eines Prozesses<br />
im Hauptspeicher. Man unterscheidet zwischen Paging<br />
und Segmenten.<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 51<br />
Zusammenfassung II<br />
• Beim Paging hat jeder Prozess einen eigenen Adressraum,<br />
der in Blöcke fester Länge unterteilt ist (Seiten und<br />
Seitenrahmen).<br />
• Die Abbildung zwischen virtuellen Adressen und<br />
Hauptspeicheradressen wird über die Seitentabellen<br />
realisiert.<br />
• Mehrstufige Seitentabellen können den Speicherbedarf<br />
für die Seitentabellen reduzieren.<br />
• Ein Translation Lookaside Buffer (TLB) beschleunigt<br />
die Adressabbildung durch das Caching der letzten<br />
Abbildungen.<br />
• Es gibt eine Vielzahl von Seitenersetzungsalgorithmen,<br />
die bestimmen, welche Seite ausgelagert wird.<br />
• Segmente sind eine Alternative zum Paging.<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 52<br />
26
Literatur<br />
• Denning: „Virtual Memory“, Computing Surveys, 2: 153-<br />
189, Sept 1970<br />
• Denning: Working Sets Past and Present, IEEE Transactions<br />
on Software Engineering, 6: 64-84, Jan 1980<br />
• Knuth: The Art of Computer Programming, Reading, MA,<br />
1973<br />
• Kröger: FH Wiesbaden, Betriebssysteme Vorlesung SS 2002<br />
• Silberschatz und Galvin: Operating System Concepts, John<br />
Wiley & Sons, 1999<br />
• Tanenbaum: Moderne Betriebssysteme, Prentice Hall, 2002<br />
• Tanenbaum: Vorlesung zu „Modern Operating Systems“,<br />
2001<br />
W. Lux, FH Düsseldorf Kap 3: <strong>Speicherverwaltung</strong> 53<br />
27