Betriebssystem - Speicherverwaltung

Speicherverwaltung ist die Funktionalität eines Betriebssystems, das den Primärspeicher verwaltet oder verwaltet und Prozesse während der Ausführung zwischen Hauptspeicher und Festplatte hin und her bewegt. Die Speicherverwaltung verfolgt jeden Speicherort, unabhängig davon, ob er einem Prozess zugeordnet ist oder kostenlos ist. Es wird geprüft, wie viel Speicher Prozessen zugewiesen werden soll. Es entscheidet, welcher Prozess zu welcher Zeit Speicher erhält. Es verfolgt, wann immer Speicher freigegeben oder nicht zugewiesen wird, und aktualisiert entsprechend den Status.

In diesem Tutorial lernen Sie grundlegende Konzepte zur Speicherverwaltung kennen.

Adressraum verarbeiten

Der Prozessadressraum ist der Satz logischer Adressen, auf die ein Prozess in seinem Code verweist. Wenn beispielsweise eine 32-Bit-Adressierung verwendet wird, können die Adressen zwischen 0 und 0x7fffffff liegen. das sind 2 ^ 31 mögliche Zahlen für eine theoretische Gesamtgröße von 2 Gigabyte.

Das Betriebssystem kümmert sich um die Zuordnung der logischen Adressen zu physischen Adressen zum Zeitpunkt der Speicherzuweisung an das Programm. Es gibt drei Arten von Adressen, die in einem Programm vor und nach der Speicherzuweisung verwendet werden:

SN Speicheradressen & Beschreibung
1

Symbolic addresses

Die in einem Quellcode verwendeten Adressen. Die Variablennamen, Konstanten und Anweisungsbezeichnungen sind die Grundelemente des symbolischen Adressraums.

2

Relative addresses

Zum Zeitpunkt der Kompilierung konvertiert ein Compiler symbolische Adressen in relative Adressen.

3

Physical addresses

Der Loader generiert diese Adressen zu dem Zeitpunkt, an dem ein Programm in den Hauptspeicher geladen wird.

Virtuelle und physische Adressen sind in Adressbindungsschemata zur Kompilierungs- und Ladezeit identisch. Virtuelle und physische Adressen unterscheiden sich im Adressbindungsschema zur Ausführungszeit.

Die Menge aller von einem Programm generierten logischen Adressen wird als bezeichnet logical address space. Die Menge aller diesen logischen Adressen entsprechenden physischen Adressen wird als bezeichnetphysical address space.

Die Laufzeitzuordnung von der virtuellen zur physischen Adresse erfolgt durch die Speicherverwaltungseinheit (MMU), bei der es sich um ein Hardwaregerät handelt. Die MMU verwendet den folgenden Mechanismus, um die virtuelle Adresse in eine physische Adresse umzuwandeln.

  • Der Wert im Basisregister wird zu jeder von einem Benutzerprozess generierten Adresse addiert, die zum Zeitpunkt des Sendens an den Speicher als Offset behandelt wird. Wenn der Basisregisterwert beispielsweise 10000 ist, wird ein Versuch des Benutzers, den Adressort 100 zu verwenden, dynamisch dem Ort 10100 neu zugewiesen.

  • Das Anwenderprogramm befasst sich mit virtuellen Adressen; es sieht nie die realen physischen Adressen.

Statisches vs dynamisches Laden

Die Wahl zwischen statischem oder dynamischem Laden muss zum Zeitpunkt der Entwicklung des Computerprogramms getroffen werden. Wenn Sie Ihr Programm statisch laden müssen, werden zum Zeitpunkt der Kompilierung die vollständigen Programme kompiliert und verknüpft, ohne dass eine externe Programm- oder Modulabhängigkeit verbleibt. Der Linker kombiniert das Objektprogramm mit anderen notwendigen Objektmodulen zu einem absoluten Programm, das auch logische Adressen enthält.

Wenn Sie ein dynamisch geladenes Programm schreiben, kompiliert Ihr Compiler das Programm. Für alle Module, die Sie dynamisch einschließen möchten, werden nur Referenzen bereitgestellt und der Rest der Arbeit wird zum Zeitpunkt der Ausführung ausgeführt.

Zum Zeitpunkt des Ladens mit static loadingwird das absolute Programm (und die Daten) in den Speicher geladen, damit die Ausführung beginnen kann.

Wenn Sie verwenden dynamic loadingDynamische Routinen der Bibliothek werden in verschiebbarer Form auf einer Festplatte gespeichert und nur dann in den Speicher geladen, wenn sie vom Programm benötigt werden.

Statische und dynamische Verknüpfung

Wie oben erläutert, kombiniert der Linker bei Verwendung der statischen Verknüpfung alle anderen Module, die von einem Programm benötigt werden, zu einem einzigen ausführbaren Programm, um Laufzeitabhängigkeiten zu vermeiden.

