Speicherverwaltung Memory Management Betriebssysteme VO WS 2008/2009
IAIK
1
Parkinsons Gesetz „Data expands to fill the space available for storage“ eigentlich ursprünglich: ‘WORK EXPANDS SO AS TO FILL THE TIME AVAILABLE FOR ITS COMPLETION’
IAIK
2
Der Traum Speicher: unendlich groß unendlich schnell nicht flüchtig … und billig auch noch
IAIK
3
Speicherhierarchie langsamer, billiger, nicht flüchtiger Massenspeicher, Gigabyte mittelschneller, flüchtiger, Hauptspeicher, Megabyte schneller, teurer, flüchtiger Cache, Kilobyte
IAIK
4
Verwaltung Memory-Manager Speicherverwaltung verfolgt Benutzung teilt Speicher zu gibt Speicher frei lagert Speicher aus
IAIK
5
Speicherverwaltungsysteme historische Systeme auch noch wichtig, da oft in
embedded systems oder PDA‘s eingesetzt
2 Klassen verschiebt Prozesse zwischen
Speicher und Platte (Swapping, Paging) verschiebt nichts IAIK
6
Wenn… Verschieben zwischen Speicher und Platte nur notwendig, weil zuwenig Speicher da Bei genügend Speicher – kein Problem mehr! aber… Parkinson!
IAIK
7
Früher…
IAIK
1981 Mit 1.Juli 1981 wurde der Werkvertrag aufgestockt, sodaß ein zusätzlicher Diskbereich mit 243 MB zur Verfügung steht. Der Anteil am Zentralspeicher wurde um 131.000 Worte (a 36 bit) erhöht. Darüberhinaus wurden Modems mit einer Übertragungsrate von 600 Baud bzw. 1.200 Baud angeschafft. …. 1984 Der Werkvertrag mit dem RZG wurde aufgestockt. Das EDV-Konzept 82 schlug eine Bedarfsabdeckung durch ein Netz regional verteilter Versorgungsschwerpunkte vor, um eine auf die jeweiligen Benutzergruppen abgestimmte EDV-Dienstleistung zu erbringen. Neu waren der Bereichsrechner "Universitätskliniken": VAX 11/750 (3 MB Zentralspeicher, 456 MB Festplatte) und der Bereichsrechner "Attemsgasse": VAX 11/750 (4 MB Zentralspeicher, 912 MB Festplatte, 205 MB Wechselplatte). aus: http://www.kfunigraz.ac.at/edvz/memory/memory47/schwerpunkte.h tml 8
Monoprogrammierung nur ein Programm aktiv Aufteilung Programm - Betriebssystem
Mainframes, Minicomputer nicht mehr verwendet IAIK
embedded Systems Palmtops
MS-DOS
9
Multiprogramming feste Partitionen Aufteilung in n Partitionen gleich groß verschieden groß
Beispielsweise bei Systemstart eingestellt Warteschlangen globale mehrere IAIK
10
Multiprogramming feste Partitionen generell: ungenutzter Platz verloren große Partition für kleinen Auftrag verwenden – schlecht Partition lange ungenutzt lassen – schlecht IAIK
?
ungenutzt
11
Multiprogramming feste Partitionen nur eine Schlange passende Partition auswählen eventuell Warteschlange nach passendstem Auftrag (verhungern!) IBM OS-360 MFT IAIK
12
Modellierung Multiprogramming verbessert Ausnutzung der CPU aber wie? 5 Prozesse die 20% der Zeit die CPU brauchen Æ 100% Auslastung? Zu vereinfachend IAIK
13
Modellierung probabilistischer Standpunkt besser Anteil „Warten auf I/O“ sei p Wahrscheinlichkeit, dass alle warten: pn Auslastung der CPU A = 1 - pn IAIK
14
Modellierung 90%
Degree of multiprogramming IAIK
15
Modellierung Modell ist immer noch vereinfachend – Prozesse sind selten völlig unabhängig Warteschlangentheorie
IAIK
16
Modellierung Ist das Modell einsetzbar? 32 MB Hauptspeicher (16 BS, 16 Prozesse a 1 MB). Ausbau um 16 MB. Gewinn? ursprünglich Auslastung 60% danach 83% (+38%) weitere 16MB: 93% (+12%) IAIK
17
Relokation/Speicherschutz Programm muss an verschiedenen Adressen laufen können! Linker muss wissen, welche Speicheradressen Programm verwenden wird IAIK
18
Relokation beim Laden Beim Laden von der Platte Adressen anpassen Linker muss Info verfügbar machen, welche Wörter im Programm Adressen sind
IAIK
19
Speicherschutz Problem: Absolute Adressen! ÆJedes Programm kann jede Speicherzelle referenzieren. Keine gute Idee Lösung: Basis/Limitregister
IAIK
20
Basis/Limitregister
Basisregister
rel. Adresse
Programm + Limitregister
≤ Interrupt!
IAIK
zum Speicher!
21
Swapping bei Batchsystemen bleibt Prozess im Memory bis er fertig ist Timesharing: manchmal nicht genug Speicher Æ inaktive Prozesse auslagern (auf Festplatte speichern) und bei Bedarf dynamisch zurückholen zwei Ansätze: swapping und virtueller Speicher IAIK
22
Swapping
IAIK
23
Swapping Unterschied zu festen Partitionen: Anzahl dynamisch Größe dynamisch Ort dynamisch
Verbessert Speicherausnutzung Macht Zuteilung und Verwaltung komplizierter IAIK
24
Compaction Dynamische Partitionen Æ es entstehen Löcher können klein sein Æ nicht nutzbar Speicherverdichtung nötig vermieden da zu teuer (Sekundenbereich)
IAIK
25
Wieviel Speicher? Programm fest Größe: einfach Aber: object.create(…) oder malloc dynamischer Speicher nötig wenn „daneben“ noch Platz, Adressraum vergrößern sonst Prozess verschieben vorbeugend mehr Speicher! IAIK
26
Dynamischer Speicher
IAIK
27
Speicherverwaltung dynamische Zuteilung Æ Verwaltung zwei Möglichkeiten Bitmaps – Problem: Suche n freie Blöcke free lists
IAIK
28
verkettete Listen
hier nach Adressen sortiert Prozess hat normalerweise 2 Nachbarn bei Terminieren vier Möglichkeiten IAIK
29
Terminieren von X
IAIK
30
Speicherzuordnungsalgorithmen First Fit durchsuche Liste, bis ein Loch groß
genug Loch in zwei Teile teilen: eins für den Prozess, eins Loch
IAIK
31
Speicherzuordnungsalgorithmen Next Fit wie First Fit, nur beginnt dort wo er
beim letzten mal geendet hat
IAIK
32
Best Fit Durchsucht die Liste nach dem kleinsten, passenden Loch langsamer als First Fit verschwendet auch mehr Speicher! da viele kleine, nutzlose Löcher entstehen!
IAIK
33
Worst Fit wählt immer das größte Loch ist aber auch nicht gerade gut…
IAIK
34
Beschleunigung getrennte Listen für Prozesse und Löcher schnelle Zuteilung komplexere, langsamere Freigabe Löcherliste nach Größe sortieren Æ erstes Loch das passt ist optimal Bestfit und Firstfit gleich schnell – NextFit
sinnlos
Löcher als Speicher für Verwaltung der Löcher! IAIK
35
Overlays Programm zu groß für Speicher Programm in Teile aufteilen (Overlays) Management durch BS, Aufteilung durch Programmierer Overlays dürfen keine Abhängigkeiten haben! IAIK
Overlay 2
Overlay 1
36
Virtueller Speicher Aufteilung bzw Ein- und Auslagern durch Betriebssystem Virtueller Speicher Æ nicht gesamtes Programm im Speicher Multiprogramming: von allen Programmen nur Teile im Speicher
IAIK
37
Adressierung Programme referenzieren Adressen Bsp: MOV REG,1000 Inhalt der Adresse 1000 ins Register REG physische Adresse: Adresse wird auf Speicherbus gelegt virtuelle Adresse – Adresse wird von MMU (Memory Management Unit) transformiert IAIK
38
MMU Teil des CPU-Chips früher getrennt
IAIK
39
Virtuelle Adressen / Paging virtueller Adressraum in Seiten (pages) unterteilt physischer Speicher in Seitenrahmen (page frames) page size typisch 512 Byte bis 64KB
IAIK
40
Umsetzung MOV REG,0 0 an MMU Seite: 0 Æ page frame 2 0 Æ 8192 8192 auf Speicherbus
IAIK
41
Umsetzung page mit X nicht im Speicher (normalerweise
present/absent bit)
Zugriff auf abwesende Seite? MMU stellt das fest Æ page fault (Seitenfehler) IAIK
42
Page fault - Seitenfehler Wenig benutzten Frame suchen Inhalt sichern Seite die pagefault ausgelöst hat in Frame laden Abbildungstabelle anpassen Befehl noch einmal ausführen
IAIK
43
Innenleben MMU
IAIK
44
MMU Seitennummer als Index in Seitentabelle present-bit 0: Seitenfehler sonst Framenummer kopieren Offset unverändert übernehmen
IAIK
45
Seitentabellen / page tables Aufteilung der virtuellen Adresse an sich beliebig verschiedene Aufteilungen ergeben verschiedene Seitengrößen pagetable bildet virtuelle Seiten auf Frames ab
IAIK
46
Probleme Größe der Pagetable Geschwindigkeit der Umrechnung
IAIK
47
Größe der Pagetable Seitengröße 4KB 32-Bit-Adressraum: eine Million Seiten Pagetablegröße? Offset: 12 Bit, framenumber: 20 Bit typisch 4 Byte pro Eintrag Æ 4 MB!
64-Bit-Adressraum - / IAIK
48
Geschwindigkeit Typischer Befehl: ein Befehlswort und meist einen oder mehrere Operanden im Memory mehrere Speicherzugriffe ADD R1,R2 ADD R1,M[1000]
1 Zugriff 2 Zugriffe
Umrechnung muss schnell sein, sonst ist sie der Engpass IAIK
49
einfache Seitentabelle pagetable: Reihe schneller HW-Register Bei Prozess-Start, Seitentabelle in Register laden danach keine Speicherzugriffe Vorteil: einfach Nachteil: für große Tabellen teuer Nachladen bei contextswitch aufwändig
IAIK
50
Seitentabelle im Memory Register zeigt auf Startadresse Austausch bei Kontextwechsel einfach – Register neu laden Nachteil: sehr viele Speicherzugriffe
IAIK
51
Mehrstufige Seitentabellen Seitentabellen zu groß – man möchte Seitentabellen nicht im Memory halten Seitentabellen ins VM legen (oder zweistufige Seitentabellen) IAIK
PT1 10 Bit
PT2 10 Bit
Offset 12 Bit
52
Mehrstufige Seitentabellen Nicht mehr alle Seitentabellen gleichzeitig im Speicher … besonders die, die nicht gebraucht werden
IAIK
53
Beispiel Prozess belegt 12 MB Speicher – 4 Programmcode 4 Daten 4 Stack 4096 Byte Pagesize – 4 Byte PTE (Page Table Entry) 4MB pro Seite der Pagetable Nur vier Seitentabellen! IAIK
54
Seitentabelleneintrag page table entry (PTE) maschinenabhängig
IAIK
55
Seitentabelleneintrag pageframe-number present-bit protection entweder 0: read, 1: read/write oder zusätzliches Bit für execute
Modified/Referenced: protokollieren Zugriffe modified oft dirty bit
Caching-Bit für Memory-based I/O – dort wichtig, caching abzuschalten im PTE nur Infos, die von HW benötigt werden – Infos über Auslagerung auf Platte anderswo IAIK
56
Problem Seitentabellen meist im Speicher Leistungshemmend Beispiel: LD R1,#1 ohne Paging: ein Speicherzugriff mit Paging: ein Zugriff auf Pagetable
dazu mehrstufiges paging: noch ein Zugriff 2/3 Leistungseinbruch IAIK
57
Lokalitätsprinzip Lokalitätsprinzip Programme neigen dazu, viele Zugriffe auf wenige Seiten zu machen Schleifen im Programmcode Arrays häufig verwendeter Code
IAIK
58
Lösung TLB - Translation Lookaside Buffer (Assoziativspeicher) Teil der MMU, einige wenige Einträge (selten mehr als 64) Felder aus PTE übernommen
IAIK
59
TLB - Funktionsweise Virtuelle Adresse an MMU Hardware prüft ob Eintrag in TLB Seitennummer mit allen Einträgen
gleichzeitig vergleichen passender Eintrag und Schutz nicht verletzt: Framenummer verwenden Schutz verletzt: Schutzfehler
IAIK
60
TLB - Funktionsweise Was, wenn kein passender Eintrag? Eintrag aus Pagetable holen und in TLB schreiben anderer Eintrag in TLB ersetzt – dessen modified-bit in pagetable sichern alle Felder des PTE in TLB ! IAIK
61
Verwaltung durch SW Früher: jede Maschine mit virtuellem Speicher und Paging hatte Seitentabellen, die von HW verwaltet
werden TLB
Systemaufrufe nur bei Seitenfehlern IAIK
62
Verwaltung durch SW Viele RISC-Prozessoren (SPARC, MIPS, Alpha…): fast gesamte Speicherverwaltung in Software TLB-Einträge durch BS geladen PTE nicht in TLB MMU erzeugt TLB-Fehler Behandlung duch Betriebssystem … und das möglichst schnell … IAIK
63
Verwaltung durch SW SW-Verwaltung einigermaßen effizient wenn TLB groß genug Æ reduziert Fehlerrate Vorteil: MMU einfacher, mehr Platz für Cache und anderes Problem: bei der Behandlung von TLBFehlern in SW können weitere TLBFehler auftreten Lösung: großer SW-Cache, dessen PTE‘s immer im TLB bleiben, dort suchen IAIK
64
große Pagetables… 64-Bit Computer: bei 4KB pagesize pagetable: 252 Einträge 8 Byte pro Eintrag Æ30 Millionen Gigabyte
das geht wohl nicht… andere Lösung gefragt… IAIK
65
Invertierte Seitentabelle ein Eintrag pro Frame! Tabellengröße abhängig vom physischen Speicher 64 Bit Adressraum – 256MB Hauptspeicher – 65536 Einträge Pro Frame: (Prozess, Seitennummer) IAIK
66
Invertierte Seitentabelle sparen Speicherplatz wenn virtuelle Adressraum größer als
physischer Speicher Nachteil: Aufwand der Abbildung höher virtuelle Seitennummer nicht als Index verwendbar Suche nach (p,n) nötig – für jeden Speicherzugriff! IAIK
67
Invertierte Seitentabelle Lösung: TLB! alle vielbenutzten Seiten im TLB: Umrechnung genauso schnell TLB-Fehler: invertierte Tabelle per SW durchsucht werden virtuelle Adresse als Hash-Wert zur Beschleunigung der Suche IAIK
68
Invertierte Seitentabelle
IAIK
69
Seitenersetzungsalgorithmen Seitenfehler Æ welche Seite muss raus? wenn die zu ersetzende Seite modifiziert wurde: auf Festplatte zurückschreiben falls Programmcode: zurückschreiben nicht nötig nun aber: welche Seite… IAIK
70
Seitenersetzungsalgorithmen zufällige Seite? besser Seiten, die nur selten benutzt werden vielbenutzte müssten bald wieder eingelagert werden ähnliches Problem auch bei Caches (Memory oder Webserver) IAIK
71
optimal leicht zu beschreiben, schwer zu implementieren markiere alle Seiten mit der Anzahl der
Befehle, die bis zum nächsten Zugriff auf diese Seite ausgeführt werden entferne die Seite mit der höchsten Zahl
nur leider… zum Vergleich geeignet IAIK
72
Not Recently Used wenn wir schon nicht in die Zukunft schauen können… … können wir aus der Vergangenheit lernen? wenn eine Seite in der letzten Zeit nicht verwendet wurde… … wird sie vielleicht auch in der nächsten Zeit nicht gebraucht IAIK
73
Not Recently Used Statusbits: R – M werden von der Hardware gesetzt und bei jedem Speicherzugriff aktualisiert bleibt auf 1 bis von BS zurückgesetzt
R
IAIK
M
74
Not Recently Used was, wenn die HW das nicht kann? Alle PTE auf ausgelagert markieren erster Zugriff auf die Seite erzeugt Seitenfehler Æ BS setzt R-Bit, Schutz auf read-only, führt Befehl noch einmal aus Schreibzugriff: weiterer Seitenfehler, M-Bit und r/w setzen IAIK
75
Not Recently Used Prozess gestartet, alle M und RBits auf 0 regelmäßig: alle R-bits löschen nur bei kürzlich referenzierten Seiten ist R-Bit gesetzt
IAIK
76
Not Recently Used Seitenfehler tritt auf Einteilung der Seiten in vier Kategorien Klasse 0: nicht ref., nicht modif. Klasse 1: nicht ref., modif. Klasse 2: ref., nicht modif. Klasse 3: referenziert und modifiziert
NRU entfernt eine zufällige Seite aus der niedrigsten nicht leeren Klasse Leistung nicht optimal, aber oft ausreichend IAIK
77
FIFO Liste aller Seiten am Kopf die älteste Seite Seitenfehler: entferne Seite am Kopf der Liste neue Seite am Ende anhängen
kann genau die falschen Seiten rauswerfen selten unverändert eingesetzt IAIK
78
Second Chance Variante von FIFO R-Bit gelöscht: seite wählen R-Bit gesetzt: R-Bit löschen und Seite ans Ende der Liste hängen sucht nach einer möglichst alten Seite, auf die im letzten Intervall nicht zugegriffen wurde Im Grenzfall (alle R-Bits gesetzt) FIFO IAIK
79
Second Chance
IAIK
80
Clock alle Seiten in einer ringförmigen Liste Zeiger auf älteste Seitenfehler: nimm Seite auf
die Zeiger zeigt Alternativ: R-Bit berücksichtigen Æ Second Chance IAIK
81
Least Recently Used wenn wir schon nicht in die Zukunft schauen können… … können wir aus der Vergangenheit lernen? wenn eine Seite sehr lange nicht mehr verwendet wurde… … wird sie vielleicht auch in der nächsten Zeit nicht gebraucht IAIK
82
Least Recently Used (LRU) realisierbar, aber nicht billig verkettete Liste aller Seiten bei jedem Zugriff aktualisiert Approximationen
IAIK
83
Approximation 1 64-Bit Zähler nach jedem Maschinenbefehl erhöht PTE: Feld für Zähler Speicherzugriff: speichert Zähler in PTE Seitenfehler: Liste nach niedrigstem Zähler durchsuchen IAIK
84
Approximation 2 Matrix aus n*m Bits, anfangs 0 Zugriff auf Seite k: Bits der Zeile k auf 1, Bits der Spalte k auf 0 die Zeile mit dem niedrigsten Binärwert ist die am längsten nicht benutzte
IAIK
85
LRU durch Software LRU ohne Hardware nicht realisierbar Hardware kaum vorhanden Softwarelösung: NFU – Not Frequently Used Zähler pro Seite Timerinterrupt erhöht den Zähler um R-Bit IAIK
86
NFU Problem: vergisst nix. Oft verwendete Seiten bleiben erhalten auch wenn nicht mehr benötigt Modifikation: vor Addition Rechtsverschiebung R-Bit beim höchstwertigen Bit
addieren
IAIK
87
Aging
IAIK
88
Aging versus LRU Unterscheidung innerhalb eines Intervalls nicht möglich endliche Anzahl von Bits, wenn Zähler 0 dann nicht unterscheidbar ob vor 9 oder vor 1000 Intervallen 8 bits reichen bei 20msec meist aus IAIK
89
Demand Paging Starten eines Prozesses… … wie viele Seiten soll der bekommen? Eine Strategie: Demand Paging (Einlagern bei Bedarf) Starten mit 0 Seiten im Hauptspeicher IAIK
90
Demand Paging Laden des Befehlscodes des ersten Befehls Æ page fault Weitere Seitenfehler für Stack und Datenbereich Nach einiger Zeit: alle Seiten eingelagert, die Prozess benötigt Lokalitätsprinzip macht das machbar! IAIK
91
Working Set Menge der Seiten, die ein Prozess zu einem bestimmten Zeitpunkt benötigt Working Set im Speicher Æ keine pagefaults Verfügbarer Speicher kleiner als working set Æ viele pagefaults Thrashing (system lagert fast nur mehr ein/aus) IAIK
92
Swapping Prozesse auslagern – normalerweise auf Festplatte Oft eigene Partition oder nur große Datei Idealerweise kontinuierlich auf der Platte – Geschwindigkeit Auslagern: Nur Daten mit dirty=1 Programmcode von executable file einlagern IAIK
93
Swapping Wie gehen wir vor wenn Prozess wieder eingelagert wird? Eigentlich brauchen wir nichts tun – pagefaults bis working set eingelagert Kostet aber CPU-Zeit für die Behandlung der pagefaults IAIK
94
Working-Set-Modell BS merkt sich das working set eines Prozesses Working set wird vor weiterer Ausführung des Prozesses wieder geladen prepaging
IAIK
95
Überlegungen zum ws Speicherzugriffe über Adressraum nicht gleich verteilt – konzentrieren sich auf einige wenige w(k,t) Menge der Seiten die in den letzten k Speicherzugriffen vor dem Zeitpunkt t referenziert wurden Monoton steigende Funktion IAIK
96
workingset
IAIK
97
Überlegungen zum ws Arbeitsbereich eines Prozesses ändert sich nur langsam – Seiten die Prozess nach Einlagern braucht zT vorhersehbar Æ prepaging funktioniert
IAIK
98
Implementierung WS BS muss wissen, welche Seiten im working set liegen. Seitenersetzungsalgorithmus: bei pagefault – finde Seite die nicht im working set, und lagere sie aus. wann ist aber eine Seite nicht im working set? IAIK
99
working set w(k,t) Menge der Seiten die in den letzten k Speicherzugriffen vor dem Zeitpunkt t referenziert wurden
Aber wie implementieren? Schieberegister, bei jedem Speicherzugriff Seitennummer reinschieben? … nicht effizient Annäherungen möglich statt „letzte k“ „letzte m msec“ IAIK
100
Approximation working-set-Zeit relative Prozesszeit 100 msec absolut, aber nur 20 msec für Prozess – virtuelle Zeit! workingset: die Menge der Seiten, auf die der Prozess in den letzten τ msec virtueller Zeit zugegriffen hat IAIK
101
Approximation Hardware muss R/M setzen periodisch: R bits gelöscht bei Seitenfehler alle PTE‘s durchsuchen R-Bit == 1? aktuelle virtuelle Zeit in Feld für Zeit des letzten Zugriffs eintragen Seite liegt im Arbeitsbereich IAIK
102
Approximation R-Bit == 0
Seite seit letzter Unterbrechung nicht
verwendet Æ Kandidat für Auslagerung Alter bestimmen: gespeicherte Zeit – aktueller virtueller Zeit
zu alt: aus workingset nehmen „zu jung“: meist verschonen. Nur wenn alle Seiten im Arbeitsbereich, älteste auslagern
Rest der Tabelle durchlaufen um
Zugriffszeiten zu aktualisieren
Alle R-Bits = 1? Pech. Irgendeine nehmen… IAIK
103
Approximation
IAIK
104
WSClock einfacher Algorithmus umständlich durchläuft pagetable bei jedem
pagefault bis Kandidat gefunden
Kombination aus Clock und Workingset: WSClock in realen Systemen weit verbreitet Wie Clock ringförmige Liste IAIK
105
WSClock
IAIK
106
WSClock Untersuche Seite auf die Zeiger zeigt R=1 Æ kein idealer Kandidat R Å 0 Zeiger vorrücken continue
IAIK
107
WSCLock R=0 Alter > T Æ nicht im Workingset M=0 Æ Seite kann freigegeben werden M=1 Æ vormerken, dass Seite auf Platte geschrieben werden muss. Aber weitersuchen, um Prozesswechsel zu vermeiden
IAIK
108
WSCLock Wieder am Anfang? es wurde eine Seite vorgemerkt weiterlaufen, irgendwann wird vorgemerkte im Hintergrund zurückgeschrieben es wurde keine Seite vorgemerkt alle Seiten im Arbeitsbereich Æ irgendeine Seite auslagern (am besten irgendeine saubere Seite merken, dann gibt’s die jetzt schon). IAIK
109
Zusammenfassung
IAIK
110
Modellierung FIFO 012301401234 neueste Seite
012301444233 01230111422
älteste Seite
0123000144 PPPPPPP
IAIK
PP
111
Keller-Algorithmen Jeder Prozess erzeugt Folge von Speicherzugriffen auf virtuelle Seiten Speicherzugriffe als Liste von Seitennummern darstellbar Referenzkette – reference string IAIK
Modellierung FIFO 012301401234 neueste Seite
012301444233 01230111422
älteste Seite
0123000144 PPPPPPP
PP
IAIK
112
Annahmen ein Rechner ein Prozess eine deterministische Referenzkette pro Rechner Paging-System charakterisiert durch Seitenersetzungsalgorithmus Anzahl m der physischen Seitenrahmen Referenzkette des Prozesses
IAIK
113
Simulation über Interpreter enthält interne Tabelle M – repräsentiert Zustand des Speichers M hat n Einträge, einen pro virtuelle Seite des Prozesses M hat zwei Teile oberer Teil, m Einträge: Seiten, die im
Speicher liegen unterer Teil, n-m Einträge: Seiten, die ausgelagert wurden
M zu Beginn leer IAIK
114
Prozess-Start Prozess gibt Seiten seiner Referenzkette aus. Interpreter prüft, ob Seite im Speicher. Wenn nicht – Seitenfehler. falls leerer Seitenrahmen vorhanden: dort laden (nur zu Beginn möglich) IAIK
115
Speicher voll voll: oberer Teil von M enthält m Einträge Seitenersetzungsalgorithmus aufrufen, entfernt Seite aus Speicher Æ verschieben in unteren Teil neue Seite laden oder von unteren in oberen verschieben IAIK
116
Beispiel 021 021 02 0
3 3 1 2 0
5 5 3 1 2 0
4 4 5 3 1 2 0
6 6 4 5 3 1 2 0
P P P P P P P IAIK
3 3 6 4 5 1 2 0
7 7 3 6 4 5 1 2 0 P
4 4 7 3 6 5 1 2 0
7 7 4 3 6 5 1 2 0
3 3 7 4 6 5 1 2 0
3 3 7 4 6 5 1 2 0
5 5 3 7 4 6 1 2 0 P
5 5 3 7 4 6 1 2 0
3 3 5 7 4 6 1 2 0
1 1 3 5 7 4 6 2 0 P
1 1 3 5 7 4 6 2 0
1 1 3 5 7 4 6 2 0
7 7 1 3 5 4 6 2 0
1 1 7 3 5 4 6 2 0
3 3 1 7 5 4 6 2 0
4 4 3 1 7 5 6 2 0 P
1 1 4 3 7 5 6 2 0
117
Modellierung FIFO 012301401234 neueste Seite
012301444233 01230111422
älteste Seite
0123000144 PPPPPPP
IAIK
PP
118
FIFO – 4 Frames 0
1
2
3
0
1
4
0
1
2
3
4
0
1
2
3
3
3
4
0
1
2
3
4
0
1
2
2
2
3
4
0
1
2
3
0
1
1
1
2
3
4
0
1
2
0
0
0
1
2
3
4
0
1
P
P
P
P
P
P
P IAIK
P
P
P
119
Algorithmen Algorithmen mit der Eigenschaft
M (m, r ) ⊆ M (m + 1, r ) sind besonders interessant… nach r Speicherzugriffen ist der obere Teil von M für einen Speicher von m Seiten Teilmenge des oberen Teils von M Speichers von m+1 Seiten IAIK
120
Kelleralgorithmen – stack-algorithms Algorithmen mit der Eigenschaft M (m, r ) ⊆ M (m + 1, r )
heißen Kelleralgorithmen. LRU ist ein Kelleralgorithmus FIFO nicht Keller-Algorithmen sind nicht für Beladys Anomalie anfällig
IAIK
121
Distanzkette Repräsentation der Referenzkette in abstrakterer Form zur Evaluierung der Verfahren Seitenbezeichnung durch Abstand der Seite vom oberen Ende des Stack Seiten, auf die noch nicht zugegriffen wurde: Abstand ∞ IAIK
122
Distanzkette 021 021 02 0
4 4 7 3 6 5 1 2 0 ∞∞∞∞∞∞∞4 ∞4
IAIK
3 3 1 2 0
5 5 3 1 2 0
4 4 5 3 1 2 0
6 6 4 5 3 1 2 0
3 3 6 4 5 1 2 0
7 7 3 6 4 5 1 2 0
7 7 4 3 6 5 1 2 0 2
3 3 7 4 6 5 1 2 0 3
3 3 7 4 6 5 1 2 0 1
5 5 3 7 4 6 1 2 0 5
5 5 3 7 4 6 1 2 0 1
3 3 5 7 4 6 1 2 0 2
1 1 3 5 7 4 6 2 0 6
1 1 3 5 7 4 6 2 0 1
1 1 3 5 7 4 6 2 0 1
7 7 1 3 5 4 6 2 0 4
1 1 7 3 5 4 6 2 0 2
3 3 1 7 5 4 6 2 0 3
4 4 3 1 7 5 6 2 0 5
1 1 4 3 7 5 6 2 0 3 123
Distanzkette hängt ab von Referenzkette Seitenersetzungsalgorithmus
statistische Eigenschaften der Distanzkette beeinflussen Leistungsfähigkeit des Algorithmus
IAIK
124
Distanzkette
wenige Seitenfehler bei k Seitenrahmen
IAIK
„Pech gehabt“ – keine Anzahl an Frames passt (außer n) 125
Seitenfehlerrate vorhersagen mit Hilfe der Distanzkette möglich Ziel: einmal Distanzkette durchlaufen und mit den gesammelten Infos vorhersagen, wie viele Seitenfehler bei k Frames vorkommen (k=1…n)
IAIK
126
Algorithmus durchläuft Distanzkette
C1 C2 zählt Abstände C3 C4 ∞∞ ∞∞ ∞ ∞∞ 4 ∞ 4 2 3 1 5 1 2 6 1 1 4 2 3 5 3 C5 C6 C∞ IAIK
4 3 3 3 2 1 8 127
Algorithmus
Fm =
n
∑C
k = m +1
k
+ C∞
Fm = Anzahl der Seitenfehler für gegebene Distanzkette und m Seitenrahmen IAIK
C1 C2 C3 C4 C5 C6 C∞
4 3 3 3 2 1 8
F1 F2 F3 F4 F5 F6 F∞
20 17 14 11 9 8 8 128
Design-Kriterien Bisher: Mechanik wie funktioniert Paging welche Algorithmen für
Seitenersetzung gibt es wie modelliert man diese
reicht nicht jetzt: was ist für ein leistungsstarkes System nötig? IAIK
129
Lokal – Global ? A erzeugt pagefault Welche Seiten für Ersetzung in Betracht ziehen? Nur die von A – lokale Strategie ? Alle – globale Strategie? IAIK
130
Lokal - Global lokal: fester Speicherbereich pro Prozess global: dynamische Verteilung, Anzahl der Frames eines Prozesses variabel
IAIK
131
Lokal - Global Im Allgemeinen: global Strategien besser – besonders wenn sich die Größe des Workingset ändert Speicherbedarf wächst – thrashing (obwohl Seiten „woanders“ verfügbar) Speicherbedarf schrumpft – Seiten verschwendet IAIK
132
Lokal - Global manche Seitenersetzungsalgorithmen für lokale und globale Strategien anwendbar (FIFO, LRU) andere nicht (Workingset, WSClock)
IAIK
133
Global Globale Strategie entscheidet ständig über die Anzahl der Seitenrahmen Möglichkeiten: Aging-Bits – eventuell zu grob Frames zu gleichen Teilen auf alle
Prozesse (regelmäßig anpassen) – nicht sinnvoll, wenn Prozesse unterschiedlich groß
IAIK
134
Global Im Verhältnis zur Prozessgröße? Minimum kann notwendig sein (Befehl könnte bis zu 6 Seiten im Speicher benötigen) Starten mit Seitenzahl im Verhältnis zur Größe, danach dynamische Anpassung IAIK
135
PFF-Algorithmus Page-Fault-Frequency Algorithmus bestimmt nur, wie viel Speicher ein Prozess bekommt Pagefault-Rate indirekt-proportional zur Speichergröße
IAIK
136
PFF-Algorithmus
IAIK
137
PFF-Algorithmus zu hohe Seitenfehlerrate: mehr Speicher zuteilen zu niedrige Seitenfehlerrate: Speicher wegnehmen
IAIK
138
Laststeuerung wenn working-set aller Prozesse größer als Hauptspeicher - es wird immer zu viele Seitenfehler geben! PFF-Algorithmus könnte das anzeigen: mehrere zu wenig, keiner zu viel Lösung: Prozesse auslagern IAIK
139
Laststeuerung Wenn danach die Fehlerrate sinkt – ok sonst: noch einen auslagern – bis sich Erfolg einstellt Swapping also auch bei pagingsystemen sinnvoll! Kann auch wichtig sein, welche Prozesse man auslagert IAIK
140
Seitengröße Oft einstellbarer Parameter keine optimale Lösung große Seiten – mehr interne Fragmentierung: wieviele Bytes bleiben in Seitenrahmen ungenutzt? kleine Seiten: viele Seiten, große Seitentabellen, mehr Verwaltung, Transfer kleiner Seiten dauert fast gleich lange wie großer Seiten IAIK
141
Seitengröße Platzverbrauch kann mathematisch analysiert werden Durchschnittliche Prozessgröße s Seitengröße p, PTE e Bytes, s/p-Seiten Speicherverbrauch für Seitentabelle und
Fragmentierung V=se/p+p/2 Optimum wenn -se/p2+1/2 = 0
p = 2 se IAIK
142
Seitengröße s=1MB e=8 Byte optimale Seitengröße 4KB übliche Seitengrößen heute 4 oder 8 KB
IAIK
143
getrennte Programm- und Datenbereiche
IAIK
144
Gemeinsame Seiten shared pages mehrere Benutzer benutzen das gleiche Programm Effizienter, Seiten gemeinsam zu nutzen geht aber nur für Code, nicht für Daten!
IAIK
145
Gemeinsame Seiten getrennte Adressräume für Code und Daten – gemeinsamen Adressraum für Code, getrennten für Daten
IAIK
146
Gemeinsame Seiten Betriebssystem muss gemeinsame Seiten berücksichtigen Auslagern von einem Prozess –
zweiter Prozess lagert wieder alle ein? Beenden eines Prozesses – Seiten müssen eventuell erhalten bleiben
IAIK
147
Gemeinsame Seiten Daten gemeinsam zu benutzen etwas komplizierter zB nach UNIX-fork Beide lesen: kein Problem Schreiben: Seiten auf R/O setzen Schreibzugriff: Seite kopieren – jeder Prozess eigene Kopie und auf R/W setzen copy-on-write Seiten die nie beschrieben werden, müssen nicht kopiert werden IAIK
148
Freigabe-Strategien Paging funktioniert am besten wenn genügend Seitenrahmen frei Wenn alle Pageframes voll sind und einer gebraucht wird – unangenehm. Eventuell muss freizumachende Seite noch zurückgeschrieben werden. Das dauert! IAIK
149
Freigabe-Strategien Daher: Vorbeugen Paging-Daemon meist inaktiv wacht regelmäßig auf und prüft
Speicherzustand nicht genug freie Rahmen Æ wählt Seiten aus und beginnt sie auszulagern IAIK
150
Paging-Daemon Inhalt der Seiten bleibt erhalten Æ falls doch noch benötigt, ist nichts verloren Bei einem Pagefault ist dann immer ein freier Rahmen verfügbar Æ Performancesteigerung
IAIK
151
Implementierungsprobleme Auswahl der Strategien ist eine Sache praktische Probleme bei der Implementierung eine andere
IAIK
152
Betriebssystemaufgaben bei Paging vier Punkte wo das BS Arbeit leisten muss Erzeugung des Prozesses Ausführung des Prozesses Seitenfehler Terminierung des Prozesses
IAIK
153
Erzeugung des Prozesses Größe des Programmcodes und der Daten feststellen Seitentabelle für Prozess erzeugen Speicher zuteilen und initialisieren Platz für ausgelagerte Seiten auf der Platte reservieren ev. Swapping-Bereich mit Code und Daten initialisieren IAIK
154
Ausführung des Prozesses MMU auf neuen Prozess einstellen TLB leeren aktuelle Seitentabelle auf Tabelle des Neuen Prozesses setzen eventuell prepaging
IAIK
155
Seitenfehler Hardware-Register auslesen um festzustellen, welche Adresse Fehler verursacht hat finden der benötigten Seite freien Seitenrahmen suchen eventuell alte Seite auslagern neue Seite einlesen Programmzähler auf Befehl zurücksetzen, der den Seitenfehler verursacht hat IAIK
156
Terminierung des Prozesses Seitentabelle, Seitenrahmen und Plattenplatz freigeben gemeinsam benutzte nur, wenn der letzte Prozess terminiert
IAIK
157
Behandlung von Seitenfehlern 1. Hardware PCÆ Stack, Sprung in Kernel 2. Interrupt-Serviceroutine sichern von Registern und anderer Informationen 3. OS welche virtuelle Adresse hat Fehler ausgelöst? HW-Register, oder Befehl interpretieren! IAIK
158
Behandlung von Seitenfehlern 4. Prüfen der Adresse auf Gültigkeit Schutzverletzung Æ Abbruch sonst: freien Seitenrahmen finden. keiner da? Ersetzungsalgorithmus starten. 5. Seitenrahmen modifiziert Æ Seite auf Platte schreiben lassen, Prozess suspendieren und anderen laufen lassen. Seitenrahmen als belegt markieren! IAIK
159
Behandlung von Seitenfehlern 6. Wenn Seitenrahmen sauber: laden der Seite von Platte. Prozess bleibt oder wird suspendiert. 7. Seite angekommen (Interrupt durch Festplatte): Seitentabelle anpassen. Seitenrahmen als „normal“ markieren IAIK
160
Behandlung von Seitenfehlern 8. Befehl der Unterbrechung verursacht hat, in den Anfangszustand versetzen und PC mit Adresse dieses Befehls laden 9. Prozess zur Ausführung auswählen; zurück in Assemblerroutine 10.Wiederherstellen der Register und des Zustandes und Wechsel in BenutzerModus IAIK
161
Befehlsunterbrechung Bei Pagefaults: Befehl „mittendrin“ unterbrochen, Sprung ins BS Nach Laden der Seite muss Befehl neu gestartet werden Das klingt einfacher als es ist.
IAIK
162
Ein Beispiel MOVE.L #6(A1),#2(A0) Befehl mit zwei Adressen Ladet ein Datum vom Typ Long von A von M[A1+6] auf M[A0+2] Befehl selbst ist 6 Byte lang
IAIK
163
Ein Beispiel
IAIK
164
Ein Beispiel Pagefault Befehl neu starten: was ist das erste Byte des Befehls? Wert des PC abhängig vom Operanden und der Implementierung im Microcode der CPU PC: 1000, 1002, 1004 IAIK
165
Ein Beispiel Noch schlimmer: Adressierungsmodi mit Predecrement MOVEM.L D0-D3/D6/D7,A0-A5,-(SP)
D0ÆSP-4 D1ÆSP-8 D2ÆSP-12 … IAIK
166
Was tun? Hilfe durch HW nötig Info über Originalwert des PC/Register Instruktion an der unterbrochenen Stelle fortführbar
IAIK
167
Sperren von Seiten Prozess fordert I/O-Operation an Beispiel: lesen in Puffer Prozess wird suspendiert Andere Prozesse erzeugen pagefaults Seite des Puffers könnte ersetzt werden DMA-Transfer in falschen Speicher Seite muss daher gesperrt werden (pinning) oder über Kernel transferiert IAIK
168
Hintergrundspeicher Auslagern – fein. Aber wohin? Einrichtung eines speziellen SwapBereichs Eigene Partition auf Festplatte Spezieller File im Filesystem
Jeder Prozess bekommt Block seiner Größe IAIK
169
Hintergrundspeicher Prozesstabelle enthält Plattenadresse des Swap-Bereichs Berechnung einfach: Addition Initialisierung: entweder gesamtes Image laden und auf Swap schreiben oder nach Bedarf auslagern IAIK
170
Hintergrundspeicher Problem: dynamischer Speicher Alternative: nichts reservieren, und für jede Seite eigenen Block anfordern Mehr Verwaltungsaufwand
IAIK
171
Hintergrundspeicher
IAIK
172
Segmentierung Virtueller Speicher bisher eindimensional Alle Adressen zwischen 0 und max
Oft Trennung in mehrere Adressräume nützlich
IAIK
173
Beispiel Compiler Braucht diverse Datenbereiche Quellcode Symboltabelle Tabelle für Konstanten
Wachsen ständig!
Strukturbaum Stack
IAIK
174
Eindimensional
IAIK
175
Lösung? Abbruch wenn Bereich zu klein Nicht elegant
Reallocation Mühsam
Besser: mehrere Adressräume Segmente
IAIK
176
Segment Lineare Folge von Adressen (0..max) Verschieden groß Größe kann sich unabhängig von anderen Segmenten ändern Adresse hat zwei Teile: Segmentnummer, Adresse im Segment
IAIK
177
Beispiel
IAIK
178
Hinweise Segment ist logische Einheit Programmierer berücksichtigt es Schutzmaßnahmen auf Segmentbasis Jede Prozedur in eigenes Segment: Linken wird stark vereinfacht Startadresse jeder Prozedur:
(Segmentnummer,0)
IAIK
179
Shared Libraries Gemeinsame Bibliotheken Viele Routinen die von fast allen Programmen benötigt werden Gemeinsame Nutzung spart Platz Library in ein Segment laden, kann von allen gemeinsam genutzt werden IAIK
180
Vergleich Paging/Segmentierung
IAIK
181
Implementierung Wichtiger Unterschied: Seiten haben fixe Größe Segmente nicht!
IAIK
182
Segmentierung mit Paging Kombination nutzt Vorteile beider Systeme MULTICS war das erste System Jedes Programm bis zu 218 Segmente a 65536 Worte (36 Bit) Jedes Segment war virtueller Speicher IAIK
183
VM-MULTICS Segmenttabelle, bis zu 250.000 Einträge Æ selbst Segment und kann ausgelagert werden Segmenddeskriptor zeigt an ob Segment ausgelagert oder nicht Teil des Segments im Speicher: gilt als Segment im Speicher und seine pagetable auch Deskriptor hat Zeiger auf pagetable IAIK
184
VM-MULTICS
IAIK
185
Adressen in MULTICS
IAIK
186
Speicherzugriff MULTICS Laden des Segmentdeskriptors Ist pagetable im Speicher. Nein: Segmentfehler
Pagetable untersuchen Eventuell pagefault
Offset dazu Speicherzugriff IAIK
187
Speicherzugriff MULTICS
IAIK
188
Geschwindigkeit MULTICS-HW hatte 16 Einträge großen TLB
IAIK
189
MULTICS … vor etwa 30 Jahren entstanden Viele wegweisende Ansätze Letzter Systemshutdown 31.10.2000 ! www.multicians.org
IAIK
190
Intel Pentium Virtueller Speicher ähnlich MULTICS Segmentierung und Paging 16K Segmente, bis zu einer Milliarde 32bit-Worte Größe wichtiger: öfter große Segmente und selten sehr viele IAIK
191
LDT - GDT Local Descriptor Table Für jedes Programm Lokale Segmente (u.a. Code, Daten,
Stack)
Global Descriptor Table Systemsegmente Darunter das Betriebssystem
IAIK
192
Segmentregister Sechs Segmentregister CS: Selektor für Code Segment DS: Selektor für Datensegment
Selektor
IAIK
193
Segmentregister Selektor 0 verboten – bedeutet: nicht verfügbar Selektor in Segmentregister: Deskriptor aus LDT oder GDT in internen Register gespeichert
IAIK
194
Deskriptor
IAIK
195
Adressumsetzung (Selektor, Offset) Mikroprogramm findet passenden Deskriptor in internen Registern Selektor 0 oder ausgelagert: Interrupt Offset überschreitet Segmentgröße: Interrupt IAIK
196
Adressumsetzung Limit: 20 Bit G bestimmt Granularität 0: Limit in Byte 1: Limit in Seiten
Addiert Basisfeld zum Offset Ergebnis 32 Bit lineare Adresse Paging abgeschaltet: lineare Adresse = physische Adresse IAIK
197
Segmentierung
IAIK
198
Paging Paging enabled: lineare Adresse ist virtuelle Adresse Über pagetables in physische Adresse abbilden Fixe Seitengröße 4KB Æ eine Million Seiten Æ zweistufige Seitentabellen IAIK
199
Paging
IAIK
200
Paging Seitenverzeichnis oder Page Directory 1024 32bit-Einträge Adresse in globalen Register Jeder Eintrag zeigt auf eine Seitentabelle mit 1024 Einträgen
IAIK
201
Paging TLB vorhanden Ein Selektor in alle Segmentregister: Ergebnis ist normales Paging Ist bei allen gängigen Betriebssystemen der Fall Nur OS/2 hat Features des Pentium voll ausgenutzt IAIK
202
Speicherschutz Vier Schutzebenen Zugriff auf Daten höherer Ebene legal Zugriff auf Daten niedrigerer Ebene Æ Schutzverletzung Aufruf einer Prozedur nur über Call Gates IAIK
203
Speicherschutz Konzept der Schutzringe an MULTICS angelehnt Zugriffe auf höhere Ebene ok Aufrufe auf niedrigere Ebenen über Call-Gates IAIK
204