05.08.2013 Aufrufe

Kapitel 3: Speicherverwaltung 3.1 Einführung

Kapitel 3: Speicherverwaltung 3.1 Einführung

Kapitel 3: Speicherverwaltung 3.1 Einführung

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!