17.01.2014 Aufrufe

Download

Download

Download

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.

Speicherverwaltung<br />

Memory Management<br />

Teil 2<br />

WS 2011/2012<br />

IAIK 1


Invertierte Seitentabelle<br />

• Gewönliche Seitentabelle<br />

• Größe abhängig von der Größe des<br />

virtuellen Adressraums<br />

• Immer nur ein (kleiner) Teil davon im<br />

RAM – verschwendet Platz<br />

• Invertierte Seitentabelle<br />

IAIK 2


Invertierte Seitentabelle<br />

IAIK 3


Invertierte Seitentabelle<br />

• sparen Speicherplatz<br />

• wenn virtuelle Adressraum größer als<br />

physischer Speicher<br />

• Nachteil: Aufwand der Abbildung<br />

höher<br />

• virtuelle Seitennummer nicht als<br />

Index verwendbar<br />

• Suche nach (p,n) nötig – bei jedem<br />

Speicherzugriff! Inpraktikabel<br />

IAIK 4


Invertierte Seitentabelle<br />

• Lösung:<br />

TLB!<br />

• alle vielbenutzten Seiten im TLB:<br />

Umrechnung genauso schnell<br />

• TLB-Fehler: invertierte Tabelle per SW<br />

durchsucht werden<br />

• virtuelle Adresse als Hash-Wert zur<br />

Beschleunigung der Suche<br />

IAIK 5


Seitenersetzungsalgorithmen<br />

• Seitenfehler welche Seite muss<br />

raus?<br />

• wenn die zu ersetzende Seite<br />

modifiziert wurde: auf Festplatte<br />

zurückschreiben<br />

• falls Programmcode:<br />

zurückschreiben nicht nötig<br />

• nun aber: welche Seite…<br />

IAIK 6


Seitenersetzungsalgorithmen<br />

• zufällige Seite?<br />

• besser Seiten, die nur selten<br />

benutzt werden<br />

• vielbenutzte müssten bald wieder<br />

eingelagert werden<br />

• ähnliches Problem auch bei Caches<br />

(Memory oder Webserver)<br />

IAIK 7


optimal<br />

• leicht zu beschreiben, schwer zu<br />

implementieren<br />

• markiere alle Seiten mit der Anzahl der<br />

Befehle, die bis zum nächsten Zugriff auf<br />

diese Seite ausgeführt werden<br />

• entferne die Seite mit der höchsten Zahl<br />

• nur leider…<br />

• zum Vergleich geeignet<br />

IAIK 8


Not Recently Used<br />

• wenn wir schon nicht in die<br />

Zukunft schauen können…<br />

• … können wir aus der<br />

Vergangenheit lernen?<br />

• wenn eine Seite in der letzten Zeit<br />

nicht verwendet wurde…<br />

• … wird sie vielleicht auch in der<br />

nächsten Zeit nicht gebraucht<br />

IAIK 9


Not Recently Used<br />

• Statusbits: R – M<br />

• werden von der Hardware gesetzt und<br />

bei jedem Speicherzugriff aktualisiert<br />

• bleibt auf 1 bis von BS zurückgesetzt<br />

R<br />

M<br />

IAIK 10


Not Recently Used<br />

• was, wenn die HW das nicht kann?<br />

• Alle PTE auf ausgelagert markieren<br />

• erster Zugriff auf die Seite erzeugt<br />

Seitenfehler BS setzt R-Bit,<br />

Schutz auf read-only, führt Befehl<br />

noch einmal aus<br />

• Schreibzugriff: weiterer<br />

Seitenfehler, M-Bit und r/w setzen<br />

IAIK 11


Not Recently Used<br />

• Prozess gestartet, alle M und R-<br />

Bits auf 0<br />

• regelmäßig: alle R-bits löschen<br />

• nur bei kürzlich referenzierten<br />

Seiten ist R-Bit gesetzt<br />

IAIK 12


Not Recently Used<br />

• Seitenfehler tritt auf<br />

• Einteilung der Seiten in vier Kategorien<br />

• Klasse 0: nicht ref., nicht modif.<br />

• Klasse 1: nicht ref., modif.<br />

• Klasse 2: ref., nicht modif.<br />

• Klasse 3: referenziert und modifiziert<br />

• NRU entfernt eine zufällige Seite aus<br />

der niedrigsten nicht leeren Klasse<br />

• Leistung nicht optimal, aber oft<br />

ausreichend<br />

IAIK 13


FIFO<br />

• Liste aller Seiten<br />

• am Kopf die älteste Seite<br />

• Seitenfehler:<br />

• entferne Seite am Kopf der Liste<br />

• neue Seite am Ende anhängen<br />

• kann genau die falschen Seiten<br />

rauswerfen<br />

• selten unverändert eingesetzt<br />

IAIK 14


Second Chance<br />

• Variante von FIFO<br />

• R-Bit gelöscht: seite wählen<br />

• R-Bit gesetzt: R-Bit löschen und Seite<br />

ans Ende der Liste hängen<br />

• sucht nach einer möglichst alten Seite,<br />

auf die im letzten Intervall nicht<br />

zugegriffen wurde<br />

• Im Grenzfall (alle R-Bits gesetzt) FIFO<br />

IAIK 15


Second Chance<br />

IAIK 16


Clock<br />

• alle Seiten in<br />

einer<br />

ringförmigen Liste<br />

• Zeiger auf älteste<br />

• Seitenfehler:<br />

• nimm Seite auf<br />

die Zeiger zeigt<br />

• Alternativ: R-Bit<br />

berücksichtigen <br />

Second Chance<br />

IAIK 17


Least Recently Used<br />

• wenn wir schon nicht in die<br />

