[ 前のページ ] [ 次のページ ] [ 目次 ] [ DOC Home ]

14 ロック・プログラミング・インタフェース

Galaxyプラットフォームの主な機能の1つに,オペレーティング・システムの複数のインスタンス間でリソースを共用できる機能があります。 リソースを共用する場合, そのリソースへのアクセスの同期をとる必要があります。 この章で説明するサービスは,Galaxy内の共用リソースへのアクセスの同期をとるために, 協調動作スキームを作成する基礎となるものを提供します。

galaxyロックは,スピンロックとミューテックスの組み合わせです。 所有されているgalaxyロックを取得しようとする間,スレッドは短期間スピンします。 スピン中にロックが使用可能にならないと,スレッドは待ち状態になります。 これはSMPスピンロックと異なります。SMPスピンロックでは, スピンが時間切れになると,システムがクラッシュしますが, このような動作はgalaxyでは認められません。

galaxyロックの性質上,これらのロックは共用メモリのどこかに存在します。 その共用メモリはユーザまたはgalaxyロック・サービスによって割り当てることができます。 ユーザがメモリを割り当てる場合は,ロック・サービスはロックの場所だけを追跡します。 ロック・サービスがメモリを割り当てる場合は, ユーザの代わりにメモリを管理します。

execletsのMONバージョンの一部でしかない他のモニタリング・コードと異なり,galaxy ロックのモニタリング・コードは常にロードされます。

galaxyロックを取り扱うために複数のルーチンが提供されています。これらのルーチンは, ロックに関係する基礎的な機能だけを提供します。SMP をサポートするために使用されるスピン・ロックより少し豊富な機能を備えていますが, ロック・マネージャが提供する機能より,はるかに劣ります。

14.1 SYS$CREATE_GALAXY_LOCK_TABLE

このサービスは,galaxyロック・テーブル構造を割り当てます。この構造は, やはりこのサービスが作成する共用メモリ・セクションに関する情報を管理するために使用されます。 固有のロック・テーブル名を使用してこのサービスを最初に呼び出すプロセスがセクションを作成します。 その後の呼び出しプロセスはセクションをマッピングします。 この共用メモリ・ セクションにはgalaxyロックの集合が格納されます。セクション内に存在するすべてのロックは同じサイズです。 ロック・テーブルが作成された後,SYS$CREATE_GALAXY_LOCK サービスを使用してロックを作成し,テーブルから割り当てることができます。

フラグGLCKTBL$C_PROCESSとGLCKTBL$C_SYSTEMは,共用メモリ領域がシステム空間にマッピングされるのか, プロセス空間にマッピングされるのかを指定します。 プロセス空間セクションを作成するには,SHMEM特権が必要です。 システム空間セクションを作成するには,SHMEM特権とCMKRNL特権が必要です。

sys$create_galaxy_lock_table(name, accmode, section_size, section_ type, prot, lock_size, handle)

パラメータ サイズ(バイト数) タイプ 使用方法
name 8 値による入力 ロック・テーブル名のアドレス(ASCIZ)
accmode 4 値による入力 ロック・テーブルのアクセス・モード
section size 8 値による入力 ロック・セクションの仮想サイズ
section type 4 値による入力 glcktbl$c_processまたはglcktbl$c_ system
prot 4 値による入力 ロック・セクションに適用される保護
lock_size 4 値による入力 セクション内のgalaxyロックのサイズ
handle 8 参照による出力 ロック・テーブル・ハンドル

戻り状態:


SS$_ACCVIO
SS$_BADPARAM
SS$_CREATED
SS$_IVLOCKID
SS$_NOPRIV
SS$_NOSHMEM
SS$_NORMAL
共用メモリ・サポート・ルーチンから返された状態

14.2 SYS$DELETE_GALAXY_LOCK_TABLE

このサービスは,galaxyロック・テーブルを削除します。テーブルが管理しているロック・ テーブル・セクションのマッパが存在しない場合は,ロック・ テーブルは削除されます。

sys$delete_galaxy_lock_table (handle)

