01.3 獲得済み領域の管理(VSMLIST)

プログラムが仮想記憶内のどの領域をGETMAINしているかをマッピングすることができます。一般のプログラムでは殆ど必要とされませんが、サーバー・プログラムなどで自分が使用しているリソース量の詳細を得る機能などを実装する場合などに利用できます。

VSMLISTマクロでストレージ・マップを作る

リージョン(PVT域)内のGETMAIN済み領域をリストする

SP=PVT指定のVSMLISTで、プログラムがリージョン内にどれだけのGETMAINを出しているかを知ることができます。返される領域情報は、GETMAINして割当て中の仮想ページのアドレスと大きさ(4KB単位)です。SPACE=FREEパラメーターを追加することで、割当て中ページ内の空きスペース長も得ることができます。割当て中ページの大きさから空きスペース長を引けば、そのページ内でのGETMAIN済み領域長となります。なお連続するページ内で複数回に渡ってGETMAINしても、割当て済み領域が連続すれば1つの割当て済み領域として返されますから、どの長さで何回GETMAINしたかはトレースできません。例えば、1504バイトの長さで2回連続したGETMAINをしても、VSMLISTでは3008バイトの領域が割当て中と返されます。

共通域(CSA)内の割当て済みページをリストする

CSAの割当て済み領域のリストを作成するには、SPパラメーターにCSAを指定します。他にもLSQA、SQAが指定できます。PVTの場合は、領域を割り振ったタスクを判別するTCBアドレスがリスト内に設定されますが、CSAの場合は0がセットされて具体的にどのタスクあるいはジョブでCSAを割り振ったかはわかりません。ただし、割り振られている領域の記憶保護キーが返されるので、キーの値によってどのコンポーネントで使っている領域かは大まかな見当を付けることはできます。例えば、キーが6であればVTAMやTCPIP関連の領域、キーが5であればDFSMS関連の領域、キーが1であればJES関連の領域という具合です。キーが8であれば主にアプリケーション(ベンダー・ソフトウェア含む)が割り振った領域となりますが、z/OSのV1R9からはユーザー・キーでのCSA割り振りを認めないのがシステム・デフォルトになってしまったため、PARMLIBのDIAGxxパラメーターでユーザーキーCSAを認めていない限り、アプリケーションであっても7以下(おそらくは0)のキーの領域しか割り振れません。

VSMLISTによって返されるストレージ・マップリスト

VSMLISTで戻される割当て済み領域及び空き領域リストは、上記のような構造の可変長エントリーのテーブルです。1つ1つのエントリーをたどってGETMAIN済み領域のアドレスと長さを求めることができます。MVSではGETMAINによって領域を割り振る時、必要なページを切り出した後、ページの後方から領域を割り振ります。例えば、切り出したページ・アドレスがx10000番地の時、GETMAINで1000バイト(x3E8)の長さを要求すると、x10C18番地からx10FFF番地までの1000バイトが割り振られます。そのページのx10000番地からx10C17番地までは、空き領域になり次のGETMAIN等で使用されます。GETMAINで5000バイト要求した場合は、2ページが切り出されて後方ページの後方アドレスから割り振られます。
VSMLISTは、例えシステム系プログラムであっても滅多に必要とするAPIではありませんが、仮想記憶の中がどのように使われているかを調べたいような場合に利用できます。存在ぐらいを覚えておけばいいでしょう。マクロの使い方と返答領域の構造などの詳細は、マニュアル「MVS許可アセンブラーサービスの手引き(Authorized Assembler Services Guide)」「MVS許可アセンブラーサービス解説書(Authorized Assembler Services Reference)」に記載されています。マニュアルは許可アセンブラーサービスとなっていますが、非APFプログラムでも使用できます。

その他の仮想記憶管理関連マクロ

VSMLOCマクロでストレージの妥当性をテストする

VSMLOCマクロを使えば、メモリーアドレスの正当性をチェックすることができます。例えば、サブルーチンでパラメーター領域として正しいアドレスが渡されたかどうかをチェックしたいといった場合に利用できます。従来このようなチェックをするには、プログラムを監視プログラム・モードにしてLRA命令やTPROT命令を使うのが一般的でした。監視プログラム・モードのプログラムなら機械命令でチェックした方がパフォーマンス面でも有利ですが、非APFプログラムなど監視プログラム・モードで走行することができないプログラムでも仮想記憶アドレスの正当性が確認できます。これによって、誤ったアドレスをハンドリングしたことによるS0C4ABENDを抑止するようなガードを掛けることもできます。

VSMREGNマクロでリージョンの開始アドレスと大きさを求める

VSMREGNマクロを使えば、利用可能な私用域の最大サイズを求めることができます。簡単ですが、返ってくるのはそのシステムでの構成上の最大値で、JCLのREGIONパラメーター値は考慮されていません。利用可能な残りのストレージ量を実用的に求めるならLDAというOSの制御表を参照する方が確実です。