[ 前のページ ]
[ 次のページ ]
[ 目次 ]
[ DOC Home ]
Galaxyプラットフォームの主な機能の1つに,オペレーティング・システムの複数のインスタンス間でリソースを共用できる機能があります。 リソースを共用する場合, そのリソースへのアクセスの同期をとる必要があります。 この章で説明するサービスは,Galaxy内の共用リソースへのアクセスの同期をとるために, 協調動作スキームを作成する基礎となるものを提供します。
galaxyロックは,スピンロックとミューテックスの組み合わせです。 所有されているgalaxyロックを取得しようとする間,スレッドは短期間スピンします。 スピン中にロックが使用可能にならないと,スレッドは待ち状態になります。 これはSMPスピンロックと異なります。SMPスピンロックでは, スピンが時間切れになると,システムがクラッシュしますが, このような動作はgalaxyでは認められません。
galaxyロックの性質上,これらのロックは共用メモリのどこかに存在します。 その共用メモリはユーザまたはgalaxyロック・サービスによって割り当てることができます。 ユーザがメモリを割り当てる場合は,ロック・サービスはロックの場所だけを追跡します。 ロック・サービスがメモリを割り当てる場合は, ユーザの代わりにメモリを管理します。
execletsのMONバージョンの一部でしかない他のモニタリング・コードと異なり,galaxy ロックのモニタリング・コードは常にロードされます。
galaxyロックを取り扱うために複数のルーチンが提供されています。これらのルーチンは, ロックに関係する基礎的な機能だけを提供します。SMP をサポートするために使用されるスピン・ロックより少し豊富な機能を備えていますが, ロック・マネージャが提供する機能より,はるかに劣ります。
このサービスは,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 | 参照による出力 | ロック・テーブル・ハンドル |
戻り状態:
このサービスは,galaxyロック・テーブルを削除します。テーブルが管理しているロック・ テーブル・セクションのマッパが存在しない場合は,ロック・ テーブルは削除されます。
sys$delete_galaxy_lock_table (handle)
パラメータ | サイズ(バイト数) | タイプ | 使用方法 |
---|---|---|---|
handle | 8 | 値による入力 | ロック・テーブル・ハンドル |
戻り状態:
このサービスは,galaxyロックをSYS$ACQUIRE_GALAXY_LOCKサービスで無効であると解釈される状態に設定します。 このルーチンは,ユーザが割り当て,SYS$INIT_GALAXY_LOCK によって初期化された共用メモリ内に存在するロックに対してだけ使用されます。
sys$reset_lock(handle, va)
パラメータ | サイズ(バイト数) | タイプ | 使用方法 |
---|---|---|---|
handle | 8 | 値による入力 | galaxyロック・ハンドル |
va | 8 | 参照による入力 | galaxyロックのアドレス |
戻り状態:
このサービスは,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 | 参照による出力 | 新しいロックのハンドル |
戻り状態:
このサービスは,SYS$RESET_GALAXY_LOCKを使用して,galaxyロックを無効にし, 削除します。ロックのためのメモリは,実際に削除されるわけではなく, 後で使用できるように未使用リストに登録されます。
sys$delete_galaxy_lock(handle)
パラメータ | サイズ(バイト数) | タイプ | 使用方法 |
---|---|---|---|
handle | 8 | 値による入力 | galaxyロック・ハンドル |
戻り状態:
このサービスは,指定されたロックからすべての「関心」フィールドを返します。
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ロック構造内のフラグ・フィールド |
戻り状態:
このサービスは,galaxyロックの最小サイズと最大サイズを返します。最大サイズのロックが作成されると, ロック・サービスは取得情報(acquire information)と解除情報(release information)をロックに記録します。
sys$get_galaxy_lock_size(min_size, max_size)
パラメータ | サイズ(バイト数) | タイプ | 使用方法 |
---|---|---|---|
min_ size | 4 | 参照による出力 | galaxyロックの最小サイズ |
max_ size | 4 | 参照による出力 | galaxyロックの最大サイズ |
戻り状態:
このサービスは,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 |
戻り状態:
このサービスは,galaxyロックの所有権を解除します。galaxyロックは同じ所有者によって2 回以上取得されることがあるため(ネストした所有権) ,所有権カウントが0になるまで,ロックは解除されません。ロック所有権が完全に解除され, そのロックを待っている他のスレッドがある場合は, 待ち状態から解放されます。
sys$release_galaxy_lock(handle)
パラメータ | サイズ(バイト数) | タイプ | 使用方法 |
---|---|---|---|
handle | 8 | 値による入力 | galaxyロック・ハンドル |
戻り状態:
所有されていないロックを解除しようとしました。
ロックを取得するためのすべての呼び出しに対して,ロックを解除するための呼び出しがあるかどうか確認してください。
ロック・サービスに渡されたロック・テーブル・ハンドルが有効なロック・ テーブルではありません。
使用しているロック・テーブル・ハンドルが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 ]