前へ | 次へ | 目次 | 索引 |
1.5 VAXシステムとAXPシステムの算術演算ライブラリ間の互換性
OpenVMS Mathematics(MTH$)ランタイム・ライブラリに対して標準的な VMS呼び出しインターフェイスを使用する算術演算アプリケーションを,AXPシステムに移行するときには,MTH$ルーチンの呼び出しを変更する必要はありません。これは,MTH$ルーチンをDigital Portable Mathematics Library(DPML)for AXPシステムの対応するmath$に変換するためのジャケット・ルーチンが準備されているからです。しかし,JSBエントリ・ポイントとベクタ・ルーチンに対して実行される呼び出しは,DPMLでサポートされません。DPMLルーチンはOpenVMS MTH RTL のルーチンと異なっており,算術演算の結果の精度にわずかな違いが発生する可能性があります。
将来のライブラリとの互換性を維持し,移植可能な算術演算アプリケーションを開発するには,この呼び出しインターフェイスを使用するのではなく,選択した高級言語(たとえばFORTRANやCなど)を通じて提供されるDPMLルーチンを使用することが適切です。DPMLルーチンを使用すれば,性能と精度も大幅に向上できます。
DPMLルーチンについての詳しい説明は,『Digital Portable Mathematics Library』を参照してください。
1.6 ホスト・アーキテクチャの判断
アプリケーションがVAXシステムで実行されているのか,AXPシステムで実行されているのかを,アプリケーションで判断しなければならないことがあります。プログラムの内部から$GETSYIシステム・サービス(またはLIB$GETSYI RTLルーチン)を呼び出し,ARCH_TYPEアイテム・コードを指定すれば,この情報を入手できます。アプリケーションがVAXシステムで実行されている場合には,$GETSYIシステム・サービスは1という値を戻します。アプリケーションがAXPシステムで実行されている場合には,$GETSYIシステム・サービスは2という値を戻します。
例 1-1 は,F$GETSYI DCLコマンドを呼び出し,ARCH_TYPEアイテム・コードを指定することにより,DCLコマンド・プロシージャでホスト・アーキテクチャを判断する方法を示しています(アプリケーションで $GETSYIシステム・サービスを呼び出す例については,第 2.4 節 を参照してください。その例では,AXPシステムのページ・サイズを入手するためにシステム・サービスが使用されています)。
例 1-1 アーキテクチャ・タイプを判断するための ARCH_TYPEキーワードの使用 |
---|
$! Determine architecture type $ type_symbol = f$getsyi("arch_type") $ if type_symbol .eq. 1 then goto ON_VAX $ if type_symbol .eq. 2 then goto ON_ALPHA_AXP $ ON_VAX: $ ! $ ! Do VAX-specific processing $ ! $ exit $ ON_ALPHA_AXP: $ ! $ ! Do Alpha AXP-specific processing $ ! $ exit |
しかし,ARCH_TYPEアイテム・コードは,バージョン5.5またはそれ以降のバージョンを実行しているVAXシステムだけでしか使用できません。アプリケーションが,これ以前のバージョンのオペレーティング・システムでホスト・アーキテクチャを判断しなければならない場合には,表 1-3 に示した$GETSYI システム・サービスの他のアイテム・コードを使用しなければなりません。
キーワード | 使用方法 |
---|---|
ARCH_TYPE | VAXシステムでは1を戻す。AXPシステムでは2を戻す。AXPシステムと,OpenVMSバージョン5.5またはそれ以降のバージョンのVAXシステムでサポートされる。 |
ARCH_NAME | VAXマシンでは"VAX"というテキスト文字列を戻し,AXPマシンでは"Alpha"というテキスト文字列を戻す。AXPシステムと,OpenVMSバージョン5.5またはそれ以降のバージョンを実行しているVAXシステムでサポートされる。 |
HW_MODEL | ハードウェア・モデルを識別する整数を戻す。1024以上のすべての値はAXPシステムを示す。 |
CPU | CPUを識別する整数を戻す。128という値はAXPシステムを識別する。 |
この章では,アプリケーションでVAXのページ・サイズに依存している部分を識別する方法を説明し,これらの問題に対する対処方法を示します。
2.1 概要
ページ・サイズは,オペレーティング・システムが操作するメモリの基本単位であり,一般にアプリケーションのレベルでは意識する必要はありません。特に,高級プログラミング言語や中級プログラミング言語で作成されたアプリケーションの場合には,ページ・サイズを直接操作することはほとんどありません。しかし,アプリケーションでシステム・サービスやランタイム・ライブラリ・ルーチンを呼び出し,次のようなメモリ管理機能を実行する場合には,ページ・サイズに依存する部分がアプリケーションに含まれている可能性があります。
これらを実行するシステム・サービスやランタイム・ライブラリ・ルーチンは,メモリをページ単位で操作します。これらのルーチンに対する引数として値を指定する場合は,1ページが512バイトであるものと仮定しています。これはVAXアーキテクチャで定義されているページ・サイズです。Alpha AXPアーキテクチャでは,8Kバイト,16Kバイト,32Kバイト,または64Kバイトのページ・サイズをサポートします。したがって,ルーチンへの引数として指定する値を調べ,それらの値がアプリケーションの必要条件を満足するかどうかを確認しなければなりません。この後の節では,これらのルーチンを調べる方法について詳しく説明します。
このようなページ・サイズの違いは,上位レベル・ルーチンを使用するメモリ割り当てには影響を与えません。たとえば,Cの mallocや freeルーチンなど,言語固有のメモリ割り当てルーチンや,仮想メモリ領域を操作するランタイム・ライブラリ・ルーチンなどは,ページ・サイズの違いの影響を受けません。
2.1.1 互換性のある機能
システム・サービスやランタイム・ライブラリ・ルーチンは,AXPシステムにおいてもできる限りVAXシステムと同じインターフェイスや戻り値を維持しています。たとえば AXPシステムでは,引数としてページ・カウント値を受け付けるルーチンのこれらの引数をページレットと呼ぶ512バイトの量として解釈することにより,CPU固有のページ・サイズと区別します。各ルーチンはページレットの値をCPU固有のページに変換します。ページ・カウント値を戻すルーチンは,CPU固有のページからページレットに変換することにより,アプリケーションで期待される戻り値が512バイト単位で表現されるようにします。
AXPシステムでは,$CRMPSCシステム・サービスを使用して(さらにSEC$M_PFNMAPフラグ・ビットをセットして)ページ・フレーム・セクションを作成する場合には,ページ・カウント引数(pagcnt)に指定された値はCPU固有のページ・サイズとして解釈され,ページレットの値としては解釈されません。 |
2.1.2 特定のページ・サイズに依存する可能性のあるメモリ管理ルーチンのまとめ
互換性があるにもかかわらず,一部のルーチンのAXPシステムでの動作はVAXシステムでの動作と異なっており,ソース・コードを変更しなければならない可能性があります。たとえばAXPシステムでは,セクション・ファイルをマッピングするシステム・サービス($CRMPSCと$MGBLSC)は,CPU固有のページ境界にアラインされたアドレス値を引数として指定しなければなりません。VAXシステムでは,これらのルーチンは引数のアドレス値を VAXページ境界になるように調整します。AXPシステムでは,これらのアドレスはCPU固有のページ境界には調整されません。
表 2-1 は,ページ・サイズに依存する部分を含んでいる可能性のあるメモリ管理ルーチンと,それらのルーチンがサポートする引数を示しています。この表には,各引数の機能と,これらの引数がルーチンのOpenVMS AXPバージョンでどのように解釈されるかが示されています。この表には,ルーチンが受け付けるすべての引数が示されているわけではありません。ルーチンとその引数リストについての詳しい説明は,『OpenVMS System Services Reference Manual』を参照してください。
引数 | AXPシステムの動作 | |
---|---|---|
Adjust Working Set Limit($ADJWSL) | ||
pagcnt | 現在のワーキング・セット・リミットに加算される(またはワーキング・セット・リミットから減算される)ページ数を指定する。 | 値をページレットとして解釈し,CPU固有のサイズのページを表現するために切り上げるか,または切り捨てる。 |
wsetlm | 現在のワーキング・セット・リミットの値を指定する。 | 値をページレットとして解釈し,CPU固有のサイズのページを表現するために切り上げるか,または切り捨てる。 |
Create Process($CREPRC) | ||
quota | 省略時のワーキング・セット・サイズ,ページング・ファイル・クォータ,ワーキング・セット拡張クォータなど,ページ・カウントを指定する複数のクォータ記述子を受け付ける。 | 値をページレットとして解釈し,CPU固有のサイズのページを表現するために切り上げるか,または切り捨てる。 |
Create Virtual Address($CRETVA) | ||
inadr | 割り当てられるメモリの先頭のアドレスと末尾のアドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1ページが割り当てられる。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | 呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Create and Map Section($CRMPSC) | ||
inadr | 再びマッピングされる領域を定義する先頭アドレスと末尾アドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1ページがマッピングされる。ただし,SEC$M_EXPREGフラグが設定されている場合には,割り当てがP0空間であるのか,P1空間であるのかを判断し,その結果をもとに先頭アドレスが解釈される。 | アドレスは CPU固有のページにアラインしなければならない(SEC$M_EXPREGフラグが設定されていない場合)。切り上げや切り捨ては実行されない(マッピングについての詳しい説明は 第 2.3 節 を参照)。 |
retadr | 呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 使用可能なアドレス範囲の先頭アドレスと末尾アドレスを戻す。これはマッピングされた合計サイズと異なる可能性がある。relpag 引数を指定した場合には,この引数も指定しなければならない。 |
flags | 作成またはマッピングされるセクションのタイプと属性を指定する。 | フラグ・ビットSEC$M_NO_OVERMAPは,既存のアドレス空間をマッピングしてはならないことを示す。フラグ・ビットSEC$M_PFNMAPがセットされている場合には,pagcnt 引数はCPU固有のページとして解釈され,ページレットとしては解釈されない。 |
relpag | セクション・ファイルのマッピングを開始するページ・オフセットを指定する。 | セクション・ファイルへのインデックスとして解釈され,単位はページレットであると解釈される。 |
pagcnt | マッピングされるファイル内のページ数(ブロック数)を指定する。 | ページレットとして解釈される。切り上げや切り捨ては実行されない。フラグ・ビットSEC$M_PFNMAPがセットされている場合には,pagcnt 引数はCPU固有のページとして解釈され,ページレットとしては解釈されない。 |
pfc | ページ・フォルトが発生したときにマッピングしなければならないページ数を指定する。 | CPU固有のサイズのページとして解釈される。この引数の値を指定する場合には,各物理ページに対して少なくとも 16ページレットがマッピングされることを考慮しなければならない。これは,AXPシステムが8Kバイト,16Kバイト,32Kバイト,64Kバイトの物理ページ・サイズをサポートするからである。システムが物理ページより小さいサイズをマッピングすることはできない。 |
Delete Virtual Address($DELTVA) | ||
inadr | 割り当てが解除されるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | 削除されたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Expand Program/Control Region($EXPREG) | ||
pagcnt | 512バイト単位で割り当てるメモリ・サイズを指定する。 | ページレットとして解釈される。 |
retadr | 呼び出しの影響を受けるメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Get Job/Process Information($GETJPI) | ||
itmlst | プロセスに関して戻される情報を指定する。 | JPI$_WSEXTENTなど,多くの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。 |
Get Queue Information($GETQUI) | ||
itmlst | func 引数によって指定された関数を実行するときに使用される情報を指定する。 | いくつかの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。 |
Get Systemwide Information($GETSYI) | ||
itmlst | 1つ以上のノードに関して戻される情報を指定する。 | 一部の項目はページレット単位の値として解釈される。SYI$_PAGE_SIZEという追加項目は,ノードがサポートするページ・サイズを指定する。詳しくは『OpenVMS System Services Reference Manual』を参照。 |
Get User Authorization Information($GETUAI) | ||
itmlst | ユーザのユーザ登録ファイルからどの情報が戻されるかを指定する。 | 一部の項目はページレット単位の値を戻す。詳しくは『OpenVMS System Services Reference Manual』を参照。 |
Lock Page($LCKPAG) | ||
inadr | ロックされるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | ロックされたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Lock Working Set($LKWSET) | ||
inadr | ロックされるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | 実際にロックされたメモリの先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Map Global Section($MGBLSC) | ||
inadr | 再びマッピングされる領域を定義する先頭アドレスと末尾アドレスを指定する。末尾アドレスが先頭アドレスと同じである場合には,1ページがマッピングされる。ただし,SEC$M_EXPREGフラグがセットされている場合には,割り当てがP0空間で実行されるのか,P1空間で実行されるのかを判断し,その結果に従って先頭アドレスが解釈される。 | アドレスはCPU固有のページにアラインしなければならない(SEC$M_EXPREGフラグが設定されていない場合)。アドレスの切り上げや切り捨ては実行されない(マッピングについての詳しい説明は 第 2.3 節 を参照)。 |
retadr | 呼び出しの影響を受けたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | マッピングされたメモリの使用可能な部分の先頭アドレスと末尾アドレスを戻す。 |
relpag | セクション・ファイルのマッピングを開始するページ・オフセットを指定する。 | セクション・ファイルに対するインデックスとして解釈され,単位はページレットであると解釈される。 |
Purge Working Set($PURGWS) | ||
inadr | パージされるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
Set Protection($SETPRT) | ||
inadr | 保護されるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | 保護されたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Set User Authorization File($SETUAI) | ||
itmlst | ユーザのユーザ登録ファイルからどの情報を設定するかを指定する。 | いくつかの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。 |
Send to Job Controller($SNDJBC) | ||
itmlst | func引数によって指定された関数を実行するときに使用される情報を指定する。 | いくつかの項目はページレット単位の値として解釈される。詳しくは『OpenVMS System Services Reference Manual』を参照。 |
Unlock Page($ULKPAG) | ||
inadr | アンロックされるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | アンロックされたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Unlock Working Set($ULWSET) | ||
inadr | アンロックされるメモリの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
retadr | アンロックされたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | 変更されない。 |
Update Section($UPDSEC) | ||
inadr | ディスクに書き込むセクションの先頭アドレスと末尾アドレスを指定する。 | CPU固有のページになるように要求は切り上げられるか,または切り捨てられる。ディスク上の記憶空間によって表現される実際のアドレス範囲だけがディスクに書き込まれる。 |
retadr | ディスクに書き込まれたメモリの実際の先頭アドレスと末尾アドレスを指定する。 | CPU固有のページ境界にアラインされるように,アドレスは切り上げられるか,または切り捨てられる。 |
表 2-2 に示したランタイム・ライブラリ・ルーチンは,メモリ・ページを割り当てるか,または解放します。互換性を維持するために,これらのルーチンでは,ユーザが指定したページ・カウント情報をページレットの値として解釈します。
アドレス範囲引数の機能 | OpenVMS AXPでの解釈 | |
---|---|---|
LIB$GET_VM_PAGE | ||
number-of-pages | ||
割り当てる連続ページのページ数を指定する。 | ページレット単位の値として解釈され,CPU固有のページに切り上げられるか,または切り捨てられる。 | |
LIB$FREE_VM_PAGE | ||
number-of-pages | ||
割り当てを解除する連続ページのページ数を指定する。 | ページレット単位の値として解釈され,CPU固有のページになるように切り上げられるか,または切り捨てられる。 |
前へ | 次へ | 目次 | 索引 |