Zukunft schauen können…<br />

• … können wir aus der<br />

Vergangenheit lernen?<br />

• wenn eine Seite sehr lange nicht<br />

mehr verwendet wurde…<br />

• … wird sie vielleicht auch in der<br />

nächsten Zeit nicht gebraucht<br />

IAIK 18


Least Recently Used (LRU)<br />

• realisierbar, aber nicht billig<br />

• verkettete Liste aller Seiten<br />

• bei jedem Zugriff aktualisiert<br />

• Approximationen<br />

IAIK 19


Approximation 1<br />

• 64-Bit Zähler<br />

• nach jedem Maschinenbefehl<br />

erhöht<br />

• PTE: Feld für Zähler<br />

• Speicherzugriff: speichert Zähler in<br />

PTE<br />

• Seitenfehler: Liste nach<br />

niedrigstem Zähler durchsuchen<br />

IAIK 20


Approximation 2<br />

• Matrix aus n*m Bits, anfangs 0<br />

• Zugriff auf Seite k: Bits der Zeile k auf 1, Bits<br />

der Spalte k auf 0<br />

• die Zeile mit dem niedrigsten Binärwert ist die<br />

am längsten nicht benutzte<br />

IAIK 21


LRU durch Software<br />

• LRU ohne Hardware nicht<br />

realisierbar<br />

• Hardware kaum vorhanden<br />

• Softwarelösung: NFU – Not<br />

Frequently Used<br />

• Zähler pro Seite<br />

• Timerinterrupt erhöht den Zähler<br />

um R-Bit<br />

IAIK 22


NFU<br />

• Problem: vergisst nix. Oft<br />

verwendete Seiten bleiben<br />

erhalten auch wenn nicht mehr<br />

benötigt<br />

• Modifikation:<br />

• vor Addition Rechtsverschiebung<br />

• R-Bit beim höchstwertigen Bit<br />

addieren<br />

IAIK 23


Aging<br />

IAIK 24


Aging versus LRU<br />

• Unterscheidung innerhalb eines<br />

Intervalls nicht möglich<br />

• endliche Anzahl von Bits, wenn<br />

Zähler 0 dann nicht unterscheidbar<br />

ob vor 9 oder vor 1000 Intervallen<br />

• 8 bits reichen bei 20msec meist<br />

aus<br />

IAIK 25


Demand Paging<br />

• Starten eines Prozesses…<br />

• … wie viele Seiten soll der<br />

bekommen?<br />

• Eine Strategie: Demand Paging<br />

(Einlagern bei Bedarf)<br />

• Starten mit 0 Seiten im<br />

Hauptspeicher<br />

IAIK 26


Demand Paging<br />

• Laden des Befehlscodes des ersten<br />

Befehls page fault<br />

• Weitere Seitenfehler für Stack und<br />

Datenbereich<br />

• Nach einiger Zeit: alle Seiten<br />

eingelagert, die Prozess benötigt<br />

• Lokalitätsprinzip macht das machbar!<br />

IAIK 27


Working Set<br />

• Menge der Seiten, die ein Prozess zu<br />

einem bestimmten Zeitpunkt benötigt<br />

• Working Set im Speicher keine<br />

pagefaults<br />

• Verfügbarer Speicher kleiner als<br />

working set viele pagefaults<br />

• Thrashing (system lagert fast nur mehr<br />

ein/aus)<br />

IAIK 28


Swapping<br />

• Prozesse auslagern – normalerweise auf<br />

Festplatte<br />

• Oft eigene Partition oder nur große<br />

Datei<br />

• Idealerweise kontinuierlich auf der<br />

Platte – Geschwindigkeit<br />

• Auslagern: Nur Daten mit dirty=1<br />

• Programmcode von executable file<br />

einlagern<br />

IAIK 29


Swapping<br />

• Wie gehen wir vor wenn Prozess<br />

wieder eingelagert wird?<br />

• Eigentlich brauchen wir nichts tun<br />

– pagefaults bis working set<br />

eingelagert<br />

• Kostet aber CPU-Zeit für die<br />

Behandlung der pagefaults<br />

IAIK 30


Working-Set-Modell<br />

• BS merkt sich das working set<br />

eines Prozesses<br />

• Working set wird vor weiterer<br />

Ausführung des Prozesses wieder<br />

geladen<br />

• prepaging<br />

IAIK 31


Überlegungen zum ws<br />

• Speicherzugriffe über Adressraum<br />

nicht gleich verteilt – konzentrieren<br />

sich auf einige wenige<br />

• w(k,t) Menge der Seiten die in<br />

den letzten k Speicherzugriffen vor<br />

dem Zeitpunkt t referenziert<br />

wurden<br />

• Monoton steigende Funktion<br />

IAIK 32


workingset<br />

IAIK 33


Überlegungen zum ws<br />

• Arbeitsbereich eines Prozesses<br />

ändert sich nur langsam – Seiten<br />

die Prozess nach Einlagern braucht<br />

zT vorhersehbar prepaging<br />

funktioniert<br />

IAIK 34


Implementierung WS<br />

• BS muss wissen, welche Seiten im<br />

working set liegen.<br />

• Seitenersetzungsalgorithmus: bei<br />

pagefault – finde Seite die nicht im<br />

working set, und lagere sie aus.<br />

• wann ist aber eine Seite nicht im<br />

working set?<br />

IAIK 35


working set<br />

• w(k,t) Menge der Seiten die in den letzten k<br />

Speicherzugriffen vor dem Zeitpunkt t referenziert<br />

wurden<br />

• Aber wie implementieren?<br />

• Schieberegister, bei jedem<br />

Speicherzugriff Seitennummer<br />

reinschieben? … nicht effizient<br />

