OpenVMS Alpha
オペレーティング・システム
64 ビット・アドレッシングおよび
VLM 機能説明書


前へ 次へ 目次 索引


3.3 符号拡張チェック

表 3-1 に示されていない OpenVMS システム・サービス,および 64 ビット・アドレスを受け取ることが明示的に指定されていないユーザ作成システム・サービスはすべて,符号拡張チェックを受けます。これらのサービスに渡される引数が正しく符号拡張されていないと,SS$_ARG_GTR_32_BITS というエラー状態が返ります。

3.4 言語の 64 ビット・システム・サービスのサポート

システム・サービスの C 関数プロトタイプは SYS$LIBRARY:SYS$STARLET_C.TLB (または STARLET) にあります。

システム・サービスに 64 ビット MACRO-32 マクロはありません。MACRO-32 呼び出し者は,AMACRO ビルトイン EVAX_CALLG_64 マクロ,または $CALL64 マクロを使用しなければなりません。MACRO-32 プログラミングでの 64 ビット・アドレッシングのサポートについての詳細は,第 12 章 を参照してください。

3.5 C の NEW STARLET 定義

OpenVMS Alpha V7.0 以降,SYS$LIBRARY:SYS$STARLET_C.TLB (または STARLET) は,新規および拡張データ構造体定義,およびシステム・サービスの C 関数プロトタイプを提供します。新しい定義は,OpenVMS C 言語のコーディング規則および SYS$LIBRARY:SYS$LIB_C.TLB で使用されている定義 (typedefs) との一貫性が向上しています。

既存ユーザの STARLET.H とのソース・レベルでの互換性を保持するために,古い形式の 関数宣言および定義が,省略時の設定としてそのまま提供されています。新しいシステム・サービス関数プロトタイプおよびタイプ定義を利用するには,これらを明示的に有効にしなければなりません。

これには,__NEW_STARLET シンボルを DEC C コマンド行修飾子で定義する方法と,定義をソース・プログラムに直接指定する方法があります。次の例を参照してください。

Librarian ユーティリティを使用すると,STARLET.H の中で現在有効なシステム・サービス関数プロトタイプを確認できます。次の例を参照してください。


$ LIBRARY/OUTPUT=STARLET.H SYS$LIBRARY:SYS$STARLET_C.TLB/EXTRACT=STARLET 

次の例は,STARLET.H に定義されている新しいシステム・サービス関数プロトタイプを示します。


    #pragma __required_pointer_size __long 
 
     int sys$expreg_64( 
               struct _generic_64 *region_id_64, 
               unsigned __int64 length_64, 
               unsigned int acmode, 
               unsigned int flags, 
               void *(*(return_va_64)), 
               unsigned __int64 *return_length_64); 
 
    #pragma __required_pointer_size __short 

DEC C ポインタ・サイズ・プログマについての詳細は,『DEC C User's Guide for OpenVMS Systems』を参照してください。

次のソース・コード例は,プログラムの中で参照されている sys$expreg_64 関数プロトタイプを示します。


 
#define __NEW_STARLET 1               /* Enable "New Starlet" features */ 
 
#include <starlet.h>                  /* Declare prototypes for system service 
s */ 
#include <gen64def.h>                 /* Define GENERIC_64 type */ 
#include <vadef.h>                    /* Define VA$ constants */ 
 
#include <ints.h>                     /* Define 64-bit integer types */ 
#include <far_pointers.h>             /* Define 64-bit pointer types */ 
 
{ 
    int status;                       /* Ubiquitous VMS status value */ 
    GENERIC_64 region = { VA$C_P2 };  /* Expand in "default" P2 region */ 
    VOID_PQ p2_va;                    /* Returned VA in P2 space */ 
    uint64 length;                    /* Allocated size in bytes */ 
    extern uint64 page_size;          /* Page size in bytes */ 
 
    status = sys$expreg_64( &region, request_size, 0, 0, &p2_va, &length ); 
    ... 
 
} 

新しい関数プロトタイプで使用されるデータ構造体を 表 3-2 に示します。

