オペレーティングシステムがユーザアドレス空間をどのように管理しているかの詳細を知らなくても、VOSやOpenVOSで多くのプログラミングタスクを達成することができます。 しかし、詳細を知ることは楽しいことですし、あるタスクを達成するためにデフォルトの設定を調整する必要があることもあります。 この記事では、VOSのユーザアドレス空間について紹介します。
VOS のユーザアドレス空間は 5 つの領域に分かれており、それぞれが特定の目的のために使用されます。 最も低いアドレス(@0x)から最も高いアドレス(@7FFFFFFFx)の順に、プログラムモジュール領域、動的に割り当てられた共有仮想メモリ領域、ユーザヒープ、ユーザスタック、およびオペレーティング・システム自体が使用するために予約された小さな領域です。次の図は、これらの領域の順序を示しています。この図は縮尺ではありません。この図は、V シリーズの実装(VOS リリース 15.0 以降)に固有のものです。
プログラムモジュール |
共有仮想メモリ |
ユーザーヒープ |
デッドゾーン |
ユーザースタック |
システムデータ |
プログラムモジュール領域のサイズは128MBに固定されています。 システムデータ領域のサイズは2MB弱に固定されています。 他の 3 つの領域のサイズは、実行中のプログラムのニーズに合わせて調整することができます。 共有仮想メモリ領域のデフォルトサイズは896MBです。したがって、最初の 2 つの領域は 1 ギガバイト、つまりアドレス空間の半分を占めます。 ユーザーヒープのデフォルトサイズは、VOSやOpenVOSのバージョンによって多少異なります。 リリース17.0では、デフォルトサイズは64MBです。 ユーザースタックのデフォルトサイズは8MBです。 ヒープとスタックの間の未使用の空間をデッドゾーンと呼びます。 ヒープは上に成長し(低いアドレスから高いアドレスへ)、スタックは下に成長する(高いアドレスから低いアドレスへ)ので、デッドゾーンはヒープまたはスタックのどちらかが拡張のために主張することができます。ヒープ、スタック、システムデータに利用可能な仮想メモリの総量は、さらに1ギガバイトです。 合計すると、ユーザープロセスは2ギガバイトの仮想メモリにアクセスできます。
使用可能なヒープ空間の総量には管理上の制限があります。スタックスペースと総容量(プログラムモジュールスペース、共有仮想メモリスペース、ヒープスペース、スタックスペースの合計)についても同様です。 モジュール全体の制限値は list_default_cmd_limits コマンドで確認し、update_default_cmd_limits コマンドで修正します。 新しいプロセスは、これらのモジュール全体の値を継承します。 プロセスが起動して実行されると、その制限値は list_process_cmd_limits コマンドを使用して表示し、update_process_cmd_limits コマンドを使用して変更することができます。
プロセス全体の制限値は、プログラムが実行されるたびに使用される制限値を初期化するために使用されます。 プログラムが起動して実行されると、s$get_current_cmd_limitsとs$set_current_cmd_limitsサブルーチンを呼び出して、実行中の制限値を取得したり変更したりすることができます。 このようにして、プログラムはシステムの初期デフォルト値よりも多くのスタックスペースを確保したり、使用が許可されているヒープスペースの量を増やしたりすることができます。 逆に、おそらくコーディングエラーのためにあまりにも多くのスペースを使用することを心配している場合は、使用できるスペースの量を減らすこともできます。
詳細については、update_default_cmd_limitsとバインドコマンドの説明を読んでください。