• Annäherungen möglich<br />

• statt „letzte k“ „letzte m msec“<br />

IAIK 36


Approximation<br />

• working-set-Zeit relative<br />

Prozesszeit<br />

• 100 msec absolut, aber nur 20<br />

msec für Prozess – virtuelle Zeit!<br />

• workingset: die Menge der Seiten,<br />

auf die der Prozess in den letzten τ<br />

msec virtueller Zeit zugegriffen hat<br />

IAIK 37


Approximation<br />

• Hardware muss R/M setzen<br />

• periodisch: R bits gelöscht<br />

• bei Seitenfehler<br />

• alle PTE‘s durchsuchen<br />

• R-Bit == 1?<br />

• aktuelle virtuelle Zeit in Feld für Zeit des<br />

letzten Zugriffs eintragen<br />

• Seite liegt im Arbeitsbereich<br />

IAIK 38


Approximation<br />

• R-Bit == 0<br />

• Seite seit letzter Unterbrechung nicht<br />

verwendet Kandidat für Auslagerung<br />

• Alter bestimmen: gespeicherte Zeit –<br />

aktueller virtueller Zeit<br />

• zu alt: aus workingset nehmen<br />

• „zu jung“: meist verschonen. Nur wenn alle<br />

Seiten im Arbeitsbereich, älteste auslagern<br />

• Rest der Tabelle durchlaufen um<br />

Zugriffszeiten zu aktualisieren<br />

• Alle R-Bits = 1? Pech. Irgendeine<br />

nehmen…<br />

IAIK 39


Approximation<br />

IAIK 40


WSClock<br />

• einfacher Algorithmus umständlich<br />

• durchläuft pagetable bei jedem<br />

pagefault bis Kandidat gefunden<br />

• Kombination aus Clock und<br />

Workingset: WSClock<br />

• in realen Systemen weit verbreitet<br />

• Wie Clock ringförmige Liste<br />

IAIK 41


WSClock<br />

IAIK 42


WSClock<br />

• Untersuche Seite auf die Zeiger<br />

zeigt<br />

• R=1 kein idealer Kandidat<br />

• R 0<br />

• Zeiger vorrücken<br />

• continue<br />

IAIK 43


WSCLock<br />

• R=0<br />

• Alter > T nicht im Workingset<br />

• M=0 Seite kann freigegeben werden<br />

• M=1 vormerken, dass Seite auf Platte<br />

geschrieben werden muss. Aber<br />

weitersuchen, um Prozesswechsel zu<br />

vermeiden<br />

IAIK 44


WSCLock<br />

• Wieder am Anfang?<br />

• es wurde eine Seite vorgemerkt<br />

• weiterlaufen, irgendwann wird<br />

vorgemerkte im Hintergrund<br />

zurückgeschrieben<br />

• es wurde keine Seite vorgemerkt<br />

• alle Seiten im Arbeitsbereich <br />

irgendeine Seite auslagern (am besten<br />

irgendeine saubere Seite merken, dann<br />

gibt’s die jetzt schon).<br />

IAIK 45


Zusammenfassung<br />

IAIK 46


Modellierung<br />

• FIFO<br />

neueste Seite<br />

älteste Seite<br />

0 1 2 3 0 1 4 0 1 2 3 4<br />

0 1 2 3 0 1 4 4 4 2 3 3<br />

0 1 2 3 0 1 1 1 4 2 2<br />

0 1 2 3 0 0 0 1 4 4<br />

P P P P P P P P P<br />

IAIK 47


Keller-Algorithmen<br />

• Jeder Prozess erzeugt<br />

Folge von<br />

Speicherzugriffen auf<br />

virtuelle Seiten<br />

• Speicherzugriffe als<br />

Liste von<br />

Seitennummern<br />

darstellbar<br />

• Referenzkette –<br />

reference string<br />

IAIK<br />

Modellierung<br />

• FIFO<br />

0 1 2 3 0 1 4 0 1 2 3 4<br />

neueste Seite<br />

älteste Seite<br />

0 1 2 3 0 1 4 4 4 2 3 3<br />

0 1 2 3 0 1 1 1 4 2 2<br />

0 1 2 3 0 0 0 1 4 4<br />

P P P P P P P P P<br />

IAIK 48


Annahmen<br />

• ein Rechner<br />

• ein Prozess<br />

• eine deterministische Referenzkette pro<br />

Rechner<br />

• Paging-System charakterisiert durch<br />

• Seitenersetzungsalgorithmus<br />

• Anzahl m der physischen Seitenrahmen<br />

• Referenzkette des Prozesses<br />

IAIK 49


Simulation über Interpreter<br />

• enthält interne Tabelle M –<br />

repräsentiert Zustand des Speichers<br />

• M hat n Einträge, einen pro virtuelle<br />

Seite des Prozesses<br />

• M hat zwei Teile<br />

• oberer Teil, m Einträge: Seiten, die im<br />

Speicher liegen<br />

• unterer Teil, n-m Einträge: Seiten, die<br />

ausgelagert wurden<br />

• M zu Beginn leer<br />

IAIK 50


Prozess-Start<br />

• Prozess gibt Seiten seiner<br />

Referenzkette aus.<br />

• Interpreter prüft, ob Seite im<br />

Speicher. Wenn nicht –<br />

Seitenfehler.<br />

• falls leerer Seitenrahmen<br />

vorhanden: dort laden (nur zu<br />

Beginn möglich)<br />

IAIK 51


Speicher voll<br />

• voll: oberer Teil von M enthält m<br />

Einträge<br />

• Seitenersetzungsalgorithmus<br />

aufrufen, entfernt Seite aus<br />

Speicher verschieben in unteren<br />

