5 Speicherverwaltung 5.1 Belegungsverfahren Aufgabenstellung ...
5 Speicherverwaltung 5.1 Belegungsverfahren Aufgabenstellung ...
5 Speicherverwaltung 5.1 Belegungsverfahren Aufgabenstellung ...
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
5 <strong>Speicherverwaltung</strong><br />
<strong>5.1</strong> <strong>Belegungsverfahren</strong><br />
AktivitŠt<br />
Prozess<br />
Prozess<br />
Prozess<br />
Prozess<br />
temp.Zuordnung<br />
Prozessor<br />
Aktive Komponente<br />
<strong>Aufgabenstellung</strong><br />
Zugriff<br />
Datum<br />
Datum<br />
Datum<br />
temp.Zuordnung<br />
Zugriff<br />
Speicher<br />
aktiv<br />
passiv<br />
Speicher<br />
¥ Auswahl der StŸcke<br />
¥ Effizienz der Algorithmen<br />
belegt<br />
frei<br />
¥ Speicherausnutzung<br />
Inhalt<br />
logisch<br />
physikalisc<br />
BehŠlter<br />
¥ Spezielle Randbedingungen<br />
Einsatzbereich: (realer) Hauptspeicher und (teilweise) Plattenspeicher<br />
5-1<br />
5-2<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Struktur einer <strong>Speicherverwaltung</strong><br />
Gestaltungsparameter einer <strong>Speicherverwaltung</strong><br />
Belegen<br />
(allocate)<br />
Freigeben<br />
(release)<br />
Konkrete <strong>Speicherverwaltung</strong>sverfahren unterscheiden sich bezŸglich der folgenden<br />
Aspekte:<br />
<strong>Speicherverwaltung</strong><br />
feste Schnittstelle<br />
¥ Reihenfolge der Operationen<br />
¥ Grš§e der StŸcke<br />
¥ Belegungsdarstellung<br />
Frei<br />
(free)<br />
Belegtsetzen<br />
(set_occupied)<br />
Freisetzen<br />
(set_free)<br />
unabhängige Algorithmen<br />
¥ Verschnitt<br />
¥ Auswahlstrategie (bei den freien StŸcken)<br />
Verwaltungsdaten<br />
¥ Wiedereingliederung<br />
5-3<br />
5-4
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Reihenfolge der Operationen<br />
Belegungen und Freigaben<br />
¥ in gleicher Reihenfolge<br />
(Schlangenverfahren, FIFO = First In First Out))<br />
¥ in umgekehrter Reihenfolge<br />
(Stapelverfahren, LIFO = Last In First Out)<br />
¥ in beliebiger Reihenfolge<br />
Grš§e der StŸcke<br />
¥ Konstante Einheiten<br />
NUM = 1 (Grundeinheit)<br />
¥ Vielfache gleicher Grundeinheiten<br />
NUM = k(Grundeinheit)<br />
¥ Bestimmte Portionsgrš§en<br />
NUM = k 1 , k 2 , k 3 ,...<br />
¥ Beliebige Grš§en<br />
NUM = x<br />
(allgemeiner Fall)<br />
5-5<br />
5-6<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Belegungsdarstellung<br />
Wie ? ¥ als Vektor Wo? ¥ abgesetzt<br />
¥ als Tabelle ¥ integriert<br />
Vektordarstellung<br />
¥ abgesetzt<br />
Tabellendarstellung (meist Freispeichertabelle)<br />
¥ abgesetzte Belegungsdarstellung<br />
Belegungsinformation wird in Tabellen gehalten.<br />
Sortierung je nach Bedarf nach Adresse und/oder LŠnge<br />
01 2 3 4 8 10 14 17 20<br />
¥ integriert<br />
11110100011110010000<br />
1 1 1 1 0 1 0 0 0 1 1 1 1 0 0 1 0 0 0 0<br />
Beispiel<br />
Hauptspeicher 128 Mbyte (2 27 Byte)<br />
Grundeinheit 512 Byte (2 9 Byte)<br />
Ergibt 262144 Komponenten (2 18 )<br />
Belegungsdarstellung gespeichert in 8192 Worten zu je 32 Bit<br />
Sortiert nach Adresse<br />
Adresse<br />
0<br />
4<br />
14<br />
20<br />
Länge<br />
3<br />
4<br />
3<br />
13<br />
Sortiert nach LŠnge<br />
Länge<br />
3<br />
3<br />
4<br />
13<br />
Adresse<br />
14<br />
0<br />
4<br />
20<br />
5-7<br />
5-8
Tabellendarstellung<br />
¥ integrierte Belegungsdarstellung<br />
© H.-U. Hei§, Uni Paderborn<br />
Die SpeicherstŸcke identifizieren sich selbst, geben ihre LŠnge an und enthalten einen<br />
Zeiger auf das nŠchste Listenelement<br />
FreistŸcke sortiert nach Adresse<br />
0 3 4 8 10 14 17 20<br />
3 4 3 13<br />
Verschnitt (fragmentation)<br />
© H.-U. Hei§, Uni Paderborn<br />
¥ Meistens wird Speicher in Vielfachen von festen Elementargrš§en vergeben.<br />
Anforderungen werden daher auf das nŠchste Vielfache gerundet.<br />
Dadurch entsteht Speicherplatz, der als belegt gekennzeichnet ist, aber nicht benutzt<br />
wird.<br />
Man nennt solchen Speicherplatz internen Verschnitt f int (internal fragmentation)<br />
¥ Durch die Dynamik des Belegens und Freigebens kann es vorkommen, dass eine<br />
Anforderung zwar von der Gesamtmenge des freien Speichers erfŸllbar wŠre, durch die<br />
ZerstŸckelung jedoch kein hinreichend gro§es StŸck gefunden werden kann.<br />
Dadurch entsteht Speicherplatz, der frei, aber (momentan) nicht belegbar ist.<br />
Er wird als externer Verschnitt f ext (external fragmentation) bezeichnet<br />
FreistŸcke sortiert nach LŠnge<br />
0 3 4 8 10 14 17 20<br />
3 4 3 13<br />
frei, aber nicht belegbar (externer Verschnitt)<br />
belegt, aber nicht benutzt (interner Verschnitt)<br />
belegt und benutzt<br />
belegt<br />
5-9<br />
5-10<br />
Auswahlstrategie<br />
¥ Erstes passendes StŸck (First-Fit)<br />
© H.-U. Hei§, Uni Paderborn<br />
Auswahlstrategie<br />
¥ NŠchstes passendes StŸck (Next-Fit, Rotating First-Fit)<br />
© H.-U. Hei§, Uni Paderborn<br />
0 3 4 8 10 14 17 20<br />
3 4 3 13<br />
25<br />
1<br />
27<br />
6<br />
0 3 4 8 10 14 17 20<br />
3 4 3 13<br />
25<br />
1<br />
27<br />
6<br />
Die (nach Adressen sortierte) Liste wird von vorne durchlaufen.<br />
Das erste hinreichend gro§e freie StŸck wird genommen.<br />
Eigenschaften:<br />
¥ Geringer Suchaufwand<br />
¥ ZerstŸckelung des Speichers (externer Verschnitt)<br />
¥ Konzentration der belegten StŸcke am Anfang<br />
und dadurch Erhšhung des Suchaufwands<br />
Stelle der letzten Belegung<br />
Liste wird zyklisch durchlaufen.<br />
Suche beginnt an der Stelle, wo die letzte Belegung stattgefunden hat.<br />
Eigenschaften<br />
¥ Wie First-Fit, vermeidet aber den Nachteil der Konzentration<br />
der Belegungen am Anfang.<br />
Dadurch etwas kŸrzere Suchzeiten.<br />
5-11<br />
5-12
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Auswahlstrategie<br />
Auswahlstrategie<br />
¥ NŠchstliegendes passendes StŸck (Nearest-Fit)<br />
¥ Am besten passendes StŸck (Best-Fit)<br />
0 3 4 8 10 14 17 20<br />
3 4 3 13<br />
25<br />
1<br />
27<br />
6<br />
0 3 4 8 10 14 17 20<br />
3 4 3 13<br />
25<br />
1<br />
27<br />
6<br />
Stelle der gewünschten Belegung<br />
Das kleinste hinreichend gro§e StŸck wird genommen<br />
¥ Eigenschaften<br />
¥ Bei Sortierung nach Adresse muss die gesamte FreistŸckliste durchsucht werden.<br />
Es empfiehlt sich daher Sortierung nach Grš§e.<br />
¥ Im Prinzip bessere Speicherausnutzung, da kleinere Anforderungen auch durch<br />
kleinere freie Bereiche erfŸllt werden und nicht gro§e StŸcke ãangeknabbertÒ<br />
werden.<br />
¥ Neigt allerdings dazu, sehr kleine freie StŸcke zu erzeugen, mit denen man gar<br />
nichts mehr anfangen kann.<br />
5-13<br />
Eine ãWunschadresseÒ fŸr das angeforderte StŸck wird Ÿbergeben.<br />
Der Algorithmus beginnt dann eine First-Fit-Suche von der angegebenen Adresse an.<br />
Beim Plattenspeicher hatten wir gesehen, dass es vorteilhaft ist, Armbewegungen zu<br />
minimieren.<br />
Kennt man die Zugriffsreihenfolge oder ZugriffshŠufigkeit, so kann man durch die Belegung<br />
die Armbewegung beeinflussen.<br />
¥ Dateikataloge kšnnen auf die mittleren Zylinder gelegt werden.<br />
¥ Bei der Erweiterung sequentieller Dateien sollten die neuen Blšcke in der NŠhe der<br />
bisher belegten liegen.<br />
5-14<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Wiedereingliederung<br />
¥ sofort bei Freigabe:<br />
Freigabe<br />
Beispiele fŸr konkrete Verfahren<br />
ãSchlangenverfahrenÒ (Ringpuffer)<br />
belegt frei frei belegt<br />
¥ verzšgert zusammengefasst<br />
belegt frei belegt<br />
Belegungsanfang<br />
Freigeben<br />
Belegungsende<br />
Belegen<br />
belegt<br />
belegt<br />
belegt<br />
belegt<br />
¥ Belegen und Freigeben in gleicher Reihenfolge<br />
¥ Gleich lange StŸcke<br />
¥ Kein Suchen<br />
¥ Kein externer Verschnitt<br />
¥ Automatische sofortige Wiedereingliederung<br />
5-15<br />
5-16
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Stapelverfahren (Keller, Stack)<br />
Vektorverfahren<br />
1111010001111001000011100000011110110000<br />
Suchen<br />
Belegen<br />
:= 1<br />
Freigeben<br />
:= 0<br />
Stapelanfang<br />
Stapelende<br />
Belegen<br />
¥ Belegen und Freigeben in beliebiger Reihenfolge<br />
Freigeben<br />
¥ StŸckgrš§e = k x Grundeinheit<br />
¥ Belegen und Freigeben in umgekehrter Reihenfolge (LIFO)<br />
¥ Beliebig lange StŸcke<br />
¥ Kein Suchen<br />
¥ Wenig externer Verschnitt<br />
¥ Automatische sofortige Wiedereingliederung<br />
¥ Suche nach erstem (passenden) StŸck<br />
¥ Interner und externer Verschnitt<br />
¥ Automatische sofortige Wiedereingliederung<br />
5-17<br />
5-18<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Ein Tabellenverfahren<br />
(Randkennzeichnungsverfahren, boundary tag system)<br />
Kennzeichnung der StŸcke<br />
Verkettung nach Grš§e<br />
¥ freies StŸck<br />
Randkennzeichnungsverfahren<br />
Nach Freigabe<br />
freigeworden<br />
fL 1<br />
fL 1 fL 2 f L 2 fL 3 f L 3<br />
belegt frei belegt<br />
¥ belegtes StŸck<br />
Zeiger vorwärts<br />
Zeiger rückwärts<br />
Länge<br />
„frei“<br />
Länge<br />
„frei“<br />
Nach Wiedereingliederung<br />
f L<br />
f L<br />
belegt<br />
Länge<br />
Länge<br />
„belegt“<br />
„belegt“<br />
5-19<br />
5-20
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Randkennzeichnungsverfahren<br />
Eigenschaften<br />
¥ Operationen in beliebiger Reihenfolge<br />
¥ Vergabe in beliebig langen StŸcken<br />
¥ Belegungsdarstellung und StŸckverwaltung integriert.<br />
Doppelt verkettete Liste sortiert nach Grš§e<br />
¥ Suchstrategie Best-Fit,<br />
¥ Externer Verschnitt<br />
Weitere Optimierungsmšglichkeiten<br />
Verwaltungsaufwand durch kleine ReststŸcke<br />
¥ Kleine ReststŸcke der Anforderung zuschlagen<br />
(Umwandlung von externem in internen Verschnitt)<br />
belegt<br />
angefordert<br />
frei<br />
belegt<br />
¥ Kleine ReststŸcke nicht in FreistŸckliste aufnehmen,<br />
aber bei Freigaben mit freigewordenem Nachbarn vereinigen.<br />
zu klein<br />
¥ Explizit durchgefŸhrte sofortige Wiedereingliederung<br />
Ausnutzen der LŠngenfelder zum PrŸfen der Nachbarn<br />
Sortiertes EinfŸgen in verkette Liste<br />
5-21<br />
5-22<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Weitere Optimierungsmšglichkeiten<br />
Suchaufwand bei beliebiger Reihenfolge von Belegen und Freigeben O(n)<br />
Suchaufwand reduzieren<br />
Beispiel: Zugriff Ÿber BinŠrbaum<br />
Suchaufwand reduzieren<br />
Beispiel: Vorkonfektionierte StŸcke<br />
4<br />
Statistisch hŠufig auftretende Anforderungsgrš§en bereithalten (ãKonfektionswareÒ)<br />
1 2 3 4<br />
1<br />
2<br />
5<br />
4 2 5 1 1 5 1 1 4<br />
5<br />
5-23<br />
5-24
Speicherauslastung<br />
Speicherauslastung: η = 1 - f ext<br />
Simulation mit 32K-Einheiten, kein interner Verschnitt<br />
Anforderungen gleichverteilt mit Mittelwert A und Standardabweichung σ A<br />
Belegungszeiten gleichverteilt aus Intervall (5,15)<br />
η<br />
η<br />
95%<br />
90%<br />
85%<br />
80%<br />
Best-Fit<br />
First-Fit<br />
σ A =256<br />
90%<br />
89%<br />
88%<br />
87%<br />
86%<br />
Best-Fit<br />
First-Fit<br />
© H.-U. Hei§, Uni Paderborn<br />
A=1024<br />
Halbierungsverfahren (Buddy-System)<br />
Speicher besteht aus 2 kmax Einheiten<br />
Kleinere StŸcke entstehen durch (fortgesetzte) Halbierung grš§erer StŸcke<br />
© H.-U. Hei§, Uni Paderborn<br />
Gemeinsam entstandene kleinere StŸcke werden bei Freigabe wieder zu grš§eren StŸcken<br />
vereinigt<br />
Charakteristik<br />
¥ Belegen und Freigeben in beliebiger Reihenfolge<br />
¥ Vergabe in StŸckgrš§en 2 0 , 2 1 , 2 2 , .. , 2 k<br />
¥ Darstellung abgesetzt<br />
¥ Wenig Suchen<br />
512 1024 2048 4096 A<br />
64 128 256 512<br />
σ A<br />
Ergebnis: Der externe Verschnitt steigt mit der Grš§e und der Streuung der Anforderungen.<br />
¥ Interner und externer Verschnitt<br />
¥ Explizit durchgefŸhrte Wiedereingliederung<br />
5-25<br />
5-26<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Beispiel Buddy-System<br />
2M 4M<br />
8M<br />
16M<br />
32M<br />
Datenstrukturen beim Buddysystem<br />
(abgesetzte FreistŸckverwaltung)<br />
Anforderung:<br />
3M<br />
2 0<br />
Anforderung:<br />
800K<br />
2 1<br />
Anforderung:<br />
Freigabe:<br />
12M<br />
12M<br />
2 2<br />
2 3<br />
Anforderung: 3,5M<br />
Freigabe: 3M<br />
Freigabe: 800K<br />
Freigabe: 3,5M<br />
2<br />
2 n<br />
Ein Array von Listenkšpfen, die auf StŸcke gleicher Grš§e zeigen<br />
5-27<br />
5-28
Ablauf Anforderung<br />
¥ Aufrunden auf nŠchste Zweierpotenz<br />
¥ Zugriff auf erstes freies StŸck der Liste<br />
¥ Falls Liste leer (rekursiv):<br />
- Zugriff auf Liste der nŠchsten Grš§e<br />
- StŸck entfernen<br />
- StŸck halbieren<br />
- Hintere HŠlfte in entsprechende Liste einhŠngen<br />
Ablauf Freigabe<br />
5-29<br />
© H.-U. Hei§, Uni Paderborn<br />
¥ Buddy bestimmen<br />
¥ Falls Buddy belegt, freigewordenes StŸck in die Liste einhŠngen<br />
¥ Falls Buddy frei:<br />
Vereinigung mit Buddy<br />
Vorgang iterieren, bis Buddy belegt oder bei der maximalen Grš§e angekommen<br />
Buddy-Verfahren: Interner Verschnitt<br />
Anforderungsgrš§e a: 1 2 3 4 5 6 7 8 9 10 ...<br />
Grš§e des belegten StŸcks b(a): 1 2 4 4 8 8 8 8 16 16 ...<br />
p a<br />
b(a)<br />
Def.:<br />
die Wahrscheinlichkeit, dass eine Anforderung die Grš§e a besitzt,<br />
die Grš§e des resultierenden belegten StŸcks,<br />
5-30<br />
© H.-U. Hei§, Uni Paderborn<br />
Der interne Verschnitt f int ist das VerhŠltnis der Erwartungswerte der Anzahl<br />
ungenutzter Einheiten zur Anzahl belegter Einheiten:<br />
a max<br />
f int =<br />
a max<br />
∑<br />
a=1<br />
a max<br />
p a ( ba ( )−a)<br />
∑<br />
a=1<br />
p a ba ( )<br />
a max<br />
Mit S b := ∑ p a ba ( ) und S a := ∑ p a a als Erwartungswerte der Belegungsgrš§e b bzw. der<br />
a=1<br />
a=1<br />
Anforderungsgrš§e a ergibt sich der interne Verschnitt als f int = 1− S a /S b<br />
Buddy-Verfahren: Interner Verschnitt<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Buddy-Verfahren: Interner Verschnitt<br />
Durch die Aufrundung auf die nŠchste Zweierpotenz sieht die korrespondierende<br />
Rechnung fŸr die zugeteilten StŸcke folgenderma§en aus:<br />
S b = 1 ⎛<br />
2 n 1+ 2 + 4 + 4 + 8 + 8 + 8 + ⎞<br />
⎜<br />
8+K+2n 14+K+2 243<br />
n<br />
⎟<br />
⎝<br />
2 n−1 mal ⎠<br />
= 1 (<br />
2 n 1+1⋅2+2⋅4+4⋅8+K+2n−1 2 n<br />
)<br />
= 1 n−1<br />
⎛ ⎞<br />
n⎜1+2∑22i⎟ = 1 ⎛ −1⎞<br />
= 2 n−1 + 1 2 ⎝ i=0 ⎠ 2 n ⎜ 1+222n 2 2 ⎟<br />
⎝ −1⎠<br />
2 ≈ 2n−1<br />
Um den internen Verschnittzu berechnen, benštigen wir Annahmen Ÿber die Verteilung der<br />
Anforderungen.<br />
Der Einfachheit halber nehmen wir an,<br />
die Grš§en der Anforderungen seien gleichverteilt Ÿber das Intervall [1, 2 n ],<br />
d.h. jede Grš§e aus diesem Intervall habe die gleiche Wahrscheinlichkeit p a = 2 −n .<br />
Wir erhalten dann approximativ eine mittlere Anforderungsgrš§e<br />
S a = 1 2 n<br />
∑<br />
2 n i = 1 2 n 2 n +1<br />
2 n 2<br />
i=1<br />
( )<br />
= 1 2 2n+1 +1<br />
2 n ≈ 2n+1<br />
3 3<br />
Daraus ergibt sich ein VerhŠltnis S a S b = 2 n−1 1 3 2n+1 ( ) = 34,<br />
d.h. die zugeteilten StŸcke sind im Mittel um ein Drittel grš§er als angefordert,<br />
die belegten StŸcke sind im Mittel nur zu 3/4 genutzt,<br />
und der interne Verschnitt betrŠgt f int = 25%.<br />
5-31<br />
5-32
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Buddy-Verfahren<br />
¥ Schnelle Operationen (O(1))<br />
¥ Stellt sich auf das Anforderungsprofil ein<br />
¥ Nach Einschwingen nur wenig Teilungs- und VereinigungsvorgŠnge<br />
¥ Relativ hoher interner Verschnitt<br />
5.2 Speicherbereinigung (Garbage Collection)<br />
Problem:<br />
Dynamische <strong>Speicherverwaltung</strong>soperationen (C: malloc, free) erfordern disziplinierte<br />
Benutzung durch den Programmierer<br />
Nicht mehr benštigter Speicher sollte zurŸckgegeben werden<br />
Beim Aufbau verzeigerter Datenstrukturen (Listen, BŠume) kann es vorkommen, dass<br />
25% int. Verschnitt<br />
• Teile der Datenstruktur nicht mehr erreichbar sind (Lšschen oder Umsetzen einer<br />
Referenz)<br />
• Objekte gelšscht werden, auf die noch Referenzen existieren<br />
Anforderung gleichverteilt:<br />
Minimum<br />
Mittelwert<br />
Maximum<br />
5-33<br />
5-34<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Beispiel (Java)<br />
class Node<br />
{ Node (String s, Node n)<br />
{ data = s; next = n;}<br />
String data; Node next;<br />
}<br />
Node list = new Node ("A", null)<br />
UngŸltig gewordene Referenzen (dangling references)<br />
Wird ein Objekt freigegeben, auf das noch eine Referenz existiert, und anschlie§end der<br />
Speicherplatz dieses Objekts neu vergeben, so kšnnen unvorhersehbare Fehler auftreten<br />
list<br />
Nach weiteren EinfŸgeoperationen kšnnte die folgende Liste entstehen:<br />
list<br />
"A"<br />
"B"<br />
"C"<br />
"A"<br />
"B"<br />
"C"<br />
Mit list.next = null sind die beiden hinteren Objekte nicht mehr erreichbar:<br />
list<br />
"A"<br />
"B"<br />
"C"<br />
5-35<br />
5-36
Modell<br />
© H.-U. Hei§, Uni Paderborn<br />
Wir nehmen an, der Speicherbereich eines Programms besteht aus drei Teilbereichen<br />
• Statischer Speicher:<br />
fest zugeordnet, nicht dynamisch belegbar (globale Variable)<br />
• Stack:<br />
Dynamischer Speicher zur Verwaltung lokaler Daten in Prozeduren.<br />
WŠchst beim Prozeduraufruf und schrumpft bei der RŸckkehr (LIFO-Prinzip)<br />
• Heap:<br />
Dynamischer Speicher zur Aufnahme dynamisch angelegter Objekte<br />
Speicherobjekte im Heap kšnnen nur erreicht werden Ÿber Referenzen oder Ketten von<br />
Referenzen, die ihren Ursprung im statischen Speicher oder im Stack haben.<br />
Wurzeln und Lebendigkeit<br />
© H.-U. Hei§, Uni Paderborn<br />
Objekte des statischen Speichers oder Stacks, die solche Referenzen enthalten, hei§en<br />
Wurzeln (roots).<br />
Ein Speicherobjekt des Heaps hei§t lebendig (live),<br />
1. wenn es eine Wurzel gibt, die eine Referenz auf es besitzt oder<br />
2. wenn es ein lebendiges Objekt gibt, das eine Referenz auf es besitzt<br />
Referenzierung bildet eine Relation auf der Menge der Speicherobjekte, die<br />
"zeigt-auf"-Relation oder "→"-Relation: O → P, gdw O eine Referenz auf P enthŠlt.<br />
Die Menge der lebendigen Objekte ist dann die transitive referenzielle HŸlle der<br />
Wurzelobjekte, d.h. die kleinste Menge live mit der folgenden Eigenschaft<br />
{ }<br />
live = O ∈Objects ( ∃r ∈roots : r →O)∨∃ ( P ∈live : P →O)<br />
Objekte des Heaps, die nicht lebendig sind, hei§en Abfall (garbage)<br />
Es ist Aufgabe der Speicherbereinigung (Garbage Collection), solche Abfallobjekte zu<br />
finden, ggf. ihren Inhalt zu lšschen und ihren Platz zur Wiederverwendung zur VerfŸgung<br />
zu stellen.<br />
5-37<br />
5-38<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
5.2.1 ReferenzzŠhler (reference counter)<br />
Der Heap sei ein StŸck zusammenhŠngender Speicher (Folge von Speicherzellen)<br />
Die <strong>Speicherverwaltung</strong> fŸr den Heap unterhŠlt eine Freispeicherliste (free_list), in der freie<br />
Speicherobjekte als verkettete Liste verwaltet werden.<br />
Jedes Speicherobjekt, ob frei oder belegt, enthŠlt ein Feld RC (reference counter)<br />
Freie Speicherobjekte haben einen RC-Wert von 0<br />
Bei der Anforderung eines Speicherobjekts (z.B. durch "new") wird der RC des Objekts auf<br />
1 gesetzt.<br />
Bei jeder Erzeugung einer weiteren Referenz auf das Speicherobjekt wird sein<br />
ReferenzzŠhler inkrementiert, bei jeder Lšschung einer Referenz dekrementiert.<br />
Wird der ReferenzzŠhler eines Objekts zu 0, so existiert keine Referenz mehr darauf und<br />
es kann in die Freispeicherliste zurŸck<br />
Operationen fŸr ReferenzzŠhler-Verfahren<br />
Beispielformulierung in Java-Šhnlicher Notation<br />
class GC {<br />
class MemObj {<br />
MemObj next;<br />
int rc = 0;<br />
...<br />
}<br />
MemObj free_list;<br />
MemObj allocate() { // Entnahme eines freien Speicherobjekts<br />
MemObj newMemObj = free_list;<br />
free_list = free_list.next;<br />
return newMemObj;<br />
}<br />
MemObj new() { // Belegung eines neuen Speicherobjekts<br />
if (free_list == null)<br />
throw new Error("memory exhausted");<br />
newMemObj = allocate();<br />
newMemObj.rc = 1;<br />
return newMemObj;<br />
}<br />
5-39<br />
5-40
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Fortsetzung<br />
}<br />
private void free(o) { // Rueckgabe in die Freiliste<br />
o.next = free_list;<br />
free_list = o;<br />
}<br />
void delete(MemObj o) { // Loescht eine Referenz<br />
o.rc = o.rc-1;<br />
if (o.rc == 0) {<br />
// Achtung: das folgende ist kein Java :-)<br />
for _all p in children(o)_<br />
delete(p);<br />
free(o);<br />
}<br />
}<br />
void update(MemObj o, MemObj p) { // Modifikation von Referenzen<br />
delete(o); // Ersetzt das 1. Argument durch das 2.<br />
p.rc = p.rc+1;<br />
o = p;<br />
}<br />
vor update(R.right, null)<br />
T<br />
2<br />
Rekursion:<br />
delete(R.right)<br />
T<br />
2<br />
R<br />
R<br />
n<br />
n<br />
S<br />
S<br />
1<br />
0<br />
U<br />
U<br />
1<br />
1<br />
V<br />
1<br />
freelist<br />
freelist<br />
0<br />
0<br />
V<br />
1<br />
5-41<br />
5-42<br />
Weiter in Rekursion:<br />
delete(S.left)<br />
R n<br />
0<br />
© H.-U. Hei§, Uni Paderborn<br />
Zyklische Datenstrukturen<br />
© H.-U. Hei§, Uni Paderborn<br />
T<br />
1<br />
S<br />
0<br />
U<br />
1<br />
V<br />
1<br />
freelist<br />
Ausgangspunkt<br />
R<br />
n<br />
S<br />
2<br />
Nach Lšschen eines Zeigers<br />
R<br />
n<br />
S<br />
1<br />
nach Abschluss aller Rekursionen<br />
in update(R.right, null)<br />
T<br />
2<br />
T<br />
2<br />
R<br />
n<br />
0<br />
U<br />
1<br />
U<br />
1<br />
T<br />
1<br />
S<br />
0<br />
freelist<br />
Das ReferenzzŠhlerverfahren ist nicht in der Lage, bei Zyklen in der Datenstruktur die<br />
Unerreichbarkeit zu erkennen, da die ReferenzzŠhler nicht zu Null werden.<br />
U<br />
0<br />
V<br />
0<br />
Dies ist ein schwerwiegender Nachteil, weswegen das Verfahren in seiner reinen Form nur<br />
eingesetzt werden kann, wenn feststeht, dass keine zyklischen Strukturen auftreten.<br />
5-43<br />
5-44
5.2.2 Mark-Sweep<br />
© H.-U. Hei§, Uni Paderborn<br />
Im Gegensatz zum ReferenzzŠhler-Verfahren, wird das Mark-Sweep-Verfahren nur dann<br />
aktiv, wenn kein freier Speicher mehr zur VerfŸgung steht.<br />
MemObj new () {<br />
if (free_list == null)<br />
throw new Error("memory exhausted");<br />
newMemObj = allocate();<br />
newMemObj.rc = 1;<br />
return newMemObj;<br />
}<br />
Nach Aufruf durchlŠuft es den Speicher, erkennt die nicht erreichbaren Objekte und gibt<br />
deren Platz frei.<br />
Anschlie§end kann der normale Betrieb weiterlaufen, bis wiederum aller Speicher<br />
aufgebraucht ist.<br />
Zwei Phasen<br />
void mark_sweep() {<br />
for (R in Roots) mark(R); // Phase 1<br />
sweep(); // Phase 2<br />
if (free_list == Null)<br />
}<br />
Das Verfahren besteht aus zwei Phasen:<br />
Phase 1 (Mark):<br />
© H.-U. Hei§, Uni Paderborn<br />
Beginnend bei den Wurzeln der Datenstruktur wird der komplette Graph abgelaufen<br />
und jedes Objekt markiert (z.B. Tiefensuche). Die markierten Objekte sind die<br />
lebendigen.<br />
Phase 2 (Sweep):<br />
In der Sweepphase wird der Speicher linear durchlaufen und alle Objekte, die nicht<br />
markiert sind, in die Freispeicherliste zurŸckgegeben.<br />
Der Nachteil von Mark-Sweep besteht darin, dass der Programmlauf wŠhrend der GC-<br />
Phasen zum Halten kommt, das Programm also fŸr einige Zeit nicht reagiert.<br />
5-45<br />
5-46<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
5.2.3 Kopierverfahren<br />
Fromspace<br />
Fromspace<br />
Beim Kopierverfahren wird der Heap in zwei Teile geteilt, einen fŸr die aktuellen<br />
Datenobjekte und einen, in dem sich ŸberflŸssig gewordenene befinden.<br />
Bei Aufruf der Garbage Collection wechseln die beiden TeilrŠume ihre Funktion.<br />
___<br />
T<br />
R<br />
S<br />
T<br />
R<br />
S<br />
Der bislang aktive Teilraum (ãFromspace) wird wie bei Mark-Sweep entlang der<br />
Verzeigerung durchlaufen.<br />
Jedes erreichte Speicherobjekt wird in den anderern Teilraum (ãTospaceÒ) kopiert, wobei<br />
man sich von der alten Kopie mittels eines Zeigers die Lage der neuen Kopie merkt, um<br />
Mehrfachreferenzen korrekt behandeln zu kšnnen.<br />
U<br />
U<br />
Nachteil: Doppelter Speicherraum<br />
Vorteil: Kompaktere Speicherung (bessere LokalitŠt der Zugriffe)<br />
5-47<br />
Tospace<br />
5-48<br />
Tospace
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Fromspace<br />
Fromspace<br />
5.3 Speicherhierachie und LokalitŠt<br />
R<br />
R<br />
T<br />
S<br />
T<br />
S<br />
Verarbeitung<br />
U<br />
U<br />
schneller, teurer,<br />
kleiner<br />
Register<br />
Cache<br />
Hauptspeicher<br />
R<br />
T<br />
S<br />
U<br />
Magnetplatte<br />
langsamer,<br />
billiger, größer<br />
Archiv (CD-ROM, Band,...)<br />
Tospace<br />
5-49<br />
Tospace<br />
5-50<br />
Prinzipielle Arbeitsweise der Speicherhierarchie<br />
© H.-U. Hei§, Uni Paderborn<br />
Beim (ersten) Zugriff auf ein Datenelement werden entlang der Speicherhierarchie Kopien<br />
angelegt, d.h. das Datenlement ãwandertÒ nach ãobenÒ<br />
Schicht 1<br />
Schicht n-1<br />
Schicht n<br />
Kopie<br />
Kopie<br />
Original<br />
Zugriff<br />
Nach der Modifikation des Datenelements werden €nderungen (schrittweise, verzšgert)<br />
nach unten propagiert.<br />
Schicht 1<br />
Schicht n-1<br />
Schicht n<br />
Kopie<br />
Kopie<br />
Original<br />
Modifikation<br />
LokalitŠtsprinzip (Principle of locality)<br />
© H.-U. Hei§, Uni Paderborn<br />
Die Speicherhierarchie basiert auf dem LokalitŠtsprinzip:<br />
Ein Prozess greift in einem kleinen Zeitraum ∆t nur auf einen kleinen Teil ∆A ⊂ A seines<br />
Adressraums A zu.<br />
RŠumliche LokalitŠt:Wird auf eine Adresse a zugegriffen, so ist ein Zugriff auf eine<br />
Adresse in der NŠhe von a sehr wahrscheinlich.<br />
Spezialfall: sequentieller Zugriff.<br />
Zeitliche LokalitŠt:<br />
Wird auf eine Adresse a zugegriffen, so ist es sehr wahrscheinlich,<br />
dass in KŸrze wieder auf a zugegriffen wird.<br />
Warum ?<br />
¥ Meist werden die Anweisungen sequentiell ausgefŸhrt (rŠumliche, sequentielle Lokal.)<br />
¥ Programme verbringen die meiste Zeit in irgendwelchen Schleifen (zeitliche LokalitŠt)<br />
¥ Manche Teile eines Programms werden nur in AusnahmefŠllen angesprungen.<br />
¥ Viele Felder sind nur teilweise belegt.<br />
¥ 90/10-Regel: Ein Prozess verbringt 90% seiner Zeit in 10% seines Adressraums<br />
Konsequenz:<br />
¥ In jedem kleinen Zeitintervall wird nur ein kleiner Teil des Adressraums benštigt.<br />
Jeweils nicht benštigte Teile kšnnen auf billigeren, langsameren Medien abgelegt sein.<br />
5-51<br />
5-52
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Gestaltungsaspekte einer Speicherhierarchie<br />
Ziel:<br />
Die gerade benštigten Daten und Programme sollen mšglichst weit oben in der<br />
Speicherhierarchie verfŸgbar sein<br />
Problem: Die KapazitŠten werden nach oben hin sehr knapp<br />
Fragen:<br />
¥ Woher wei§ man, auf welche Daten als nŠchstes zugegriffen wird ?<br />
Kenntnis des Programmverhaltens<br />
¥ Wer ist fŸr den Datentransport zustŠndig ?<br />
Benutzer/Programmierer, †bersetzer, Betriebssystem, Hardware<br />
¥ In welchen Einheiten werden die Daten transportiert ?<br />
Bytes, Speicherworte, Blšcke, Dateien<br />
¥ LŠuft der vertikale Datentransport automatisch ab oder muss man sich explizit darum<br />
kŸmmern?<br />
¥ Wird der Zugriff auf die aktuelle Schicht beschleunigt (Caching) oder die KapazitŠt der<br />
aktuellen Schicht erweitert (Virtualisierung)<br />
_Caching vs. Virtualisierung<br />
Schicht k-1<br />
Schicht k<br />
Schicht k+1<br />
Caching<br />
Virtualisierung<br />
transparent<br />
sichtbar<br />
transparent<br />
• Der Programmierer oder Nutzer einer Speicherhierarchie sieht in der Regel nicht alle<br />
Schichten, sondern einige sind ihm verborgen, bzw. sind transparent fŸr ihn.<br />
• Er hat den Eindruck, es gebe nur die Schicht k, auf die sich seine Zugriffe beziehen.<br />
• Sieht der Benutzer Schicht k, greift aber de facto auf Schicht k-1 zu, so spricht man von<br />
Caching.<br />
• Sieht der Benutzer Schicht k, obwohl die addressierten Daten tatsŠchlich auf Schicht k+1<br />
liegen, so spricht man Virtualisierung<br />
• Durch Caching werden die Datenzugriffe schneller, durch Virtualisierung wird die<br />
KapazitŠt grš§er.<br />
5-53<br />
5-54<br />
ZustŠndigkeiten bei AusfŸhrung<br />
Zuständigkeit<br />
Hardware<br />
Hardware<br />
Betriebssystem<br />
Betriebssystem, Benutzer<br />
Prozessorregister<br />
Cache<br />
Hauptspeicher<br />
Magnetplatte<br />
Magnetband<br />
WŠhrend der Laufzeit eines Programms wird der Transport der Daten und Befehle<br />
zwischen Hauptspeicher, Cache und Prozessor von der Hardware direkt erledigt.<br />
Zugriffe auf die Platte sind Aufgabe des Betriebssystems.<br />
Transfereinheit<br />
Wort (z.B. 8 Byte)<br />
Cache-Line (z.B. 64 Byte)<br />
Plattenblock (z.B. 4KByte)<br />
Datei (variabel)<br />
© H.-U. Hei§, Uni Paderborn<br />
Aus- und Einlagern von Dateien auf/vom Archivspeicher wird entweder explizit vom<br />
Benutzer angesto§en oder automatisch vom Betriebssystem (Dateisystem) durchgefŸhrt.<br />
FlŸchtiger / Permanenter Speicher<br />
© H.-U. Hei§, Uni Paderborn<br />
Bedingt durch die auf den jeweiligen Ebenen eingesetzten Speichermedien sind die oberen<br />
Schichten flŸchtig, d.h. ihr Inhalt geht bei Stromabschaltung<br />
Daher werden die oberen Schichten fŸr die Speicherung temporŠrer Objekte<br />
(Programmvariable) verwendet, wŠhrend die unteren fŸr permanente Objekte (Dateien)<br />
verwendet werden<br />
flüchtiger Speicher<br />
temporäre Daten<br />
(Programmvariablen)<br />
nichtflüchtiger Speicher<br />
permanente Daten<br />
(Dateien)<br />
Prozessorregister<br />
Cache<br />
Hauptspeicher<br />
Magnetplatte<br />
Magnetband<br />
5-55<br />
5-56
FlŸchtiger / Permanenter Speicher<br />
© H.-U. Hei§, Uni Paderborn<br />
Caching und Virtualisierung haben dazu gefŸhrt, dass die historische Verwendung des<br />
Hauptspeichers ( nur fŸr Programmadressraum) und des Plattenspeichers (nur Dateien)<br />
aufgeweicht wurde.<br />
Caching im World Wide Web<br />
© H.-U. Hei§, Uni Paderborn<br />
Auch das Zugriffsverhalten im WWW zeigt LokalitŠt.<br />
Es lohnt sich daher, Webseiten in einem Cache zwischenzuspeichern, um dadurch den<br />
Zugriff zu beschleunigen und den Netzverkehr zu entlasten<br />
Webclient<br />
Webclient<br />
Webclient<br />
flüchtiger Speicher<br />
temporäre Daten<br />
(Programmvariablen)<br />
nichtflüchtiger Speicher<br />
permanente Daten<br />
(Dateien)<br />
Datei-Cache<br />
Caching<br />
Dateien<br />
Programm AR<br />
Virtualisierung<br />
Paging area<br />
Hauptspeicher<br />
Magnetplatte<br />
Webcache<br />
Internet<br />
Intranet<br />
Web-<br />
Server<br />
Web-<br />
Server<br />
Web-<br />
Server<br />
5-57<br />
5-58<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Verzweigende Speicherhierarchien<br />
Ebene der Verarbeitung<br />
und Modifikation<br />
5.4 Registerzuteilung<br />
Zur VerknŸpfung von Werten mŸssen diese erst in Register des Prozessors geladen<br />
werden<br />
Auch Zwischenergebnisse komplexer arithmetischer AusdrŸcke mŸssen in Registern<br />
zwischengespeichert werden:<br />
Speicherhierarchien kšnnen auch verzweigen.<br />
Verzweigungen nach ãuntenÒ sind dabei unkritisch.<br />
Verzweigungen nach ãobenÒ fŸhren dazu, dass auf derselben Ebene mehrere Kopien<br />
existieren, die auf oberster Ebene unabhŠngig voneinander modifiziert werden kšnnen.<br />
Dies fŸhrt zu einem Konsistenzproblem (Cache-KohŠrenz)<br />
5-59<br />
Hšhere Programmiersprache Maschinencode (Assembler)<br />
y := 3; load r1, 3<br />
store r1,y<br />
x := (a+b) * (c+d)<br />
load r2, a<br />
add r2, b<br />
load r3, c<br />
add r3,d<br />
mult r2, r3<br />
z := x+y<br />
add r1, r2<br />
store r1, z<br />
Da Zugriffe auf den Speicher ãteuerÒ sind, wird versucht, Werte, die noch benštigt werden,<br />
in Registern zu halten. (Z.B. ist y noch in R1 verfŸgbar)<br />
5-60
Grundblšcke<br />
© H.-U. Hei§, Uni Paderborn<br />
Man wŸnscht sich daher so viele Register, dass man einen schon mal geladenen Wert bis<br />
zur letzten Verwendung in einem Register halten kann.<br />
Falls nicht genŸgend Register zur VerfŸgung stehen, muss man Werte aus Registern in<br />
den Speicher auslagern und bei erneutem Gebrauch wieder einlagern (Spill-Code)<br />
Da der Compiler die Befehlsfolge selbst erzeugt, kennt er auch die nŠchsten benštigten<br />
Daten, sofern nicht bedingte, d.h. von Werten abhŠngige SprŸnge auftreten (if..then..else)<br />
Teile eines Programms, die frei sind von solchen Verzweigungen, also aus<br />
deterministischem Code bestehen hei§en Grundblšcke<br />
Innerhalb der Grundblšcke kann der Compiler versuchen,<br />
die Nutzung der Register zu optimieren.<br />
if a < b then<br />
begin<br />
t:= a;<br />
a:= b;<br />
b:= t;<br />
end<br />
else<br />
a:= a-b;<br />
Registerzuteilung innerhalb der Grundblšcke<br />
a =: 3<br />
b := 8<br />
c :=<br />
d := 5<br />
e :=<br />
f :=<br />
g :=<br />
f :=<br />
a+b<br />
d *a<br />
e+d<br />
c+a<br />
b+g<br />
a b c d e f g<br />
R1 R2 R3 R4 R5 R4 R1<br />
R1 (R2) R3 R4 R2 R4 R1<br />
(R1) (R2) R3 R2 R1 R1 R2<br />
max.<br />
Schnitt<br />
5 Register<br />
4 Register<br />
3 Register<br />
© H.-U. Hei§, Uni Paderborn<br />
5-61<br />
5-62<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Registerzuteilung innerhalb der Grundblšcke<br />
1 Lebensdauern der Werte bestimmen<br />
2 Maximalen Schnitt bestimmen (Registerbedarf des Blocks)<br />
3 Register der Reihe nach zuordnen<br />
bei Registermangel:<br />
Register freimachen (Wert auslagern, spilling)<br />
Kriterium fŸr Auslagerung:<br />
Werte, die schon im Speicher stehen (kein Auslagern, einfach Ÿberschreiben)<br />
Werte, die am lŠngsten nicht mehr benštigt werden<br />
5.5 Streuende Adressierung im Hauptspeicher<br />
Der Programmadressraum wird in kleinere StŸcke zerlegt, die unabhŠngig voneinander im<br />
Speicher abgelegt werden.<br />
¥ Bessere Ausnutzung von LŸcken (geringerer externer Verschnitt)<br />
¥ Hšherer Aufwand beim Adressieren<br />
Man spricht von dynamischer Adressumsetzung:<br />
Die Adressen im Programm (logische Adressen) werden durch eine spezielle<br />
Einrichtung des Prozessors (Speicherabbildungseinheit, Memory Management Unit<br />
(MMU)) in physikalische Adressen umgesetzt.<br />
Programmadreßraum<br />
Speicher<br />
MMU<br />
5-63<br />
5-64
StŸckelung in gleichlange Teile:<br />
¥ kein externer, aber interner Verschnitt<br />
¥ Die Teile des Adressraums hei§en Seiten (pages)<br />
© H.-U. Hei§, Uni Paderborn<br />
¥ Die korrespondierenden Einheiten des Speicher hei§en Seitenrahmen oder Kacheln<br />
(page frames)<br />
StŸckelung in gleich lange Teile (Seiten, pages)<br />
© H.-U. Hei§, Uni Paderborn<br />
Da es nun eine variable und gro§e Anzahl von Basisadressen geben kann, kšnnen wir sie<br />
nicht alle im Prozessor halten.<br />
Sie werden in einer Seitentabelle zusammengefasst und im Hauptspeicher abgelegt.<br />
Im Prozessor befindet sich nur noch die Basisadresse der Seitentabelle in einem Register<br />
Programmadreßraum<br />
Speicher<br />
Die Adressen bestehen aus zwei Teilen, der Seitennummer und einer Relativadresse<br />
innerhalb der Seite (offset, displacement)<br />
Tabellenbasisadresse<br />
Seitentabelle<br />
Speicher<br />
+<br />
Seite<br />
Byte<br />
K<br />
5-65<br />
5-66<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Seitengrš§e<br />
Wie gro§ sollte eine Seite sein ?<br />
Seitengrš§e<br />
¥ kleine Seiten ¥ gro§e Seiten<br />
+ geringer Verschnitt - hoher Verschnitt<br />
- lange Seitentabellen + kurze Seitentabellen<br />
Sei<br />
p LŠnge des Programmadressraums<br />
s SeitenlŠnge<br />
Wie gro§ sollte eine Seite sein ?<br />
Beispiel<br />
s opt<br />
v opt<br />
Dann gilt: ¥ interner Verschnitt: s/2<br />
¥ LŠnge der Seitentabelle<br />
Relativer Gesamtverlust<br />
1 p s<br />
v =<br />
⎛<br />
+<br />
⎞<br />
p ⎝ s 2⎠<br />
Daraus folgt<br />
sopt = 2 p<br />
vopt = 2/ p<br />
⎡ p<br />
⎢ ⎤ s ⎥<br />
p = 50 10 20%<br />
p = 5000 100 2%<br />
p = 500000 1000 0.2%<br />
WŠhlt man jeweils die optimale SeitenlŠnge, so nimmt der Speicherverlust mit<br />
zunehmender Programmgršsse ab<br />
5-67<br />
5-68
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
StŸckelung in variabel lange Teile (Segmente, segments)<br />
¥ kein interner Verschnitt<br />
¥ dafŸr externer Verschnitt<br />
Speicher<br />
Programmadreßraum<br />
belegt<br />
StŸckelung in variabel lange Teile (Segmente)<br />
Da Segmente an beliebigen Adressen beginnen kšnnen, muss die Segmenttabelle volle<br />
Adressen aufnehmen kšnnen.<br />
Die Relativadresse (Byte) innerhalb des Segments wird dann zur Segmentbasisadresse<br />
addiert<br />
frei<br />
Tabellenbasisadresse<br />
Segmenttabelle<br />
Speicher<br />
+<br />
frei<br />
Segment<br />
Byte<br />
+<br />
5-69<br />
5-70<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
GegenŸberstellung: Seiten- und Segmentumsetzung<br />
Zweistufige Adressumsetzung<br />
Jedes Segment besteht aus einer variablen Menge von Seiten<br />
Seitenumsetzung<br />
0000<br />
0001<br />
0010 1101<br />
Segmenttabelle<br />
Tabellenbasisadresse<br />
+<br />
Seitentabelle<br />
0010 1011<br />
K 11011011<br />
+<br />
Segmentumsetzung<br />
0000<br />
0001<br />
0010 11010101<br />
Speicher<br />
K<br />
0010 1011<br />
+ 11100000<br />
Segment<br />
Seite<br />
Byte<br />
5-71<br />
5-72
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Beschleunigung der Adressumsetzung<br />
Zweistufige Adressumsetzung mit Assoziativregister<br />
Problem:<br />
Segment- und Seitentabellen sind so gro§, dass sie im Hauptspeicher untergebracht<br />
werden mŸssen.<br />
Um eine effektive Hauptspeicheradresse zu bilden, muss zunŠchst die Seiten- und/oder<br />
Segmentadresse beschafft werden.<br />
Tabellenbasisadresse<br />
+<br />
Segmenttabelle<br />
+<br />
Seitentabelle<br />
FŸr jeden Zugriff (Befehl oder Daten) sind damit mindestens zwei Hauptspeicherzugriffe<br />
erforderlich.<br />
Dadurch reduziert sich die Verarbeitungsgeschwindigkeit etwa um den Faktor 2<br />
TLB (Assoziativspeicher)<br />
Segment Seite<br />
Kachel<br />
Speicher<br />
Um das zu verhindern, werden die aktuell benštigten Segment/Seitentabellen in einem<br />
schnellen Registersatz gespeichert. (TLB = Translation Lookaside Buffer)<br />
Der TLB ist ein Assoziativspeicher, d.h. eine Tabelle, bei der zu findende Eintrag simultan<br />
in allen Zeilen der Tabelle gesucht wird.<br />
Er wird als eine Art Cache fŸr Seiten-/Segmenttabellen verwendet.<br />
Die Suche kann also in einem Schritt durchgefŸhrt werden.<br />
Segment<br />
Seite<br />
Byte<br />
K<br />
5-73<br />
5-74<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Typische Eigenschaften eines TLB<br />
¥ Zeilenbreite : 4-8 Byte: Logische Seiten/Segment-Nr., Kachel-Nr. Verwaltungsbits<br />
¥ Zeit fŸr Adressumsetzung<br />
5.6 Virtueller Speicher<br />
¥ Das Zerlegen der AdressrŠume, das Ein-und Auslagern der Teile kann (mit<br />
technischer Hilfe) automatisiert werden.<br />
¥ Die benštigten Teile werden erst auf Anforderung eingelagert (demand paging)<br />
¥ FŸr den Benutzer / Programmierer sind diese VorgŠnge transparent<br />
Erfolg (hit):<br />
Misserfolg (miss)<br />
² 1 Prozesorzyklus<br />
10 - 30 Prozessorzyklen<br />
¥ Er hat den Eindruck, der Speicher sei in unbegrenzter Grš§e vorhanden.<br />
¥ Dieser unbegrenzte Speicher ist jedoch nur virtuell vorhanden<br />
¥ Trefferrate: 99.0% - 99.99%<br />
¥ TLB-Grš§e: 32 - 1024 Zeilen (EintrŠge)<br />
Voraussetzungen fŸr effizienten Betrieb:<br />
¥ Gestreute Adressierung (Seitentabellen)<br />
Seiten sind die Einheiten der †berlagerung<br />
¥ Automatisches Erkennen der Abwesenheit einer Seite<br />
Zugriff auf nicht vorhandene Seite lšst Unterbrechung aus.<br />
Einlagerung der Seite wird im Rahmen der Unterbrechungsbehandlung ausgelšst.<br />
5-75<br />
5-76
Beteiligte Komponenten (Datenstrukturen)<br />
¥ Seitentabellen (page table)<br />
Funktion:<br />
Inhalt:<br />
Adresstransformation<br />
fŸr jede Seite:<br />
¥ Nutzungs- und PrŠsenzinformation<br />
¥ Physikalische Adresse (Kachelnummer)<br />
¥ Kacheltabelle (page frame table, inverted page table)<br />
Funktion:<br />
Inhalt:<br />
¥ Ersatzspeicher (swap area)<br />
Funktion:<br />
<strong>Speicherverwaltung</strong><br />
fŸr jede Kachel<br />
¥ Zustand (frei / belegt)<br />
¥ Besitzer<br />
¥ belegende Seite<br />
5-77<br />
© H.-U. Hei§, Uni Paderborn<br />
Bereiche des Plattenspeichers zur Aufnahme ausgelagerter Seiten<br />
Seitentabelle fŸr virtuellen Speicher<br />
5-78<br />
© H.-U. Hei§, Uni Paderborn<br />
ZusŠtzlich zur physikalischen Adresse enthŠlt jeder Eintrag Informationen, ob<br />
¥ die Seite im Hauptspeicher vorhanden ist: PrŠsenzbit (presence bit, valid bit)<br />
¥ auf die Seite zugegriffen wurde: Referenzbit (reference bit)<br />
¥ die Seite verŠndert wurde (Schreibzugriff) Modifikationsbit (dirty bit)<br />
Seiten<br />
1<br />
1<br />
0<br />
1<br />
0<br />
1<br />
1<br />
0<br />
0<br />
1<br />
0<br />
1<br />
Seitentabelle<br />
1<br />
0<br />
0<br />
0<br />
0<br />
1<br />
Modifikation<br />
Zugriff (Referenzierung)<br />
Präsenz<br />
Speicher (Kacheln)<br />
Aufgaben bei der Verwaltung des virtuellen Speichers<br />
© H.-U. Hei§, Uni Paderborn<br />
Ablauf bei Seitenfehler<br />
© H.-U. Hei§, Uni Paderborn<br />
Belegen_VS<br />
Zugriff<br />
Freigeben_VS<br />
Seitenfehler<br />
Ersatzspeicher<br />
belegen<br />
Ersatzspeicher<br />
initialisieren<br />
N<br />
Seite präsent ?<br />
J<br />
Seitenfehler<br />
belegte Kacheln<br />
freigeben<br />
Ersatzspeicher<br />
freigeben<br />
Ausräumen<br />
leere Kachel verfügbar ?<br />
Nein<br />
Kachel zum Räumen auswählen<br />
Kachelinhalt (Seite) modifiziert ?<br />
Seite auslagern auf Ersatzspeicher<br />
Neue Seite einlagern von Ersatzspeicher<br />
Ja<br />
Ja<br />
Nein<br />
Strategieproblem<br />
Zeitaufwendig!<br />
Umschalten!<br />
Einräumen<br />
Eintrag Kacheltabelle<br />
Eintrag Seitentabelle<br />
5-79<br />
5-80
5.7 Datei-Cache<br />
5-81<br />
© H.-U. Hei§, Uni Paderborn<br />
¥ Da hŠufig Daten mehrfach zugegriffen werden, z.B. Indexblšcke (Block mit<br />
Verwaltungsdaten, in welchen Plattenblšcken welche Teile der Datei abgelegt sind),<br />
lohnt es sich, Plattenblšcke im Hauptspeicher zu puffern. (Platten-Cache, Datei-<br />
Cache)<br />
¥ Einige Betriebssysteme verwenden den gesamten sonst ungenutzten Hauptspeicher<br />
als Plattencache (z.B. Linux)<br />
(Auch moderne Plattencontroller haben hŠufig einen internen, transparenten Cache)<br />
¥ Bei jedem Zugriff auf einen Plattenblock wird daher zunŠchst im Puffer nachgesehen,<br />
ob der Block schon vorhanden ist.<br />
¥ Als Auslagerungsstrategie bei Platzmangel kommen dieselben Algorithmen in Frage<br />
wie beim virtuellen Speicher oder auf anderen Ebenen der Speicherhierarchie. (siehe<br />
5.7)<br />
¥ Wenn ein modifizierter Plattenblock jedoch erst im Rahmen einer Auslagerung auf die<br />
Platte geschrieben wird, besteht die Gefahr des Verlustes (bei Systemabsturz,<br />
Stromausfall)<br />
¥ Wichtige Blšcke, von deren AktualitŠt die Konsistenz des Dateisystems abhŠngt<br />
(Verzeichnisblšcke, Indexblšcke) sollten daher sofort gerettet werden.<br />
¥ Sequentieller Zugriff kann beim Puffern ausgenutzt werden: Read-Ahead und Free-<br />
Behind<br />
Beispiel: Datei-Cache in Unix<br />
5-82<br />
© H.-U. Hei§, Uni Paderborn<br />
¥ Zur Verwaltung der Plattenblšcke im Hauptspeicher wird eine Hashtabelle verwendet.<br />
Blšcke mit gleichem Hashwert werden in einer verketteten Liste gehalten.<br />
¥ Blšcke, die gerade gefŸllt oder geleert werden, sind gesperrt<br />
¥ Die nicht gesperrten Blšcke werden in der Reihenfolge des letzten Zugriffs (zusŠtzlich)<br />
verkettet. Wird ein Block benštigt, so wird der am lŠngsten nicht mehr referenzierte<br />
gerŠumt.<br />
Hashtabelle<br />
Kopf der Freiliste<br />
frei<br />
gesperrt<br />
Caching in verteilten Dateisystemen<br />
© H.-U. Hei§, Uni Paderborn<br />
• Im lokalen Fall bedeutet Caching, da§ Teile der Datei, die auf einem Plattenspeicher<br />
abgelegt ist,sich im Hauptspeicher befinden.<br />
• Im verteilten Dateisystem mit Client-Server-Struktur wird der Server ebenfalls gro§e Teile<br />
des Hauptspeichers als Pufferplatz verwenden, um Plattenzugriffe zu sparen.<br />
• Bei entfernten Zugriffen sollten jedoch auch Datentransporte Ÿber das Netz minimiert<br />
werden. Dazu kann man nun auf Seiten des Clients einen Puffer einsetzen.<br />
• Der Puffer auf Client-Seite kann nun auf der Platte oder im Hauptspeicher realisiert sein.<br />
Client<br />
x3<br />
Netz<br />
Puffer<br />
x1<br />
Server<br />
Cache-Konsistenz<br />
© H.-U. Hei§, Uni Paderborn<br />
Greifen mehrere Clients lesend und schreibend auf dieselbe Datei zu, so fŸhrt das Caching<br />
zu Konsistenzproblemen, weil Schreiboperationen sich zunŠchst nur auf die lokale Kopie<br />
beziehen.<br />
Client<br />
lokale<br />
Kopie<br />
Client<br />
lokale<br />
Kopie<br />
lokales Netz<br />
Client<br />
lokale<br />
Kopie<br />
x2<br />
x0<br />
Als Transfereinheiten verwendet man entweder Blšcke (z.B. NFS = Network File System)<br />
oder ganze Dateien (z.B. AFS = Andrew File System)<br />
File-<br />
Server<br />
Original<br />
5-83<br />
5-84
Cache-Konsistenz<br />
Zur Reduktion der Netzlast wurden folgende Ma§nahmen vorgeschlagen<br />
5-85<br />
© H.-U. Hei§, Uni Paderborn<br />
Write-Through<br />
Der Puffer wird zum Lesen benutzt. Schreiboperationen werden sofort zum Server<br />
weitergegeben, d.h. auf das Original angewendet.<br />
Verzšgertes Schreiben<br />
Schreiboperationen werden gesammelt und im BŸndel an den Server weitergeleitet.<br />
Write-on-Close<br />
DateiŠnderungen werden erst beim Schlie§en der Datei an den Server weitergeleitet.<br />
In allen FŠllen kšnnen Inkonsistenzen auftreten. Es handelt sich um pragmatische<br />
Kompromisse zwischen Konsistenzwahrung und Aufwandsminimierung,<br />
Soll strenge Konsistenz erreicht werden, so muss auf Sperren oder Transaktionskonzepte<br />
zurŸckgegriffen werden.<br />
Das Cache-Konsistenzproblem tritt auch bei WWW-Browsern auf (Reload-Button)<br />
5.8 Auslagerungsstrategien<br />
5-86<br />
© H.-U. Hei§, Uni Paderborn<br />
Je grš§er der Unterschied der Zugriffszeiten zwischen zwei adjazenten Ebenen der<br />
Speicherhierarchie, desto wichtiger ist die Trefferwahrscheinlichkeit, d.h. die<br />
Wahrscheinlichkeit, mit der ein referenziertes Datenelement auf der jeweiligen Ebene<br />
vorgefunden wird.<br />
Ist das gewŸnschte Datenelement auf der jeweiligen Ebene nicht vorhanden, so liegt ein<br />
Zugriffsfehler (z.B. cache miss, page fault) vor.<br />
Ein Zugriff auf einer bestimmten Ebene ist also entweder ein Treffer oder ein Zugriffsfehler.<br />
Ist auf einer Ebene ein Zugriffsfehler aufgetreten und ist kein Platz mehr zum Einlagern des<br />
referenzierten Datenelements frei, so muss ein anderes Datenelement ausgelagert werden.<br />
Wir werden in diesem Abschnitt Auslagerungsstrategien im Kontext und in der<br />
Terminologie des virtuellen Speichers behandeln.<br />
Alle Aussagen lassen sich aber mutatis mutandis auf andere Ebenen einer<br />
Speicherhierarchie anwenden.<br />
Auswirkung der Trefferrate auf die Zugriffszeit<br />
Eine kleine Rechnung:<br />
Sei p pf die Wahrscheinlichkeit fŸr einen Seitenfehler (page fault), t m die<br />
Speicherzugriffszeit und t pf die Zeit zur Behandlung eines Seitenfehlers.<br />
Dann erhalten wir als effektive Speicherzugriffszeit im virtuellen Speicher<br />
teff :=( 1−<br />
ppf )⋅ tm + ppf ⋅tpf<br />
Bei halbwegs realistischen Grš§en von z.B. t m = 20 nsec und t pf = 20 msec<br />
teff = ( 1−<br />
ppf )⋅ 20 + ppf<br />
⋅20. 000.<br />
000<br />
= 20 + 19. 999.<br />
980 ⋅p<br />
pf<br />
Bei einer Seitenfehlerwahrscheinlichkeit von p pf = 0, 001 erhalten wir eine effektive<br />
Zugriffszeit von 20 µsec, d.h. eine Verlangsamung um den Faktor 1000 !<br />
−<br />
Selbst bei einem Wert von p pf = 10 6 verdoppelt sich die effektive Zugriffszeit.<br />
© H.-U. Hei§, Uni Paderborn<br />
Auswahlstrategie<br />
© H.-U. Hei§, Uni Paderborn<br />
Die Seitenfehlerrate hŠngt natŸrlich stark davon ab, welche Seiten wir im Hauptspeicher<br />
halten und welche wir auslagern.<br />
Auswahlstrategie:<br />
Wenn Seitenfehler und keine Kachel frei, welche soll dann geleert werden ?<br />
Unterscheidung<br />
Lokale Auswahlstrategie:<br />
Es wird eine Kachel desjenigen Prozesses gerŠumt,<br />
der den Seitenfehler verursacht hat<br />
Globale Auswahlstrategie:<br />
Eine beliebige Kachel (auch fremder Prozesse) wird gerŠumt<br />
Es ist daher ungeheuer wichtig, die Seitenfehlerzahl sehr gering zu halten<br />
5-87<br />
5-88
Modellierung der Seitenzugriffe<br />
Um die verschiedenen Auswahlalgorithmen vergleichen zu kšnnen,<br />
legen wir sogenannte Seitenreferenzfolgen zugrunde<br />
Sei r i die Nummer der Seite, auf die zum Zeitpunkt i zugegriffen wird.<br />
Dann ist R= r 1 , r 2 , r 3 ,..., r n eine Seitenreferenzfolge.<br />
5-89<br />
© H.-U. Hei§, Uni Paderborn<br />
Es gelte ri<br />
≠ri+1 ∀i, d.h. aufeinanderfolgende Referenzen auf dieselbe Seite werden in<br />
der Referenzfolge zu einer Referenz zusammengefasst.<br />
Bei lokaler Strategie erhalten wir fŸr jeden Prozess eine Referenzfolge. Die<br />
Referenznummern beziehen sich auf den jeweiligen Adressraum.<br />
Bei globaler Strategie entsteht die Referenzfolge als Mischung der Referenzfolgen der<br />
Prozesse.<br />
Der Seitennummer ist die Prozesskennung beizufŸgen, so dass eine Referenz aus einem<br />
Paar (PID, Seitennummer) besteht.<br />
FŸr die nachfolgende Diskussion ergibt sich daraus kein Unterschied.<br />
ZufŠllige Auswahlstrategie (RANDom)<br />
5-90<br />
© H.-U. Hei§, Uni Paderborn<br />
Falls die Referenzfolge keinerlei statistische Eigenschaften hat,<br />
d.h. wenn das LokalitŠtsprinzip nicht zutrifft, also die Zugriffe unabhŠngig voneinander und<br />
gleichverteilt Ÿber den Adressraum stattfinden,<br />
dann ist es letztlich gleichgŸltig, welche Seite ausgelagert wird.<br />
Dies fŸhrt zur zufŠlligen Strategie (RAND)<br />
Beispiel:<br />
Gegeben sei ein Speichergrš§e von 3 Kacheln und eine Referenzfolge<br />
ZufŠllige Strategie: 7 Seitenfehler (ohne die Initialseitenfehler beim ersten Zugriff)<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12<br />
Referenz 0 2 4 3 2 3 0 1 0 3 0 2<br />
Kachel 1 0 0 0 0 2 2 2 2 2 2 0 0<br />
Kachel 2 2 2 3 3 3 0 0 0 3 3 3<br />
Kachel 3 4 4 4 4 4 1 1 1 1 2<br />
Die Zugriffe, die einen Seitenfehler verursachen, sind fett gedruckt<br />
Optimale Auswahlstrategie (OPTimal)<br />
Die zufŠllige Strategie nutzt keinerlei Information der Referenzfolge.<br />
© H.-U. Hei§, Uni Paderborn<br />
Es stellt sich daher die Frage, ob es eine optimale Strategie gibt,<br />
d.h. eine Strategie, die unter Ausnutzung der Referenzfolge die Seiten so auswŠhlt,<br />
dass die Anzahl der Seitenfehler bei einer gegebenen Speichergrš§e minimiert wird.<br />
TatsŠchlich gibt es eine solche Strategie und sie lautet:<br />
ãWŠhle (zum Auslagern) die Seite, die am lŠngsten nicht mehr benštigt werden wird.Ò<br />
Optimale Strategie: 3 Seitenfehler (ohne Initialseitenfehler)<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12<br />
Referenz 0 2 4 3 2 3 0 1 0 3 0 2<br />
Kachel 1 0 0 0 0 0 0 0 0 0 0 0 2<br />
Kachel 2 2 2 2 2 2 2 1 1 1 1 1<br />
Kachel 3 4 3 3 3 3 3 3 3 3 3<br />
Realisierbare Strategien<br />
Die optimale Strategie hat einen schwerwiegenden Nachteil:<br />
Sie ist nicht realisierbar, da i.a. zu jedem Zeitpunkt nur die bisher stattgefundenen<br />
Referenzen, nicht aber die zukŸnftigen bekannt sind.<br />
(Die optimale Strategie dient daher nur als ãMesslatteÒ fŸr realisierbare Strategien)<br />
Daher:<br />
Versuchen, auf Grund der vergangenen Referenzen die zukŸnftigen Referenzen<br />
vorherzusagen.<br />
LokalitŠtsprinzip bedeutet:<br />
© H.-U. Hei§, Uni Paderborn<br />
Das Zugriffsverhalten in der unmittelbaren Vergangenheit ist eine gute SchŠtzung fŸr das<br />
Verhalten in der unmittelbaren Zukunft.<br />
Auswahl basiert auf<br />
¥ HŠufigkeit der Zugriffe auf eine Seite<br />
¥ Zeitpunkte der Zugriffe<br />
5-91<br />
5-92
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Realisierbare Strategien<br />
¥ FIFO (First-In-First-Out)<br />
Ausgelagert wird die Seite, die am schon am lŠngsten im Speicher ist<br />
¥ LFU (Least Frequently Used)<br />
Ausgelagert wird die Seite, die am wenigstens hŠufig referenziert wurde<br />
FIFO-Strategie<br />
FIFO-Strategie (first-in-first-out) 4 Seitenfehler<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12<br />
Referenz 0 2 4 3 2 3 0 1 0 3 0 2<br />
Kachel 1 0 0 0 3 3 3 3 3 3 3 3 2<br />
Kachel 2 2 2 2 2 2 0 0 0 0 0 0<br />
Kachel 3 4 4 4 4 4 1 1 1 1 1<br />
¥ LRU (Least Recently Used)<br />
Ausgelagert wird die Seite, die am lŠngsten nicht mehr refenziert wurde<br />
¥ RNU (Recently Not Used)<br />
Ausgelagert wird eine Seite, die innerhalb eines vorgegebenen Zeitraums nicht mehr<br />
referenziert wurde<br />
Man erwartet von einem Seitentauschalgorithmus, dass er weniger Seitenfehler produziert,<br />
wenn mehr Speicher zur VerfŸgung gestellt wird.<br />
Die Seitenfehlerrate sollte bei steigender Kachelanzahl monoton fallen.<br />
Diese Eigenschaft trifft auf die FIFO-Strategie nicht zu.<br />
5-93<br />
5-94<br />
Anomalie bei FIFO-Strategie<br />
Bei 4 Kacheln: 7 Seitenfehler<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15<br />
Referenz 0 1 2 3 4 0 1 5 6 0 1 2 3 5 6<br />
Kachel 1 0 0 0 0 4 4 4 4 6 6 6 6 6 6 6<br />
Kachel 2 1 1 1 1 0 0 0 0 0 0 2 2 2 2<br />
Kachel 3 2 2 2 2 1 1 1 1 1 1 3 3 3<br />
Kachel 4 3 3 3 3 5 5 5 5 5 5 5 5<br />
Bei 5 Kacheln: 8 Seitenfehler<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15<br />
Referenz 0 1 2 3 4 0 1 5 6 0 1 2 3 5 6<br />
Kachel 1 0 0 0 0 0 0 0 5 5 5 5 5 3 3 3<br />
Kachel 2 1 1 1 1 1 1 1 6 6 6 6 6 5 5<br />
Kachel 3 2 2 2 2 2 2 2 0 0 0 0 0 6<br />
Kachel 4 3 3 3 3 3 3 3 1 1 1 1 1<br />
Kachel 5 4 4 4 4 4 4 4 2 2 2 2<br />
5-95<br />
© H.-U. Hei§, Uni Paderborn<br />
LFU (Least Frequently Used)<br />
Zeit<br />
1 2 3 4 5 6 7 8 9 10 11 12<br />
Referenzen 0 2 4 3 2 3 0 1 0 3 0 2<br />
Kachel 0<br />
Kachel 1<br />
Kachel 2<br />
0 0<br />
2<br />
0<br />
2<br />
4<br />
3<br />
2<br />
4<br />
3<br />
2<br />
4<br />
3<br />
2<br />
4<br />
3<br />
2<br />
0<br />
3<br />
2<br />
1<br />
3<br />
2<br />
0<br />
3<br />
2<br />
0<br />
3<br />
2<br />
0<br />
3<br />
2<br />
0<br />
Zähler<br />
0<br />
1<br />
2<br />
3<br />
4<br />
1<br />
–<br />
–<br />
–<br />
–<br />
1<br />
–<br />
1<br />
–<br />
–<br />
1<br />
–<br />
1<br />
–<br />
1<br />
(1)<br />
–<br />
1<br />
1<br />
1<br />
(1)<br />
–<br />
2<br />
1<br />
1<br />
Der LFU-Algorithmus unterhŠlt fŸr alle Seiten einen ZŠhler, der bei jedem Zugriff<br />
inkrementiert wird.<br />
Im vorliegenden Beispiel werden vier Seitenfehler verursacht.<br />
(1)<br />
–<br />
2<br />
2<br />
1<br />
5-96<br />
2<br />
–<br />
2<br />
2<br />
(1)<br />
(2)<br />
1<br />
2<br />
2<br />
(1)<br />
3<br />
(1)<br />
2<br />
2<br />
(1)<br />
3<br />
(1)<br />
2<br />
3<br />
(1)<br />
4<br />
(1)<br />
2<br />
3<br />
(1)<br />
4<br />
(1)<br />
3<br />
3<br />
(1)<br />
© H.-U. Hei§, Uni Paderborn
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
LRU (Least Recently Used)<br />
LRU bedeutet, dass die am lŠngsten nicht mehr referenzierte Seite ausgelagert wird.<br />
Man kann dies leicht mit einem Stapel (stack) realisieren, bei dem die jŸngst zugegriffene<br />
oben auf den Stapel gelegt wird.<br />
Andere Seiten ãrutschenÒ dadurch nach unten.<br />
Bei k Kacheln sind die k obersten Seiten des Stapels im Speicher<br />
Zugriff auf Seite 5 (im Stapel)<br />
3<br />
7<br />
4<br />
9<br />
5<br />
8<br />
1<br />
5<br />
3<br />
7<br />
4<br />
9<br />
8<br />
1<br />
Zugriff auf Seite 6 (nicht im Stapel)<br />
3<br />
7<br />
4<br />
9<br />
5<br />
8<br />
1<br />
6<br />
3<br />
7<br />
4<br />
9<br />
5<br />
8<br />
LRU (Least Recently Used)<br />
Beispiel fŸr LRU-Strategie (4 Seitenfehler)<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12<br />
Referenz 0 2 4 3 2 3 0 1 0 3 0 2<br />
Kachel 1 0 0 0 3 3 3 3 3 3 3 3 3<br />
Kachel 2 2 2 2 2 2 2 1 1 1 1 2<br />
Kachel 3 4 4 4 4 0 0 0 0 0 0<br />
0 2 4 3 2 3 0 1 0 3 0 2<br />
Stapel 0 2 4 3 2 3 0 1 0 3 0<br />
0 2 4 4 2 3 3 1 1 3<br />
t = i t = i+1 t = i t = i+1<br />
5-97<br />
5-98<br />
LRU (Least Recently Used)<br />
© H.-U. Hei§, Uni Paderborn<br />
Die LRU Strategie schaut also in die Vergangenheit und wŠhlt die Seite, deren letzter<br />
Zugriff am weitesten zurŸckliegt.<br />
Sie ist damit symmetrisch zur optimalen Strategie OPT, die in die Zukunft schaut und<br />
diejenige Seite auswŠhlt, deren nŠchster Zugriff am weitesten vorausliegt.<br />
rückwärts vorwärts<br />
r i m<br />
r i-m+1 .... r i 1<br />
r i<br />
r i+1<br />
.... r i+m-1 r i+m<br />
aktueller Zeitpunkt<br />
Sei R ein Referenzstring und R -1 der zu R invertierte Referenzstring.<br />
Dann gilt:<br />
Die Seitenfehlerzahl, die entsteht, wenn LRU auf R angewendet wird, ist gleich der<br />
Seitenfehlerzahl, die OPT angewendet auf R -1 erzeugt.<br />
(... und umgekehrt)<br />
RNU (Recently Not Used)<br />
© H.-U. Hei§, Uni Paderborn<br />
RNU ist Šhnlich wie LRU, arbeitet jedoch mit einem festen ãZeitfensterÒ der LŠnge k, das<br />
Ÿber die Referenzfolge geschoben wird.<br />
FŸr eine Auslagerung in Frage kommen alle Seiten, die innerhalb des Fensters nicht<br />
referenziert wurden.<br />
Die Fenstergrš§e k ist so wŠhlen, dass Anzahl der RNU-Seiten klein, aber > 0<br />
Beispiel fŸr RNU-Strategie (4 Seitenfehler)<br />
(fŸr Fenstergrš§e k=2)<br />
Zeit 1 2 3 4 5 6 7 8 9 10 11 12<br />
Referenz 0 2 4 3 2 3 0 1 0 3 0 2<br />
Kachel 1 0 0 0 3 3 3 3 3 3 3 3 3<br />
Kachel 2 2 2 2 2 2 2 1 1 1 1 2<br />
Kachel 3 4 4 4 4 0 0 0 0 0 0<br />
5-99<br />
5-100
Anmerkungen zur Realisierung<br />
Alle realisierbaren Strategien erfordern bei jedem Zugriff gewisse Datenoperationen<br />
(z.B. Stack-Operationen, ZŠhlerinkrementierung,..)<br />
Sie vollstŠndig in Software durchzufŸhren ist zu aufwendig.<br />
Auch eine Hardware-UnterstŸtzung (erweiterte Funktion des TLB) wird i.a. aus<br />
AufwandsgrŸnden nicht vorgesehen.<br />
Man begnŸgt sich daher mit leichter realisierbaren AnnŠherungsverfahren.<br />
© H.-U. Hei§, Uni Paderborn<br />
Von den diskutierten Verfahren zeigt LRU i.d.R. das beste Verhalten, d.h. LRU fŸhrt zur<br />
geringsten Seitenfehlerrate.<br />
Die in realen Betriebssystemen zu findenden Seitentauschstrategien sind daher leicht<br />
realisierbare Varianten von LRU<br />
Mit der Ÿblichen Hardware-UnterstŸtzung, d.h. der Aktualisierung von Referenzbits bei<br />
jedem Zugriff auf eine Seite, lŠsst sich LRU bzw. RNU annŠhern.<br />
AngenŠherte LRU/RNU-Strategie<br />
© H.-U. Hei§, Uni Paderborn<br />
Die Referenzindikatoren geben an, auf welche Seiten zugegriffen wurde, geben aber keine<br />
Auskunft Ÿber den Zeitpunkt des letzten Zugriffs.<br />
Da eine Seite nur bei Zugriff eingelagert wird, sind ohnehin alle Referenzindikatoren 1 und<br />
daher nicht hilfreich bei der Auswahl.<br />
Die Referenzindikatoren mŸssen deshalb periodisch zurŸckgesetzt werden,<br />
damit man erkennen kann, auf welche Seiten aktuell noch zugegriffen wird.<br />
Präsenzindikatoren<br />
0<br />
1<br />
2<br />
3<br />
4<br />
5<br />
0<br />
1<br />
1<br />
0<br />
1<br />
0<br />
–<br />
–<br />
–<br />
Referenzindikatoren<br />
-<br />
1<br />
1<br />
-<br />
0<br />
-<br />
Setzen bei<br />
individueller<br />
Referenz<br />
Periodisch<br />
gemeinsam löschen<br />
5-101<br />
5-102<br />
© H.-U. Hei§, Uni Paderborn<br />
© H.-U. Hei§, Uni Paderborn<br />
Second-Chance-Algorithmus (Clock-Algorithmus)<br />
„Second Chance“-Algorithmus (Clock-Algorithmus)<br />
Der Clock-Algorithmus ist insofern geschickter, als er die Referenzindikatoren nicht alle auf<br />
einmal zurŸcksetzt, sondern immer nur Teilmengen:<br />
0<br />
Referenzindikatoren<br />
0<br />
1<br />
¥ Der Vektor der Referenzbits wird zyklisch durchlaufen.<br />
0<br />
0<br />
0<br />
¥ Bei der Suche nach einem Kandidaten wird die nŠchste Seite gewŠhlt, deren<br />
Referenzbit 0 ist.<br />
1<br />
1<br />
0<br />
1<br />
1<br />
0<br />
1<br />
1<br />
0<br />
¥ Im Zuge dieser linearen Suche werden alle besuchten Referenzindikatoren<br />
zurŸckgesetzt.<br />
¥ Sie haben - bis der Zeiger das nŠchste Mal vorbeikommt - eine weitere Chance,<br />
referenziert zu werden<br />
Auswahlzeiger<br />
1<br />
1<br />
1<br />
1<br />
0<br />
Auswahlzeiger<br />
0<br />
0<br />
0<br />
0<br />
1<br />
Auswahlzeiger<br />
0<br />
1<br />
1<br />
0<br />
1<br />
¥ Ausgelagert wird also eine Seite, die seit dem letzten Durchlauf des Auswahlzeigers<br />
nicht wieder referenziert wurde.<br />
1<br />
0<br />
1<br />
0<br />
1<br />
1<br />
Vor Auswahl Nach Auswahl Nach weiteren Referenzen<br />
5-103<br />
5-104