表 3-2 _NEW_STARLET プロトタイプが使用する構造体
プロトタイプが使用する構造体 定義されているヘッダ・ファイル 構造体メンバ名の
共通接頭辞
説明
struct _cluevthndl cluevtdef.h cluevthndl$ クラスタ・イベント・ハンドル
struct _fabdef fabdef.h fab$ ファイル・アクセス・ブロック
struct _generic_64 gen64def.h gen64$ 汎用クォドワード構造体
struct _ieee ieeedef.h ieee$ IEEE 浮動小数点制御構造体
struct _ile21 iledef.h ile2$ 項目リスト・エントリ 2
struct _ile31 iledef.h ile3$ 項目リスト・エントリ 3
struct _ilea_641 ilea_64$ iledef.h 64 ビット項目リスト・エントリ A 構造体
struct _ileb_641 ileb_64$ iledef.h 64 ビット項目リスト・エントリ B 構造体
struct _iosa iosadef.h iosa$ 入出力状態領域
struct _iosb iosbdef.h iosb$ 入出力状態ブロック
struct _lksb lksbdef.h lksb$ ロック状態ブロック
struct _rabdef rabdef.h rab$ RMS レコード・アクセス・ブロック
struct _secid seciddef.h secid$ グローバル・セクション識別子
struct _va_range va_rangedef.h va_range$ 32 ビット仮想アドレス範囲


1starlet.h 内の関数プロトタイプで,この構造体型の使用を要求するものはない。この構造体型は便宜上提供されており,適切な場所で使用できる。


第 4 章
メモリ管理 VLM 機能

本章では,次の OpenVMS Alpha メモリ管理 VLM 機能について説明します。

これら多数の VLM 機能を紹介するサンプル・プログラムについては,付録 D を参照してください。

4.1 VLM 機能の概要

メモリ常駐グローバル・セクションを使用すると,データベース・サーバは,大量の "ホット"なデータを物理メモリにキャッシュしておくことができます。このため,データベース・サーバは,ディスク上のデータベース・ファイルから読み込み操作を実行することなく,物理メモリから直接データにアクセスできます。物理メモリ内のデータには,より高速にアクセスできるため,実行時の性能は大幅に向上します。

Fast I/Oは,入出力要求当たりの CPU コストを削減し,データベース操作の性能を向上します。Fast I/O を使用するには, バッファ・オブジェクトを介してデータをメモリ内にロックしておく必要があります。OpenVMS Alpha の以前のバージョンでは,バッファ・オブジェクトはプロセス・プライベート仮想アドレス空間に対してしか作成できませんでした。OpenVMS Alpha 7.2 では,バッファ・オブジェクトは,メモリ常駐セクション内のページも含めて,グローバル・ページに対して作成できるようになりました。

共用ページ・テーブルを使用すると,同じデータベース・サーバがシステムの中で消費する物理メモリ量を削減することができます。複数のサーバ・プロセスが,大きなデータベース・キャッシュをマップする同じ物理ページ・テーブルを共用するため,OpenVMS Alpha システムはより多くのサーバ・プロセスをサポートできます。これによってシステム全般の容量が増加し,クライアント要求に対する応答時間を短縮することができます。

共用ページ・テーブルを使用すると,サーバ・プロセスは従来のグローバル・セクションの数百倍の速度でメモリ常駐グローバル・セクションをマップできるため,データベース・サーバのスタートアップ時間を大幅に短縮できます。数ギガバイトのグローバル・データベース・キャッシュを使用すると,サーバのスタートアップ時間を大幅に短縮できます。

システム・パラメータ GBLPAGESGBLPAGFIL は動的パラメータです。CMKRNL 特権を持つユーザは,実行中のシステムでこれらのパラメータの値を変更できるようになりました。GBLPAGES パラメータの値を大きくすると,必要に応じて新しい最大サイズまで,グローバル・ページ・テーブルを拡張できます。