Teil<br />

• neue Seite laden oder von unteren<br />

in oberen verschieben<br />

IAIK 52


IAIK 53<br />

Beispiel<br />

P<br />

P<br />

P<br />

P<br />

P<br />

P<br />

P<br />

P<br />

P<br />

P<br />

P<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

0<br />

0<br />

6<br />

6<br />

6<br />

6<br />

6<br />

6<br />

6<br />

6<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

2<br />

2<br />

0<br />

1<br />

4<br />

3<br />

1<br />

7<br />

1<br />

1<br />

1<br />

3<br />

5<br />

5<br />

3<br />

3<br />

7<br />

4<br />

7<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

5<br />

5<br />

4<br />

4<br />

4<br />

4<br />

4<br />

4<br />

6<br />

6<br />

6<br />

5<br />

5<br />

5<br />

5<br />

5<br />

1<br />

1<br />

2<br />

0<br />

7<br />

7<br />

5<br />

5<br />

5<br />

7<br />

7<br />

7<br />

4<br />

4<br />

4<br />

6<br />

6<br />

6<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

3<br />

1<br />

7<br />

3<br />

3<br />

5<br />

5<br />

5<br />

7<br />

7<br />

7<br />

4<br />

4<br />

3<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

4<br />

3<br />

1<br />

7<br />

1<br />

3<br />

3<br />

3<br />

5<br />

3<br />

3<br />

7<br />

7<br />

4<br />

7<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

1<br />

4<br />

3<br />

1<br />

7<br />

1<br />

1<br />

1<br />

3<br />

5<br />

5<br />

3<br />

3<br />

7<br />

4<br />

7<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0


Modellierung<br />

• FIFO<br />

neueste Seite<br />

älteste Seite<br />

0 1 2 3 0 1 4 0 1 2 3 4<br />

0 1 2 3 0 1 4 4 4 2 3 3<br />

0 1 2 3 0 1 1 1 4 2 2<br />

0 1 2 3 0 0 0 1 4 4<br />

P P P P P P P P P<br />

IAIK 54


FIFO – 4 Frames<br />

0 1 2 3 0 1 4 0 1 2 3 4<br />

0 1 2 3 3 3 4 0 1 2 3 4<br />

0 1 2 2 2 3 4 0 1 2 3<br />

0 1 1 1 2 3 4 0 1 2<br />

0 0 0 1 2 3 4 0 1<br />

P P P P P P P P P P<br />

IAIK 55


Algorithmen<br />

• Algorithmen mit der Eigenschaft<br />

M ( m,<br />

r)<br />

⊆ M ( m + 1, r)<br />

sind besonders interessant…<br />

• nach r Speicherzugriffen ist der obere Teil<br />

von M für einen Speicher von m Seiten<br />

Teilmenge des oberen Teils von M<br />

Speichers von m+1 Seiten<br />

IAIK 56


Kelleralgorithmen –<br />

stack-algorithms<br />

• Algorithmen mit der Eigenschaft<br />

M ( m,<br />

r)<br />

⊆ M ( m + 1, r)<br />

heißen Kelleralgorithmen.<br />

• LRU ist ein Kelleralgorithmus<br />

• FIFO nicht<br />

• Keller-Algorithmen sind nicht für<br />

Belady‘s Anomalie anfällig<br />

IAIK 57


Distanzkette<br />

• Repräsentation der Referenzkette<br />

in abstrakterer Form zur<br />

Evaluierung der Verfahren<br />

• Seitenbezeichnung durch Abstand<br />

der Seite vom oberen Ende des<br />

Stack<br />

• Seiten, auf die noch nicht<br />

zugegriffen wurde: Abstand ∞<br />

IAIK 58


IAIK 59<br />

Distanzkette<br />

3<br />

5<br />

3<br />

2<br />

4<br />

1<br />

1<br />

6<br />

2<br />

1<br />

5<br />

1<br />

3<br />

2<br />

∞ 4<br />

∞ ∞ ∞ ∞ ∞ ∞ ∞ 4<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

2<br />

0<br />

0<br />

6<br />

6<br />

6<br />

6<br />

6<br />

6<br />

6<br />

6<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

2<br />

2<br />

0<br />

1<br />

4<br />

3<br />

1<br />

7<br />

1<br />

1<br />

1<br />

3<br />

5<br />

5<br />

3<br />

3<br />

7<br />

4<br />

7<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

5<br />

5<br />

4<br />

4<br />

4<br />

4<br />

4<br />

4<br />

6<br />

6<br />

6<br />

5<br />

5<br />

5<br />

5<br />

5<br />

1<br />

1<br />

2<br />

0<br />

7<br />

7<br />

5<br />

5<br />

5<br />

7<br />

7<br />

7<br />

4<br />

4<br />

4<br />

6<br />

6<br />

6<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

3<br />

1<br />

7<br />

3<br />

3<br />

5<br />

5<br />

5<br />

7<br />

7<br />

7<br />

4<br />

4<br />

3<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

4<br />

3<br />

1<br />

7<br />

1<br />

3<br />

3<br />

3<br />

5<br />

3<br />

3<br />

7<br />

7<br />

4<br />

7<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0<br />

1<br />

4<br />

3<br />

1<br />

7<br />

1<br />

1<br />

1<br />

3<br />

5<br />

5<br />

3<br />

3<br />

7<br />

4<br />

7<br />

3<br />

6<br />

4<br />

5<br />

3<br />

1<br />

2<br />

0


Distanzkette<br />

• hängt ab von<br />

• Referenzkette<br />

• Seitenersetzungsalgorithmus<br />

• statistische Eigenschaften der<br />

Distanzkette beeinflussen<br />

Leistungsfähigkeit des Algorithmus<br />

