大きなプログラムのサポート
このトピックでは、デフォルトのアドレス・スペース・モデルで提供されるデータ域よりも大きいデータ域を必要とするプログラムを入れるための、ラージ・アドレス・スペース・モデルおよびベリー・ラージ・アドレス・スペース・モデルの使用に関する情報を示します。
大アドレス空間モデルはAIX 4.3以降で利用可能である。 非常に大きなアドレス・スペース・モデルは、 AIX 5.1 以降で使用できます。
32 ビット・プロセスの仮想アドレス・スペースは、
それぞれ別個のハードウェア・レジスターによってアドレッシングされている、
16 個の 256 メガバイト域 (またはセグメント) に分割されています。 オペレーティング・システムは、
セグメント 2 (仮想アドレス 0x20000000-0x2FFFFFFF) をプロセス専用 セグメントとして参照します。 デフォルトでは、
このセグメントにユーザー・スタックとデータ (ヒープを含む) が入れられます。 プロセス専用のセグメントには、
プロセスの u-block も入れられます。
これは、
オペレーティング・システムによって使用されるもので、アプリケーションは読み取ることができません。
ユーザー・データとスタックの両方で単一のセグメントが使用されるため、 最大集合サイズは 256 MB を若干下回ります。 ただし、プログラムによっては、大きなデータ域 (初期化または未初期化) を必要とするものや、 malloc または sbrk サブルーチンを使用して大量のメモリーを割り振る必要があるものもあります。 ラージ・アドレス・スペース・モデルまたはベリー・ラージ・アドレス・スペース・モデルを使用するように プログラムを作成すれば、最大で 2 GB のデータを使用することができます。
maxdata 値 にゼロ以外を指定することにより、 既存のプログラムでラージ・アドレス・スペース・モデルまたはベリー・ラージ・アドレス・スペース・モデルのいずれかを使用することもできます。 maxdata 値は、 LDR_CNTRL 環境変数か、または 実行可能ファイル内のフィールドのいずれかから取得されます。 プログラムの中にはデフォルトのアドレス・スペース・モデルとの依存関係を持つものがあります。 それらのプログラムは、ラージ・アドレス・スペース・モデルを使用して実行すると中断します。
ラージ・アドレス・スペース・モデルについて
ラージ・アドレス・スペース・モデルを使用することにより、 指定したプログラムで 256 MB を超えるデータを使用することができます。 その他のプログラムでは、 デフォルトのアドレス・スペース・モデルが引き続き使用されます。 プログラムでラージ・アドレス・スペース・モデルを使用できるようにするには、ゼロ以外の maxdata 値を指定します。 ゼロ以外の maxdata 値を指定するには、プログラムの作成時に ld コマンドを使用するか、プログラムの実行前に LDR_CNTRL 環境変数をエクスポートします。
ラージ・アドレス・スペース・モデルを使用するプログラムが実行されると、 オペレーティング・システムは、 maxdata 値で指定した量のデータを保持するのに必要な数の 256 MB セグメントを予約します。 次に、 プログラムの初期化されたデータの実行可能ファイルからメモリーへの読み取りが、 セグメント 3 から開始されます。 maxdata 値が 256 MB よりも小さい場合でも、 データの読み取りはセグメント 3 から始められます。 ラージ・アドレス・スペース・モデルを使用すると、プログラムは最大で 8 つのセグメント、つまり 2 GB または 3.25 GB のデータをそれぞれ持つことができます。
デフォルトのアドレス・スペース・モデルでは、 shmat または mmap サブルーチンで 12 個のセグメントを使用することができます。 ラージ・アドレス・スペース・モデルが使用される場合、データ用に予約されるセグメントの数により、shmat および mmap サブルーチンで使用可能なセグメントの数が減少します。 データの最大サイズは 2 GB なので、 少なくとも 2 つのセグメントがいつでも shmat および mmap サブルーチンで使用可能です。
ラージ・アドレス・スペース・モデルが使用される場合、 ユーザー・スタックはセグメント 2 に入れられたままです。 その結果、スタックのサイズは、 256 MB よりも若干少なく制限されます。 ただし、 アプリケーションはユーザー・スタックを共有メモリー・セグメントまたは割り当て済みメモリーに再配置できます。
プログラム内の初期化済みデータのサイズを大きくすることができますが、 テキストのサイズの制限は残っています。 プログラムで使用される実行可能ファイルでは、 テキスト・セクションのサイズとローダー・セクションのサイズの合計が、 256 MB より小さくなければなりません。 これが必要なのは、 これらのセクションを単一の読み取り専用セグメント (セグメント 1、TEXT セグメント) に適合させるためです。 dump コマンドを使用して、セクション・サイズを調べることができます。
ベリー・ラージ・アドレス・スペース・モデルについて
ベリー・ラージ・アドレス・スペース・モデルは、いくつかの相違点はありますが、ラージ・アドレス・スペース・モデルとほぼ同様の方法で、ラージ・データ・プログラムを使用可能にします。 プログラムでベリー・ラージ・アドレス・スペース・モデルを使用できるようにするには、 maxdata 値と動的セグメント割り当て (dsa) 属性を指定しなければなりません。 ld ( ) コマンドまたは LDR_CNTRL 環境変数のいずれかを使用して、 最大データ 値と DSA オプションを指定します。
maxdata 値が指定されている場合、 ベリー・ラージ・アドレス・スペース・モデルでは、 プログラムのデータのメモリーへの読み取りがセグメント 3 から開始され、 必要な数のセグメントが占有されるという点が、 ラージ・アドレス・スペース・モデルと同じです。 ただし、残りのデータ・セグメントは実行時にデータ域用に予約されず、 動的に取得されます。 プログラムのデータ域にセグメントが必要になるまでは、 shmat または mmap サブルーチンによってそのセグメントを使用することができます。 ベリー・ラージ・アドレス・スペース・モデルを使用する場合、 プログラムは最大で 13 個のセグメント (つまり 3.25 GB のデータ) を持つことができます。 それらの 13 個のセグメントのうち、12 個のセグメント (つまり 3 GB) を shmat サブルーチンおよび mmap サブルーチンに使用可能です。
プロセスがデータ域を新しいセグメントへ拡張しようとする場合、 そのセグメントが shmat サブルーチンまたは mmap サブルーチンで使用されていない限り、 その操作は成功します。 プログラムは、 shmdt または munmap サブルーチンを呼び出して、セグメントをデータ域に使用できるようにセグメントの使用を停止することができます。 しかし、データ域用に使用されているセグメントは、データ域のサイズが縮小された場合でも、他の目的には使用できなくなります。
dsa 属性とともに maxdata 値が指定されていない (maxdata = 0) 場合、前述の振る舞いとは若干異なります。 このプロセスのデータとスタックは、 通常のプロセスと同じようにセグメント 2 に入れられます。 このプロセスにはグローバル共有ライブラリーへのアクセス権がないため、 このプロセスによって使用される共有ライブラリーはすべて、 専用にロードされます。 この方法で実行すると、 プロセスにおいて 13 個のセグメント (3.25 GB) すべてを、shmat サブルーチンおよび mmap サブルーチンで使用できるという利点があります。
データ域用に使用できるセグメントを shmat サブルーチンまたは mmap サブルーチンが使用する可能性を減らすため、 オペレーティング・システムは、 戻されるアドレスの選択に関して異なる規則を使用します (特定のアドレスが要求されていない場合)。 通常、shmat サブルーチンまたは mmap サブルーチンは、使用可能なセグメントのうち最も下のセグメントの中にアドレスを戻します。 ベリー・ラージ・アドレス・スペース・モデルを使用する場合、 これらのサブルーチンでは、 使用可能なセグメントのうち最も上のセグメントの中にアドレスを戻します。 特定のアドレスに関する要求は、 そのアドレスが既にデータ域に使用されているセグメント内に入れられているのでない限り、 成功します。 この振る舞いは、dsa 属性が指定されているすべてのプロセスでも同様です。
ベリー・ラージ・アドレス・スペース・モデルを使用する場合、
maxdata 値には、
ゼロ以上 0xD0000000 以下の値を指定できます。 maxdata 値に 0xAFFFFFFF よりも大きい値を指定した場合、プログラムはグローバルにロードされた共有ライブラリーを使用しません。 その代わり、すべての共有ライブラリーが専用にロードされます。 これは、プログラムのパフォーマンスに影響を及ぼす場合があります。
ラージ・アドレス・スペース・モデルおよびベリー・ラージ・アドレス・スペース・モデルの使用可能化
maxdata 値に任意のゼロ以外の値を指定し、 動的セグメント割り当て (dsa) 属性を指定しないと、 ラージ・アドレス・スペース・モデルが使用されます。 maxdata 値に任意の値を指定し、dsa 属性を指定すると、 ベリー・ラージ・アドレス・スペース・モデルが使用されます。 -bmaxdata フラグを指定した ld コマンドを使用して、 maxdata 値を指定し、 dsa プロパティーを設定します。
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.out0x80000000 に設定するには、
以下のコマンドを使用します。/usr/ccs/bin/ldedit -bmaxdata:0x80000000 a.out/usr/ccs/bin/ldedit -bmaxdata:0x80000000/dsa a.outdump コマンドを使用して、 maxdata 値を調べたり、プログラムに dsa プロパティーがあるかどうかを判別したりすることができます。
プログラムの中にはデフォルトのアドレス・スペース・モデルとの依存関係を持つものがあります。 これらのプログラムは、プログラムの実行可能ファイルの変更か LDR_CNTRL 環境変数の設定のいずれかによって、maxdata 値にゼロ以外の値が指定されていると、終了します。
ラージ・データ域を持つプログラムの実行
ラージ・アドレス・スペース・モデルを使用するプログラムを実行すると、オペレーティング・システムは、データ・サイズのソフト制限を変更し、必要な場合、その制限を引き上げて maxdata 値と一致させようとします。 maxdata 値が、データ・サイズの現在のハード制限よりも大きい 場合は、プログラムが実行されない (環境変数 XPG_SUS_ENV で値が ON に設定されている場合) か、またはソフト制限が現在のハード制限に設定されます。
maxdata 値がプログラムの静的データのサイズよりも小さい 場合、 プログラムは実行されません。
プログラムの初期化されたデータと未初期化データをセグメント 3 以降に入れた後で、 ブレーク値が計算されます。 ブレーク値は、プロセスの静的データの終わりとその動的割り当て可能データの先頭を定義します。 malloc、 brk または sbrk サブルーチンを使用すると、プロセスはブレーク値を移動してデータ域のサイズを増やすことができます。
例えば、プログラムによって指定された maxdata 値が 0x68000000の場合、最大ブレーク値はセグメント 9 の中央にあります (0x98000000)。 brk サブルーチンはセグメント境界を超えてブレーク値を拡張しますが、データ域のサイズが現行のソフト・データ限界を超えることはできません。
setrlimit サブルーチンを使用すると、プロセスは、ソフト・データ制限を、ハード・データ制限を超えない任意の値に設定することができます。 ただし、 データ域の最大サイズはオリジナルの maxdata 値までに制限され、256 MB の倍数に丸められます。
大部分のサブルーチンは、ラージ・データ・プログラムによる影響を受けません。 shmat および mmap サブルーチンは、使用可能なセグメントの数が少ないため、最も影響を受けます。 ラージ・データ・アドレス・モデルのプログラムが fork を行うと、 子プロセスは現在のデータ・リソース制限を継承します。
特別な考慮事項
ラージ・データ・スペースを持つプログラムには、大量のページング・スペースが必要です。 例えば、 2 GB のアドレス・スペースを持つプログラムがそのアドレス・スペース内の全ページにアクセスしようとする場合、 システムには 2 GB のページング・スペースが必要です。 オペレーティング・システムは、 ページング・スペースの残量が少なくなると、プロセスを終了します。 一般に、ラージ・データ・スペースのあるプログラムが大量のページング・スペースを消費するので、 最初に終了されます。
ラージ・データ・モデルを使用するプログラムのデバッグは、 その他のプログラムのデバッグと同じです。 dbx コマンドは、これらの大きなプログラムをアクティブにデバッグすることも、コア・ダンプからデバッグすることもできます。 ラージ・データ・プログラムからのフル・コア・ダンプは非常に大きくなる場合があります。 コア・ファイルが切り捨てられないようにするには、 coredump リソース制限に十分な大きさを指定し、 プログラムが実行されるファイルシステムに十分なフリー・スペースを確保してください。
一部のアプリケーション・プログラムは、 デフォルトのアドレス・スペース・モデルの特性に依存する方法で作成されている場合があります。 それらのプログラムは、 ラージ・アドレス・スペース・モデルまたはベリー・ラージ・アドレス・スペース・モデルを実行した場合、 機能しないことがあります。 これらのプログラムを実行するときには、 LDR_CNTRL 環境変数を設定しないでください。
ベリー・ラージ・アドレス・スペース・モデルを使用するプロセスでは、 2 GB を超えるチャンク内でアドレス・スペースのブレーク値を移動させるために、 それらのプログラムへのコード変更を行わなければなりません。 これは、 sbrk システム・コール (符号付きの値をパラメーターとしてとる) の制限です。 予備手段として、 プログラムは sbrk を複数回呼び出して、 ブレーク値を任意の位置に移動させることもできます。