共用メモリ・グローバル・セクション
は,
共用コミュニティ内のすべてのインスタンスからアクセスできるメモリをマッピングします。
これらのオブジェクトは
Galaxy-wide 共用セクション
とも呼びます。このような各オブジェクトには名前,バージョン,保護属性があります。
18.1 共用メモリの使用
アプリケーション・プログラムは, Galaxy-wide 共用セクションをマッピングすることで共用メモリにアクセスします。 プログラミング・モデルは標準の OpenVMS グローバル・セクションと同じです。 つまり,共用メモリを使用する各インスタンスで,その共用メモリを作成, マッピング,アンマッピング,削除します。 共用メモリ・グローバル・セクションには次の属性があります。
ページはデマンド 0 から始まり,あらかじめ共用 PFN に割り当てられます。
ページはワーキング・セットの一部としてカウントされません。
ページがプロセスのページ・テーブルで有効になった後, 削除されるまで有効なままです。 共用メモリ・セクション・ページがディスクにページングされることはありません。
共用メモリにアクセスする各インスタンスで共用セクションを作成しなければなりません。
セクションは一時的でも永久的でも構いません。
セクションはグループ・セクションまたはシステム・グローバル・セクションになることができます。
Galaxy-wide 共用セクションは通常のグローバル・セクションと異なるネーム・スペースを使用します。
ident_64 フィールドに指定されるセクション・バージョンは, Galaxy 全体で有効であるかどうかチェックされます。
指定された名前および UIC グループが割り当てられた共用セクションは,共用コミュニティ内に 1 つだけしか存在できません。 これは,複数のバージョンが共存できる伝統的なグローバル・セクションとは異なります。
共用メモリ・セクションを作成するには,SHMEM 特権が必要です。
プログラマの立場から見ると,共用メモリ・グローバル・セクションはメモリ常駐セクションによく似ています。 メモリ常駐セクションを作成するときに使用するシステム・サービスと同じサービスを使用して,Galaxy-wide 共用セクションを作成します。 フラグ SEC$M_SHMGS をセットすると,サービスは共用メモリ・グローバル・セクションに対して動作します。
メモリ常駐セクションと異なり,Galaxy-wide セクションに対して空間を割り当てるために,予約メモリ・レジストリは使用されません。SYSMAN RESERVE コマンドは,ノード固有メモリにのみ影響します。 通常の OpenVMS ページング操作のために共用メモリは使用されないので,共用メモリを予約する必要はありません。
Galaxy-wide セクションに対して共用ページ・テーブルを作成しなければならないかどうかを指定するためのユーザ・インタフェースもありません。
その代わり,Galaxy-wide セクションに対する共用ページ・テーブルの作成は,セクション・サイズによって決定されます。
OpenVMS バージョン 7.2 では,共用ページ・テーブルは 128 ページ (1MB) 以上のセクションに対して作成されます。
Galaxy-wide 共用ページ・テーブルはすべてのGalaxy インスタンス間で共用されます。
18.2 システム・サービス
ここでは,共用メモリ・グローバル・セクションをサポートする新しいシステム・サービスと,変更されたシステム・サービスについて説明します。
18.2.1 強化されたサービス
新しい共用メモリ・グローバル・セクション・フラグ SEC$M_SHMGS を認識するように,次のシステム・サービスが強化されました。
SYS$CRMPSC_GDZRO_64
SYS$CREATE_GDZRO
SYS$MGBLSC_64
SYS$DGBLSC
次のシステム・サービスは共用メモリを操作できるように強化されていますが, インタフェースは変更されていません。
SYS$DELTVA
SYS$DELTVA_64
SYS$CREATE_BUFOBJ
SYS$CREATE_BUFOBJ_64
SYS$DELETE_BUFOBJ
18.2.2 新しいセクション・フラグ SEC$M_READ_ONLY_SHPT
新しいセクション・フラグ SEC$M_READ_ONLY_SHPT は, SYS$CREATE_GDZRO と SYS$CRMPSC_GDZRO_64 サービスで認識されます。 このビットがセットされている場合は,読み込みアクセスだけが可能な共用ページ・テーブルをセクション用に作成することをシステムに要求します。 この機能は特に,メモリ常駐セクションや Galaxy 共用セクションが多くのプログラムで読み込まれるものの, 書き込むプログラムは 1 つしかない環境で役立ちます。
共用ページ・テーブル・セクションが割り当てられている Galaxy 共用セクションまたはメモリ常駐セクションをマッピングする場合には, データにアクセスするために次のオプションを使用できます。
| 共用ページ・テーブル | 読み込み専用 | 読み込みと書き込み |
何も作成されない |
マップ要求に SEC$M_WRT フラグをセットしない。 プライベート・ページ・テーブルは,セクションをマッピングする共用ページ・テーブル領域を指定した場合でも,常に使用される。 |
マップ要求に SEC$M_WRT フラグをセットする。 プライベート・ページ・テーブルは,セクションをマッピングする共用ページ・テーブル領域を指定した場合でも,常に使用される。 |
書き込みアクセス |
マップ要求に SEC$M_WRT フラグをセットしない。 プライベート・ページ・テーブルが使用されることを確認する。 セクションをマッピングする共用ページ・テーブル領域を指定しない。 指定すると,エラー状態 S$_IVSECFLG が返される。 |
マップ要求に SEC$M_WRT フラグをセットする。 セクションをマッピングする共用ページ・テーブル領域を指定した場合, マッピングのために共用ページ・テーブル・セクションが使用される。 |
読み込みアクセス |
マップ要求に SEC$M_WRT フラグをセットしない。セクションをマッピングする共用ページ・テーブル領域を指定した場合, マッピングのために共用ページ・テーブル・セクションが使用される。 |
マップ要求に SEC$M_WRT フラグをセットする。 プライベート・ページ・テーブルが使用されることを確認する。 セクションをマッピングする共用ページ・テーブル領域を指定しない。 指定すると,エラー状態 SS$_IVSECFLG が返される。 |
注意
Galaxy 共用セクションの共用ページ・テーブルも Galaxy 共用セクションとして実装されます。 このため,このセクションに接続されているすべての OpenVMS インスタンスで読み込みアクセスが許可されるか,またはすべてのインスタンスで読み込みアクセスと書き込みアクセスが許可されます。 セクションを作成するために, 最初のインスタンスが要求する SEC$M_READ_ONLY_SHPT フラグの設定がすべてのインスタンスで使用されます。
SYS$CRMPSC_GDZRO_64 サービスを使用すると,常に SEC$M_WRT フラグがセットされ, 書き込みのためにセクションをマッピングすることが示されます。 このサービスを使用して,読み込み専用アクセスのために共用ページ・テーブルを使用するセクションを作成する場合は, プライベート・ページ・テーブルを使用しなければならず, セクションをマッピングする共用テーブル領域を指定することはできません。
Galaxy 共用メモリにオブジェクトを作成するには,SHMEM 特権が必要です。 既存のセクションにマッピングする権利は, 通常のアクセス制御機能によって制御されます。 既存のセクションをマッピングするために SHMEM は必要ありません。 通常のメモリ常駐セクションを作成する場合は, VMS$MEM_RESIDENT_USER 識別子が必要ですが, Galaxy-wide セクションの場合は必要ありません。
Galaxy-wide メモリ・セクションの作成とマッピングは, メモリ常駐セクションを作成する場合と同じサービスで実行されます。 現在,次のサービスが SEC$M_SHMGS フラグを認識します。
SYS$CREATE_GDZRO
SYS$CRMPSC_GDZRO_64
SYS$MGBLSC_64
SYS$DGBLSC
SYS$CREATE_GDZRO と SYS$CRMPSC_GDZRO_64 は新しい状態コードを返します。
| 状態コード | 説明 |
SS$_INV_SHMEM |
共用メモリが不正である。 |
SS$_INSFRPGS |
空き共用ページまたはプライベート・ページが不足している。 |
SS$_NOBREAK |
Galaxy ロックが別のノードによって保有されており,破棄されていない。 |
SS$_LOCK_TIMEOUT |
Galaxy ロック・タイムアウトが発生した。 |
INSTALL LIST/GLOBAL コマンドと SHOW MEMORY コマンドは Galaxy-wide セクションを認識します。
Galaxy-wide セクションはそれぞれ独自のネーム・スペースを使用します。 さまざまな所有者 UIC に対して,システム・グローバル・セクションとグループ・グローバル・セクションを識別するために常に同じ名前を使用できるのと同様に,Galaxy-wide システム・グローバル・セクションと Galaxy-wide グループ・グローバル・セクションで同じ名前を使用できます。
Galaxy-wide セクションにはそれぞれ,セキュリティ・クラスが割り当てられます。
GLXSYS_GLOBAL_SECTION
GLXGRP_GLOBAL_SECTION
これらのセキュリティ・クラスは $GET_SECURITY と $SET_SECURITY システム・サービス,DCL コマンド SET/SHOW SECURITY で使用されます。
これらの新しいセキュリティ・クラスは Galaxy 環境でのみ有効です。 Galaxy 以外のノードでは認識されません。
Galaxy-wide グローバル・セクションが共用インスタンスに存在する場合は, そのセキュリティ属性を検索し,影響を与えることだけが可能です。
次の例は,Galaxy-wide セクションの監査メッセージを示しています。
%%%%%%%%% OPCOM 20-MAR-2002 10:44:43.71 %%%%%%%% (from node GLX1 at 20-MAR-2002 10:44:43.85)
Message from user AUDIT$SERVER on GLX1
Security alarm (SECURITY) on GLX1, system id: 19955
Auditable event: Object creation
Event information: global section map request
Event time: 20-MAR-2002 10:44:43.84
PID: 2040011A
Process name: ANDY
Username: ANDY
Process owner: [ANDY]
Terminal name: RTA1:
Image name: MILKY$DKA100:[ANDY]SHM_MAP.EXE;1
Object class name: GLXGRP_GLOBAL_SECTION
Object name: [47]WAY____D99DDB03_0$MY_SECTION
Secondary object name:
<Galaxywide global section>
Access requested: READ,WRITE
Deaccess key: 8450C610
Status: %SYSTEM-S-CREATED, file or section did not exist;
has been created
"Object name" フィールドに注意してください。 ここに表示されているオブジェクト名は, OpenVMS Galaxy 内のセクションを一意に識別します。 フィールドは次のとおりです。
[47] |
(グループ・グローバル・セクションの場合のみ) セクションの作成者の UIC グループを識別する。 |
WAY____D99DDB03_0$ |
共用コミュニティの識別子。 |
MY_SECTION |
ユーザが指定したセクションの名前。 |
ユーザはセキュリティ・プロファイルを設定または表示するために, 要求に対してセクション名とクラスだけを指定できます。 UIC は常に現在のプロセスから取得され, コミュニティ識別子はプロセスが実行されているコミュニティから取得されます。
Galaxy-wide システム・グローバル・セクションの出力は, "Object class name" と "Objects name" フィールドでのみ異なります。 このタイプのセクションのオブジェクト名には, グループ識別フィールドが含まれません。
オブジェクト・クラス名: |
GLXSYS_GLOBAL_SECTION |
オブジェクト名: |
WAY____D99DDB03_0$SYSTEM_SECTION |
セキュリティに関する注意
Galaxy-wide メモリ・セクションのセキュリティ属性は, それがどのインスタンスで実行されているかとは関係なく, プロセスにとって同一でなければなりません。
この条件は,この共用コミュニティに参加するすべてのインスタンスを, すべてのノードがセキュリティ関連ファイルを共用する同種の OpenVMS Cluster に参加させることで実現できます。
SYSUAF.DAT, SYSUAFALT.DAT (システム登録ファイル)
RIGHTSLIST.DAT (ライト・データベース)
VMS$OBJECTS.DAT (オブジェクト・データベース)
特に,保護の変更を Galaxy-wide セクションに自動的に伝達するには, すべての共用インスタンスで同じ物理ファイル (VMS$OBJECTS.DAT) を使用することが必要です。
インストールしたシステムで, これらのファイルが Galaxy 全体で共用されない場合は, Galaxy-wide 共用セクションの作成者は,セクションが各インスタンスで同じセキュリティ属性を持つようにしなければなりません。 このためには,手動の操作が必要です。