IAIK 60


Distanzkette<br />

wenige Seitenfehler bei k Seitenrahmen<br />

„Pech gehabt“ – keine<br />

Anzahl an Frames passt<br />

(außer n)<br />

IAIK 61


Seitenfehlerrate vorhersagen<br />

• mit Hilfe der Distanzkette möglich<br />

• Ziel: einmal Distanzkette<br />

durchlaufen und mit den<br />

gesammelten Infos vorhersagen,<br />

wie viele Seitenfehler bei k Frames<br />

vorkommen (k=1…n)<br />

IAIK 62


Algorithmus<br />

• durchläuft<br />

Distanzkette<br />

• zählt Abstände<br />

∞∞∞∞∞∞∞ 4 ∞ 4 2 3 1 5 1 2 6 1 1 4 2 3 5 3<br />

C 1 4<br />

C 2 3<br />

C 3 3<br />

C 4 3<br />

C 5 2<br />

C 6 1<br />

C∞ 8<br />

IAIK 63


Algorithmus<br />

F<br />

m<br />

=<br />

n<br />

∑<br />

C<br />

k = m+<br />

1<br />

k<br />

+ C<br />

F m = Anzahl der<br />

Seitenfehler für<br />

gegebene<br />

Distanzkette und<br />

m Seitenrahmen<br />

∞<br />

C 1 4<br />

C 2 3<br />

C 3 3<br />

C 4 3<br />

C 5 2<br />

C 6 1<br />

C∞ 8<br />

F 1 20<br />

F 2 17<br />

F 3 14<br />

F 4 11<br />

F 5 9<br />

F 6 8<br />

F∞ 8<br />

IAIK 64


Design-Kriterien<br />

• Bisher: Mechanik<br />

• wie funktioniert Paging<br />

• welche Algorithmen für<br />

Seitenersetzung gibt es<br />

• wie modelliert man diese<br />

• reicht nicht<br />

• jetzt: was ist für ein<br />

leistungsstarkes System nötig?<br />

IAIK 65


Lokal – Global ?<br />

• A erzeugt<br />

pagefault<br />

• Welche Seiten für<br />

Ersetzung in<br />

Betracht ziehen?<br />

• Nur die von A –<br />

lokale Strategie ?<br />

• Alle – globale<br />

Strategie?<br />

IAIK 66


Lokal - Global<br />

• lokal: fester Speicherbereich pro<br />

Prozess<br />

• global: dynamische Verteilung,<br />

Anzahl der Frames eines Prozesses<br />

variabel<br />

IAIK 67


Lokal - Global<br />

• Im Allgemeinen: global Strategien<br />

besser – besonders wenn sich die<br />

Größe des Workingset ändert<br />

• Speicherbedarf wächst – thrashing<br />

(obwohl Seiten „woanders“<br />

verfügbar)<br />

• Speicherbedarf schrumpft – Seiten<br />

verschwendet<br />

IAIK 68


Lokal - Global<br />

• manche Seitenersetzungsalgorithmen<br />

für lokale und globale<br />

Strategien anwendbar (FIFO, LRU)<br />

• andere nicht (Workingset,<br />

WSClock)<br />

IAIK 69


Global<br />

• Globale Strategie entscheidet<br />

ständig über die Anzahl der<br />

Seitenrahmen<br />

• Möglichkeiten:<br />

• Aging-Bits – eventuell zu grob<br />

• Frames zu gleichen Teilen auf alle<br />

Prozesse (regelmäßig anpassen) –<br />

nicht sinnvoll, wenn Prozesse<br />

unterschiedlich groß<br />

IAIK 70


Global<br />

• Im Verhältnis zur Prozessgröße?<br />

• Minimum kann notwendig sein<br />

(Befehl könnte bis zu 6 Seiten im<br />

Speicher benötigen)<br />

• Starten mit Seitenzahl im<br />

Verhältnis zur Größe, danach<br />

dynamische Anpassung<br />

IAIK 71


PFF-Algorithmus<br />

• Page-Fault-Frequency Algorithmus<br />

• bestimmt nur, wie viel Speicher ein<br />

Prozess bekommt<br />

• Pagefault-Rate indirekt-proportional zur<br />

Speichergröße<br />

IAIK 72


PFF-Algorithmus<br />

IAIK 73


PFF-Algorithmus<br />

• zu hohe Seitenfehlerrate: mehr<br />

Speicher zuteilen<br />

• zu niedrige Seitenfehlerrate:<br />

Speicher wegnehmen<br />

IAIK 74


Laststeuerung<br />

• wenn working-set aller Prozesse<br />

größer als Hauptspeicher - es wird<br />

immer zu viele Seitenfehler geben!<br />

• PFF-Algorithmus könnte das<br />

anzeigen: mehrere zu wenig,<br />

keiner zu viel<br />

• Lösung: Prozesse auslagern<br />

IAIK 75


Laststeuerung<br />

• Wenn danach die Fehlerrate sinkt<br />

– ok<br />

• sonst: noch einen auslagern – bis<br />

sich Erfolg einstellt<br />

• Swapping also auch bei pagingsystemen<br />

sinnvoll!<br />

• Kann auch wichtig sein, welche<br />

Prozesse man auslagert<br />

IAIK 76


Seitengröße<br />

• Oft einstellbarer Parameter<br />

• keine optimale Lösung<br />

• große Seiten – mehr interne<br />

Fragmentierung: wieviele Bytes bleiben<br />

in Seitenrahmen ungenutzt?<br />

• kleine Seiten: viele Seiten, große<br />

Seitentabellen, mehr Verwaltung,<br />

Transfer kleiner Seiten dauert fast<br />