Wenn die dynamische Verknüpfung verwendet wird, muss das eigentliche Modul oder die Bibliothek nicht mit dem Programm verknüpft werden. Zum Zeitpunkt der Kompilierung und Verknüpfung wird lediglich ein Verweis auf das dynamische Modul bereitgestellt. Dynamic Link Libraries (DLL) in Windows und Shared Objects in Unix sind gute Beispiele für dynamische Bibliotheken.

Tauschen

Das Auslagern ist ein Mechanismus, bei dem ein Prozess vorübergehend aus dem Hauptspeicher (oder dem Verschieben) in den Sekundärspeicher (Festplatte) ausgelagert werden kann und diesen Speicher anderen Prozessen zur Verfügung stellt. Zu einem späteren Zeitpunkt tauscht das System den Prozess vom sekundären Speicher in den Hauptspeicher zurück.

Die Leistung wird normalerweise durch den Austauschprozess beeinträchtigt, hilft jedoch dabei, mehrere und große Prozesse parallel auszuführen, und das ist der Grund Swapping is also known as a technique for memory compaction.

Die Gesamtzeit, die der Austauschprozess benötigt, umfasst die Zeit, die benötigt wird, um den gesamten Prozess auf eine sekundäre Festplatte zu verschieben und den Prozess dann wieder in den Speicher zu kopieren, sowie die Zeit, die der Prozess benötigt, um den Hauptspeicher wiederzugewinnen.

Nehmen wir an, dass der Benutzerprozess eine Größe von 2048 KB hat und auf einer Standardfestplatte, auf der der Austausch stattfindet, eine Datenübertragungsrate von etwa 1 MB pro Sekunde aufweist. Die eigentliche Übertragung des 1000K-Prozesses in oder aus dem Speicher dauert

2048KB / 1024KB per second
= 2 seconds
= 2000 milliseconds

Wenn man nun die Ein- und Aus-Zeit berücksichtigt, dauert es komplette 4000 Millisekunden plus anderen Overhead, wenn der Prozess um die Wiederherstellung des Hauptspeichers konkurriert.

Speicherzuweisung

Der Hauptspeicher besteht normalerweise aus zwei Partitionen -

  • Low Memory - Das Betriebssystem befindet sich in diesem Speicher.

  • High Memory - Benutzerprozesse werden in einem hohen Speicher gehalten.

Das Betriebssystem verwendet den folgenden Speicherzuweisungsmechanismus.

SN Speicherzuordnung & Beschreibung
1

Single-partition allocation

Bei dieser Art der Zuordnung wird das Verschiebungsregisterschema verwendet, um Benutzerprozesse voreinander und vor dem Ändern von Betriebssystemcode und -daten zu schützen. Das Verschiebungsregister enthält den Wert der kleinsten physischen Adresse, während das Grenzregister den Bereich der logischen Adressen enthält. Jede logische Adresse muss kleiner als das Grenzregister sein.

2

Multiple-partition allocation

Bei dieser Art der Zuordnung ist der Hauptspeicher in mehrere Partitionen fester Größe unterteilt, wobei jede Partition nur einen Prozess enthalten sollte. Wenn eine Partition frei ist, wird ein Prozess aus der Eingabewarteschlange ausgewählt und in die freie Partition geladen. Wenn der Prozess beendet wird, wird die Partition für einen anderen Prozess verfügbar.

Zersplitterung

Wenn Prozesse geladen und aus dem Speicher entfernt werden, wird der freie Speicherplatz in kleine Teile zerlegt. Es kommt manchmal vor, dass Prozesse aufgrund ihrer geringen Größe nicht Speicherblöcken zugeordnet werden können und Speicherblöcke nicht verwendet werden. Dieses Problem wird als Fragmentierung bezeichnet.

Es gibt zwei Arten der Fragmentierung:

SN Fragmentierung & Beschreibung
1

External fragmentation

Der gesamte Speicherplatz reicht aus, um eine Anforderung zu erfüllen oder einen Prozess darin zu speichern. Er ist jedoch nicht zusammenhängend und kann daher nicht verwendet werden.

2

Internal fragmentation

Der dem Prozess zugewiesene Speicherblock ist größer. Ein Teil des Speichers bleibt ungenutzt, da er nicht von einem anderen Prozess verwendet werden kann.

Das folgende Diagramm zeigt, wie Fragmentierung zu Speicherverschwendung führen kann, und eine Komprimierungstechnik kann verwendet werden, um aus fragmentiertem Speicher mehr freien Speicher zu erstellen.

Die externe Fragmentierung kann durch Komprimieren oder Mischen von Speicherinhalten reduziert werden, um den gesamten freien Speicher in einem großen Block zusammenzufassen. Um eine Verdichtung zu ermöglichen, sollte die Verlagerung dynamisch sein.