予約メモリ・レジストリは,メモリ常駐グローバル・セクションおよび共用ページ・テーブルをサポートします。予約メモリ・レジストリは,SYSMAN ユーティリティの中のそのインタフェースを介して,メモリ常駐セクションまたは他の特権コードで使用するためのメモリを大量に確保して,OpenVMS システムを構成することができます。また,予約メモリ・レジストリによって,前もって確保した予約メモリを考慮しながら,AUTOGEN を介して OpenVMS システムを適切にチューニングできます。

4.2 メモリ常駐グローバル・セクション

メモリ常駐グローバル・セクションは,ファイルにバックアップされないグローバル・セクションです。つまり,メモリ常駐グローバル・セクション内のページは,ページファイルや,ディスク上の他のファイルにバックアップされません。このため,プロセスやシステムがページファイル制限値を制限されることはありません。プロセスがメモリ常駐グローバル・セクションにマップしページを参照するとき,ページのワーキング・セット・リスト・エントリは作成されません。したがって,プロセスがワーキング・セット制限値には制限されることはありません。

メモリ常駐グローバル・デマンド・ゼロ (DZRO) セクション内のページには,最初は 0 が含まれています。

メモリ常駐グロバール DZRO セクションの作成は,SYS$CREATE_GDZRO システム・サービス,またはSYS$CRMPSC_GDZRO_64 システム・サービスを呼び出すことによって行われます。

メモリ常駐グローバル DZRO セクションへのマップは,SYS$CRMPSC_GDZRO_64 システム・サービス,または SYS$MGBLSC_64 システム・サービスを呼び出すことによって行われます。

メモリ常駐グローバル・セクションを作成するには,プロセスに VMS$MEM_RESIDENT_USER ライト識別子が与えられていなければなりません。なお,メモリ常駐グローバル・セクションへのマップは,このライト識別子を必要としません。

メモリ常駐グローバル DZRO セクションを作成する場合,次の 2 つのオプションを使用できます。

Fault オプション

fault オプションを使用するには,予約メモリ・レジストリを介して,システムの流動ページ・カウントからメモリ常駐グローバル・セクション内のページを差し引くことをおすすめします。なお,この操作が要求されるわけではありません。

予約メモリ・レジストリを使用すると,システムの流動ページ・カウントの計算にメモリ常駐セクション・ページを含めずに,AUTOGEN でシステムを適切にチューニングできます。AUTOGEN は,システムの流動ページ・カウントに基づいて,システム・ページファイル,プロセス数,およびワーキング・セット最大サイズを判別します。

予約メモリ・レジストリを介してメモリ常駐グローバル・セクションが登録されていない場合,メモリ常駐グローバル・セクションを含むことができるだけの十分な流動ページがシステムにない時は,システム・サービス呼び出しは失敗します。

予約メモリ・レジストリを介してメモリ常駐グローバル・セクションが登録されている場合,グローバル・セクションのサイズが予約メモリのサイズを超えたときに,追加ページを含むことができるだけの十分な流動ページがシステムにないと,システム・サービス呼び出しは失敗します。

予約メモリ・レジストリを介してメモリが予約されている場合,そのメモリは,SYSMAN コマンドで指定されているグローバル・セクションで使用されなければなりません。メモリをシステムに戻すには,SYSMAN を実行して予約メモリを"解放"します。ページが戻され,システムの流動ページ・カウントの対象となります。

起動時にメモリ常駐グローバル・セクションの名前がわからない場合,または,システムがプールしている流動メモリを超えて大量のメモリを構成する場合,予約メモリ・レジストリ内のエントリを追加し,AUTOGEN でシステムを再チューニングすることができます。システムを再起動した後で,予約メモリを"解放"して,VMS$MEM_RESIDENT_USER ライト識別子を持つシステム内の任意のアプリケーションにこれを使用させることができます。この方法は,予約メモリを受け取るアプリケーションや名前付きグローバル・セクションを限定することなく,メモリ常駐グローバル・セクションに使用する流動メモリを増加することができます。RESERVED_MEMORY FREE コマンドについての詳細は,第 4.6.2.2 項 を参照してください。

Allocate オプション