gleich lange wie großer Seiten<br />

IAIK 77


Seitengröße<br />

• Platzverbrauch kann mathematisch<br />

analysiert werden<br />

• Durchschnittliche Prozessgröße s<br />

• Seitengröße p, PTE e Bytes, s/p-Seiten<br />

• Speicherverbrauch für Seitentabelle und<br />

Fragmentierung<br />

V=se/p+p/2<br />

• Optimum wenn -se/p 2 +1/2 = 0<br />

p = 2se<br />

IAIK 78


Seitengröße<br />

• s=1MB<br />

• e=8 Byte<br />

• optimale Seitengröße 4KB<br />

• übliche Seitengrößen heute 4 oder<br />

8 KB<br />

IAIK 79


getrennte Programm- und<br />

Datenbereiche<br />

IAIK 80


Gemeinsame Seiten<br />

shared pages<br />

• mehrere Benutzer benutzen das<br />

gleiche Programm<br />

• Effizienter, Seiten gemeinsam zu<br />

nutzen<br />

• geht aber nur für Code, nicht für<br />

Daten!<br />

IAIK 81


Gemeinsame Seiten<br />

• getrennte<br />

Adressräume für<br />

Code und Daten –<br />

gemeinsamen<br />

Adressraum für<br />

Code, getrennten<br />

für Daten<br />

IAIK 82


Gemeinsame Seiten<br />

• Betriebssystem muss gemeinsame<br />

Seiten berücksichtigen<br />

• Auslagern von einem Prozess –<br />

zweiter Prozess lagert wieder alle ein?<br />

• Beenden eines Prozesses – Seiten<br />

müssen eventuell erhalten bleiben<br />

IAIK 83


Gemeinsame Seiten<br />

• Daten gemeinsam zu benutzen etwas<br />

komplizierter<br />

• zB nach UNIX-fork<br />

• Beide lesen: kein Problem<br />

• Schreiben:<br />

• Seiten auf R/O setzen<br />

• Schreibzugriff: Seite kopieren – jeder Prozess<br />

eigene Kopie und auf R/W setzen<br />

• copy-on-write<br />

• Seiten die nie beschrieben werden, müssen nicht<br />

kopiert werden<br />

IAIK 84


Freigabe-Strategien<br />

• Paging funktioniert am besten<br />

wenn genügend Seitenrahmen frei<br />

• Wenn alle Pageframes voll sind<br />

und einer gebraucht wird –<br />

unangenehm.<br />

• Eventuell muss freizumachende<br />

Seite noch zurückgeschrieben<br />

werden. Das dauert!<br />

IAIK 85


Freigabe-Strategien<br />

• Daher: Vorbeugen<br />

• Paging-Daemon<br />

• meist inaktiv<br />

• wacht regelmäßig auf und prüft<br />

Speicherzustand<br />

• nicht genug freie Rahmen wählt<br />

Seiten aus und beginnt sie<br />

auszulagern<br />

IAIK 86


Paging-Daemon<br />

• Inhalt der Seiten bleibt erhalten <br />

falls doch noch benötigt, ist nichts<br />

verloren<br />

• Bei einem Pagefault ist dann<br />

immer ein freier Rahmen<br />

verfügbar <br />

Performancesteigerung<br />

IAIK 87


Implementierungsprobleme<br />

• Auswahl der Strategien ist eine<br />

Sache<br />

• praktische Probleme bei der<br />

Implementierung eine andere<br />

IAIK 88


Betriebssystemaufgaben bei<br />

Paging<br />

• vier Punkte wo das BS Arbeit<br />

leisten muss<br />

• Erzeugung des Prozesses<br />

• Ausführung des Prozesses<br />

• Seitenfehler<br />

• Terminierung des Prozesses<br />

IAIK 89


Erzeugung des Prozesses<br />

• Größe des Programmcodes und der<br />

Daten feststellen<br />

• Seitentabelle für Prozess erzeugen<br />

• Speicher zuteilen und initialisieren<br />

• Platz für ausgelagerte Seiten auf<br />

der Platte reservieren<br />

• ev. Swapping-Bereich mit Code<br />

und Daten initialisieren<br />

IAIK 90


Ausführung des Prozesses<br />

• MMU auf neuen Prozess einstellen<br />

• TLB leeren<br />

• aktuelle Seitentabelle auf Tabelle<br />

des Neuen Prozesses setzen<br />

• eventuell prepaging<br />

IAIK 91


Seitenfehler<br />

• Hardware-Register auslesen um<br />

festzustellen, welche Adresse Fehler<br />

verursacht hat<br />

• finden der benötigten Seite<br />

• freien Seitenrahmen suchen<br />

• eventuell alte Seite auslagern<br />

• neue Seite einlesen<br />

• Programmzähler auf Befehl<br />

zurücksetzen, der den Seitenfehler<br />

verursacht hat<br />

IAIK 92


Terminierung des Prozesses<br />

• Seitentabelle, Seitenrahmen und<br />

Plattenplatz freigeben<br />

• gemeinsam benutzte nur, wenn<br />

der letzte Prozess terminiert<br />

IAIK 93


Behandlung von<br />

Seitenfehlern<br />

1. Hardware<br />

PC Stack, Sprung in Kernel<br />

2. Interrupt-Serviceroutine<br />

sichern von Registern und anderer<br />

Informationen<br />

3. OS<br />

welche virtuelle Adresse hat Fehler<br />

ausgelöst?<br />

HW-Register, oder Befehl<br />

interpretieren!<br />

IAIK 94


Behandlung von<br />

Seitenfehlern<br />

4. Prüfen der Adresse auf Gültigkeit<br />

Schutzverletzung Abbruch<br />

