[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ DOC Home ]
Galaxyプラットフォームの主な機能の1つに,オペレーティング・システムの複数のインスタンス間でリソースを共用できる機能があります。 リソースを共用する場合, そのリソースへのアクセスの同期をとる必要があります。 この章で説明するサービスは,Galaxy内の共用リソースへのアクセスの同期をとるために, 協調動作スキームを作成する基礎となるものを提供します。
galaxyロックは,スピンロックとミューテックスの組み合わせです。 所有されているgalaxyロックを取得しようとする間,スレッドは短期間スピンします。 スピン中にロックが使用可能にならないと,スレッドは待ち状態になります。 これはSMPスピンロックと異なります。SMPスピンロックでは, スピンが時間切れになると,システムがクラッシュしますが, このような動作はGalaxyでは認められません。
galaxyロックの性質上,これらのロックは共用メモリのどこかに存在します。 その共用メモリはユーザまたはgalaxyロック・サービスによって割り当てることができます。 ユーザがメモリを割り当てる場合は,ロック・サービスはロックの場所だけを追跡します。 ロック・サービスがメモリを割り当てる場合は, ユーザの代わりにメモリを管理します。
execletsのMONバージョンの一部でしかない他のモニタリング・コードと異なり,galaxy ロックのモニタリング・コードは常にロードされます。
galaxyロックを取り扱うために複数のルーチンが提供されています。これらのルーチンは, ロックに関係する基礎的な機能だけを提供します。SMP をサポートするために使用されるスピン・ロックより少し豊富な機能を備えていますが, ロック・マネージャが提供する機能より,はるかに劣ります。
OpenVMS Galaxyのロックの所有権を取得します。
SYS$ACQUIRE_GALAXY_LOCK handle ,timeout ,flags
int sys$acquire_galaxy_lock (unsigned __int64 lock_handle, unsigned int timeout, unsigned int flags);
OpenVMS使用法 galaxy lock handle タイプ quadword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 wait timeout タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 bit mask タイプ longword (unsigned) アクセス read メカニズム input by value
所有されているロックを取得しようとしたときにデフォルトで実行される動作は,10 マイクロ秒だけスピンし,その後待ち状態になるという動作です。 待ちタイムアウト値が指定されている場合は,その値が使用されます。 指定されていない場合は,$CREATE_GALAXY_LOCKでロックに設定されたタイムアウト値が使用されます。 この動作は,入力フラグを使用して変更できます。
GLOCK$C_NOSPINだけが指定されており,ロックが所有されている場合は, スピンは実行されません。
GLOCK$C_NOWAITだけが指定されており,ロックが所有されている場合は, 呼び出しプロセスはロックでスピンします。タイムアウト値が呼び出しに指定されている場合は, その値がスピン時間として使用されます。それ以外の場合は, 呼び出しプロセスは10マイクロ秒だけスピンします。スピンの間にロックが使用可能にならないと, ロックは取得されず,SS$_NOWAIT が返されます。
GLOCK$C_NOSPINとGLOCK$C_NOWAITが指定されており,ロックが所有されている場合は, 制御がただちに返されます。ロックは取得されず,SS$_ NOWAITが返されます。
OpenVMS Galaxyインスタンスのシャットダウンなどのシステム・イベントのために, 存在しないエンティティによってロックが所有されることがあります。 この場合には,$ACQUIRE_GALAXY_LOCKのデフォルト動作は,以前のロック所有権を破棄するという動作になります。 呼び出しプロセスが新しい所有者になり, サービスはSS$_BROKENを返します。GLOCK$C_NOBREAK が指定されている場合は,$ACQUIRE_GALAXY_LOCKはロック所有権を破棄せず,SS$_NOBREAK を返します。
OpenVMS Galaxyロック・テーブルへの書き込みアクセスには,取得するロックが含まれます。
なし
$CREATE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_INFO,
$GET_GALAXY_LOCK_SIZE,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
SS$_BADPARAM | パラメータ値が不正です。 |
SS$_ BROKEN | ロック所有権が破壊された後,ロックが取得されました。 |
SS$_IVLOCKID | ロックIDが無効です。 |
SS$_ IVLOCKOP | ロック操作が無効です。 |
SS$_IVLOCKTBL | ロック・テーブルが不正です。 |
SS$_LOCK_TIMEOUT | ロックの取得が失敗しました。 要求は時間切れになりました。 |
SS$_NOBREAK | ロックの取得が失敗しました。 ロック所有権が破壊されています。 |
SS$_NOWAIT | ロックの取得が失敗しました。NOWAITが指定されています。 |
OpenVMS Galaxyロック・ブロックを$CREATE_GALAXY_LOCK_TABLEサービスで作成されたロック・ テーブルから割り当てます。
SYS$CREATE_GALAXY_LOCK lcktbl_handle ,name ,timeout ,size ,ipl,rank ,handle
int sys$create_galaxy_lock (unsigned int lcktbl_handle, char *name, unsigned int size, unsigned int timeout, unsigned int ipl, unsigned int rank, unsigned __int64 *lock_handle);
OpenVMS使用法 lock table handle タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 address タイプ zero-terminated string アクセス read メカニズム input by reference
OpenVMS使用法 wait timeout タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 byte count タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 IPL of lock タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 rank of lock タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 address タイプ quadword (unsigned) アクセス write メカニズム output by reference
システム・ロックの場合: CMKRNL,SHMEM ユーザ・ロックの場合: SHMEM ロック・テーブルへの書き込みアクセス権
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_INFO,
$GET_GALAXY_LOCK_SIZE,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
SS$_ACCVIO | パラメータに対するアクセス違反。 |
SS$_ BADLCKTBL | OpenVMS Galaxyロック・テーブルが壊れています。 |
SS$_BADPARAM | パラメータ値が不正です。 |
SS$_ IVLOCKID | ロックIDが無効です。 |
SS$_IVLOCKTBL | ロック・テーブルが不正です。 |
SS$_INSFMEM | ロック・ テーブルのメモリが不足しています。 |
SS$_NOCMKRNL | この操作にはCMKRNL特権が必要です。 |
SS$_NOSHMEM | この操作にはSHMEM 特権が必要です。 |
OpenVMS Galaxyロック・テーブルを割り当てます。
SYS$CREATE_GALAXY_LOCK_TABLE name ,accmode ,section_size ,section_type ,prot ,lock_size ,lcktbl_handle
int sys$create_galaxy_lock_table (char *name, unsigned int accmode, unsigned __int64 section_size, unsigned int section_type, unsigned int prot, unsigned int lock_size, unsigned int *lcktbl_handle);
OpenVMS使用法 address タイプ zero-terminated string アクセス read メカニズム input by reference
OpenVMS使用法 access mode タイプ longword (unsigned) アクセス read メカニズム input by value
$PSLDEFマクロは,4つのアクセス・モードに対して次のシンボルを定義します。
シンボル | アクセス・モード |
---|---|
PSL$C_KERNEL | カーネル |
PSL$C_EXEC | エグゼクティブ |
PSL$C_SUPER | スーパバイザ |
PSL$C_USER | ユーザ |
使用される最高特権のアクセス・モードは,呼び出しプロセスのアクセス・ モードです。
OpenVMS使用法 byte count タイプ quadword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 bit mask タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 protection タイプ longword (unsigned) アクセス read メカニズム input by value
マスクには4つの4ビット・フィールドが含まれます。ビットは各フィールドの右から左に読み込まれます。
クリアされているビットは,読み込みアクセス,書き込みアクセス,実行アクセス, 削除アクセスが,この順に特定のユーザ・カテゴリに与えられることを示します。
ロック・セクションの保護の場合,読み込みアクセスと書き込みアクセスだけが意味があります。 削除アクセス・ビットは無視されます。
OpenVMS使用法 byte count タイプ longword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 address タイプ longword アクセス write メカニズム output by reference
フラグGLCKTBL$C_PROCESSとGLCKTBL$C_SYSTEMは,共用メモリ領域がシステム空間にマッピングされるのか, プロセス空間にマッピングされるのかを指定します。 プロセス空間セクションを作成するには,SHMEM特権が必要です。 システム空間セクションを作成するには,SHMEM特権とCMKRNL特権が必要です。
CMKRNL, SHMEM
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_INFO,
$GET_GALAXY_LOCK_SIZE,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
SS$_ACCVIO | パラメータに対するアクセス違反。 |
SS$_ BADPARAM | パラメータ値が不正です。 |
SS$_CREATED | ファイルまたはセクションが存在しません。 新規作成されました。 |
SS$_ IVLOCKID | ロックIDが無効です。 |
SS$_NOPRIV | 実行しようとした操作に必要な特権がありません。 |
SS$_NOCMKRNL | この操作にはCMKRNL特権が必要です。 |
SS$_NOSHMEM | この操作にはSHMEM特権が必要です。 |
OpenVMS Galaxyロックを無効にし,削除します。
SYS$DELETE_GALAXY_LOCK handle
int sys$delete_galaxy_lock (unsigned __int64 lock_handle);
OpenVMS使用法 galaxy lock handle タイプ quadword (unsigned) アクセス read メカニズム input by value
CMKRNL,SHMEM
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_INFO,
$GET_GALAXY_LOCK_SIZE,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
SS$_BADLCKTBL | Galaxy ロック・テーブルが壊れています。 |
SS$_ IVLOCKID | ロックIDが無効です。 |
SS$_IVLOCKTBL | ロック・テーブルが不正です。 |
SS$_LOCKINUSE | 不正な操作;ロックは使用中です。 |
SS$_NOCMKRNL | この操作にはCMKRNL特権が必要です。 |
SS$_NOSHMEN | この操作にはSHMEM 特権が必要です。 |
OpenVMS Galaxyロック・テーブルを削除します。
SYS$DELETE_GALAXY_LOCK_TABLE lcktbl_handle
int sys$delete_galaxy_lock_table (unsigned int *lcktbl_handle);
OpenVMS使用法 lock table handle タイプ longword (unsigned) アクセス read メカニズム input by value
CMKRNL, SHMEM
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK,
$GET_GALAXY_LOCK_INFO,
$GET_GALAXY_LOCK_SIZE,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
SS$_BADPARAM | パラメータ値が不正です。 |
SS$_ IVLOCKID | ロックIDが無効です。 |
SS$_IVLOCKTBL | ロック・テーブルが無効です。 |
SS$_NOCMKRNL | この操作にはCMKRNL特権が必要です。 |
SS$_NOSHMEM | この操作にはSHMEM特権が必要です。 |
指定されたロックから"interesting"フィールドを返します。
SYS$GET_GALAXY_LOCK_INFO handle ,name ,timeout ,size ,ipl, rank ,flags
int sys$get_galaxy_lock_info (unsigned __int64 lock_handle, char *name, unsigned int *timeout, unsigned int *size, unsigned int *ipl, unsigned int *rank, unsigned short int *flags);
OpenVMS使用法 handle for the galaxy lock タイプ quadword (unsigned) アクセス read メカニズム input by value
OpenVMS使用法 address タイプ zero-terminated string アクセス write メカニズム output by reference
OpenVMS使用法 address タイプ longword (unsigned) アクセス write メカニズム output by reference
OpenVMS使用法 address タイプ longword (unsigned) アクセス write メカニズム output by reference
OpenVMS使用法 address タイプ longword (unsigned) アクセス write メカニズム output by reference
OpenVMS使用法 address タイプ longword (unsigned) アクセス write メカニズム output by reference
OpenVMS使用法 address タイプ word (unsigned) アクセス write メカニズム output by reference
これらの値の詳細については,$CREATE_GALAXY_LOCKサービスを参照してください。
ロックに対する読み込みアクセス権
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_SIZE,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
SS$_IVLOCKID | ロックID が無効です。 |
SS$_IVLOCKTBL | ロック・テーブルが無効です。 |
OpenVMS Galaxyロックの最小サイズと最大サイズを返します。
SYS$GET_GALAXY_LOCK_SIZE min_size ,max_size
int sys$get_galaxy_lock_size (unsigned int *min_size, unsigned int *max_size);
OpenVMS使用法 address タイプ longword (unsigned) アクセス write メカニズム output by reference
OpenVMS使用法 address タイプ longword (unsigned) アクセス write メカニズム output by reference
ロック・サイズは,$CREATE_GALAXY_LOCK_TABLEサービスに渡すsection_ sizeパラメータの値を判断するために使用できます。
ロックに対する読み込みアクセス権
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_INFO,
$RELEASE_GALAXY_LOCK
SS$_NORMAL | 正常終了しました。 |
OpenVMS Galaxyロックの所有権を解除します。
SYS$RELEASE_GALAXY_LOCK handle
int sys$release_galaxy_lock (unsigned __int64 lock_handle);
OpenVMS使用法 galaxy lock handle タイプ quadword (unsigned) アクセス read メカニズム input by value
ロックに対する書き込みアクセス権
なし
$ACQUIRE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK,
$CREATE_GALAXY_LOCK_TABLE,
$DELETE_GALAXY_LOCK,
$DELETE_GALAXY_LOCK_TABLE,
$GET_GALAXY_LOCK_INFO,
$GET_GALAXY_LOCK_SIZE
SS$_NORMAL | 正常終了しました。 |
SS$_IVLOCKID | ロックID が無効です。 |
SS$_IVLOCKOP | ロック操作が無効です。 |
SS$_ IVLOCKTBL | ロック・テーブルが無効です。 |
所有されていないロックを解除しようとしました。
ロックを取得するためのすべての呼び出しに対して,ロックを解除するための呼び出しがあるかどうか確認してください。
ロック・サービスに渡されたロック・テーブル・ハンドルが有効なロック・ テーブルではありません。
使用しているロック・テーブル・ハンドルがSYS$CREATE_GALAXY_LOCK_ TABLEまたはSYS$INIT_GALAXY_LOCK_TABLEで返されたハンドルと同じであるかどうか確認してください。
使用中のロックを削除しようとしたか,すでに初期化されているロックを初期化しようとしました。
使用しているロック・ハンドルがSYS$CREATE_GALAXY_LOCKまたはSYS$INIT_GALAXY_LOCK から返されたハンドルと同じであるかどうか確認してください。
タイムアウト時間内にロックを取得することができませんでした。
この問題はタイムアウト値が小さすぎるために発生することがあります。 また,スレッドが非常に長時間にわたってロックを保有しているために発生することもあります。
指定されたロック・テーブル内のロックの一覧が壊れています。
ロック・テーブルは,それが作成されたアクセス・モードから書き込み可能です。 アプリケーションでロック・テーブルに上書きしていないかどうか確認してください。
ロック所有権が破棄されており,GLOCK$C_NOBREAKがSYS$ACQUIRE_ GALAXY_LOCKの呼び出しに指定されていたために,ロックを取得することができませんでした。
ロックが保有されている間にロック所有権を破棄すると,プロセス・ エラーまたはシステム・エラーが発生することがあります。ロックの使用方法に応じて, このロックが保護しているデータが破壊されることがあります。
ロックが現在所有されており,SYS$ACQUIRE_GALAXY_LOCKの呼び出しにGLOCK$C_NOWAIT が指定されているため,ロックを取得できませんでした。
アプリケーションは操作を再実行するか,またはロックが使用可能になるのを待たなければなりません。
ロックを正しく取得することができましたが,ロックの以前の所有者が存在せず, 所有権が破壊されています。
ロックが保有されている間にロック所有権が破壊されると,プロセス・ エラーまたはシステム・エラーが発生することがあります。ロックの使用方法に応じて, このロックが保護しているデータが破壊されることがあります。
[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ DOC Home ]