パラメータ サイズ(バイト数) タイプ 使用方法
handle 8 値による入力 ロック・テーブル・ハンドル

戻り状態:


SS$_BADPARAM
SS$_IVLOCKID
SS$_IVLOCKTBL
SS$_NOPRIV
SS$_NOSHMEM
SS$_NORMAL

14.3 SYS$RESET_GALAXY_LOCK

このサービスは,galaxyロックをSYS$ACQUIRE_GALAXY_LOCKサービスで無効であると解釈される状態に設定します。 このルーチンは,ユーザが割り当て,SYS$INIT_GALAXY_LOCK によって初期化された共用メモリ内に存在するロックに対してだけ使用されます。

sys$reset_lock(handle, va)

パラメータ サイズ(バイト数) タイプ 使用方法
handle 8 値による入力 galaxyロック・ハンドル
va 8 参照による入力 galaxyロックのアドレス

戻り状態:


SS$_BADLCKTBL
SS$_IVLOCKID
SS$_LOCKINUSE
SS$_NORMAL

14.4 SYS$CREATE_GALAXY_LOCK

このサービスは,SYS$CREATE_GALAXY_LOCK_TABLEサービスを使用して作成されたロック・ テーブルからgalaxyロック・ブロックを割り当てます。その後,SYS$INIT_GALAXY_LOCK を使用して初期化します。

sys$create_galaxy_lock(lcktbl_handle, name, timeout, size, ipl, rank, handle)

パラメータ サイズ(バイト数) タイプ 使用方法
lcktbl_handle 4 値による入力 ロック・テーブル・ハンドル
name 8 参照による入力 galaxyロックの16バイトのASCIZ名のアドレス
timeout 4 値による入力 デフォルトの待ちタイムアウト(10マイクロ秒単位)
size 4 値による入力 ロックのサイズ
ipl 4 値による入力 ロックのIPL (カーネル・モードのみ)
rank 4 値による入力 ロックのランク(実装されていない)
handle 8 参照による出力 新しいロックのハンドル

戻り状態:


SS$_ACCVIO
SS$_BADLCKTBL
SS$_BADPARAM
SS$_CREATED
SS$_IVLOCKID
SS$_IVLOCKTBL
SS$_INSFMEM
SS$_NOPRIV
SS$_NOSHMEM
SS$_NORMAL

14.5 SYS$DELETE_GALAXY_LOCK

このサービスは,SYS$RESET_GALAXY_LOCKを使用して,galaxyロックを無効にし, 削除します。ロックのためのメモリは,実際に削除されるわけではなく, 後で使用できるように未使用リストに登録されます。

sys$delete_galaxy_lock(handle)

パラメータ サイズ(バイト数) タイプ 使用方法
handle 8 値による入力 galaxyロック・ハンドル

戻り状態:


SS$_BADLCKTBL
SS$_IVLOCKID
SS$_IVLOCKTBL
SS$_LOCKINUSE
SS$_NORMAL
SS$_NOPRIV
SS$_NOSHMEM

14.6 SYS$GET_GALAXY_LOCK_INFO

このサービスは,指定されたロックからすべての「関心」フィールドを返します。

sys$get_galaxy_lock_info(handle, name, timeout, size, ipl, rank, flags)

パラメータ サイズ(バイト数) タイプ 使用方法
handle 8 値による入力 galaxyロック・ハンドル
name 8 参照による出力 galaxyロックの16バイトのASCIZ名のアドレス
timeout 4 参照による出力 デフォルトの待ちタイムアウト
size 4 参照による出力 ロック構造のサイズ
ipl 4 参照による出力 ロックのIPL
rank 4 参照による出力 ロックのランク
flags 2 参照による出力 galaxyロック構造内のフラグ・フィールド

戻り状態:


SS$_IVLOCKID
SS$_NORMAL

14.7 SYS$GET_GALAXY_LOCK_SIZE

このサービスは,galaxyロックの最小サイズと最大サイズを返します。最大サイズのロックが作成されると, ロック・サービスは取得情報(acquire information)と解除情報(release information)をロックに記録します。

