Die Speicherverwaltung (engl. memory management) ist der Teil eines Betriebssystems, der (Teile der) Speicherhierarchie verwaltet. Insbesondere soll sie einen effizienten und komfortablen Zugriff auf den physischen Arbeitsspeicher (Hauptspeicher) eines Computers ermöglichen. In diesem Zusammenhang spricht man auch von der Hauptspeicherverwaltung.Mandl: Grundkurs Betriebssysteme. 4. Aufl. 2014, S. 213. Das Verwalten der höheren Ebenen der Speicherhierarchie wie beispielsweise des Cache-Speichers wird dagegen üblicherweise von der Hardware vorgenommen.

Eine der Schlüsselfunktionen eines Betriebssystems in der Speicherverwaltung ist normalerweise die Bereitstellung eines virtuellen (logischen) Adressraums für jeden Prozess. Man kann sich darunter eine Menge von Speicheradressen vorstellen, auf die Prozesse zugreifen können. Dieser Adressraum ist entkoppelt vom physischen Arbeitsspeicher des Computers – er kann sowohl größer als auch kleiner als dieser sein. Die virtuellen (logischen) Adressen gehen nicht direkt an den Speicherbus, sondern an die Memory Management Unit (MMU, dt. Speicherverwaltungseinheit), welche die virtuellen Adressen auf die physischen Adressen abbildet. Normalerweise lädt das Betriebssystem einen Teil des Adressraumes in den Arbeitsspeicher, ein anderer Teil bleibt auf der Festplatte. Bei Bedarf werden Programmteile zwischen den beiden Speichern hin- und hergeschoben.

Je nach Einsatzbereich des Computers werden zur Speicherverwaltung unterschiedliche Techniken verwendet. In Multiuser-/Multiprogramming-Betriebssystemen nutzt man heute meist die virtuelle Speicherverwaltung mit diversen Optimierungsmöglichkeiten im Demand-Paging-Verfahren.

Speicherhierarchie

mini|Diagramm der Speicherhierarchie Normalerweise werden in einem Rechnersystem unterschiedliche Speichertechnologien eingesetzt. Je kürzer die Zugriffszeiten einer bestimmten Speicherart sind, desto teurer sind diese und desto knapper werden sie bemessen sein. Es wird deshalb versucht, einen Kompromiss aus Geschwindigkeit, Kosten und Persistenz zu finden, indem der Speicher in einer Speicherhierarchie (engl. memory hierarchy) angelegt und versucht wird, durch geschickte Speicherverwaltung die Vorteile der verschiedenen Komponenten zu nutzen und dabei gleichzeitig deren Nachteile zu umschiffen. Es besteht also ein Speicher mit mehreren Stufen, die unterschiedlich „weit“ vom Prozessor entfernt liegen:

Die internen Register der CPU bilden die oberste Schicht der Speicherhierarchie. CPU-Register sind Teil der CPU und verursachen deshalb kaum Zugriffsverzögerungen. Ihre Speicherkapazität ist üblicherweise auf einem 32-Bit-Prozessor und Bit auf einem 64-Bit-Prozessor. CPU-Register werden durch die Software kontrolliert. Der Cache-Speicher ist ein Puffer-Speicher, der vom Prozessor aus direkt zugreifbar ist. Ein Cache enthält Kopien der Hauptspeicherbereiche, die momentan am häufigsten benutzt werden. Da Programme oft verhältnismäßig lange auf einer eng begrenzten Menge von Daten und Code arbeiten, ist der Cache trotz seiner geringen Größe sehr effizient. Der Cache ist also ein relativ kleiner Hochgeschwindigkeitsspeicher, der häufig benötigte Daten zwischen der CPU und dem Hauptspeicher puffert. Heutige CPUs integrieren oft zwei oder mehr Cache-Levels, wodurch der Zugriff nochmals schneller ist. Cache-Speicher werden üblicherweise über die Hardware kontrolliert. mini|Arbeitsspeicher in Form eines ICs auf einem SDRAM-Modul Der Arbeitsspeicher oder Hauptspeicher (engl. main memory oder RAM = random access memory) ist das Arbeitstier des Speichersystems. Er enthält die gerade auszuführenden Programme oder Programmteile und die dabei benötigten Daten. Alle Anfragen des Prozessors, die nicht aus dem Cache beantwortet werden können, werden zum Arbeitsspeicher weitergeleitet. Die gängigsten RAMs sind „flüchtig“, das heißt, die gespeicherten Daten gehen nach Abschaltung der Stromzufuhr verloren. Massenspeicher können große Mengen an Daten dauerhaft speichern. Magnetische Festplatten sind etwa um den Faktor 100 pro Bit billiger als RAM und besitzen zudem meist 100 Mal mehr Kapazität. Dafür dauert der wahlfreie Zugriff etwa 100.000 Mal länger. Zudem können Daten auf der Platte nicht direkt vom Prozessor verarbeitet werden, sondern müssen dazu zuerst in den Hauptspeicher geladen werden. Der Plattenspeicher kann als Ergänzung oder Erweiterung des Hauptspeichers genutzt werden und wird deshalb allgemein auch als Hintergrundspeicher oder Sekundärspeicher (engl. secondary storage) bezeichnet. Hinzu kommen die Wechseldatenträger (z. B. DVD, CD, USB-Stick, Disketten, Magnetband).

