Praktische Einführung mit Virtualisierung
Stefan Bosse
Universität Koblenz - AG Praktische Informatik
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen ::
Eines der wichtigsten Betriebsmittel ist der Hauptspeicher . Die Verwaltung der Speicherressourcen ist deshalb auch ein kritisches und lohnendes Thema, das über die Leistungsfähigkeit eines Rechnersystems entscheidet. Dabei unterscheiden wir drei Bereiche, in denen unterschiedliche Strategien zur Speicherverwaltung angewendet werden:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen ::
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen ::
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Direkte Speicherbelegung
In den frühen Tagen der Computernutzung war es üblich, für jeden Job den gesamten Computer mit seinem Speicher zu reservieren.
Viele Nachteile (Overhead, "Reibung"). Besser die Daten mehrerer Prozesse gleichzeitig im Speicher halten, sobald genügend Speicher vorhanden war.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch feste Tabellen
Die einfachste Möglichkeit besteht darin, ein verkleinertes Abbild des Speichers zu erstellen: die Speicherbelegungstabelle . Jede Einheit einer solchen Tabelle (beispielsweise ein Bit) ist einer größeren Einheit (z. B. einem 32-Bit-Wort) zugeordnet. Ist das Wort belegt, so ist das Bit Eins, sonst Null.
BSG Eine direkte Speicherbelegung und ihre Belegungstabelle
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch feste Tabellen
Eine solche Belegungstabelle benötigt also bei 32 MiB Speicher selbst 1 MiB.
Soll ein freier Platz belegt werden, so muss dazu die gesamte Tabelle auf eine passende Anzahl von aufeinanderfolgenden Nullen durchsucht werden.
Besser: Paging (Einteilung des Speichers in Blöcke), reduziert die Tabellengröße
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch verzeigerte Listen
Der belegte bzw. freie Platz ist meist wesentlich länger als die Beschreibung davon.
Aus diesem Grund lohnt es sich, anstelle einer festen Tabelle eine Liste von Einträgen über die Speicherbelegung zu machen, die in der Reihenfolge der Speicheradressen über Zeiger miteinander verbunden sind.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch verzeigerte Listen
BSG Eine Speicherbelegung und die verzeigerte Belegungsliste
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch verzeigerte Listen
Eine solche Belegungsliste lässt sich auch in zwei Listen zerteilen:
Ordnen wir diese Liste noch zusätzlich nach der Größe der freien Bereiche, so muss normalerweise nie die ganze Liste durchsucht werden.
Allerdings wird auch dadurch das Verschmelzen angrenzender, freier Bereiche erschwert. Eine doppelte Verzeigerung ermöglicht das Durchsuchen der Liste in beiden Richtungen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch verzeigerte Listen
typedef unsigned int memoryptr;typedef int size;struct heap_entry { memoryptr adress; memorysize size; struct heap_entry next;};struct heap_entry *allocated;struct heap_entry *free;
Eine listenbasierte Speicherverwaltung ist beispielsweise für das Speichermanagement eines Heaps sinnvoll. Es wird meistens in Blockgrößen gerechnet (z.B. 4kB), nicht in Byteeinheiten
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch verzeigerte Listen
Es ist einfacher und schneller, nur eine einzige Liste zu führen, die Liste der freien Plätze.
Allerdings ist es sicherer, auch eine Liste der belegten Plätze zu führen, um bei der Platzrückgabe die Angaben über die Lage und die Länge des zurückgegebenen Platzes überprüfen zu können und so Fehlprogrammierungen des Benutzerprogramms aufzudecken.
Besonders in der Debugging-Phase ist dies durchaus sinnvoll; eine solche Überprüfung kann dann in späteren Phasen bei der Laufzeitoptimierung abgeschaltet werden.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Zuordnung durch Baumstrukturen
Listen haben eine Such- und Bearbeitungslaufzeit der Klasse O(N) bei N Elementen, Bäume hingegen (im Mittel) von log(N)N.
Daher bieten sich Bereichsbäume an um belegte und freie Speicherbereiche zu verwalten.
Jedoch bedürfen wie in der Natur Bäume einer Gartenpflege, Listen i.A. nicht.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Belegungsstrategien
Unabhängig von dem Mechanismus der Speicherbelegungslisten gibt es verschiedene Strategien, um aus der Menge der unbelegten Speicherbereiche den geeignetsten auszusuchen.
Die wichtigsten Strategien sind:
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Belegungsstrategien
bsdp
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Belegungsstrategien
free={addr:0, last=free function WorstFit(size) { size:N, function NextFit(size) { block=free; biggest=null next:null} if (last && last.size>=size) while(block) { block=last if (block.size>=size) { function FirstFit(size) { else if (!biggest || block=free block=free biggest.size<block.size) while(block.size<size) { while(block.size<size) { biggest=block; block=block.next block=block.next } } } block=block.next if (!block) if (!block) } return null; return null; if (!biggest) return null; addr=block.addr addr=block.addr addr=biggest.addr block.size-=size block.size-=size biggest.size-=size block.addr+=size block.addr+=size biggest.addr+=size return addr last=block return addr } return addr } }
FirstFit versa NextFit versa WorstFit
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Belegungsstrategien
Alle Anforderungen müssen also auf die nächste Zweierpotenz aufgerundet werden. Ein Speicherplatz der Länge 280 Bytes = 256 + 16 + 8 = 28 + 24 + 23 Bytes muss also auf 29 = 512 Bytes aufgerundet werden.
Ist kein freies Speicherstück der Größe 2k vorhanden, so muss ein freies Speicherstück der Größe 2k+1 in zwei Stücke von je 2k Byte aufgeteilt werden. Beide Stücke, die Partner (Buddy), sind genau gekennzeichnet: Ihre Anfangsadressen sind identisch bis auf das k-te Bit in ihrer Adresse, das invertiert ist. Beispiel: … XYZ0000 … und … XYZ1000 … sind die Anfangsadressen von Partnern.
Dies lässt sich ausnutzen, um sehr schnell (in einem Schritt!) prüfen zu können, ob ein freigewordenes Speicherstück einen freien Partner in der Belegungstabelle hat, mit dem es zu einem (doppelt so großen) Stück verschmolzen werden kann, ohne freie Reststücke zu hinterlassen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Belegungsstrategien
Angenommen, wir benötigen Speicherstücke der Größen 80 KB, 8 KB, 9 KB, 3 KB und 50 KB in der genannten Reihenfolge von einem Speicherstück von 256 KB.
bsdp Visualisierung einer Speicherzuteilung im Buddy-System
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Belegungsstrategien
Beide Vorgänge, sowohl das Suchen eines passenden freien Stücks (bzw. das dafür nötigen Auseinanderbrechen eines größeren) als auch das Zusammenfügen zu größeren Einheiten lässt sich rekursiv über mehrere Partnerebenen (mehrere Zweierpotenzen) durchführen.
Stefan Bosse - Grundlagen der Betriebssysteme - Modul S2 Speicherverwaltung - Algorithmen :: Bewertung der Strategien
Der Vergleich der verschiedenen Strategien führt zu einer differenzierten Bewertung. So stellt sich heraus, dass FirstFit von der Platzausnutzung etwas besser als NextFit und WorstFit ist und überraschenderweise auch besser als BestFit, das dazu neigt, nur sehr kleine, unbelegbare Reste übrig zu lassen. Eine Anordnung der Listenelemente nach Größe der Bereiche erniedrigt dabei die Laufzeit von BestFit und WorstFit.
Wissen wir mehr über die Verteilung der Speicheranforderungen nach Zeit oder Beleggröße, so können mit QuickFit und anderen, speziellen Algorithmen bessere Resultate erzielt werden!
Die Leistungsfähigkeit des Buddy-Systems lässt sich mit folgender Rechnung kurz abschätzen: Nehmen wir an, für den Hauptspeicher der Größe 2n werden alle 2n möglichen Stückgrößen S daraus mit gleicher Wahrscheinlichkeit verlangt (was sicher nicht vorkommt, aber mangels plausiblerer Annahmen vorausgesetzt sei). Dann ist die mittlere Speicheranforderung 〈S(n)〉 mit
Profiling zur Laufzeit kann helfen den richtigen Algorithmus auszuwählen.
file:///home/sbosse/skripte/bs1k/doc/BetriebssystemeGrundlagen/html/49321_4_De_3_Chapter.xhtml#Sec3