Version [22505]
Dies ist eine alte Version von BSys07Speicherverwaltung erstellt von RonnyGertler am 2013-03-26 22:04:42.
Betriebssysteme (Betriebssystemtheorie) - Kapitel 7 - Speicherverwaltung
Inhalte von Dr. E. Nadobnyh
7.1 Einführung
Aufgaben der Speicherverwaltung
1) Zuteilung (Allokation) und Freigabe von Speicherbereichen für mehrere Adressräume.
2) Die Abbildung der logischen Adressen auf die physische Adresse.
3) Führung einer Übersicht über freie und belegte Teile des Arbeitsspeichers.
4) Speicherbereinigung und Speicherverdichtung.
5) Auslagerung von Speicherbereichen auf einen Sekundärspeicher.
6) Speicherschutz der Adressräume von unbefugten Speicherzugriffen anderer Prozesse.
Grundbegriffe
1) Eine logische Adresse (Programmadresse) wird von einem Prozess generiert und von der CPU verwendet. Sie ist z.B. der Inhalt des Zeigers.
2) Eine physische Adresse (Speicheradresse) wird beim Speicherzugriff verwendet.
Varianten der Speicherabbildung
1) Mit der vollständigen oder unvollständigen Belegung.
Eine vollständige (komplette) Belegung findet statt, wenn das gesamte Programm in den Speicher geladen wird.
2) Mit der kontinuierlichen oder diskontinuierlichen Belegung.
Eine kontinuierliche Belegung findet statt, wenn verschiedene Teile des Programms zusammenhängend im Speicher platziert werden.
3) Mit oder ohne Auslagerung.
Eine Auslagerung ist eine regelmäßige Speicherung des Programms vom Hauptspeicher in Sekundärspeicher, z.B. auf die Festplatte und zurück.
⇒ Demo 1
Überblick
1) Realer Speicher: Ein Prozess kann nur dann laufen, wenn sich sein Adressraum vollständig im Speicher befindet.
2) Virtueller Speicher: Ein Prozess kann auch dann laufen, wenn sich nur ein Teil seines Adressraums im Speicher befindet.
7.2. Realer Speicher
Systeme ohne Speicherabstraktion
Im Hauptspeicher steht das Betriebssystem und ein einziges Anwenderprogramm.
Besonderheiten:
1) Logische und physische Adressen sind gleich.
2) Physische Adressen können zur Übersetzungszeit schon bekannt sein.
3) Es gibt keinen Speicherschutz. Ein Fehler im Anwendungsprogramm kann das Betriebssystem aushebeln, wenn es sich nicht im ROM befindet.
4) Diese Technik ist für Monoprogrammierung (Singletasking, Einprogrammbetrieb) geeignet und wird heute höchstens in einfachen eingebetteten Systemen verwendet. Frühes Beispiel: MS-DOS.
Variable Partitionierung
Definition:
Variable Partitionierung (Partitionierung variabler Größe) ist eine dynamische Aufteilung des Speichers in eine variable Anzahl von Bereichen variabler Größe.
Sachverhalt:
1) Speichersystem bedient die beliebige Reihenfolge von Reservierungen und Freigaben.
2) Reservierungen fordern Bereiche mit verschiedenen Größen.
Legende: P1, P2, P3, P4 – Prozesse.
Zeitpunkte:
- Drei Prozesse am Laufen.
- Prozess P1 endet. Freigabe. Lücke entsteht.
- Prozess P4 kommt. Reservierung. Neue Lücke entsteht.
- Prozess P2 endet. Rekombination von zwei Lücken
Dynamische Relokation
Bei der Partitionierung wird die Anfangsadresse eines Programms erst zur Ladezeit bekannt. Damit wird auch die Adresstransformation erst zur Ladezeit möglich.
Dynamische Relokation ist eine Technik für die Speicherabbildung zur Laufzeit:
1) Der Adressraum jedes Prozesses wird komplett in den Speicher geladen.
2) Die Adresstransformation findet bei jedem Speicherzugriff statt. Zu der logischen Adresse wird der Inhalt eines Basisregisters (oder Relokationsregisters) addiert. Das Basisregister enthält die physikalische Partitionsstartadresse.
Das Programm kann auch zur Laufzeit mit logischenAdressen arbeiten.
3) Für die korrekte Speicherabbildung ist der Zugriffsschutz notwendig. Bei jedem Speicherzugriff wird überprüft, ob die Adresse
innerhalb des Adressraums liegt. Dazu dient ein Grenzregister (Schutz-Register, Limitregister), das die Größe des Adressraums enthält.
4) Beim Prozesswechsel werden beide Register umgesetzt.
Bemerkungen:
1) Dynamische Relokation bietet eine Abstraktion vom physischen Speicher. Die Speicherverwaltung ist für den Programmierer transparent.
3) Eine frühere Lösung war die statische Relokation. Dabei werden alle Adressen im Programm reloziert, wenn das Programm in den Speicher geladen wird.
Swapping
Grungidee: Wenn ein Prozess im Moment keine Rechenzeit benötigt, dann wird sein Adressraum komplett in Sekundärspeicher ausgelagert.
Verwendung:
1) Diese Technik wurde in Systemen ohne Speicherabstraktion verwendet, um mehrere Programme gleichzeitig auszuführen.
2) Swapping lässt sich mit variabler Partitionierung kombinieren:
- Bei Speichermangel werden Prozesse ausgelagert.
- Die freigewordenen Speicherbereiche werden für neue oder für ausgelagerte Prozesse genutzt.
- Die Gesamtzahl der gestarteten Prozesse entspricht nämlich der Summe der ausgelagerten und nicht ausgelagerten Prozesse.
- Swapping wurde bei älteren Unix-Systemen eingesetzt.
7.3.Freispeicherverwaltung
Grundidee
Das Ziel der Verwaltung des freien Speichers (dynamische Speicherbereitstellung) ist die effiziente Nutzung des realen Speichers. Dabei sollen die Zeit der Speicherzuteilung und die Fragmentierung minimiert werden.
Eine externe Fragmentierung (Zerstückelung, Verschnitt, Zersplitterung) ist ein Speicherzustand mit den schlecht nutzbaren Lücken. Im Laufe der Zeit entstehen überall im Speicher freie Bereiche, die teilweise zu klein sind, um Adressräume hineinladen zu können. Dabei kann eine neue Reservierung nicht erfüllt werden, obwohl insgesamt genügend Speicher frei ist.
Eine interne Fragmentierung ist der ungenutzte Teil des zugeteilten Speicherbereiches.
Einige Techniken
1) Speicherverdichtung (Kompaktierung, Verschiebung) ist eine Technik, bei der alle belegten Bereiche umkopiert werden, so dass nur eine große Lücke vorhanden ist.
Nachteil: Diese Technik ist zeitfressend und wird normalerweise nicht eingesetzt.
2) Abrundung: Wenn der Rest der Lücke zu klein ist, dann wird ganze Lücke reserviert.
Vorteil: Im Speicher entstehen keine kleine Lücken
Nachteil: Interne Fragmentierung.
3) Speicherbereinigung (Garbage Collection): Freigabe und aufwendige Rekombinationen werden automatisch zu einem späteren Zeitpunkt durchgeführt.
Vorteil: Optimalerweise findet eine Speicherbereinigung immer in Leerlaufphasen statt.
Belegungsstrategien
Belegungsstrategien (Allokations-Algorithmen) sind Algorithmen, die nach einer passenden Lücke im fragmentierten Speicher suchen.
1) Sequentielle Belegungsstrategien, welche eine einzige Liste oder andere Datenstruktur für alle Lücken führen.
2) Strategien mit festen Größenklassen (separierten Freilisten), welche mehrere Listen für verschiedene Lückengrößen führen.
Sequentielle Belegungsstrategien
Name | Die Suche beginnt | Gesuchte Lücke | Erzeugte Lücken |
First Fit/ Last Fit | am Speicheranfang | erste/ letzte | Kleine Lücken entsteh- en am Anfang/am Ende des Speichers |
Next Fit | am letzten allokierten Bereich. | erste | Kleine Lücken sind gleichmäßig überall. |
Best Fit/ Worst Fit | am Speicheranfang | kleinste/ größte | Tendiert zum Erzeugen kleiner/großer Lücken |
Vorteile: Es gibt keine innere Fragmentierung.
Nachteile:
- Wesentliche externe Fragmentierung.
- Sequentielle Algorithmen sind langsam, besonders Best Fit und Worst Fit.
Sequentielle Belegungsstrategien. Beispiel
1) Ausgangssituation(in MB):
Strategien mit separierten Freilisten
1) Quick Fit führt mehrere getrennte Listen für verschiedene Lückengrößen. Diese Strategie ist sinnvoll, wenn alle Anforderungen von gleichen oder bestimmten häufig benötigten Größen sind.
Vorteile:
- Diese Strategie ist extrem schnell bei der Reservierung.
- Keine Fragmentierung.
Nachteil:
Rekombination ist aufwendig, weil alle Löcher nicht nach der Adresse, sondern nach der Größe sortiert sind.
2) Buddy–Algorithmus verteilt den Speicher in Größen von Zweierpotenzen. Alle Anforderungen müssen also auf die nächste Zweierpotenz aufgerundet werden.
Vorteil:
Diese Strategie ist extrem schnell bei der Reservierung und bei der Rekombination.
Nachteil:
Interne Fragmentierung ist erheblich (bis 25%).
Buddy-Algorithmus
Verwaltungsdaten:
1) Der Speicher wird in Größen von Zweierpotenzen verteilt. Jede Anforderung muss auf die nächste Zweierpotenz 2k aufgerundet werden.
Eine Anforderung in 280 Bytes wird z.B. auf 29 = 512 Bytes aufgerundet.
2) Für jede Speichergröße wird eine eigene Liste verwendet.Es gibt Listen für die folgende Blockgrößen:
20 , 21 , 22 … 2S Byte, wo 2S - Speichergröße ist.
Anfangs sind alle Listen leer, nur in der 2S -Liste ist ein einziger Block (der gesamte Speicher).
3) Jeder Block wird markiert: reserviert oder frei.
Speicheranforderung:
1) Ein Block 2k wird aus der entsprechenden Liste zugeteilt.
2) Ist kein Block der gewünschten Größe frei, werden schrittweise die höheren Blockgrößen geprüft, bis ein freier Block gefunden wird.
3) Wird kein Block gefunden, wird die Speicheranforderung abgelehnt.
4) Der gefundene Block wird durch iterierte Halbierung soweit zerlegt, bis ein Block der benötigten Größe 2k entsteht.
Bei jeder Halbierung entstehen zwei doppelt kleinere Blöcke der gleichen Größe (Buddies, Kumpel).
Freigabe:
1) Bei jeder Freigabe muss die Rekombination mit den benachbarten Blöcken derselben Größe geprüft werden.
Zwei benachbarte Blöcke der Große 2k mit Adressen x und y sind Buddies, wenn die folgende Bedingung zutrifft:
y == x XOR 2k
Bei der Rekombination entsteht ein Block der doppelten Größe 2k+1.
2) Im Erfolgsfall muss auch die Rekombination der Blöcke mit höherer Größe iteriert geprüft werden.
Beispiel:
(1) Anfänglich besteht der Speicher aus einem kontinuierlichen Block 64 K.
(2) Zwei Anforderungen 8 K fallen an. Der Block 64 K wird dreimal halbiert. Beide Anforderungen werden erfüllt.
(3) Vier Anforderungen 4 K fallen an. Der Block 16 K wird zweimal halbiert und alle Anforderungen werden erfüllt.
(4) Zweite und dritte Blöcke 4 K werden freigegeben. Bei der Rekombinations-Prüfung wird kein Buddy gefunden.
(5) Der erste Block 4 K wird freigegeben. Bei der Prüfung werden zwei Buddies gefunden und rekombiniert.
Belegungsstrategien. Fazit
Keine der Strategien ist ideal, da praktische Situationen sehr unterschiedlich sind.
Zum Beispiel, es sei gegeben:
- zwei Lücken 1300 und 1200 Bytes,
- drei Aufträge 1000, 1100 und 250 Bytes.
Belegung und neu markierte Lücken:
Strategie | 1.Auftrag | 2.Auftrag | 1.Auftrag |
First Fit | 1300-1000= 300 | 1200-1100= 100 | 300-250= 50 |
Best Fit | 1200-1000= 200 | 1300-1100= 200 | Reservierung abgelehnt |
Verwendung der Freispeicherverwaltung
1) für Multitasking in einfachen Systemen, z.B.:
- Belegung mit variablen Partitionen
- Swapping;
2) im Betriebssystem selbst, z.B.:
- für innere Speicherverwaltung
- Speicherzuordnung für Treiber;
3) in Anwendungsprogrammen, z.B.:
- Heap Management.
⇒ Demo 2
7.4. Virtueller Speicher
Definition
Virtueller Speicher ist eine Speichertechnik, bei welcher Adressräume vom Hauptspeicher vollkommen abstrahiert werden.
Die Grundidee ist eine Erweiterung der Speicherkapazität unter Zuhilfenahme externen Sekundärspeicher.
Funktionsprinzip:
1) Im Hauptspeicher befinden sich gleichzeitig nur die Teile von mehreren Adressräumen.
2) Restliche Teile befinden sich auf dem Sekundärspeicher (Hintergrundspeicher, z.B. Festplatte).
3) Die Teile des Adressraums werden zur Laufzeit nur nach Bedarf in den Hauptspeicher eingelagert und auch auslagert.
Eigenschaften
1) Der logische Adressraum jedes Prozesses ist nur durch die Adressbreite begrenzt.
Beispiel: Bei der 32-Bit Adressbreite ist die Adressraumgröße 232 = 4GB. Der Intervall der logischen Adressen ist von 0x00000000 bis 0xFFFFFFFF.
2) Jeder Prozess teilt den Adressraum höchstens mit dem Betriebssystem selbst.
Beispiel: Unter Windows NT wird nur ein 2 GB großen Raum für den Benutzerprozess verteilt.
3) Der Adressraum eines Prozesses kann größer als der real vorhandene Speicher sein. Solche Prozesse werden als „große Prozesse“ bezeichnet.
Beispiel: Die Hauptspeichergröße kann 0,5 GB sein und dann 2>0,5.
⇒ Demo 3.
4) Der logische Adressraum wird als virtueller Adressraum und die logische Adresse als virtuelle Adresse bezeichnet.
5) Ein Programmierer erhält die Illusion, dass er einen Speicher besitzt, welcher größer als Hauptspeicher und so schnell wie Hauptspeicher ist. Dieser illusorische Speicher wird als virtueller Speicher bezeichnet.
6) Nicht benötige Teile können manchmal nie eingelagert werden. Beispiele:
- Die Ausnahmebehandlungsfunktionen werden nur selten aufgerufen.
- Die statisch reservierte Felder werden nicht bei jeder Ausführung vollständig verwendet.
8) Jeder Prozess ist gegen Fehlzugriffe aller anderen Prozesse geschützt.
Bedingungen
Für die Realisierung des virtuellen Speichers sind folgende Voraussetzungen nötig:
1) Programme verfügen über den so genannten Lokalitätseffekt (Lokalitätseigenschaft).
2) Das System verfügt über die passende Speicherhierarchie.
3) Die Adresstransformation muss durch die speziellen Hardware unterstützt werden, z.B. MMU, TLB. Sonst wird die Adresstransformation zu langsam.
Lokalität von Programmen
Definition:
1) Räumliche Lokalität. Wird auf eine bestimmte Adresse im Hauptspeicher zugegriffen, so erfolgt der nachfolgende Zugriff mit großer Wahrscheinlichkeit in der Nachbarschaft.
2) Zeitliche Lokalität. Wird auf eine bestimmte Adresse im Hauptspeicher zugegriffen, wird in naher Zukunft mit großer Wahrscheinlichkeit wieder darauf zugegriffen.
Beispiel:
for(int i=0; i<100; i++) s + =a[i];
Zugriffe auf Elemente des Feldes a[i].
Fazit: Wegen Lokalität wird in einem gewissen Zeitabschnitt
nie der gesamte Adressraum des Programms benötigt.
Speicherhierarchie
Eine Speicherhierarchie ist eine koordinierte Nutzung von verschiedenen Speicher.
Funktionsprinzip:
1) Die verschiedenen Speicherarten werden in Ebenen aufgeteilt (z.B. Register, Cache, Hauptspeicher und Festplatte).
2) Jede Ebene ist schneller, kleiner und teurer (Preis pro Byte) als die Ebene darunter.
3) Alle Daten einer Ebene sind auch in der Ebene darunter enthalten.
4) Daten werden nur zwischen benachbarten Ebenen übertragen.
Das Ziel einer Speicherhierarchie ist es, mit dem großen Speicherbereich einer unteren Ebene zu arbeiten und dieses mit der Geschwindigkeit einer oberen Ebene.
Zwei bekannte Techniken:
1) Cach –Speicher verwendet zwei Levels: Cache und Hauptspeicher.
2) Virtueller Speicher verwendet zwei Levels: Hauptspeicher und Sekundärspeicher (Festplatte).
Bemerkung: Der sekundäre Speicher wird nicht nur für die Speicherhierarchie, sondern auch zur Datenhaltung (Dateisystem) verwendet.
Adresstransformation
1) Die logische Adresse in den Befehlen bleibt auch nach dem Laden in den Hauptspeicher unverändert erhalten. Der Prozessor arbeitet mit logischen (virtuellen) Adressen.
2) Die Adresstransformation findet bei jedem Speicherzugriff statt.
3) Zur Adresstransformation wird eine Kombination aus Hard- und Software eingesetzt:
- MMU (memory management unit, Speicherverwaltungseinheit) ist eine spezielle Hardware für Adresstransformation. Heute wird die MMU direkt in die CPU integriert.
- Die speziellen Tabellen für die Adresstransformation werden vom Betriebssystem erstellt und aktualisiert.
4) Grundvoraussetzung für die Realisierung ist die Fähigkeit der CPU, einen laufenden Befehl zu unterbrechen und nach erfolgtem Nachladen den begonnenen Befehl vollständig auszuführen.
5) Das Nachladen der Programm- und Datenabschnitte besorgt ein Betriebssystem.
6) Die virtuelle Speichertechnik ist für den Anwender vollkommen transparent. Sowohl das Nachladen von Programm- und Datenabschnitten als auch die Adresstransformation geschieht automatisch.
7) Implementierungen:
- Paging,
- Segmentierung,
- Segmentierung mit Paging.
7.5. Paging
Grundbegriffe
1) Die meisten Systeme mit virtuellem Speicher verwenden eine Technik namens Paging (Seitenadressierung).
2) Dabei werden alle Adressräume und Speicher in Blöcke gleicher Länge (Pages, Frames und Slots) eingeteilt.
3) Der Adressraum jedes Prozesses ist in Seiten (Pages) aufgeteilt. Es besteht keinerlei Bezug zur logischen Struktur des Programms. Eine Seite stellt die Austauscheinheit beim Seitenwechsel dar.
4) Der Hauptspeicher ist in Seitenrahmen (Seitenkacheln, Frames) aufgeteilt.
5) Adressräume von allen beteiligen Prozessen sind auch im Sekundärspeicher (in der Ebene darunter) enthalten und werden hier auf Slots geteilt. Adressräume können in einer speziellen Auslagerungsdatei gespeichert werden, z.B.: C:\pagefile.sys unter Windows.
Eigenschaften
1) Jeder Seite eines Adressraums kann dynamisch ein beliebiger Seitenrahmen des Hauptspeichers zugeordnet werden.
2) Paging hat keine externe Fragmentierung.
3) Keine Suche nach einem "passenden Loch" im Hauptspeicher für eine neu zu ladende Seite ist erforderlich.
Speicherabbildung
1) Die Speicherabbildung wird mittels einer Seitentabelle verwaltet. Eine Seitentabelle wird für jeden Prozess vom Betriebssystem eingerichtet.
2) Über die Seitentabelle werden alle Seiten des Adressraums auf die Frames abgebildet.
3) Jede Zeile (Eintrag) der Seitentabelle enthält u.a.:
- ein Zustand der Seite, der als ein Present-Bit (valid bit, Gültigkeitsbit) dargestellt wird. Wenn Present=0, befindet sich diese Seite nicht im Hauptspeicher (nicht eingelagert);
- eine Seitenrahmen-Nummer (Frame), wenn die Seite eingelagert ist.
Speicherabbildung. Beispiel
Adresstransformation
1) Compiler, Linker und der Prozessor arbeiten ausschließlich mit logischen (virtuellen) Adressen.
2) Eine logische Adresse ist in einen Offset und eine Seitennummer aufgeteilt:
- Ein Offset (Distanz, Wortadresse) ist eine relative Adresse innerhalb der Seite.
- Eine Seiten-Nummer ist ein Index in der entsprechenden Seitentabelle.
3) Durch diese Aufteilung ist die Seitengröße eine Zweierpotenz, typischerweise: 29 Bytes bis 212 .
Beispiel: 32 Bit-Adressen mit der Seitengröße 212 = 4 KB unter Unix und Windows auf dem PC.
MMU erfüllt die Adresstransformation:
R = Seitentabelle[S]
P = R + Offset
Legende:
S - Seitennummer,
R - Seitenrahmennummer aus der Seitentabelle.
P - physische Adresse,
+ - Konkatenation.
Eigenschaften:
1) Die Seitennummer wird als Index der Seitentabelle benutzt.
2) Der Tabellenzugriff wird durch die MMU beschleunigt.
3) Der Offset ist in der logischen und der physikalischen Adresse identisch.
7.6. Seitenfehlerbehandlung
Seitenfehler und Einlagerung
Paging erlaubt die Ausführung von Prozessen, die nicht komplett im Hauptspeicher stehen. Die Seiten eines Prozesses werden erst eingelagert, wenn sie gebraucht werden (nach Bedarf, Demand Paging).
Sachverhalt:
1) Beim Zugriff auf eine nicht eingelagerte Seite (Present=0) wird ein Interrupt ausgelöst, der als Seitenfehler (page fault) bezeichnet wird.
2) Die Instruktion, die den Seitenfehler verursacht hat, wird abgebrochen. Der Prozess wird blockiert.
3) Das Betriebssystem lagert fehlende Seite in einen freien Seitenrahmen ein und aktualisiert die Seitentabelle.
4) Der Prozess-Zustand wird zu „rechenbereit“ geändert.
5) Anschließend wird die Instruktion, die vorher den Seitenfehler verursacht hat, wiederholt werden, diesmal erfolgreich.
Seitenfehler. Ablauf
Seitenfehler. Beispiel
Speicherschutz
1) Bei der Seitenfehlerbehandlung prüft das Betriebssystem, ob die referenzierten Seiten in der Auslagerungsdatei vorhanden sind.
2) Dafür werden interne Tabellen kontrolliert (z.B. PCB, Slot-Nummer, Auslagerungsadresse).
3) Wenn Seiten fehlen, handelt es sich um einen Zugriff auf verbotene Adresse, d.h. Schutzverletzung. Das Betriebssystem kann dem Prozess ein Signal (Fehlermeldung) senden oder ihn abbrechen.
Seitenersetzung
1) Wenn der Hauptspeicher zu knapp wird, muss eine oder mehrere Seiten (Opferseiten) ersetzt werden, um Platz zu schaffen (Seitenersetzung, Verdrängung, Replacement).
2) Nach dem Modell der Speicherhierarchie sind alle Seiten im Sekundärspeicher vorhanden. Einige von ihnen werden auch im Hauptspeicher eingelagert.
Opferseiten, die im Hauptspeicher nicht geändert wurden, brauchen nicht in den Sekundärspeicher zurückgespeichert werden, sondern können sofort durch die neue Seite überschrieben werden. Zeit wird dadurch gespart.
3) Ein typischer Seitentabelleneintrag enthält u.a. das M-Bit (Modified-Bit, Dirty-Bit). Wenn ein Programm in eine Seite schreibt, setzt die Hardware automatisch das M-Bit. Dieses Bit wird benutzt, um eine Seite auszulagern.
CategoryBSys