06.11.2014 Aufrufe

5 Speicherverwaltung 5.1 Belegungsverfahren Aufgabenstellung ...

5 Speicherverwaltung 5.1 Belegungsverfahren Aufgabenstellung ...

5 Speicherverwaltung 5.1 Belegungsverfahren Aufgabenstellung ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!