sonst: freien Seitenrahmen finden.<br />

keiner da? Ersetzungsalgorithmus<br />

starten.<br />

5. Seitenrahmen modifiziert Seite auf<br />

Platte schreiben lassen, Prozess<br />

suspendieren und anderen laufen<br />

lassen.<br />

Seitenrahmen als belegt markieren!<br />

IAIK 95


Behandlung von<br />

Seitenfehlern<br />

6. Wenn Seitenrahmen sauber:<br />

laden der Seite von Platte.<br />

Prozess bleibt oder wird<br />

suspendiert.<br />

7. Seite angekommen (Interrupt<br />

durch Festplatte): Seitentabelle<br />

anpassen. Seitenrahmen als<br />

„normal“ markieren<br />

IAIK 96


Behandlung von<br />

Seitenfehlern<br />

8. Befehl der Unterbrechung verursacht<br />

hat, in den Anfangszustand versetzen<br />

und PC mit Adresse dieses Befehls<br />

laden<br />

9. Prozess zur Ausführung auswählen;<br />

zurück in Assemblerroutine<br />

10.Wiederherstellen der Register und des<br />

Zustandes und Wechsel in Benutzer-<br />

Modus<br />

IAIK 97


Befehlsunterbrechung<br />

• Bei Pagefaults: Befehl „mittendrin“<br />

unterbrochen, Sprung ins BS<br />

• Nach Laden der Seite muss Befehl<br />

neu gestartet werden<br />

• Das klingt einfacher als es ist.<br />

IAIK 98


Ein Beispiel<br />

MOVE.L #6(A1),#2(A0)<br />

• Befehl mit zwei Adressen<br />

• Ladet ein Datum vom Typ Long<br />

von A von M[A1+6] auf M[A0+2]<br />

• Befehl selbst ist 6 Byte lang<br />

IAIK 99


Ein Beispiel<br />

IAIK 100


Ein Beispiel<br />

• Pagefault<br />

• Befehl neu starten: was ist das<br />

erste Byte des Befehls?<br />

• Wert des PC abhängig vom<br />

Operanden und der<br />

Implementierung im Microcode der<br />

CPU<br />

• PC: 1000, 1002, 1004<br />

IAIK 101


Ein Beispiel<br />

• Noch schlimmer:<br />

• Adressierungsmodi mit<br />

Predecrement<br />

• MOVEM.L D0-D3/D6/D7,A0-A5,-(SP)<br />

• D0SP-4<br />

• D1SP-8<br />

• D2SP-12<br />

• …<br />

IAIK 102


Was tun?<br />

• Hilfe durch HW nötig<br />

• Info über Originalwert des<br />

PC/Register<br />

• Instruktion an der unterbrochenen<br />

Stelle fortführbar<br />

IAIK 103


Sperren von Seiten<br />

• Prozess fordert I/O-Operation an<br />

• Beispiel: lesen in Puffer<br />

• Prozess wird suspendiert<br />

• Andere Prozesse erzeugen pagefaults<br />

• Seite des Puffers könnte ersetzt werden<br />

• DMA-Transfer in falschen Speicher<br />

• Seite muss daher gesperrt werden<br />

(pinning) oder über Kernel transferiert<br />

IAIK 104


Hintergrundspeicher<br />

• Auslagern – fein. Aber wohin?<br />

• Einrichtung eines speziellen Swap-<br />

Bereichs<br />

• Eigene Partition auf Festplatte<br />

• Spezieller File im Filesystem<br />

• Jeder Prozess bekommt Block<br />

seiner Größe<br />

IAIK 105


Hintergrundspeicher<br />

• Prozesstabelle enthält<br />

Plattenadresse des Swap-Bereichs<br />

• Berechnung einfach: Addition<br />

• Initialisierung: entweder gesamtes<br />

Image laden und auf Swap<br />

schreiben oder nach Bedarf<br />

auslagern<br />

IAIK 106


Hintergrundspeicher<br />

• Problem: dynamischer Speicher<br />

• Alternative: nichts reservieren,<br />

und für jede Seite eigenen Block<br />

anfordern<br />

• Mehr Verwaltungsaufwand<br />

IAIK 107


Hintergrundspeicher<br />

IAIK 108


Segmentierung<br />

• Virtueller Speicher bisher<br />

eindimensional<br />

• Alle Adressen zwischen 0 und max<br />

• Oft Trennung in mehrere<br />

Adressräume nützlich<br />

IAIK 109


Beispiel Compiler<br />

• Braucht diverse Datenbereiche<br />

• Quellcode<br />

• Symboltabelle<br />

• Tabelle für Konstanten<br />

• Strukturbaum<br />

• Stack<br />

Wachsen ständig!<br />

IAIK 110


Eindimensional<br />

IAIK 111


Lösung?<br />

• Abbruch wenn Bereich zu klein<br />

• Nicht elegant<br />

• Reallocation<br />

• Mühsam<br />

• Besser: mehrere Adressräume<br />

• Segmente<br />

IAIK 112


Segment<br />

• Lineare Folge von Adressen (0..max)<br />

• Verschieden groß<br />

• Größe kann sich unabhängig von<br />

anderen Segmenten ändern<br />

• Adresse hat zwei Teile:<br />

Segmentnummer, Adresse im Segment<br />

IAIK 113


Beispiel<br />

IAIK 114


Hinweise<br />

• Segment ist logische Einheit<br />

• Programmierer berücksichtigt es<br />

• Schutzmaßnahmen auf<br />

Segmentbasis<br />

• Jede Prozedur in eigenes Segment:<br />

Linken wird stark vereinfacht<br />

• Startadresse jeder Prozedur:<br />

(Segmentnummer,0)<br />

IAIK 115


