Speicherverwaltung
Speicherverwaltung ist eine Form von Resourcenmanagement angewendet Computerspeicher. Die wesentliche Voraussetzung für die Speicherverwaltung besteht darin, Wege zu bieten, um Programmen auf Anfrage dynamisch Teile des Speichers zuzuweisen, und es zur Wiederverwendung freizugeben, wenn sie nicht mehr benötigt werden. Dies ist für jedes fortschrittliche Computersystem von entscheidender Bedeutung, bei dem mehr als ein einzelne Prozess könnte jederzeit im Gange sein.[1]
Es wurden verschiedene Methoden entwickelt, die die Wirksamkeit des Gedächtnismanagements erhöhen. Virtueller Speicher Systeme trennen die Speicheradressen Wird durch einen Prozess aus tatsächlichen physischen Adressen verwendet, das Trennung von Prozessen ermöglicht und die Größe der Größe erhöht Virtueller Adressraum über die verfügbare Menge an hinaus RAM Verwendung Paging oder tauschen sich gegen Zweitlager. Die Qualität des virtuellen Speichermanagers kann sich umfangreiche Auswirkungen auf das Gesamtsystem haben Leistung.
In einigen Betriebssysteme, z.B. OS/360 und Nachfolger,[2] Der Speicher wird vom Betriebssystem verwaltet.[Anmerkung 1] In anderen Betriebssystemen, z. Unix-artig Betriebssysteme, der Speicher wird auf Anwendungsebene verwaltet.
Die Speicherverwaltung innerhalb eines Adressraums wird im Allgemeinen als beide kategorisiert Manuellem Speichermanagement oder Automatische Speicherverwaltung.
Manuellem Speichermanagement
Die Aufgabe, eine Zuordnungsanforderung zu erfüllen, besteht darin, einen Block mit ungenutzter Speicher für ausreichende Größe zu finden. Speicheranforderungen werden durch die Zuweisung von Teilen aus einem großen Pool erfüllt[Anmerkung 2] des Gedächtnisses genannt das Haufen[Notiz 3] oder Kostenloser Laden. Zu jedem Zeitpunkt werden einige Teile des Haufens verwendet, während einige "frei" (nicht genutzt) sind und somit für zukünftige Zuteilungen verfügbar sind.
Mehrere Probleme erschweren die Implementierung, wie z. externe Fragmentierung, was entsteht, wenn es viele kleine Lücken zwischen zugewiesenen Speicherblöcken gibt, die ihre Verwendung für eine Zuordnungsanforderung ungültig machen. Der Allocator des Allocators Metadaten kann auch die Größe von (einzeln) kleinen Zuteilungen aufblasen. Dies wird oft von verwaltet von Chunking. Das Speicherverwaltungssystem muss ausstehende Zuteilungen verfolgen, um sicherzustellen, dass es sich nicht überlappt und dass kein Speicher jemals "verloren" ist (d. H. Dass es keine gibt. "Speicherlecks").
Effizienz
Der implementierte spezifische Algorithmus für dynamische Speicherzuordnungen kann die Leistung erheblich beeinflussen. Eine 1994 durchgeführte Studie von Digital Equipment Corporation illustriert die Gemeinkosten für eine Vielzahl von Allokatoren beteiligt. Der niedrigste Durchschnitt Anweisungspfadlänge erforderlich, um einen einzelnen Speicherschlitz zuzuweisen, betrug 52 (gemessen mit einem Anweisungsniveau Profiler auf einer Vielzahl von Software).[1]
Implementierungen
Da der genaue Ort der Allokation im Voraus nicht bekannt ist, wird auf den Speicher indirekt zugegriffen, normalerweise über a Zeiger Hinweis. Der spezifische Algorithmus, der zum Organisieren des Speicherbereichs und zur Zuordnung und Handlungsböcken verwendet wird, ist mit dem verknüpft Kernelund kann eine der folgenden Methoden verwenden:
Blöcke mit fester Größe zu Allokation
Die Allokation mit fester Größe, die auch als Speicherpool-Allokation bezeichnet wird, verwendet a Kostenlose Liste von Speicherblöcken mit fester Größe (oft alle gleicher Größe). Das funktioniert gut für einfach eingebettete Systeme wo keine großen Objekte zugewiesen werden müssen, aber darunter leiden müssen Zersplitterungbesonders mit langen Speicheradressen. Aufgrund des signifikant reduzierten Aufwand kann diese Methode jedoch die Leistung für Objekte erheblich verbessern Videospiele.
Kumpelblöcke
In diesem System wird der Speicher in mehrere Speicherpools anstelle von nur einem zugeordnet, wobei jeder Pool Speicherblöcke eines bestimmten Kraft von zwei Größe oder Blöcke eines anderen bequemen Größenverlaufs. Alle Blöcke einer bestimmten Größe werden in einem sortierten gehalten verlinkte Liste oder Baum und alle neuen Blöcke, die während der Zuordnung gebildet werden, werden ihren jeweiligen Speicherpools für die spätere Verwendung hinzugefügt. Wenn eine kleinere Größe angefordert wird als verfügbar, wird die kleinste verfügbare Größe ausgewählt und geteilt. Eines der resultierenden Teile wird ausgewählt und der Vorgang wiederholt sich, bis die Anforderung abgeschlossen ist. Wenn ein Block zugewiesen wird, beginnt der Allocator mit dem kleinsten großen Block, um unnötig brechen Blöcke zu vermeiden. Wenn ein Block befreit wird, wird er mit seinem Kumpel verglichen. Wenn sie beide frei sind, werden sie kombiniert und in die entsprechend größere Kumpel-Block-Liste platziert.
Plattenallokation
Dieser Speicherzuweisungsmechanismus poliert Speicherbrocken, die für die Anpassung von Objekten eines bestimmten Typs oder einer bestimmten Größe geeignet sind.[3] Diese Brocken werden als Caches bezeichnet und der Allocator muss nur eine Liste kostenloser Cache -Slots im Auge behalten. Das Erstellen eines Objekts verwendet einen der kostenlosen Cache -Slots, und das Zerstören eines Objekts fügt der kostenlosen Cache -Slot -Liste einen Steckplatz zurück. Diese Technik lindert die Gedächtnisfragmentierung und ist effizient, da nicht nach einem geeigneten Teil des Speichers gesucht werden muss, da jeder offene Steckplatz ausreicht.
Stapelzuweisung
Viele Unix-artig Systeme sowie Microsoft Windows Implementieren Sie eine Funktion genannt alloca
zum dynamischen Zuordnen des Stack-Speichers auf ähnliche Weise wie die heap-basierten malloc
. Ein Compiler übersetzt ihn normalerweise in eingeleitete Anweisungen, die den Stapelzeiger manipulieren.[4] Obwohl es nicht erforderlich ist, das Speicher auf diese Weise manuell zu befreien, wie es automatisch befreit wird, wenn die Funktion aufgerufen wird alloca
Renditen, es besteht ein Überlaufrisiko. Und da Alloca ein ist ad hoc Expansion in vielen Systemen, aber nie in POSIX oder im C -Standard, sein Verhalten bei einem Stapelüberlauf ist undefiniert.
Eine sicherere Version von Alloca rief an _malloca
, die Fehler meldet, gibt es unter Microsoft Windows. Es erfordert die Verwendung von _freea
.[5] Gnulib Bietet eine äquivalente Schnittstelle, wenn auch anstatt eine SEH -Ausnahme auf den Überlauf zu werfen, delegiert sie Malloc, wenn eine überlagernde Größe erkannt wird.[6] Eine ähnliche Funktion kann mit manueller Buchhaltung und Größenüberprüfung nachgewiesen werden, wie beispielsweise in der Verwendung von alloca_account
in glibc.[7]
Automatische Speicherverwaltung
In vielen Programmiersprache Implementierungen verteilt die Laufzeitumgebung für das Programm automatisch Speicher in der Rufen Sie Stack an für nicht statische Lokale Variablen von a Subroutine, genannt Automatische Variablen, wenn die Unterroutine aufgerufen wird und diese Speicher automatisch freigibt, wenn die Unterroutine beendet wird. Spezielle Erklärungen können es lokalen Variablen ermöglichen, Werte zwischen Aufrufe des Verfahrens zu erhalten, oder es können die lokalen Variablen von anderen Unterroutinen zugegriffen werden. Die automatische Zuordnung lokaler Variablen macht Rekursion möglich, bis zu einer Tiefe, die durch den verfügbaren Speicher begrenzt ist.
Müllsammlung
Die Müllsammlung ist eine Strategie zum automatischen Erkennen von Gedächtnissen, die Objekten zugewiesen werden, die in einem Programm nicht mehr verwendet werden können, und die Rückgabe dieses Speicherspeichers an einen Pool freier Speicherorte. Diese Methode steht im Gegensatz zur "manuellen" Speicherverwaltung, bei der ein Programmierer die Speicheranforderungen und Speicherveröffentlichungen im Programm explizit kodiert. Während die automatische Müllsammlung die Vorteile der Reduzierung der Programmierer -Arbeitsbelastung und der Verhinderung bestimmter Arten von Speicherzuordnungsfehlern hat, erfordert die eigene Müllabfuhr eine eigene Speicherressourcen und kann mit dem Anwendungsprogramm für die Prozessorzeit konkurrieren.
Systeme mit virtuellem Speicher
Virtueller Speicher ist eine Methode zur Entkopplung der Speicherorganisation von der physischen Hardware. Die Anwendungen arbeiten über den Speicher über den Speicher Virtuelle Adressen. Jeder Versuch der Anwendung, auf eine bestimmte virtuelle Speicheradresse zuzugreifen physikalische Adresse.[8] Auf diese Weise ermöglicht das Hinzufügen eines virtuellen Speichers eine granulare Steuerung über Speichersysteme und Zugriffsmethoden.
In virtuellen Speichersystemen begrenzt das Betriebssystem, wie a Prozess kann auf den Speicher zugreifen. Diese Funktion nennt man Gedächtnisschutz, kann verwendet werden, um einen Prozess zum Lesen oder Schreiben in den Speicher, der ihm nicht zugeordnet ist, nicht zulassen, und verhindern, dass böswilliger oder fehlfunktionierender Code in einem Programm den Betrieb eines anderen beeinträchtigt.
Obwohl der für bestimmte Prozesse zugewiesene Speicher normalerweise isoliert ist, müssen Prozesse manchmal in der Lage sein, Informationen auszutauschen. Geteilte Erinnerung ist eine der schnellsten Techniken für Interprozesskommunikation.
Der Speicher wird normalerweise durch Zugriffsrate in eingestuft in Hauptspeicher und Zweitlager. Speicherverwaltungssysteme verarbeiten unter anderem auch das Verschieben von Informationen zwischen diesen beiden Speicherebenen.
Speicherverwaltung in OS/360 und Nachfolgern
IBM System/360 unterstützt keinen virtuellen Gedächtnis.[Anmerkung 4] Gedächtnisisolation von Arbeitsplätze ist optional erreicht mit Verwendung Schutzschlüssel, Zuweisen von Speicher für jeden Job einen anderen Schlüssel, 0 für den Supervisor oder 1–15. Speicherverwaltung in OS/360 ist ein Supervisor Funktion. Der Speicher wird mit dem angefordert GetMain
Makro und befreit mit dem Freemain
Makro, das zu einem Aufruf an den Vorgesetzten führt (SVC) Um den Vorgang auszuführen.
In OS/360 variieren die Details je nach System, wie das System ist generiertz. B. für PCP, Mft, MVT.
In OS/360 MVT Suballokation innerhalb eines Jobs Region oder die geteilten Systemwarteschlangenbereich (SQA) basiert auf Unterpools, Bereiche ein Vielfaches von 2 kb Größe - die Größe eines Bereichs, der durch einen Schutzschlüssel geschützt ist. Unterpools sind mit 0–255 nummeriert.[9] Innerhalb einer Region werden Unterpools entweder dem Speicherschutz des Jobs oder dem Schlüssel des Supervisors, Key 0, zugewiesen. Subpools 0–127 erhalten den Schlüssel des Jobs. Zunächst wird nur Unterpool -Null erstellt, und alle Benutzerspeicheranforderungen sind von Unterpool 0 erfüllt, es sei denn, in der Speicheranforderung wird ein anderer angegeben. Unterpools 250–255 werden durch Speicheranfragen vom Vorgesetzten im Namen des Jobs erstellt. Die meisten davon werden Schlüssel 0 zugewiesen, obwohl einige den Schlüssel des Jobs erhalten. Subpool -Zahlen sind auch in MFT relevant, obwohl die Details viel einfacher sind.[10] MFT verwendet fest Partitionen vom Bediener anstelle von dynamischen Regionen neu definierbar und PCP hat nur eine einzige Partition.
Jedes Unterpool wird durch eine Liste von Steuerblöcken abgebildet, die zugewiesene und freie Speicherblöcke innerhalb des Unterpools identifizieren. Der Speicher wird zugewiesen, indem ein freier Bereich mit ausreichender Größe oder durch Zuordnen zusätzlicher Blöcke im Unterpool bis zur Regiongröße des Auftrags zugewiesen wird. Es ist möglich, alle oder einen Teil eines zugewiesenen Speicherbereichs zu befreien.[11]
Die Details für OS/VS1 sind ähnlich[12] an die für MFT und für MVT; die Details für OS/VS2 sind ähnlich wie für MVT, außer dass die Seitengröße 4 KIB beträgt. Sowohl für OS/VS1 als auch für OS/VS2 die gemeinsame Nutzung Systemwarteschlangenbereich (SQA) ist nicht pennbar.
Im MVS Der Adressraum enthält einen zusätzlichen, lehbaren gemeinsamen Bereich, der, der Gemeinsamer Speicherbereich (CSA) und ein zusätzlicher privater Bereich, die Systemarbeitsbereich (SWA). Außerdem sind die Speicherschlüssel 0-7 für die Verwendung durch einen privilegierten Code reserviert.
Siehe auch
Anmerkungen
- ^ Die Laufzeitumgebung für einen Sprachprozessor kann jedoch den Speicher unterteilt, der dynamisch vom Betriebssystem erfasst wurde, z. B. um einen Stapel zu implementieren.
- ^ In einigen Betriebssystemen, z. B.,, OS/360Die freie Speicherung kann auf verschiedene Weise unterteilt werden, z. B. Unterpools in OS/360, unterhalb der Linie, über der Linie und über der Balken in der Stange Z/OS.
- ^ Nicht zu verwechseln mit dem Unabhängigen Haufen Datenstruktur.
- ^ Außer auf dem Modell 67
Verweise
- ^ a b Detlefs, d.; Dosser, a.; Zorn, B. (Juni 1994). "Speicherzuweisungskosten in großen C- und C ++ - Programmen" (PDF). Software: Übung und Erfahrung. 24 (6): 527–542. Citeseerx 10.1.1.30.3073. doi:10.1002/spe.4380240602. S2CID 14214110.
- ^ "Hauptspeicherallokation" (PDF). IBM -Betriebssystem/360 Konzepte und Einrichtungen (PDF). Systemreferenzbibliothek (First Ed.). IBM Corporation. 1965. p. 74. Abgerufen 3. April, 2019.
- ^ Silberschatz, Abraham; Galvin, Peter B. (2004). Betriebssystemkonzepte. Wiley. ISBN 0-471-69466-5.
- ^ Linux Programmierer Handbuch - Bibliotheksfunktionen - -
- ^ "_malloca". Microsoft CRT -Dokumentation.
- ^ "gnulib/malloca.h". GitHub. Abgerufen 24. November 2019.
- ^ "Glibc/include/alloca.h". Die Spiegel von Beren Minor. 23. November 2019.
- ^ Tanenbaum, Andrew S. (1992). Modern Operating Systems. Englewood Cliffs, N.J.: Prentice-Hall. p. 90. ISBN 0-13-588187-0.
- ^ OS360SUP, pp.82-85.
- ^ OS360SUP, pp.82.
- ^ IBM Corporation (Mai 1973). Programmlogik: IBM System/360 Betriebssystem MVT Supervisor (PDF). S. 107–137. Abgerufen 3. April, 2019.
- ^ OSVS1dig, pp.2.37-2.39, VS1 Speicherunterpools.
- OS360SUP
- OS -Release 21 IBM System/360 Betriebssystem Supervisor -Dienste und Makroanweisungen (PDF). Systemreferenzbibliothek (Achte Ausgabe). IBM. September 1974. GC28-6646-7.
- OSVS1dig
- OS/VS1 Programmer Reference Digest Release 6 (PDF). Systeme (Sechstes Ausgabe). IBM. November 1975. GC24-5091-5.
Weitere Lektüre
- Donald Knuth. Grundalgorithmen, Dritte Edition. Addison-Wesley, 1997. ISBN0-201-89683-4. Abschnitt 2.5: Dynamische Speicherzuweisung, S. 435–456.
- Einfache SpeicherzuordnungsalgorithmenArchiviert 5. März 2016 bei der Wayback -Maschine (Ursprünglich veröffentlicht in Osdev Community)
- Wilson, P. R.; Johnstone, M. S.; Neely, M.; Boles, D. (1995). "Dynamische Speicherzuweisung: Eine Umfrage und kritische Überprüfung". Speicherverwaltung. Vorlesungsnotizen in Informatik. Vol. 986. S. 1–116. Citeseerx 10.1.1.47.275. doi:10.1007/3-540-60368-9_19. ISBN 978-3-540-60368-9.
- Berger, E. D.; Zorn, B. G.; McKinley, K. S. (Juni 2001). "Hochleistungsspeicher-Allokatoren komponieren" (PDF). Proceedings der ACM Sigplan 2001 -Konferenz zum Design und zur Implementierung von Programmiersprache. Pldi '01. S. 114–124. Citeseerx 10.1.1.1.2112. doi:10.1145/378795.378821. ISBN 1-58113-414-2. S2CID 7501376.
- Berger, E. D.; Zorn, B. G.; McKinley, K. S. (November 2002). "Überdenken benutzerdefinierte Speicherzuweisung" (PDF). Verfahren der 17. ACM-Sigplan-Konferenz über objektorientierte Programmierung, Systeme, Sprachen und Anwendungen. Oopsla '02. S. 1–12. Citeseerx 10.1.1.119.5298. doi:10.1145/582419.582421. ISBN 1-58113-471-1. S2CID 481812.
- Wilson, Paul R.; Johnstone, Mark S.; Neely, Michael; Boles, David (28. bis 29. September 1995), Dynamische Speicherallokation: Eine Umfrage und kritische Überprüfung (PDF), Austin, Texas: Abteilung für Computerwissenschaften Universität von Texas, abgerufen 2017-06-03