sys$get_galaxy_lock_size(min_size, max_size)

パラメータ サイズ(バイト数) タイプ 使用方法
min_ size 4 参照による出力 galaxyロックの最小サイズ
max_ size 4 参照による出力 galaxyロックの最大サイズ

戻り状態:


SS$_NORMAL

14.8 SYS$ACQUIRE_GALAXY_LOCK

このサービスは,galaxyロックの所有権を取得するために使用されます。 ロックが空き状態の場合は,呼び出しプロセスが所有者になり,制御はただちに返されます。 ロックが所有されている場合は,入力フラグとタイムアウト値をもとに, 呼び出しプロセスは待ち状態になるか,またはエラーが返されます。

所有されているロックを取得しようとしたときにデフォルトで実行される動作は,10 マイクロ秒だけスピンし,その後待ち状態になるという動作です。 待ちタイムアウト値が呼び出しに指定されている場合は,その値が使用されます。 指定されていない場合は,SYS$CREATE_GALAXY_LOCKまたはSYS$INIT_GALAXY_LOCK でロックに設定されたタイムアウト値が使用されます。 この動作は,入力フラグを使用して変更できます。

GLOCK$C_NOSPINだけが指定されており,ロックが所有されている場合は, スピンは実行されません。

GLOCK$C_NOWAITだけが指定されており,ロックが所有されている場合は, 呼び出しプロセスはロックでスピンします。タイムアウト値が呼び出しに指定されている場合は, その値がスピン時間として使用されます。それ以外の場合は, 呼び出しプロセスは10マイクロ秒だけスピンします。スピンの間にロックが使用可能にならないと, ロックは取得されず,SS$_NOWAIT が返されます。

GLOCK$C_NOSPINとGLOCK$C_NOWAITが指定されており,ロックが所有されている場合は, 制御がただちに返されます。ロックは取得されず,SS$_ NOWAITが返されます。

galaxyインスタンスのシャットダウンなどのシステム・イベントのために, 存在しないエンティティによってロックが所有されることがあります。 この場合には,SYS$ACQUIRE_GALAXY_LOCKのデフォルト動作は,以前のロック所有権を破棄するという動作になります。 呼び出しプロセスが新しい所有者になり, サービスはSS$_BROKENを返します。GLOCK$C_NOBREAK が指定されている場合は,SYS$ACQUIRE_GALAXY_LOCKはロック所有権を破棄せず,SS$_NOBREAK を返します。

sys$acquire_galaxy_lock(handle, timeout, flags)

パラメータ サイズ(バイト数) タイプ 使用方法
handle 8 値による入力 galaxyロック・ハンドル
timeout 4 値による入力 待ちタイムアウト(デフォルトを変更)
flags 4 値による入力 GLOCK$C_NOWAIT GLOCK$C_NOSPIN GLOCK$C_NOBREAK

戻り状態:


SS$_BADPARAM
SS$_BROKEN
SS$_IVLOCKID
SS$_IVLOCKOP
SS$_IVLOCKTBL
SS$_LOCK_TIMEOUT
SS$_NOBREAK
SS$_NOWAIT
SS$_NORMAL

14.9 SYS$RELEASE_GALAXY_LOCK

このサービスは,galaxyロックの所有権を解除します。galaxyロックは同じ所有者によって2 回以上取得されることがあるため(ネストした所有権) ,所有権カウントが0になるまで,ロックは解除されません。ロック所有権が完全に解除され, そのロックを待っている他のスレッドがある場合は, 待ち状態から解放されます。

sys$release_galaxy_lock(handle)

パラメータ サイズ(バイト数) タイプ 使用方法
handle 8 値による入力 galaxyロック・ハンドル

戻り状態:


SS$_IVLOCKID
SS$_IVLOCKOP
SS$_IVLOCKTBL
SS$_NORMAL

14.10 ロック・エラー・メッセージ


[ 前のページ ] [ 次のページ ] [ 目次 ] [ DOC Home ]