GETMAINとFREEMAIN(仮想記憶域の獲得と解放)

By 神居 - Posted: 2012/10/18 Last updated: 2012/12/17 - Leave a Comment

MVS,MSP,VOS3:OSの互換性:API,インターネルの違い – GETMAINとFREEMAIN

仮想記憶域を獲得、返却するためのAPIマクロである、GETMAINとFREEMAINは基本的にMVS、MSPおよびVOS3間で互換がある。24ビット・アドレスしかサポートされていなかったMVS/SPの頃までは、マクロの構文もSVCインターフェースも全く同じであった。
しかしながら、31ビット・アドレスがサポートされた以降は関連するパラメーターとインターフェースに若干の違いが見られる。また、64ビット・アドレスに関してはz/OSでしかサポートされないため、使用する記憶域量に無理がなければ31ビット域で代用するしかない。


基本的な構文

マクロ命令の構文はいずれのOS共に基本的なものについては互換である。ただし、MVS(z/OS)にはESA第4版以降に追加されたいくつかの固有のパラメーターがあり、それらはMSPとVOS3に対しては非互換である。また、MVSにはARモードやクロスメモリー・モードのプログラムでも発行できるGETMAIN/FREEMAINと同等機能のSTORAGEマクロも用意されている。


ストレージの獲得位置の指定

GETMAINではストレージを、16MB境界より下に割り当てるのか、それとも16MB境界より上に割り当てるのか、をLOCパラメーターで指定できる。

基本的に非互換なのはLOC=EXPLICITの指定である。これは獲得したい領域のアドレス(あくまでも希望アドレス)を要求側が指定するもので、MVSに固有の機能である。具体的なアドレスはINADDRパラメーターで指定する。




獲得したストレージの初期値

MVSでは、GETMAINで獲得した仮想記憶域は条件次第でゼロ・クリアーされる。マニュアルには、「ページング可能な私用域のサブプールから8192バイト以上あるいはBNDRY=PAGEが指定されていれば4096バイト以上」の領域をGETMAINした場合は、システムが領域をゼロに設定する、と明記されている。
しかし、MSPにおいては同じではない。経験的には新しい仮想ページが割り当てられた場合(4KB単位の大きさでGETMAINするとか)はゼロになっていた、と記憶しているが、必要ならMVCL命令で初期化していたからGETMAINの仕様にこだわったことはない。ずいぶん前のことであるが、富士通のソフトウェア工場の人から「MSPのGETMAINルーチンでは明示的にゼロ・クリアーされる保証はしていない、海外のMVS用ソフトウェアの中にはGETMAINした領域がゼロ・クリアーを期待していて、MSP用に移植した際に上手く動かず問い合わせを受けたこともあった」という話を聞いたことがある。どうしてそんな期待をするのかと思っていたけど、MVSはマニュアルで明確にしている。MSPもVOS3もMVSのように明確にゼロ・クリアーの条件を公表していないので、MVSと同じように考えない方がよい。ゼロ・クリアーを前提にしたいなら、GETMAIN直後に自分でゼロ・クリアーすることを奨める。


GETMAINマクロにおけるz/OSに固有のパラメーター

従来GETMAINでのバウンダリー調整はBNDRY=PAGEによるページ単位(4KB)バウンダリーしかできなかった。短い領域をページ・バウンダリーで大量に獲得すると、不連続な空き領域が増えてストレージ効率が悪くなる。また、MVS(MSP,VOS3)では、GETMAINする領域はページの後方から前方に向かって空き領域を割り当てる(BNDRY=DBLWDの時)という特徴がある。このため1Kや2Kといった長さでは意図してきりのいいアドレスから割り当てることが難しかった。CONTBDYやSTARTBDYの機能によって、プログラムによるバウンダリー調整が容易になり、その結果の不連続空き領域の発生も抑えられる効果がある。

Posted in API、インターナルの違い • • Top Of Page