Unterstützung großer Programme
Dieser Abschnitt enthält Informationen zur Verwendung der großen und sehr großen Adressraummodelle für Programme, die Datenbereiche benötigen, die größer sind als die vom Standardadressraummodell bereitgestellten.
Das Modell des großen Adressraums ist unter AIX® 4.3 und höher verfügbar. Das sehr große Adressraummodell ist unter AIX 5.1 und höher verfügbar.
Der virtuelle Adressraum eines 32-Bit-Prozesses ist in 16 256-Megabyte-Bereiche (oder Segmente) unterteilt, die jeweils durch ein separates Hardwareregister adressiert werden. Das Betriebssystem bezieht sich auf Segment 2 (virtuelle Adressen 0x20000000-0x2FFFFFFF) als Segment process-private . Dieses Segment enthält standardmäßig den Benutzerstack und die Daten einschließlich des Heapspeichers. Das prozessprivate Segment enthält auch den U-Block des Prozesses, der vom Betriebssystem verwendet wird und von einer Anwendung nicht gelesen werden kann.
Da ein einzelnes Segment sowohl für Benutzerdaten als auch für Stacks verwendet wird, beträgt die maximale Aggregatgröße etwas weniger als 256 MB. Bestimmte Programme erfordern jedoch große Datenbereiche (initialisiert oder nicht initialisiert) oder sie müssen große Speichermengen mit der Subroutine malloc oder sbrk zuordnen. Programme können für die Verwendung des Modells für große oder sehr große Adressräume erstellt werden, sodass sie bis zu 2 GB Daten verwenden können.
Es ist möglich, das große oder sehr große Adressraummodell mit einem vorhandenen Programm zu verwenden, indem ein maxdata-Wert ungleich null angegeben wird. Der Wert maxdata wird entweder aus der Umgebungsvariablen LDR_CNTRL oder aus einem Feld in der ausführbaren Datei abgerufen. Einige Programme haben Abhängigkeiten vom Standardadressraummodell und werden unterbrochen, wenn sie mit dem großen Adressraummodell ausgeführt werden.
Informationen zum Modell für große Adressräume
Das Modell für große Adressräume ermöglicht angegebenen Programmen die Verwendung von mehr als 256 MB an Daten. Andere Programme verwenden weiterhin das Standardadressraummodell. Damit ein Programm das große Adressraummodell verwenden kann, geben Sie einen Wert ungleich null für maxdata an. Sie können einen Wert ungleich null für maxdata angeben, indem Sie entweder den Befehl ld verwenden, wenn Sie das Programm erstellen, oder indem Sie die Umgebungsvariable LDR_CNTRL exportieren, bevor Sie das Programm ausführen.
Wenn ein Programm ausgeführt wird, das das große Adressraummodell verwendet, reserviert das Betriebssystem so viele 256-MB-Segmente wie erforderlich, um das durch den Wert maxdata angegebene Datenvolumen aufzunehmen. Ab Segment 3 werden die initialisierten Daten des Programms aus der ausführbaren Datei in den Speicher gelesen. Das Lesen der Daten beginnt in Segment 3, auch wenn der Wert für maxdata kleiner als 256 MB ist. Beim Modell mit großen Adressräumen kann ein Programm maximal 8 Segmente bzw. 2 GB bzw. 3.25 GB Daten enthalten.
Im Standardadressraummodell sind 12 Segmente zur Verwendung durch die Subroutinen shmat oder mmap verfügbar. Wenn das Modell für große Adressräume verwendet wird, reduziert die Anzahl der Segmente, die für Daten reserviert sind, die Anzahl der Segmente, die für die Subroutinen shmat und mmap verfügbar sind. Da die maximale Datengröße 2 GB beträgt, sind immer mindestens zwei Segmente für die Subroutinen shmat und mmap verfügbar.
Der Benutzerstack verbleibt in Segment 2, wenn das große Adressraummodell verwendet wird. Daher ist die Größe des Stacks auf etwas weniger als 256 MB begrenzt. Eine Anwendung kann ihren Benutzerstack jedoch in ein gemeinsam genutztes Speichersegment oder in zugeordneten Speicher verlagern.
Während die Größe der initialisierten Daten in einem Programm groß sein kann, gibt es immer noch eine Einschränkung für die Textgröße. In der ausführbaren Datei für ein Programm muss die Größe des Textabschnitts plus die Größe des Ladeprogrammabschnitts kleiner als 256 MB sein. Dies ist erforderlich, damit diese Abschnitte in ein einzelnes schreibgeschütztes Segment (Segment 1, das Segment TEXT) passen. Mit dem Befehl dump können Sie die Abschnittsgrößen untersuchen.
Informationen zum Modell für sehr große Adressräume
Das sehr große Adressraummodell ermöglicht große Datenprogramme auf dieselbe Weise wie das große Adressraummodell, obwohl es mehrere Unterschiede zwischen ihnen gibt. Damit ein Programm das sehr große Adressraummodell verwenden kann, müssen Sie einen maxdata -Wert und die Eigenschaft für die dynamische Segmentzuordnung (dsa) angeben. Verwenden Sie entweder den Befehl ld oder die Umgebungsvariable LDR_CNTRL , um einen Wert für maxdata und die Option DSA anzugeben.
Wenn ein Wert für maxdata angegeben wird, folgt das Modell für sehr große Adressräume dem Modell für große Adressräume, indem die Daten eines Programms ab Segment 3 in den Speicher eingelesen werden und so viele Segmente wie erforderlich belegt werden. Die übrigen Datensegmente sind jedoch zur Ausführungszeit nicht für den Datenbereich reserviert, sondern werden dynamisch abgerufen. Bis ein Segment für den Datenbereich eines Programms benötigt wird, kann es von den shmat -oder mmap -Subroutinen verwendet werden. Bei dem sehr großen Adressraummodell kann ein Programm maximal 13 Segmente oder 3.25 GB Daten enthalten. Von diesen 13 Segmenten (12 Segmente oder 3 GB) sind für die Subroutinen shmat und mmap verfügbar.
Wenn ein Prozess versucht, seinen Datenbereich in ein neues Segment zu erweitern, ist die Operation erfolgreich, solange das Segment nicht von den Subroutinen shmat oder mmap verwendet wird. Ein Programm kann die Subroutine shmdt oder munmap aufrufen, um die Verwendung eines Segments zu stoppen, sodass das Segment für den Datenbereich verwendet werden kann. Nachdem ein Segment für den Datenbereich verwendet wurde, kann es jedoch nicht mehr für andere Zwecke verwendet werden, auch wenn die Größe des Datenbereichs reduziert wird.
Wenn kein Wert für maxdata (maxdata = 0) mit der Eigenschaft dsa angegeben wird, wird eine geringfügige Abweichung vom oben genannten Verhalten erzielt. Der Prozess hat seine Daten und seinen Stack in Segment 2, ähnlich wie ein regulärer Prozess. Der Prozess hat keinen Zugriff auf die globalen gemeinsam genutzten Bibliotheken, sodass alle gemeinsam genutzten Bibliotheken, die vom Prozess verwendet werden, privat geladen werden. Die Ausführung auf diese Weise hat den Vorteil, dass ein Prozess über alle 13 Segmente (3.25 GB) verfügt, die von den Subroutinen shmat und mmap verwendet werden können.
Um die Wahrscheinlichkeit zu verringern, dass die Subroutinen shmat oder mmap ein Segment verwenden, das für den Datenbereich verwendet werden könnte, verwendet das Betriebssystem eine andere Regel für die Auswahl einer zurückzugebenden Adresse (wenn eine bestimmte Adresse nicht angefordert wird). Normalerweise geben die Subroutinen shmat oder mmap eine Adresse im niedrigsten verfügbaren Segment zurück. Wenn das sehr große Adressraummodell verwendet wird, geben diese Subroutinen eine Adresse im höchsten verfügbaren Segment zurück. Eine Anforderung für eine bestimmte Adresse wird erfolgreich sein, solange sich die Adresse nicht in einem Segment befindet, das bereits für den Datenbereich verwendet wurde. Dieses Verhalten gilt für alle Prozesse, die die Eigenschaft dsa angeben.
Bei dem sehr großen Adressraummodell kann ein maxdata -Wert von null oder ein Wert von bis zu 0xD0000000 angegeben werden. Wenn ein Wert für maxdata größer als 0xAFFFFFFF angegeben wird, verwendet ein Programm keine global geladenen gemeinsam genutzten Bibliotheken. Stattdessen werden alle gemeinsam genutzten Bibliotheken privat geladen. Dies kann sich auf die Programmleistung auswirken.
Große und sehr große Adressraummodelle aktivieren
Das Modell für große Adressräume wird verwendet, wenn ein Wert ungleich null für den Wert maxdata angegeben ist und die Eigenschaft für dynamische Segmentzuordnung (dsa) nicht angegeben ist. Das sehr große Adressraummodell wird verwendet, wenn ein Wert für maxdata angegeben und die Eigenschaft "dsa" angegeben ist. Verwenden Sie den Befehl ld mit dem Flag -bmaxdata , um einen Wert für maxdata anzugeben und die Eigenschaft "dsa" festzulegen.
cc -bmaxdata:0x80000000 sample.o cc -bmaxdata:0xD0000000/dsa sample.o cc -bmaxdata:0xD0000000/dsa sample.o LDR_CNTRL=MAXDATA=0x80000000 a.outLDR_CNTRL=MAXDATA=0x80000000@DSA a.out0x80000000zu setzen:/usr/ccs/bin/ldedit -bmaxdata:0x80000000 a.out/usr/ccs/bin/ldedit -bmaxdata:0x80000000/dsa a.outSie können den Befehl dump verwenden, um den Wert maxdata zu untersuchen oder um zu ermitteln, ob ein Programm die Eigenschaft dsa hat.
Einige Programme haben Abhängigkeiten vom Standardadressraummodell. Diese Programme werden beendet, wenn ein Wert ungleich null für maxdata angegeben wurde, indem entweder die ausführbare Datei des Programms geändert oder die Umgebungsvariable LDR_CNTRL festgelegt wurde.
Programme mit großen Datenbereichen ausführen
Wenn Sie ein Programm ausführen, das das Modell mit großen Adressräumen verwendet, versucht das Betriebssystem, den veränderlichen Grenzwert für die Datenmenge bei Bedarf zu ändern, um ihn an den Wert maxdata anzupassen. Wenn der Wert maxdata größer als der aktuelle feste Grenzwert für die Datenmenge ist, wird das Programm entweder nicht ausgeführt, wenn für die Umgebungsvariable XPG_SUS_ENV der Wert ON festgelegt ist, oder der veränderliche Grenzwert wird auf den aktuellen festen Grenzwert gesetzt.
Wenn der Wert maxdata kleiner als die Größe der statischen Daten des Programms ist, wird das Programm nicht ausgeführt.
Nachdem die initialisierten und nicht initialisierten Daten des Programms in Segmente 3 und darüber hinaus platziert wurden, wird der Unterbrechungswert berechnet. Der Unterbrechungswert definiert das Ende der statischen Daten des Prozesses und den Anfang der dynamisch zuordnungsfähigen Daten. Mit der Subroutine malloc, brk oder sbrk kann ein Prozess den Unterbrechungswert verschieben, um den Datenbereich zu vergrößern.
Beispiel: Wenn der von einem Programm angegebene Wert für maxdata 0x68000000ist, liegt der maximale Gruppenwechselwert in der Mitte von Segment 9 (0x98000000). Die Subroutine brk erweitert den Unterbrechungswert über Segmentgrenzen hinweg, aber die Größe des Datenbereichs darf den aktuellen veränderlichen Datengrenzwert nicht überschreiten.
Mit der Subroutine setrlimit kann ein Prozess seinen veränderlichen Datengrenzwert auf einen beliebigen Wert setzen, der den festen Datengrenzwert nicht überschreitet. Die maximale Größe des Datenbereichs ist jedoch auf den ursprünglichen Wert maxdata begrenzt, aufgerundet auf ein Vielfaches von 256 MB.
Die meisten Subroutinen sind von großen Datenprogrammen nicht betroffen. Die Subroutinen shmat und mmap sind am meisten betroffen, da sie weniger Segmente für die Verwendung verfügbar haben. Wenn ein Modellprogramm für große Datenadressen verzweigt, übernimmt der untergeordnete Prozess die aktuellen Datenressourcengrenzwerte.
Besondere Hinweise
Programme mit großen Datenspeicherbereichen benötigen einen großen Paging-Bereich. Wenn ein Programm mit einem Adressraum von 2 GB beispielsweise versucht, auf alle Seiten in seinem Adressraum zuzugreifen, muss das System über 2 GB Paging-Bereich verfügen. Das Betriebssystem beendet Prozesse, wenn der Paging-Bereich knapp wird. Programme mit großen Datenspeicherbereichen werden zuerst beendet, weil sie normalerweise sehr viel Paging-Bereich belegen.
Das Debugging von Programmen, die das große Datenmodell verwenden, unterscheidet sich nicht von dem Debugging anderer Programme. Der Befehl dbx kann diese großen Programme aktiv oder aus einem Kernspeicherauszug heraus debuggen. Ein vollständiger Kernspeicherauszug eines Programms mit großen Daten kann sehr groß sein. Um abgeschnittene Kerndateien zu vermeiden, stellen Sie sicher, dass der Ressourcengrenzwert coredump groß genug ist, und stellen Sie sicher, dass in dem Dateisystem, in dem Ihr Programm ausgeführt wird, genügend freier Speicherplatz vorhanden ist.
Einige Anwendungsprogramme können so geschrieben werden, dass sie auf Merkmale des Standardadressraummodells angewiesen sind. Diese Programme funktionieren möglicherweise nicht, wenn sie mit dem großen oder sehr großen Adressraummodell ausgeführt werden. Legen Sie die Umgebungsvariable LDR_CNTRL nicht fest, wenn Sie diese Programme ausführen.
Prozesse, die das sehr große Adressraummodell verwenden, müssen Codeänderungen an ihren Programmen vornehmen, um den Unterbrechungswert des Adressraums in Blöcken von mehr als 2 GB zu verschieben. Dies ist eine Einschränkung des Systemaufrufs sbrk , der einen Wert mit Vorzeichen als Parameter akzeptiert. Als Problemumgehung kann ein Programm sbrk mehrmals aufrufen, um den Unterbrechungswert an die gewünschte Position zu verschieben.