ダンプリスト解析入門⑨

By 神居 - Posted: 2013/03/07 Last updated: 2013/03/07 - Leave a Comment

ダンプリスト解析入門⑨:ダンプ解析に関連するOSコントロール・ブロック&#9316

タスクで実行中のプログラムがGETMAINマクロなどで獲得した仮想記憶域は、サブプール毎に獲得済みの領域とフリー領域が管理されています。これを行うためのコントロール・ブロックがSPQE、DQEおよびFQEです。


SPQEとSPQA

SPQE(Subpool Queue Element)は、タスクで使用しているサブプールを示すコントロール・ブロックです。サブプール番号とストレージ・キー、オーナー・タスクおよびサブプール内の領域を管理するDQEへのアンカー領域であるSPQAへのポインターなどで構成されています。SPQEは、TCBのTCBMSSフィールドからポイントされ、サブプール単位にSPQEがチェインされます。
SPQA(Subpool Queue Anchors)は、サブプール内の獲得済み領域を示すDQEをポイントします。16MB境界より上の拡張域のDQEは、SPQAに代わりSPQX(SPQA Extension)からポイントされます。SPQAとSPQXはSPQEからそれぞれ別にポイントされ、サブプール番号が同じでも、獲得される領域の位置(16MB境界の上下いずれなのか)によって異なるアンカー領域が使われます。なお、対応するDQEが存在しない場合、DQEポインターはそのSPQAもしくはSPQX自身のアドレスを示しています。
SPQEはIHASPQEマクロによって、SPQA/SPQXはIHASPQAマクロによってマッピングできます。

SPQEはタスク毎に作られてSPQEキューとしてチェインされます。ただしサブプール0についてはタスク間で共用できます。この場合、SPQEはタスク毎に作成されますが、そこからポイントされるSPQAとSPQXについては同じコントロール・ブロックを共用しています。サブプール0を共用しないタスクの場合は、SPQEからポイントされるSPQXとSPQEもそのタスク固有のコントロール・ブロックとなります。


DQEとFQE

DQE(Descriptor Queue Element)は、SPQEが示すサブプール内の獲得済み領域を示します。1つのDQEは1つの連続した領域ブロックを管理します。サブプール内に複数の獲得済み領域がある場合は、それぞれの領域毎にDQEが作られます。GETMAINが発行された際に新しい仮想ページが割り振られるとDQEが作られ、割り振られた仮想ページ内のすべての領域が解放されるとそこを管理していたDQEも消滅します。DQEはIHADQEマクロによって、FQEはIHAFQEマクロによってマッピングできます。
FQE(Free Queue Element)は、DQEが管理する仮想ページ内のフリー領域(GETMAINされていない領域)を管理します。DQEはSPQE/SPQAからチェインされていますが、FQEは1つ1つのDQE単位に管理されDQEからチェインされます。GETMAINが要求されると、指定されたサブプールのDQEからFQEをたどります。要求長を満たすフリー領域が見つかると、そのFQEが指すフリー領域の後方から前方に向かって領域を切り出します。


FBQE

FQEは割り振られている仮想ページ内の空き領域を管理しますが、リージョン内で未だ仮想ページが割り振られていない領域はFBQE(Free Block Queue Element)によって管理されます。FBQEはどのタスクにも割り当てられていない未使用の領域を管理するもので、LDA(Local Data Area)からポイントされています。LDAは、アドレス空間に固有の仮想記憶域を管理するコントロール・ブロックで、16MB境界の上下それぞれのリージョン域の開始アドレスとサイズ、使用可能なリージョン・サイズ、使用済みの仮想ストレージサイズなどが格納されています。
FBQEはIHAFBQEマクロによって、LDAはIHALDAマクロによってマッピングできます。


ダンプリスト上の仮想記憶マップ

プログラムがS878やS80AといったコードでABENDすることはよくあります。一般的にはJCLで指定したリージョンサイズが小さすぎる場合に起きるため、まずはJCL側のリージョンサイズを修正して再実行する対応が行われます。しかしながらいくらリージョンサイズを増やしても、再発するような場合はリージョンサイズの問題ではなく、プログラム側で獲得した領域を解放していない、あるいは獲得時のサイズと解放時のサイズが異なっている、といったバグによるものもあります。領域の未解放や誤ったサイズによる解放で、仮想記憶域内でフラグメンテーションが起きているような場合は、ダンプリスト上に出力される「**VIRTUAL STORAGE MAP**」を参照することでわかる場合があります。

Posted in ダンプ解析入門 • • Top Of Page