Die Speicherverwaltung (engl. memory manager) des Betriebssystems verwaltet diese Speicherhierarchie. Sie verfolgt, welche Speicherbereiche gerade benutzt werden, teilt Prozessen Speicher zu, wenn sie ihn benötigen und gibt ihn anschließend wieder frei.Tanenbaum: Moderne Betriebssysteme. 3. Aufl. 2009, S. 55–59, 228; Carsten Vogt: Betriebssysteme. Spektrum: Heidelberg, Berlin, 2001, S. 131–143.

In allen Ebenen der Speicherhierarchie kann die sog. Lokalitätseigenschaft ausgenutzt werden: Die zeitliche Lokalität besagt, dass Adressbereiche, auf die zugegriffen wird, auch in naher Zukunft mit hoher Wahrscheinlichkeit wieder benutzt werden und die räumliche Lokalität, dass nach einem Zugriff auf einen Adressbereich mit hoher Wahrscheinlichkeit der nächste Zugriff auf eine Adresse in unmittelbarer Nachbarschaft erfolgt. Im zeitlichen Verlauf werden also immer wieder Speicheradressen angesprochen, die sehr nahe beieinander liegen. Dies kann man ausnutzen, indem man bei einem Speicherzugriff auch gleich die benachbarten Adressbereiche in die nächste Hierarchiestufe bringt.

Direkte Speicherverwaltung mini|Blockschaltbild einer Prozessorchipkarte

Das einfachste Verfahren ist, überhaupt keine Speicherabstraktion einzusetzen. Jedes Programm hat einfach den physischen Speicher vor sich: eine Menge von Adressen von 0 bis zu einem gewissen Maximum, wobei jede Adresse einer Zelle zugeordnet ist, die eine bestimmte Anzahl Bits enthält.

Auf Großrechnern, Minirechnern, PCs wird die direkte Adressierung des physischen Speichers heute nicht mehr eingesetzt. Demgegenüber gibt es in vielen eingebetteten Systemen und Smartcards noch immer keine Speicherabstraktion: „Geräte wie Radios, Waschmaschinen und Mikrowellen sind heutzutage voller Software (im ROM) und in den meisten Fällen adressiert die Software absoluten Speicher. Dies funktioniert hier, weil alle Programme im Voraus bekannt sind und die Benutzer nicht einfach ihre eigene Software auf ihrem Toaster laufen lassen dürfen.“Tanenbaum: Moderne Betriebssysteme. 2009, S. 232.

Speicherverwaltung bei Monoprogramming

Im Monoprogramming wird der Arbeitsspeicher nur dem gerade aktiven Programm und dem Betriebssystem zugeteilt. Es wird nur ein Prozess zur gleichen Zeit ausgeführt. Dieser Prozess hat dann exklusiven Zugriff auf den physischen Arbeitsspeicher und kann diesen direkt adressieren. Eine Verwaltung des Speichers ist bei diesen Computern sehr einfach und besteht darin, die angeforderte Adresse über den Datenbus zugänglich zu machen.Mandl: Grundkurs Betriebssysteme. 2014, S. 219.

Auch in diesem einfachsten Speichermodell sind noch mehrere Optionen der Organisation möglich. So kann der Speicher in verschiedene Teile aufgeteilt werden, zum Beispiel: Das Betriebssystem liegt am unteren Rand des Speichers im RAM, das Benutzerprogramm darüber. Dieses Modell wurde früher in Großrechnern und Minicomputern eingesetzt, wird heute aber kaum noch verwendet. Das Betriebssystem liegt am oberen Rand des Speichers im ROM. Dieses Modell wird in einigen PDAs und eingebetteten Systemen benutzt. Die Gerätetreiber liegen oben im ROM und der Rest des Systems liegt unten im RAM. Dieses Modell wurde von frühen PCs (z. B. unter MS-DOS) verwendet.Tanenbaum: Moderne Betriebssysteme. 2009, S. 229.

