Sie können viele Programmieraufgaben in VOS und OpenVOS erledigen, ohne die Details zu kennen, wie das Betriebssystem den Benutzeradressraum verwaltet. Aber es macht Spaß, die Details zu kennen, und manchmal müssen Sie die Standardkonfiguration anpassen, um eine Aufgabe zu erledigen. Dieser Beitrag ist eine Einführung in den VOS-Benutzeradressraum.
Der VOS-Benutzeradressraum ist in 5 Bereiche unterteilt, von denen jeder für einen bestimmten Zweck verwendet wird. In der Reihenfolge von der niedrigsten Adresse (@0x) bis zur höchsten Adresse (@7FFFFFFFx) sind dies der Programmmodulbereich, der dynamisch zugewiesene gemeinsame virtuelle Speicherbereich, der Benutzer-Heap, der Benutzer-Stack und ein kleiner Bereich, der für die Verwendung durch das Betriebssystem selbst reserviert ist. Das folgende Diagramm zeigt die Reihenfolge dieser Bereiche. Es ist nicht maßstabsgetreu. Dieses Diagramm ist spezifisch für die Implementierung der V-Serie (VOS Release 15.0 und höher).
Programm-Modul |
Gemeinsamer virtueller Speicher |
Benutzer Heap |
(tote Zone) |
Benutzer-Stapel |
Systemdaten |
Die Größe des Programmmodulbereichs ist auf 128 MB festgelegt. Die Größe des Systemdatenbereichs ist auf knapp 2 MB festgelegt. Die Größen der anderen 3 Bereiche können an die Bedürfnisse des laufenden Programms angepasst werden. Die Standardgröße des gemeinsamen virtuellen Speicherbereichs beträgt 896 MB. Somit belegen die ersten beiden Bereiche 1 Gigabyte oder die Hälfte des Adressraums. Die Standardgröße des Benutzer-Heaps variiert je nach Version von VOS oder OpenVOS. In Release 17.0 beträgt die Standardgröße 64 MB. Die Standardgröße des Benutzer-Stacks beträgt 8 MB. Der ungenutzte Platz zwischen dem Heap und dem Stack wird als tote Zone bezeichnet. Da der Heap nach oben wächst (niedrige Adressen zu hohen Adressen) und der Stack nach unten wächst (hoch zu niedrig), kann die tote Zone entweder vom Heap oder vom Stack zur Erweiterung beansprucht werden. Die Gesamtmenge an virtuellem Speicher, die dem Heap, dem Stack und den Systemdaten zur Verfügung steht, beträgt weitere 1 Gigabyte. Insgesamt hat ein Benutzerprozess Zugriff auf 2 Gigabyte virtuellen Speicher.
Die Gesamtmenge des Heap-Speicherplatzes, die verwendet werden kann, unterliegt einer administrativen Begrenzung. Dasselbe gilt für den Stack-Speicherplatz und den Gesamtspeicherplatz (der sich aus der Summe des Programmmodulplatzes, des gemeinsam genutzten virtuellen Speichers, des Heap-Speicherplatzes und des Stack-Speicherplatzes zusammensetzt). Die modulweiten Grenzen werden mit dem Befehl list_default_cmd_limits angezeigt und mit dem Befehl update_default_cmd_limits geändert. Neue Prozesse erben diese modulweiten Werte. Nachdem der Prozess gestartet ist und läuft, können seine Grenzen mit dem Befehl list_process_cmd_limits angezeigt und mit dem Befehl update_process_cmd_limits geändert werden.
Die prozessweiten Grenzwerte werden dann verwendet, um die Grenzwerte zu initialisieren, die jedes Mal verwendet werden, wenn ein Programm ausgeführt wird. Sobald ein Programm läuft, kann es die Subroutinen s$get_current_cmd_limits und s$set_current_cmd_limits aufrufen, um die Limits für die Dauer seiner Ausführung abzurufen oder zu ändern. Auf diese Weise kann ein Programm mehr Platz für seinen Stack reservieren als der anfängliche Standardwert des Systems, oder es kann die Menge an Heap-Speicherplatz erhöhen, die es verwenden darf. Umgekehrt kann ein Programm, das befürchtet, zu viel Speicherplatz zu verbrauchen, z. B. aufgrund eines Kodierungsfehlers, die Menge an Speicherplatz, die es verwenden darf, verringern.
Weitere Informationen finden Sie in der Beschreibung der Befehle update_default_cmd_limits und bind.