Hauptseite Zu yanwittmann.de

Zur Hauptseite

<     4. Speicherverwaltung     >

Software >> Betriebssysteme


Das Betriebssystem versucht die für die Prozesse nötigen Daten immer im Hauptspeicher zu haben, da die Zugriffszeit dort sehr viel kleiner ist, als auf der Festplatte. Dieser ist jedoch nicht beliebig groß, daher müssen einige Strategien befolgt werden, um Prozesse ein- und auszulagern. Solange die für den Prozess benötigten Daten nicht eingelagert sind, kann der Prozess nicht ausgeführt werden.


Swapping (≠ ㅂ≋!)

Hier werden Prozesse komplett aus- und eingelagert. Hierzu wird auf der Festplatte ein bestimmter Bereich reserviert, der sog. „Swap-space”. Ein Prozess wird ausgelagert, wenn:



Hierbei kann es zu kleinen, ungenutzten Bereichen im Hauptspeicher kommen, da die Prozesse nicht immer die vorhandenen „Lücken” komplett ausfüllen:


Virtueller Speicher

Hauptspeicher und externer Speicher (z.B. Festplatte) werden so vereint, dass sie wie ein einzelner, großer Speicher wirken. Es gibt hier mehr Adressen, als es im Hauptspeicher gibt, daher wird dieser Speicher „Virtueller Speicher” genannt.
Der Prozess wird in mehrere Teile aufgeteilt. Der Teil des Prozesses, der gerade benötigt wird, steht im Hauptspeicher, der Rest wird ausgelagert. Es kann also auch nur ein Teil des Prozesses im Hauptspeicher stehen.
Wenn der Prozess auf einen Teil zugreift, der aktuell auf der Festplatte liegt, muss dieser erst eingelagert werden. Dies übernimmt die MMU (Memory Management Unit = Speicherverwaltungseinheit): Sie weiß, ob ein Teil ein- oder ausgelagert ist. Wenn auf einen nicht eingelagerten Teil zugegriffen wird, wird dieser eingelagert und die Adresse in der MMU aktualisiert.
So müssen sich die Programme keine Gedanken machen, wo die einzulesende/beschreibende Adresse liegt, sondern sie können eine virtuelle Adresse verwenden, die immer gleich bleibt, während die MMU die dazugehörigen realen, sich verändernden Adressen im Hintergrund passend verwaltet.
Dies hat mehrere Vorteile: Die Größe des Prozesses ist nicht auf die des Hauptspeichers begrenzt und es können mehrere Programme gleichzeitig ausgeführt werden, die in ihrer Gesamtlänge den Hauptspeicher überschreiten würden.


Es gibt zwei verschiedene Möglichkeiten, diese Variante zu implementieren:

Segmentorientierter Speicher

Der Adressraum wird hier in Abschnitte (Segmente) variabler Größe eingeteilt, die den logischen Einheiten des Prozesses entsprechen, z.B: Quelltext, Konstanten oder die Symboltabelle. Diese besitzen je eine Segmentnummer, welche in einer Segmenttabelle verwaltet werden. Diese Tabelle enthält für jedes Segment folgende Attribute:

                         
RechteLängeValid Bitreelle Anfangsadresse

Die Rechte beschreiben, auf welche Art auf das Segment zugegriffen werden darf, die Länge beschreibt die Länge des Segments, das Valid Bit sagt aus, ob sich das Segment bereits im Hauptspeicher befindet (1 = ja; 0 = nein) und die reelle Anfangsadresse ist, wenn es sich im Hauptspeicher befindet, die Startadresse des Segments im Hauptspeicher; wenn es nicht im Hauptspeicher ist, dann sagt es aus, wo es auf der Festplatte zu finden ist.

Die virtuelle Adresse, also die, die der Prozess anfordert, besteht aus der Segmentnummer und dem Offset innerhalb des Segments.
Ein kompletter Zugriff auf eine virtuelle Adresse sieht folgendermaßen aus:

  1. Zunächst muss überprüft werden, ob sich die Rechte mit denen vereinen, mit denen auf das Segment zugegriffen wird (z.B. Schreiben, Lesen).
  2. Wenn der Offset größer ist als die Länge des Segments, so befindet sich Adresse nicht mehr im Segment und ein Fehler wird ausgegeben.
  3. Wenn das Valid Bit nicht gesetzt ist, so muss das Segment erst noch eingelagert werden. Eventuell muss hierfür ein anderes Segment ausgelagert werden, wenn nicht genügend Platz vorhanden ist. Die neuen reelle Anfangsadressen werden dann im Seitentabelleneintrag aktualisiert.
  4. Die reelle Adresse wird berechnet, indem die Anfangsadresse des Segments plus das Offset gerechnet wird.

                                               
VorteileNachteile
Segmente lassen sich individuell mit Rechten schützenMöglicherweise sehr große Segmente, die zusammenhängend gespeichert werden müssen
Segmente können dynamisch größer und kleiner werdenBei Zugriff auf Segment muss ganzes Segment eingelesen werden, obwohl vielleicht nur ein kleiner Teil benötigt wird


Seitenorientierter Speicher (Paging)

Der virtuelle und physische Speicher wird beim Paging in gleich große, je zusammenhängende Teile  eingeteilt. Die virtuellen Teile werden Seiten genannt, die physischen Seitenrahmen / Pageframes / Kacheln / Tiles. Um Seiten und Seitenrahmen zueinander zuordnen zu können, wird, ähnlich wie bei dem segmentorientieren Speicher, eine Seitentabelle (Page Table) verwendet. Jeder Prozess besitzt eine solche Tabelle. Die virtuelle Adresse besteht auch hier aus Seitennummer und Offset.
Ein Beispiel zur Adressberechnung:

Natürlich muss, wie beim Segmentorientieren, überprüft werden, ob die Zugriffsrechte stimmen, die Länge überschritten wurde und ob das Valid Bit gesetzt ist (wenn nicht: Seite einlesen, Adressen aktualisieren und weitermachen).

                                                               
VorteileNachteile
Einfachheit:  Alle Seiten haben die gleiche Länge, es treten keine Verschnittprobleme  auf. Die Seiten können beliebig ausgetauscht werdenStruktur des virtuellen Speichers spiegelt nicht den logischen Aufbau wieder
(alle Daten durcheinander; nicht in Segmente eingeteilt)
Es müssen nicht große Teile eingelesen werden, wenn nur ein kleiner von diesen gebraucht wirdSpeicherplatz wird womöglich verschwendet, wenn eine Seite nicht komplett voll beschrieben wird
Hoher Speicherbedarf für die Seitentabellen