Mit Hilfe von Swapping können aber auch ohne Speicherabstraktion mehrere Programme gleichzeitig ausgeführt werden: Dazu muss das Betriebssystem den gesamten Inhalt des Arbeitsspeichers auf einer Festplatte ablegen und dann das nächste Programm von der Festplatte holen und im Arbeitsspeicher ausführen.Tanenbaum: Moderne Betriebssysteme. 2009, S. 230.

Speicherverwaltung mit festen Partitionen mini|Ein IBM-System 360/20 im Deutschen Museum, München

Auch bei direkter Speicherverwaltung ist es möglich, mehrere Programme gleichzeitig auszuführen (Multiprogramming-Betrieb), indem der Arbeitsspeicher in feste Teile, sogenannte Partitionen, zerlegt wird. In jeder Partition wird dabei genau ein Programm ausgeführt. Diese Technik wurde beispielsweise im Betriebssystem IBM OS/360 eingesetzt.

Bei dieser Technik musste allerdings verhindert werden, dass die Benutzerprogramme untereinander und mit dem Betriebssystem selbst in Konflikt gerieten. Das eine Programm könnte beispielsweise an einer Speicheradresse einen Wert überschreiben, den das andere Programm zuvor dort abgelegt hat. Dies würde unmittelbar zum Absturz der beiden Programme führen. Deshalb wurde jeder Speicherblock mit einem Schutzschlüssel ausgestattet, der wiederum in einem speziellen CPU-Register gespeichert war. Wenn ein Prozess versuchte, auf den Speicher mit einem Schutzcode zuzugreifen, der sich vom eigenen PSW-Schlüssel (Programmstatuswort) unterschied, wurde ein Systemaufruf ausgelöst.

Swapping

In der Praxis ist die Gesamtmenge an Arbeitsspeicher, die von allen laufenden Prozessen benötigt wird, oft viel größer, als der tatsächlich vorhandene physische Arbeitsspeicher. Somit können nicht mehr alle Prozesse die ganze Zeit im Arbeitsspeicher gehalten werden. Eine einfache Strategie, der Überlastung des Speichers zu begegnen, ist das sogenannte Swapping. Dieser Begriff bezieht sich üblicherweise auf Datenverschiebungen zwischen Arbeitsspeicher und Festplatte. Ein Prozess wird dabei vollständig in den Arbeitsspeicher geladen, darf eine gewisse Zeit laufen, und wird anschließend wieder auf die Festplatte ausgelagert. Indem der Festplattenspeicher ebenfalls verwendet werden kann, um Speicheranfragen von Programmen zu bedienen, können Anfragen, die über das verfügbare RAM hinausgehen, dann über Swap-Speicher bedient werden.Mandl: Grundkurs Betriebssysteme. 2014, S. 220.

Der wesentliche Unterschied zu festen Partitionen ist, dass die Anzahl der Prozesse, die Größe des Speicherplatzes und auch der Speicherort von Prozessen sich verändern können. Ein Prozess wird dahin geladen, wo gerade Platz ist. Es besteht auch die Möglichkeit, dass Prozesse dynamisch wachsen, da Programme beispielsweise dynamisch Speicher auf einem Heap reservieren. Es stellt sich also die Frage, wie viel Speicher für einen Prozess reserviert werden soll. Wenn ein Prozess größer als das reservierte Segment wird, entsteht ein Problem. Falls es neben dem wachsenden Prozess eine Speicherlücke gibt, kann er einfach dort „hineinwachsen“. Andernfalls muss der wachsende Prozess entweder in eine Lücke verschoben werden, die groß genug für ihn ist, oder es müssen Prozesse ausgelagert werden, um eine passende Lücke zu schaffen.Tanenbaum: Moderne Betriebssysteme. 2009, S. 236.

Durch das Swapping können ungenutzte Lücken im Arbeitsspeicher entstehen (Fragmentierung). Solche Lücken können zu einer großen Lücke zusammengefasst werden, indem man alle Prozesse so weit wie möglich im Speicher nach unten schiebt. Dadurch werden alle Lücken zu einer einzigen großen Lücke im oberen Teil des Speichers zusammengefasst. Diese Technik wird Speicherverdichtung genannt. Allerdings ist sie sehr zeitaufwendig, weshalb sie normalerweise nicht eingesetzt wird.

mini|Speicherverwaltung mit Bitmap: Der Hauptspeicher wird in Allokationseinheiten fester Größe eingeteilt. Jede Einheit entspricht einem Bit in der Bitmap. Diese speichert, ob die Allokationseinheit belegt (=1) oder frei (=0) ist.