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