allocate オプションを使用するには,システムを初期化する時にあらかじめメモリを割り当てて,連続的にアラインした物理ページが使用できる状態でなければなりません。マッピングの仮想アライメントが 8 ページ,64 ページ,または 512 ページ境界にある場合は,メモリ常駐グローバル・セクションにマップするときに粒度ヒントが使用されます (システム・ページ・サイズが 8 K バイトの場合,粒度ヒント仮想アライメントは 64 K バイト,512 K バイト,および 4 M バイト境界にあります)。OpenVMS は,SYS$MGBLSC などのマッピング・システム・サービスへの呼び出しにフラグ SEC$M_EXPREG が設定されている場合,粒度ヒントを使用した最適な仮想アライメントを選択します。

連続的でアラインされた PFN は,予約メモリ・レジストリを使用して予約されます。連続的でアラインされたページは,予約メモリの記述に基づいて,システムの初期化の際に割り当てられます。メモリ常駐グローバル・セクションのサイズは,予約メモリのサイズ以下でなければなりません。そうでない場合は,システム・サービス呼び出しからエラーが返ります。

メモリが予約メモリ・レジストリを介して予約されている場合,そのメモリは SYSMAN コマンドで指定されているグローバル・セクションで使用されなければなりません。メモリをシステムに戻すには,SYSMAN を実行して予約済みのメモリを解放します。予約済みのメモリが解放されると,allocate オプションを使用してメモリ常駐グローバル・セクションを作成することはできません。

4.3 グローバル・セクションのための Fast I/O とバッファ・オブジェクト

OpenVMS Alpha 7.2 では,VLM アプリケーションは,グローバル・セクションを介してプロセスで共用されるメモリに対して,Fast I/O を使用できます。OpenVMS Alpha の以前のバージョンでは,バッファ・オブジェクトはプロセス・プライベート仮想アドレス空間に対してしか作成できませんでした。Fast I/O を使用するには,バッファ・オブジェクトを介してデータをメモリにロックしておかなければなりません。複数のプロセスが大きなキャッシュを共用するデータベース・アプリケーションでは,次の種類のグローバル・セクションに対して,バッファ・オブジェクトを作成できるようになりました。

バッファ・オブジェクトを使用すると,Fast I/O システム・サービスが有効になります。これらのサービスを使用すると,I/O 装置との間で高速に非常に大量の共用データを読み書きすることができます。I/O 要求当たりの CPU コストを削減することで,Fast I/O は I/O 操作の性能を向上します。

Fast I/O は,データベース・サーバなどの VLM アプリケーションの能力を向上するので,従来より大きな容量を取り扱うことができるようになり,高いデータ・スループットを実現できます。

4.3.1 $QIO と Fast I/O の比較

$QIO システム・サービスでは,指定された範囲のメモリが存在することと,それぞれのダイレクト I/O 要求が実行される間,そのメモリにアクセスできることが必要です。バッファが存在することと,アクセス可能であることの確認は,プローブと呼ぶ操作で実行されます。I/O がアクティブな間,バッファを削除できないようにし,アクセス保護が変更されないようにするために,I/O 要求が実行されている間はメモリ・ページをロックし,I/O が終了した時点でアンロックするようにしています。

I/O で実行されるプローブとロック/アンロック操作は,コストのかかる操作です。この操作を各 I/O に対して実行するには,CPU の能力の多くを使用しなければならない可能性があります。Fast I/O の利点は,1 つの I/O の間だけメモリがロックされ,それ以外はページングできるという点です。

Fast I/O の場合も,バッファが使用可能であるかどうかを確認する必要がありますが,多くの I/O 要求は同じメモリ・キャッシュから実行されるため,各 I/O に対してではなく,キャッシュが 1 回だけプローブされ,ロックされる場合は,性能を向上できます。OpenVMS では,複数の I/O の間にメモリ・アクセスが変更されないことだけを確認する必要があります。Fast I/O では,この目標を達成するためにバッファ・オブジェクトを使用します。また,Fast I/O では,一部のシステム・リソースを前もって割り当て,I/O の流れを全般的に単純化することで,さらに性能を向上しています。


前へ 次へ 目次 索引