Download
Download
Download
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