3.3.2.2.3 Seitenersetzungsverfahren

[gesichtete Version][gesichtete Version]
Zeile 1: Zeile 1:
=Seitenersetzungsverfahren=
=Seitenersetzungsverfahren=
<p>
Tritt bei der Adressumrechnung in der MMU ein Seitenfehler (Page fault) auf, so muss das Betriebssystem dafür sorgen, dass die benötigte virtuelle Seite aus dem Hintergrundspeicher in einen freien Seitenrahmen des physikalischen Speichers eingelagert wird.
</p>


<p>
Steht derzeit aber kein freier Seitenrahmen zur Verfügung, so ist es die Aufgabe des implementierten Seitenersetzungsverfahrens zu entscheiden, welche momentan eingelagerte virtuelle Seite in den Hintergrundspeicher verschoben wird. Dadurch wird dann (mindestens) ein freier Seitenrahmen geschaffen, die benötigte virtuelle Seite kann eingelagert werden, und die MMU kann die zuvor gescheiterte Adressumrechnung erneut durchführen.
</p>
<p>
<loop_index>Verdrängungsstrategie</loop_index>
Statt des im vorstehenden Absatz erwähnten Begriffs ''verschoben'' findet oftmals auch das Verb ''verdrängt'' in gängiger Literatur seine Anwendung. Man spricht hier dann auch von einer '''Verdrängungsstrategie''' und meint damit wieder ein Seitenersetzungsverfahren.
</p>
<br />
<p>
<loop_area type="notice">
<p>
Für das Verständnis der folgenden Erläuterungen ist es wichtig, sich über die hier verwendeten Begriffe im Klaren zu sein. Es wird unterschieden zwischen:</p>
<p>
* (virtuelle) Seite
* Seitenrahmen
* eingelagerte Seite
* benötigte Seite
* zu ersetzende Seite
* modifizierte Seite
</p>
<p>
Falls erforderlich gibt es hier noch einige
<spoiler text="Hinweise">
<p>
* (virtuelle) Seite:<br />Eine beliebige virtuelle Seite.
</p>
<p>
* Seitenrahmen:<br />Ein beliebiger Seitenrahmen des physikalischen Speichers.
</p>
<p>
* eingelagerte Seite:<br />Ein virtuelle Seite, deren Inhalt derzeit in einem Seitenrahmen des physikalischen Speichers vorgehalten wird.
</p>
<p>
* ausgelagerte Seite:<br />Ein virtuelle Seite, deren Inhalt derzeit '''nicht''' in einem Seitenrahmen des physikalischen Speichers vorgehalten wird.
</p>
<p>
* benötigte Seite:<br />Ein virtuelle Seite, die (wegen des aufgetretenen Seitenfehlers) '''nicht''' eingelagert ist. Sie ist der Grund für den aufgetretenen Page fault (Seitenfehler), und damit auch für den Aufruf des Seitenersetzungsverfahrens.
</p>
<p>
* zu ersetzende Seite:<br />Ein virtuelle Seite, die derzeit eingelagert ist, und deren zugehöriger Seitenrahmen durch das angewendete Seitenersetzungsverfahren für eine andere (derzeit ausgelagerte) virtuelle Seite vorgesehen ist.
</p>
<p>
* modifizierte Seite:<br />Ein virtuelle Seite, die derzeit eingelagert ist, und deren Inhalt durch die jüngst von der CPU verarbeiteten Befehle verändert wurde.
</p>
</spoiler>
</p>
</loop_area>
</p>
<br />
== Was bei der Seitenersetzung passiert ==
<p>
Eine einfache Beschreibung des Ablaufs einer Seitenersetzung ist wie folgt:
</p>
<p>
# Die MMU stellt fest, dass die benötigte virtuelle Seite B nicht in einem Seitenrahmen eingelagert ist und löst deshalb einen Seitenfehler aus.
# Es wird festgestellt, dass kein freier Seitenrahmen mehr verfügbar ist, das Seitenersetzungsverfahren wird deshalb gestartet.
# Die zu ersetzende Seite E wird bestimmt, sie ist derzeit in Seitenrahmen X eingelagert.
# Die zu ersetzende Seite E wird in den Hintergrundspeicher geschrieben. Damit ist ihr Inhalt gesichert, sie kann später wieder eingelagert werden.
# Die benötigte Seite B wird eingelagert, d.h. ihr Inhalt wird in den Seitenrahmen X geschrieben. Das Ersetzungsverfahren ist damit abgeschlossen.
</p>
<br />
<p>
<loop_area type="important">
<p>
Das Schreiben der zu ersetzenden Seite E in den Hintergrundspeicher kostet viel Zeit! Das ist schlecht für die Performance des Gesamtsystems.</p>
</loop_area>
</p>
<br />
<p>
Es ist deshalb sinnvoll, eine zu ersetzende Seite nur dann in den Hintergrundspeicher zu kopieren, wenn dies auch tatsächlich notwendig ist.
</p>
<p>
Eine Seite kann beispielsweise den Programmtext oder die Daten eines Prozesses enthalten.
</p>
<br />
== Aufgabe 1 ==
<p>
<loop_area type="task">
<loop_task title="Wenn eine Seite Programmtext enthält">
<p>
Eine zu ersetzende Seite enthält lediglich Programmtext (also den ausführbaren Maschinencode mit den Befehlen) eines Prozesses. Diese Inhalte dürfen während der Ausführung des zugehörigen Prozesses nicht verändert werden.
</p>
<p>
Ist es erforderlich, diese Seite in den Hintergrundspeicher auszulagern, oder kann die dafür benötigte Zeit eingespart werden? Erläutere deine Antwort!
</p>
</loop_task>
</loop_area>
</p>
<br />
== Aufgabe 2 ==
<p>
<loop_area type="task">
<loop_task title="Wenn eine Seite Daten enthält">
<p>
Eine zu ersetzende Seite enthält Daten. Diese Daten können verändert worden sein, sie können aber auch noch unverändert sein.
</p>
<p>
Ist es erforderlich, diese Seite in den Hintergrundspeicher auszulagern, oder kann die dafür benötigte Zeit eingespart werden? Erläutere deine Antwort!
</p>
<p>
Betrachte folgende Situationen:
# Die Inhalte der Seite '''wurden verändert''', weil Werte in Speicherzellen des dieser Seite zugeordneten Seitenrahmens geschrieben wurden.<br /><br />
# Die Inhalte der Seite '''wurden nicht verändert''', zudem befindet sich eine Kopie der Seite im Hintergrundspeicher, weil sie zu einem früheren Zeitpunkt bereits einmal ausgelagert war.
</p>
</loop_task>
</loop_area>
</p>
<br />
== Auslagern von modifizierten Seiten ==
<p>
Es liegt auf der Hand, dass modifizierte Seiten nicht einfach ersetzt werden dürfen, bevor sie nicht im Hintergrundspeicher gesichert wurden. Ihre Inhalte wären andernfalls verloren, was negative Auswirkungen auf den betreffenden Prozess nach sich ziehen dürfte. Insbesondere könnten sie zu einem späteren Zeitpunkt nicht wieder eingelagert werden.
</p>
<br />
<p>
<loop_area type="question">
<p>
Wie kann das Betriebssystem aber feststellen, ob die Inhalte einer derzeit noch eingelagerten Seite modifiziert wurden, und so eine Auslagerung vor dem Ersetzen erforderlich wird?
</p>
</loop_area>
</p>
<p>
Es gibt dafür eine ganz einfache Lösung: Das M-Bit.
</p>
<br />
== Das Modifiziert-Bit ==
<p>
In den Seitentabellen wird eine zusätzliche Spalte eingeführt, siehe Abbildung unten. Für jede einzelne Seite (d.h. in jedem Seitentabelleneintrag) wird mit Hilfe eines einzelnen Bits festgehalten, ob die betreffende Seite verändert wurde.
</p>
<p>
<loop_index>Modifiziert-Bit|Seitentabelleneintrag, Modifiziert-Bit|M-Bit|Seitentabelleneintrag, M-Bit|Dirty-Bit</loop_index>
Man spricht hier vom sogenannten '''Modifiziert-Bit''', oder kurz vom '''M-Bit''' (in einigen Quellen ist auch vom '''Dirty-Bit''' die Rede).
</p>
<p>
* Das M-Bit ist gesetzt, also 1:<br />Der Inhalt der Seite wurde modifiziert.
</p>
<p>
* Das M-Bit ist nicht gesetzt, also 0:<br />Der Inhalt der Seite wurde nicht modifiziert.
</p>
<br />
<p>
<loop_figure title="Seitentabelle mit zusätzlicher Spalte für M-Bit" description="" copyright="CC-BY" index=true show_copyright=true>
[[Datei:Seitentabelle-M.JPG]]
</loop_figure>
</p>
<br />
<p>
Die MMU nimmt bei der (erfolgreichen) Umrechnung einer virtuellen in eine physikalische Adresse ein Setzen des Bits im betreffenden Eintrag der Seitentabelle vor, sofern ein schreibender Zugriff auf die betreffende Speicherzelle erfolgen soll.
</p>
<br />
<p>
<loop_area type="notice">
<p>
Ist das M-Bit einer zu ersetzenden Seite gesetzt (also gleich 1), so muss der Inhalt dieser Seite aus dem Seitenrahmen in den Hintergrundspeicher geschrieben werden.
</p>
</loop_area>
</p>
<br />
== Seitenersetzungsverfahren ==
<p>
<p>
In der [[Seitenersetzungsverfahren#Was_bei_der_Seitenersetzung_passiert|obigen Auflistung]] findet sich u.a. der Punkt "''Die zu ersetzende Seite E wird bestimmt,...''", und es stellt sich die Frage:
In der [[Seitenersetzungsverfahren#Was_bei_der_Seitenersetzung_passiert|obigen Auflistung]] findet sich u.a. der Punkt "''Die zu ersetzende Seite E wird bestimmt,...''", und es stellt sich die Frage:

Version vom 7. Februar 2015, 13:20 Uhr

Seitenersetzungsverfahren

In der obigen Auflistung findet sich u.a. der Punkt "Die zu ersetzende Seite E wird bestimmt,...", und es stellt sich die Frage:

Frage

Wie wird die zu ersetzende Seite bestimmt?


Diese Aufgabe wird von einem sogenannten Seitenersetzungsalgorithmus erledigt.

Im Laufe der Entwicklungsgeschichte von Betriebssystemen wurden eine ganze Reihe verschiedener Seitenersetzungsverfahren (oder Verdrängungsstrategien) vorgeschlagen bzw. implementiert, u.a.:

  • Optimaler Algorithmus
  • NRU - Not Recently Used Algorithmus
  • FIFO - First In First Out Algorithmus
  • Second Chance Algorithmus
  • Clock Page Algorithmus
  • LRU - Least Recently Used Algorithmus
  • NFU - Not Frequently Used Algorithmus
  • Working Set Algorithmus


Hinweis

Weiterführende Literatur

Mandl 2013 erläutert die genannten Algorithmen in den Kapiteln 7.2.3 und 7.2.4. Die Lektüre dieser Quelle sei ausdrücklich empfohlen.

Studierende sind oftmals berechtigt, eine PDF-Version dieses Buches ohne entstehende Kosten über ihre Hochschulen von Springerlink zu beziehen.


Einige der genannten Algorithmen werden auf den folgenden Seiten behandelt. Die ausführlichere Besprechung aller Verfahren leistet jedoch nur die weiterführende Literatur.


Hinweis

Beim Durcharbeiten der genannten Kapitel bei Mandl 2013 kann man sehr schön die Evolution der Algorithmen verfolgen. D.h. ein späteres Verfahren beruht sehr oft auf einem vorangegangenen Verfahren, wobei jedoch ein vorheriger Nachteil verbessert wurde.
Achte mal darauf!


So geht es weiter:


Aufgabe 3

Aufgabe

In diesem Kapitel wird beschrieben, dass ein Seitenersetzungsverfahren zum Einsatz kommt, wenn bei der Umrechnung einer virtuellen Adresse in eine physikalische Adresse auf der MMU ein Seitenfehler (page fault) ausgelöst wird.

Was ist jedoch im anderen Fall:
Eine virtuelle Adresse kann von der MMU erfolgreich in eine physikalische Adresse umgerechnet werden, es tritt also kein Seitenfehler auf.

Kommt dann auch ein Seitenersetzungsverfahren zum Einsatz?



Diese Seite steht unter der Creative Commons Namensnennung 3.0 Unported Lizenz http://i.creativecommons.org/l/by/3.0/80x15.png