Die interne Fragmentierung kann reduziert werden, indem die kleinste Partition effektiv zugewiesen wird, die jedoch groß genug für den Prozess ist.

Paging

Ein Computer kann mehr Speicher adressieren als physisch auf dem System installiert ist. Dieser zusätzliche Speicher wird eigentlich als virtueller Speicher bezeichnet und ist ein Abschnitt eines Hard, der so eingerichtet ist, dass er den RAM des Computers emuliert. Die Paging-Technik spielt eine wichtige Rolle bei der Implementierung des virtuellen Speichers.

Paging ist eine Speicherverwaltungstechnik, bei der der Prozessadressraum in Blöcke derselben Größe unterteilt wird pages(Größe ist Potenz von 2, zwischen 512 Bytes und 8192 Bytes). Die Größe des Prozesses wird in der Anzahl der Seiten gemessen.

In ähnlicher Weise ist der Hauptspeicher in kleine (physische) Speicherblöcke fester Größe unterteilt, die aufgerufen werden frames und die Größe eines Rahmens wird gleich der einer Seite gehalten, um den Hauptspeicher optimal zu nutzen und eine externe Fragmentierung zu vermeiden.

Adressübersetzung

Seitenadresse wird aufgerufen logical address und vertreten durch page number und die offset.

Logical Address = Page number + page offset

Frame-Adresse wird aufgerufen physical address und vertreten durch a frame number und die offset.

Physical Address = Frame number + page offset

Eine Datenstruktur namens page map table wird verwendet, um die Beziehung zwischen einer Seite eines Prozesses und einem Frame im physischen Speicher zu verfolgen.

Wenn das System einer Seite einen Frame zuweist, übersetzt es diese logische Adresse in eine physische Adresse und erstellt einen Eintrag in die Seitentabelle, der während der Ausführung des Programms verwendet wird.

Wenn ein Prozess ausgeführt werden soll, werden die entsprechenden Seiten in alle verfügbaren Speicherrahmen geladen. Angenommen, Sie haben ein Programm von 8 KB, aber Ihr Speicher kann zu einem bestimmten Zeitpunkt nur 5 KB aufnehmen, dann wird das Paging-Konzept ins Bild gesetzt. Wenn einem Computer der Arbeitsspeicher ausgeht, verschiebt das Betriebssystem (OS) inaktive oder unerwünschte Speicherseiten in den Sekundärspeicher, um RAM für andere Prozesse freizugeben, und bringt sie zurück, wenn dies vom Programm benötigt wird.

Dieser Vorgang wird während der gesamten Programmausführung fortgesetzt, wobei das Betriebssystem weiterhin inaktive Seiten aus dem Hauptspeicher entfernt, in den Sekundärspeicher schreibt und bei Bedarf vom Programm zurückbringt.

Vor- und Nachteile von Paging

Hier ist eine Liste der Vor- und Nachteile von Paging -

  • Paging reduziert die externe Fragmentierung, leidet jedoch immer noch unter interner Fragmentierung.

  • Paging ist einfach zu implementieren und wird als effiziente Speicherverwaltungstechnik angenommen.

  • Aufgrund der gleichen Größe der Seiten und Rahmen wird das Austauschen sehr einfach.

  • Die Seitentabelle benötigt zusätzlichen Speicherplatz und ist daher möglicherweise nicht für ein System mit kleinem RAM geeignet.

Segmentierung

Die Segmentierung ist eine Speicherverwaltungstechnik, bei der jeder Job in mehrere Segmente unterschiedlicher Größe unterteilt wird, eines für jedes Modul, das Teile enthält, die verwandte Funktionen ausführen. Jedes Segment ist tatsächlich ein anderer logischer Adressraum des Programms.

Wenn ein Prozess ausgeführt werden soll, wird seine entsprechende Segmentierung in einen nicht zusammenhängenden Speicher geladen, obwohl jedes Segment in einen zusammenhängenden Block des verfügbaren Speichers geladen wird.

Die Segmentierungsspeicherverwaltung funktioniert sehr ähnlich wie Paging, aber hier haben Segmente eine variable Länge, während Seiten wie bei Paging eine feste Größe haben.

Ein Programmsegment enthält die Hauptfunktion des Programms, Dienstprogrammfunktionen, Datenstrukturen usw. Das Betriebssystem verwaltet asegment map tablefür jeden Prozess und eine Liste der freien Speicherblöcke zusammen mit den Segmentnummern, ihrer Größe und den entsprechenden Speicherplätzen im Hauptspeicher. In der Tabelle werden für jedes Segment die Startadresse des Segments und die Länge des Segments gespeichert. Ein Verweis auf einen Speicherort enthält einen Wert, der ein Segment und einen Versatz identifiziert.