前へ | 次へ | 目次 | 索引 |
I/O サブシステムは,バッファード I/O でシステム空間からデータを移動するか,ダイレクト I/O 操作を認めることで,データをユーザ・バッファに移動できます。しかし,その前にユーザ・バッファが実際に存在することと,アクセス可能であることを確認しなければなりません。
バッファード I/O の場合,この処理は通常,I/O を要求しているプロセスのコンテキストを想定し,ターゲット・バッファをプローブすることで行われます。ほとんどの QIO 要求では,この処理は IPL 2 (IPL$_ASTDEL) で行われるため,バッファのプローブとデータの移動の間で AST が実行されることはありません。操作全体が完了するまで,バッファは削除されません。また,IPL 2 で実行することにより,データがコピーされている間,通常のページング・メカニズムが動作できます。
ダイレクト I/O の場合は通常,I/O に対してターゲット・ページをロックすることで行われます。この結果,バッファを構成するページは,ページングやスワッピングの対象から除外されます。I/O サブシステムは,ページ・フレーム番号,最初のページ内のバイト・オフセット,I/O 要求の長さで,バッファを識別できます。
この方法では,プロセスがページングを続行でき,I/O がまだ実行されていなかったり,アクティブな間も,バランス・セットからスワップすることができるので,柔軟性を最大限に向上できます。バッファード I/O の場合は,ページをロックする必要はありません。ダイレクト I/O の場合は,ほとんどのプロセス・ページはページングまたはスワッピングが可能です。しかし,この柔軟性を実現するために,コストが必要になります。I/O に関係するすべてのページを,おのおのの I/O に対してプローブまたはロックし,アンロックしなければなりません。I/O の実行回数の多いアプリケーションの場合は,オペレーティング・システムがこれらの操作に大量の時間を費やす可能性があります。
バッファ・オブジェクトを使用すると,このオーバーヘッドの大部分を回避するのに役立ちます。
4.3.3 バッファ・オブジェクトの概要
バッファ・オブジェクトとは,プロセス内の仮想アドレスに割り当てられたプロセス・エンティティです。バッファ・オブジェクトが作成されると,この範囲のアドレス内のすべてのページがメモリ内でロックされます。バッファ・オブジェクトが削除されるまで,これらのページを解放することはできません。Fast I/O 環境では,$IO_SETUP の間,バッファ・オブジェクト自体をロックすることで,この機能を利用します。このようにすると,バッファ・オブジェクトと,そのオブジェクトに割り当てられたページが削除されるのを防止できます。バッファ・オブジェクトは $IO_CLEANUP でアンロックされます。これにより,コストのかかるプローブ,ロック,アンロック操作は,I/O バッファがバッファ・オブジェクトを越えないことを確認する単純なチェックに置き換えられます。ただし,バッファ・オブジェクトに割り当てられたページは,メモリ内で永久的にロックされるという欠点があります。アプリケーションは従来より多くの物理メモリを必要とするようになりますが,実行速度は向上します。
システム・メモリへのこの種のアクセスを制御するには,ユーザは VMS$BUFFER_OBJECT_USER 識別子を保有しなければなりません。システムはバッファ・オブジェクトで使用するために特定のページ数だけをロックすることを認めます。この数は動的 SYSGEN パラメータ MAXBOBMEM で制御されます。
第 2 のバッファ・オブジェクト・プロパティにより,Fast I/O は高い IPL でシステム・コンテキストから完全に複数の I/O 関連タスクを実行することができ,プロセス・コンテキストを想定する必要がありません。バッファ・オブジェクトが作成されると,システムはデフォルトでシステム空間のセクション (S2) を,バッファ・オブジェクトに割り当てられたプロセス・ページにマップします。このシステム空間ウィンドウは,カーネル・モードだけから読み込みアクセスと書き込みアクセスを許可するように保護されます。すべてのシステム空間はどのコンテキストの内部からも等しくアクセスできるので,元のユーザのプロセス・コンテキストを想定するために,さらにコストのかかるコンテキスト切り換えを回避することができます。
バッファ・オブジェクト・ページへのシステム空間アクセスを可能にするには,コストが必要です。たとえば,S2 空間は通常,数ギガバイトですが,Fast I/O のために数ギガバイトのデータベース・キャッシュを多くのプロセスで共用しなければならない場合は,このサイズでも不十分な可能性があります。このような環境では,キャッシュ・バッファとの間のすべてまたは大部分の I/O はダイレクト I/O であり,システム空間マップは必要ありません。
OpenVMS バージョン 7.2 では,バッファ・オブジェクトは,システム空間ウィンドウを割り当てた状態で作成でき,割り当てずに作成することもできます。バッファ・オブジェクトが使用するリソースは次のようにチャージされます。
Fast I/O 機能の使用の詳細については,『OpenVMS I/O User's Reference Manual』を参照してください。
4.3.4 バッファ・オブジェクトの作成と使用
バッファ・オブジェクトを作成して使用する場合,次のことに注意する必要があります。
共用ページ・テーブルを使用すると,2 つ以上のプロセスが同じ物理ページにマップすることができます。このとき,各プロセスがページ・テーブル作成,ページ・ファイル・アカウンティング,およびワーキング・セット制限値アカウンティングのオーバヘッドを受けることはありません。共用ページ・テーブルは,内部的には特別な種類のグローバル・セクションとして扱われており,メモリ常駐グローバル・セクションの一部であるページをマップするときに使用されます。ページ・テーブルの共用を実現する特別グローバル・セクションを,共用ページ・テーブル・セクションと呼びます。共用ページ・テーブル・セクション自体は,メモリ常駐です。
共用ページ・テーブルは,いくつかのシステム・サービスによって作成され,複数のプロセスに送信されます。プロセスやアプリケーションが共用ページ・テーブルを使用するのに,特別な特権やライト識別子は必要ありません。メモリ常駐グローバル・セクションを作成するときだけ,VMS$MEM_RESIDENT_USER ライト識別子が必要です。この識別子を持たないプロセスであっても,(特定のマッピング基準を満たしている限り) 共用ページ・テーブルを使用できます。
メモリ常駐グローバル・セクションで予約されるメモリと同様に,共用ページ・テーブルのメモリも,システムの流動ページ集合から除外しなければなりません。メモリ常駐グローバル・セクションが登録される時,予約メモリ・レジストリによってこの除外が行われます。
4.4.1 プライベート・ページ・テーブルのメモリ必要量
表 4-1 は,各種サイズのグローバル・セクションにマップするプライベート・ページ・テーブルおよび共用ページ・テーブルの物理メモリ必要量を,プロセス数に応じて示しています。この表から,共用ページ・テーブルを使用することで,システム全体で節約される物理メモリ量がわかります。たとえば,100 プロセスが 1 G バイトのグローバル・セクションにマップするとき,共用ページ・テーブルでグローバル・セクションにマップすることによって,99 M バイトの物理メモリが節約されます。
物理メモリが節約されると,物理メモリ・システム・リソースの競合が抑制されるため,システム全体の性能が向上します。各プロセスについては,ページ・テーブル・ページが使用するワーキング・セットが少なくてすむため,プロセスがより多くのプライベート・コードおよびデータを物理メモリに保持できるという利点があります。
マッピング プロセスの 個数 |
8MB | 1GB | 8GB | 1TB | ||||
---|---|---|---|---|---|---|---|---|
PPT | SHTP | PPT | SHTP | PPT | SHTP | PPT | SHTP | |
1 | 8KB | 8KB | 1MB | 1MB | 8MB | 8MB | 1GB | 1GB |
10 | 80KB | 8KB | 10MB | 1MB | 80MB | 8MB | 10GB | 1GB |
100 | 800KB | 8KB | 100MB | 1MB | 800MB | 8MB | 100GB | 1GB |
1000 | 8MB | 8KB | 1GB | 1MB | 8GB | 8MB | 1TB | 1GB |
PPT---プライベート・ページ・テーブル
SHPT---共用ページ・テーブル
プロセスが共用ページ・テーブルを使用するのに,特別な特権やライト識別子は必要ありません。メモリ常駐グローバル・セクションを作成するときだけ,ライト識別子 VMS$MEM_RESIDENT_USER が必要です。メモリ常駐グローバル・セクションを作成すると,予約メモリ・レジストリによって共用ページ・テーブルが必要ないと指定されていない限り,そのグローバル・セクションをマップする共用ページ・テーブルが作成されます。一見すると,このように広くデータを共用することは,本質的なセキュリティ上のリスクを伴う可能性があります。しかし,この節で説明する理由によって,セキュリティ上のリスクはありません。
共用ページ・テーブルでメモリ常駐グローバル・セクションにマップするアプリケーションまたはプロセスは,次の手順を実行しなければなりません。
共用ページ・テーブル・リージョンは,メモリ常駐グローバル・セクションのマップのみ行えます。アプリケーションは,複数のメモリ常駐グローバル・セクションを,共用ページ・テーブル・リージョンにマップできます。共用ページ・テーブル・リージョンにマップされるグローバル・セクションの先頭仮想アドレスは,常にページ・テーブル・ページ境界に丸められます。これによって,2 つの異なるグローバル・セクションが同じページ・テーブル・ページを共用することが避けられます。手順 2 に示した以外のシステム・サービスで,共用ページ・テーブル・リージョンに仮想アドレス空間を作成しようとしても失敗します。
プロセスは非共用ページ・テーブル・リージョンを指定して,共用ページ・テーブルを伴うメモリ常駐グローバル・セクションにマップすることができます。この場合,グローバル・セクションにマップするために,プロセス・プライベート・ページ・テーブルが使用されます。 |
GBLPAGES システム・パラメータがグローバル・ページ・テーブルのサイズを定義します。パラメータ・ファイルに格納されている値は起動時に使用され,グローバル・ページ・テーブルの初期サイズを設定します。
OpenVMS Alpha V7.1 以降,システム・パラメータの GBLPAGES および GBLPAGFIL が変更され,ダイナミック・パラメータになりました。CMKRNL 特権を持つユーザであれば,実行中のシステム上でこれらの値を直ちに変更できます。実行時に GBLPAGES パラメータの値を増加すると,グローバル・ページ・テーブルを必要に応じて新しい最大値まで拡張できます。なお,グローバル・ページ・テーブルを拡張または増加させるためには,次の条件をすべて満たす必要があります。
グローバル・ページ・テーブルは,最低でも 6 G バイトの 64 ビット S2 空間にマップされるため,これらの条件はほとんどすべてのシステムで満たされます。極端にメモリを消費するシステムや,S2 仮想アドレス空間を大量に使用するアプリケーションを実行しているシステムに限って,要求に応じてグローバル・ページ・テーブルを拡張できないことがあります。
グローバル・ページは,他のチューニング・パラメータにも影響するシステム・リソースであるため,GBLPAGES を増加するには,AUTOGEN を使用してシステムを再起動することをおすすめします。操作上の理由で再起動できない場合は,実行中のシステム上で次のコマンドを使用することによって,パラメータを変更できます。
$ RUN SYS$SYSTEM:SYSGEN SYSGEN> USE ACTIVE SYSGEN> SET GBLPAGES new_value SYSGEN> WRITE ACTIVE |
WRITE ACTIVE コマンドを実行するには,CMKRNL 特権が必要です。
同じコマンドで,グローバル・ページ・サイズの有効サイズを小さくすることもできます。次の条件が満たされる場合,グローバル・ページ・テーブルは実際に縮小され,フル・ページが流動ページとしてシステムに解放されます。
GBLPAGES のアクティブ値を,現在使用されているグローバル・ページ・カウントより低い値に設定しても,現在使用されているグローバル・ページに影響はありません。新たなグローバル・ページの作成が抑制されるだけです。
GBLPAGFIL パラメータのアクティブ値は,正の最大整数値まで,いつでも増加できます。GBLPAGES と同様に,GBLPAGFIL の値を,システムのページファイルに対してページングされているグローバル・ページ数より低い値に設定しても,そのページに影響はありません。新たなグローバル・ページファイル・セクションの作成が抑制されるだけです。
なお,GBLPAGFIL を増加すると,追加のページファイル空間が必要となり,追加のページファイルをインストールしなければならないことがあるので注意してください。
前へ | 次へ | 目次 | 索引 |