Grundlagen der Speicherverwaltung und virtueller Speicher
Eingeordnet in Informatik
Geschrieben am in
Deutsch mit einer Größe von 7,01 KB
Hardware-Strukturen und Kontrolle
- Alle Verweise auf Speicher in einem Prozess werden während der Ausführung von logischen Adressen in physikalische Adressen übersetzt.
- Ein Prozess kann in mehrere Teile (Seiten oder Segmente) aufgeteilt werden, die während der Durchführung nicht zusammenhängend sein müssen.
- Dies wird durch die Kombination von dynamischer Adressübersetzung und der Verwendung von Seitentabellen oder Segmenten ermöglicht.
Ausführen eines Programms
- Das Betriebssystem lädt nur wenige Fragmente des Programms in den Hauptspeicher, einschließlich des Fragments mit dem Programmstart.
- Der Resident Set ist der Teil des Prozesses, der sich tatsächlich im Hauptspeicher befindet.
- Wenn der Prozessor auf eine Adresse stößt, die nicht im Hauptspeicher liegt, wird ein Interrupt erzeugt.
- Das Betriebssystem versetzt den Prozess in einen blockierten Zustand.
- Das fehlende Fragment wird in den Hauptspeicher geladen, wofür das Betriebssystem folgende Schritte einleitet:
- Eine E/A-Leseanforderung an die Festplatte.
- Ausführung eines anderen Prozesses, während die E/A-Operation läuft.
- Nach Abschluss der E/A-Operation wird ein Interrupt ausgelöst und das Betriebssystem ändert den Status des Prozesses auf „Bereit“.
Vorteile des Ansatzes
- Mehr Prozesse können gleichzeitig im Hauptspeicher gehalten werden, da nur Fragmente geladen werden.
- Dies führt zu einer effizienteren Nutzung des Prozessors.
- Mindestens ein Prozess, der sich im Hauptspeicher befindet, wird den Status „Bereit“ haben.
- Es ist möglich, dass ein Prozess größer als der gesamte Hauptspeicher ist. Dank virtuellem Speicher (Paging oder Segmentierung) muss sich der Programmierer keine Sorgen um die Programmgröße machen.
Arten von Speicher
- Real-Speicher: Hauptspeicher (Main Memory).
- Virtueller Speicher: Ermöglicht effektives Multiprogramming und entfernt die Beschränkungen des physischen Hauptspeichers.
Thrashing
- Wenn ein Fragment unmittelbar vor Gebrauch verdrängt wird, muss es sofort zurückgeholt werden.
- Ständiges Auslagern führt zu Thrashing.
- Der Prozessor verbraucht mehr Zeit mit dem Austausch von Fragmenten als mit der eigentlichen Ausführung.
Grundsatz der Lokalität
- Verweise auf Daten und Programmcode innerhalb eines Prozesses neigen dazu, zu clustern.
- Für kurze Zeit werden nur wenige Fragmente des Prozesses benötigt.
- Dies ermöglicht intelligente Vorhersagen darüber, welche Teile eines Prozesses in naher Zukunft benötigt werden.
Notwendige Unterstützung für virtuellen Speicher
- Hardware: Muss Paging und Segmentierung unterstützen.
- Betriebssystem: Muss Software enthalten, die das Verschieben von Seiten oder Segmenten zwischen Hauptspeicher und sekundärem Speicher verwaltet.
Paging
- Jeder Prozess hat seine eigene Seitentabelle.
- Jeder Eintrag in der Seitentabelle enthält die Framenummer der entsprechenden Seite im Hauptspeicher.
- Ein Bit ist erforderlich, um anzuzeigen, ob die Seite im Hauptspeicher vorhanden ist.
- Ein weiteres Bit gibt an, ob der Inhalt der Seite geändert wurde (Dirty-Bit), um unnötige Schreibvorgänge beim Ersetzen zu vermeiden.
Seitentabellen
- Es gibt eine Seitentabelle pro Prozess.
- Einige Tabellen können große Mengen des Hauptspeichers belegen.
- Die Seitentabellen liegen im virtuellen Speicher.
- Wenn ein Prozess läuft, muss zumindest ein Teil der Seitentabelle im Hauptspeicher sein.
Translation Lookaside Buffer (TLB)
- Jeder Speicherzugriff könnte zwei Zugriffe erfordern: einen für die Seitentabelle und einen für die Daten.
- Um dies zu lösen, nutzen die meisten virtuellen Speichersysteme einen speziellen Cache namens TLB.
- Der Prozessor prüft bei einem Speicherzugriff zuerst den TLB.
- Ist der Eintrag vorhanden, kann die physikalische Adresse direkt berechnet werden.
- Wird er nicht gefunden, sucht der Prozessor in der Seitentabelle des Prozesses.
- Nach erfolgreicher Suche wird der TLB aktualisiert.
- Ist das Präsenz-Bit nicht aktiv, liegt ein Page Fault vor.
Seitengröße
- Kleinere Seitengrößen reduzieren die interne Fragmentierung, erhöhen aber die Anzahl der benötigten Seiten und Seitentabellen.
- Größere Seiten sind oft besser für sekundäre Speichermedien geeignet.
- Die Wahl der Seitengröße beeinflusst die Effizienz des TLB und die Häufigkeit von Page Faults.
Segmentierung
- Ermöglicht dem Entwickler, den Speicher als mehrere logische Adressräume zu betrachten.
- Segmente können unterschiedlich groß und dynamisch sein.
- Speicheradressen bestehen aus Segmentnummer und Offset.
- Vereinfacht die Verwaltung wachsender Datenstrukturen, das unabhängige Kompilieren und den Datenaustausch zwischen Prozessen.
Segmenttabelle
- Enthält die Startadresse des Segments im Hauptspeicher, die Länge sowie Bits für Präsenz, Änderung, Schutz und gemeinsame Nutzung.
Kombination von Paging und Segmentierung
- Jedes Segment kann in Seiten fester Größe unterteilt werden.
- Für jeden Prozess gibt es eine Segmenttabelle und mehrere Seitentabellen.
Schutz und Austausch
- Verwendung eines Schutzring-Modells (Ringschutz).
- Programme können nur auf Daten zugreifen, die im gleichen oder einem weniger privilegierten Ring liegen.
Algorithmen zur Speicherverwaltung
- Performance: Ziel ist die Minimierung des Speicher-Overheads bei Page Faults.
- Lesepolitik: Entscheidung, wann eine Seite geladen wird (z. B. Demand Paging oder Prepaging).
- Platzierungspolitik: Bestimmt, wo ein Teil des Prozesses im Hauptspeicher abgelegt wird.
- Ersetzungspolitik: Wählt die Seite aus, die bei einem neuen Ladevorgang ersetzt werden soll (z. B. Optimal, LRU, FIFO, Clock).
- Frame Lock: Verhindert, dass bestimmte Seiten (z. B. Kernel-Strukturen) aus dem Hauptspeicher verdrängt werden.
Resident Set-Verwaltung
- Das Betriebssystem entscheidet über die Zuteilung der Frames (feste oder variable Zuweisung).
- Umfang des Ersatzes: Global (alle Seiten als Kandidaten) oder Lokal (nur Seiten des eigenen Prozesses).
- Load Control: Steuert den Grad des Multiprogramming, um Thrashing zu vermeiden.
- Prozess-Suspendierung: Wenn der Grad des Multiprogramming reduziert werden muss, werden Prozesse basierend auf Priorität, Status oder Größe gestoppt.