Shared Libraries<br />

• Gemeinsame Bibliotheken<br />

• Viele Routinen die von fast allen<br />

Programmen benötigt werden<br />

• Gemeinsame Nutzung spart Platz<br />

• Library in ein Segment laden, kann<br />

von allen gemeinsam genutzt<br />

werden<br />

IAIK 116


Vergleich<br />

Paging/Segmentierung<br />

IAIK 117


Implementierung<br />

• Wichtiger Unterschied:<br />

• Seiten haben fixe Größe<br />

• Segmente nicht!<br />

IAIK 118


Segmentierung mit Paging<br />

• Kombination nutzt Vorteile beider<br />

Systeme<br />

• MULTICS war das erste System<br />

• Jedes Programm bis zu 2 18<br />

Segmente a 65536 Worte (36 Bit)<br />

• Jedes Segment war virtueller<br />

Speicher<br />

IAIK 119


VM-MULTICS<br />

• Segmenttabelle, bis zu 250.000<br />

Einträge selbst Segment und kann<br />

ausgelagert werden<br />

• Segmenddeskriptor zeigt an ob<br />

Segment ausgelagert oder nicht<br />

• Teil des Segments im Speicher: gilt als<br />

Segment im Speicher und seine<br />

pagetable auch<br />

• Deskriptor hat Zeiger auf pagetable<br />

IAIK 120


VM-MULTICS<br />

IAIK 121


Adressen in MULTICS<br />

IAIK 122


Speicherzugriff MULTICS<br />

• Laden des Segmentdeskriptors<br />

• Ist pagetable im Speicher.<br />

• Nein: Segmentfehler<br />

• Pagetable untersuchen<br />

• Eventuell pagefault<br />

• Offset dazu<br />

• Speicherzugriff<br />

IAIK 123


Speicherzugriff MULTICS<br />

IAIK 124


Geschwindigkeit<br />

• MULTICS-HW hatte 16 Einträge großen<br />

TLB<br />

IAIK 125


MULTICS<br />

• … vor etwa 30 Jahren entstanden<br />

• Viele wegweisende Ansätze<br />

• Letzter Systemshutdown<br />

31.10.2000 !<br />

• www.multicians.org<br />

IAIK 126


Intel Pentium<br />

• Virtueller Speicher ähnlich<br />

MULTICS<br />

• Segmentierung und Paging<br />

• 16K Segmente, bis zu einer<br />

Milliarde 32bit-Worte<br />

• Größe wichtiger: öfter große<br />

Segmente und selten sehr viele<br />

IAIK 127


LDT - GDT<br />

• Local Descriptor Table<br />

• Für jedes Programm<br />

• Lokale Segmente (u.a. Code, Daten,<br />

Stack)<br />

• Global Descriptor Table<br />

• Systemsegmente<br />

• Darunter das Betriebssystem<br />

IAIK 128


Segmentregister<br />

• Sechs Segmentregister<br />

• CS: Selektor für Code Segment<br />

• DS: Selektor für Datensegment<br />

• Selektor<br />

IAIK 129


Segmentregister<br />

• Selektor 0 verboten – bedeutet:<br />

nicht verfügbar<br />

• Selektor in Segmentregister:<br />

Deskriptor aus LDT oder GDT in<br />

internen Register gespeichert<br />

IAIK 130


Deskriptor<br />

IAIK 131


Adressumsetzung<br />

(Selektor, Offset)<br />

• Mikroprogramm findet passenden<br />

Deskriptor in internen Registern<br />

• Selektor 0 oder ausgelagert:<br />

Interrupt<br />

• Offset überschreitet<br />

Segmentgröße: Interrupt<br />

IAIK 132


Adressumsetzung<br />

• Limit: 20 Bit<br />

• G bestimmt Granularität<br />

• 0: Limit in Byte<br />

• 1: Limit in Seiten<br />

• Addiert Basisfeld zum Offset<br />

• Ergebnis 32 Bit lineare Adresse<br />

• Paging abgeschaltet: lineare<br />

Adresse = physische Adresse<br />

IAIK 133


Segmentierung<br />

IAIK 134


Paging<br />

• Paging enabled: lineare Adresse ist<br />

virtuelle Adresse<br />

• Über pagetables in physische<br />

Adresse abbilden<br />

• Fixe Seitengröße 4KB eine<br />

Million Seiten zweistufige<br />

Seitentabellen<br />

IAIK 135


Paging<br />

IAIK 136


Paging<br />

• Seitenverzeichnis oder Page<br />

Directory<br />

• 1024 32bit-Einträge<br />

• Adresse in globalen Register<br />

• Jeder Eintrag zeigt auf eine<br />

Seitentabelle mit 1024 Einträgen<br />

IAIK 137


Paging<br />

• TLB vorhanden<br />

• Ein Selektor in alle<br />

Segmentregister: Ergebnis ist<br />

normales Paging<br />

• Ist bei allen gängigen<br />

Betriebssystemen der Fall<br />

• Nur OS/2 hat Features des<br />

Pentium voll ausgenutzt<br />

IAIK 138


Speicherschutz<br />

• Vier Schutzebenen<br />

• Zugriff auf Daten höherer Ebene<br />

legal<br />

• Zugriff auf Daten niedrigerer<br />

Ebene Schutzverletzung<br />

• Aufruf einer Prozedur nur über Call<br />

Gates<br />

IAIK 139


Speicherschutz<br />

• Konzept der<br />

Schutzringe an<br />

MULTICS<br />

angelehnt<br />

• Zugriffe auf<br />

höhere Ebene ok<br />

• Aufrufe auf<br />

niedrigere Ebenen<br />

über Call-Gates<br />

IAIK 140

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!