(57)【要約】      （修正有）【課題】ロックを利用して適正に排他制御を行う。【解決手段】プロセスを実行する複数のプロセス実行部と、複数のプロセス実行部によりアクセスされる共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置と、ロック解放状態の場合に、ロック状態フラグをロック取得状態に、ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新してプロセス実行部にロックを取得させる第１のロック取得処理と、ロック取得状態の場合に、ロック変数が同じロック識別情報を維持している間に所定の時間が経過した後に、ロック変数記憶装置の前記ロック変数のロック識別情報を新たに更新されたロック識別情報に更新してプロセス実行部にロックを取得させる第２のロック取得処理とを実行する排他制御装置とを有する。【選択図】図５
2016157399.tif 000002
【特許請求の範囲】
【請求項１】
それぞれのプロセスを実行する複数のプロセス実行部と、
前記複数のプロセス実行部によりアクセスされる共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置と、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得処理と、前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得処理とを実行する排他制御装置とを有する情報処理装置。
【請求項２】
前記排他制御装置は、前記第１のロック取得処理において、
所望のタイミングで前記ロック変数を読み出して旧値に設定し、
前記旧値のロック状態フラグがロック解放状態の場合に、前記ロック状態フラグをロック取得状態とし前記ロック識別情報を前記新たに更新されたロック識別情報とするロック変数を新値に設定し、前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する請求項１に記載の情報処理装置。
【請求項３】
前記排他制御装置は、前記第２のロック取得処理において、
第１のタイミングで、前記ロック変数記憶装置から読み出した前記ロック変数のロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過したか否かのタイムアウト判定を開始し、
前記第１のタイミング後の第２のタイミングで、前記ロック変数記憶装置から読み出した前記ロック変数のロック識別情報が前記第１のタイミングで読み出したロック識別情報と同じで且つ前記タイムアウト時間が経過している場合に、前記ロック変数の前記ロック識別情報を前記新たに更新されたロック識別情報に更新する請求項１または２に記載の情報処理装置。
【請求項４】
前記第２のロック取得処理における前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新させる処理では、
前記第２のタイミングで読み出した前記ロック変数を旧値に設定し、前記ロック状態フラグをロック取得状態とし前記ロック識別情報を前記新たに更新されたロック識別情報とするロック変数を新値に設定し、前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する請求項３に記載の情報処理装置。
【請求項５】
前記排他制御装置は、
前記ロック変数記憶装置から前記ロック変数を読み出し、前記読み出したロック変数が前記ロックを取得した時に更新したロック変数と一致する場合、前記ロック変数記憶装置のロック変数のロック状態フラグをロック解放状態に更新するロック解放処理を実行する請求項１乃至４のいずれかに記載の情報処理装置。
【請求項６】
それぞれのプロセスを実行する複数のプロセス実行部と、
前記複数のプロセス実行部によりアクセスされる共有リソースと、
前記共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置と、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得処理と、前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得処理とを実行する排他制御装置とを有する情報処理システム。
【請求項７】
それぞれのプロセスを実行する複数のプロセス実行部によりアクセスされる共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置にアクセスすること、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得を行うこと、
前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得を行うことと
を有する排他制御処理をコンピュータに実行させるコンピュータ読み取り可能な排他制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，情報処理装置、情報処理システム及び排他制御プログラムに関する。
【背景技術】
【０００２】
情報処理システムにおいて、単一または複数のCPU、単一または複数のCPUコア、単一または複数の情報処理装置などが、複数のプロセス（またはスレッド、ジョブ、以下代表してプロセスと称する。）を並列に実行する。これらのCPU、CPUコア、情報処理装置はプロセスのプログラムを実行するプロセス実行部である。
【０００３】
プロセス実行部は、共有変数などの共有リソースにアクセスする場合、プロセス間で共有リソースに対して同期をとる。この同期方法は、あるプロセスが共有リソースにアクセスする場合、他のプロセスによる共有リソースへのアクセスを禁止する排他制御である。排他制御の一つとして、排他的なロックを用いた排他制御がある。
【０００４】
ロックを用いた排他制御では、共有リソースにアクセスしようとするプロセスは、ロックが解放されている状態でロックを取得し、ロックを取得したプロセスだけが共有リソースにアクセスすることが許可される。一方、ロックを取得していない他のプロセスは、共有リソースにアクセスすることが禁止される。その結果、共有リソースに複数のプロセスが同時にアクセスして、プロセス間で共有リソースについてコヒーレンシを保つことができなくなるのが回避される。
【０００５】
このロックの取得を１つのプロセスに限定するために、共有リソース毎にロック変数が割り当てられる。そして、プロセスは、ロック変数をロック取得状態に書き換えることでロックを取得し、ロック変数をロック解放状態に書き換えることでロックを解放する。そして、プロセスは、ロック変数がロック解放状態の場合にロックを取得し、ロック変数がロック取得状態の場合はロック解放状態になるまで待機する。
【０００６】
ロックを用いた排他制御については、以下の先行文献に記載されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平０９−１０６３５７号公報
【特許文献２】特開平１１−３２７９３４号公報
【特許文献３】特開平１１−３２７９３１号公報
【特許文献４】特開２０１１−１２８９７５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
従来のロックを用いた排他制御では、ロック変数がロック取得状態とロック解放状態を記憶するだけである。そのため、第１のプロセスがロックを繰り返し取得した場合、第２のプロセスは第１のプロセスが障害などでロックを解放できないのか、正常にロックを繰り返し取得しているのかを区別することができない。その結果、第２のプロセスは、ロック取得状態が所定時間継続してタイムアウトした場合、誤ってロックを解放する場合がある。
【０００９】
また、第１のプロセスがロックを取得した後、障害などでロックを解放できない場合、複数の第２のプロセスが、ロック取得状態が所定時間継続してタイムアウトしたことを検出し、同時にロックを取得することがある。これでは、排他制御が適正に行われない。
【００１０】
そこで，実施の形態の第１の側面の目的は，ロックを利用して適正に排他制御を行う情報処理装置、情報処理システム及び排他制御プログラムを提供することにある。
【課題を解決するための手段】
【００１１】
実施の形態の第１の側面は，それぞれのプロセスを実行する複数のプロセス実行部と、
前記複数のプロセス実行部によりアクセスされる共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置と、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得処理と、前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得処理とを実行する排他制御装置とを有する情報処理装置、である。
【発明の効果】
【００１２】
第１の側面によれば，ロックを利用してプロセス間で適正に排他制御を行う。
【図面の簡単な説明】
【００１３】
【図１】複数のプロセス（またはプロセス実行部）が共有リソースにアクセスする情報処理装置１の構成を示す図である。
【図２】図１の情報処理装置において第１、第２のプロセスによる共有リソースへのアクセスが競合した場合の排他制御処理を示すシーケンス図である。
【図３】図１の情報処理装置において第１のプロセスの排他制御装置がロック取得とロック解放を正常に繰り返した場合の排他制御処理を示すシーケンス図である。
【図４】図１の情報処理装置において第２，第３のプロセスの排他制御装置がほぼ同じタイミングで前後してロック状態のタイムアウトを検出した場合の排他制御処理を示すシーケンス図である。
【図５】本実施の形態における複数のプロセス（またはプロセス実行部）が共有リソースにアクセスする情報処理装置１の構成を示す図である。
【図６】本実施の形態における排他制御処理のうちロック取得処理のフローチャート図である。
【図７】図６の工程S16の処理のフローチャート図である。
【図８】図６の工程S18の処理のフローチャート図である。
【図９】図６，図１０のCAS命令のフローチャート図である。
【図１０】本実施の形態における排他制御処理のうちロック解放処理のフローチャート図である。
【図１１】第１、第２プロセスのロック取得が競合する例１のシーケンス図である。
【図１２】第１プロセスがロック取得後、第２プロセスがロック取得する例２のシーケンス図である。
【図１３】第１プロセスがロック取得中にタイムアウトが発生し第２プロセスがロック取得する例３のシーケンス図である。
【図１４】第１プロセスがロック取得、解放を繰り返した場合、第２プロセスが同じロックでタイムアウトを検出できずに、両プロセスが共にロックを取得することを回避する例４のシーケンス図である。
【図１５】第１プロセスがロック取得中に第２、第３プロセスがタイムアウトを検出しロック取得が競合する例５のシーケンス図である。
【図１６】図１５における第２プロセスによるCAS命令と第３プロセスによるCAS命令のシーケンス図である。
【図１７】本実施の形態における情報処理装置の構成を示す図である。
【図１８】図１７の２つのCPUとディスクストレージの構成を示す図である。
【図１９】本実施の形態における情報処理システムの構成を示す図である。
【発明を実施するための形態】
【００１４】
図１は、複数のプロセス（またはプロセス実行部）が共有リソースにアクセスする情報処理装置１の構成を示す図である。第１のプロセスPR_1と第２のプロセスPR_2は、共有リソースCOM_RESにアクセスを行う。複数のプロセスは、例えば、情報処理装置１内のプロセッサ（CPU）やプロセッサコア（CPUコア）の処理単位であり、その処理単位のプロセスは共有リソースへのアクセス処理を有する。また、複数のプロセス実行部は、例えば、情報処理装置１内のプロセッサ（CPU）やプロセッサコア（CPUコア）である。そして、複数のプロセス実行部は、各プロセスを実行して共有リソースにアクセスする。さらに、複数のプロセス実行部は、例えばコンピュータなどの情報処理装置であってもよく、その場合、複数の情報処理装置はそれぞれのプロセスを実行して共有リソースにアクセスする。この場合は、図１に示された構成１は、情報処理システムである。
【００１５】
共有リソースへのアクセスは、共有リソースの状態を変更する処理、例えばメモリ内の共有変数を書き換える処理を有する。
【００１６】
情報処理装置１は、複数のプロセスが並列して実行される場合、プロセス間で排他制御を行う。第１、第２のプロセス間で排他制御を行う場合、情報処理装置１は、図１に示される機能ブロックを備える装置として機能する。
【００１７】
第１のプロセス実行部PE_1は、第１のプロセスPR_1による共有リソースCOM_RESへの第１アクセス処理を実行する。第２のプロセス実行部PE_2は、第２のプロセスPR_2による共有リソースCOM_RESへの第２アクセス処理を実行する。
【００１８】
排他制御装置EX_1は、第１のプロセス実行部PE_1が第１アクセス処理を実行するときに、ロック変数記憶装置LOCL_MEMにアクセスしてロックを取得し、第１アクセス処理が終了するときに、ロック変数記憶装置LOCL_MEMにアクセスしてロックを解放する。同様に、排他制御装置EX_2は、第２のプロセス実行部PE_2が第２アクセス処理を実行するときに、ロック変数記憶装置LOCL_MEMにアクセスしてロックを取得し、第２アクセス処理が終了するときに、ロック変数記憶装置LOCL_MEMにアクセスしてロックを解放する。排他制御装置EX_1,EX_2は、例えばオペレーションシステム（以下OS）内の一つのAPI関数である排他制御プログラムをCPUやCPUコアが実行することにより実現される機能である。
【００１９】
共有リソースCOM_RESは、例えば、メモリ内の変数、データベース内のテーブルなどである。一方、ロック変数記憶装置LOCK_MEMは、CPUやCPUコアがアクセスするメモリ内に実現され、それぞれの共有リソースCOM_RESに対応してそれぞれのロック変数LOCK_VALを記憶する。ロック変数LOCK_VALは、共有リソースに対してロック取得状態とロック解放状態とを有するロック状態フラグLOCK_FLGを有する。
【００２０】
図１の例では、ロック変数LOCK_VALは、後述する実施の形態のようにロックを取得するたびに新たに更新されるロック識別情報（ロックID）を有していない。そのため、以下に示すとおり、プロセスが、ロック取得状態が所定時間継続してタイムアウトした際に強制的にロックを取得するタイムアウト処理において、プロセス間で適正に排他制御を行うことができない。また、プロセスがロック解放処理を適正に行うことができない。
【００２１】
上記のとおり、CPUやCPUコアであるプロセス実行部PEがプロセスPRを実行することでロックを取得し共有リソースにアクセスし、アクセス終了後ロックを解放する。そして、プロセスPRがOSの排他制御プログラムを呼び出すとき、その排他制御プログラムを実行するCPUやCPUコアなどの排他制御装置EXが、ロック取得と解放を行う排他制御を実行する。このように、処理単位であるプロセスPRは、CPUやCPUコアであるプロセス実行部PEにより実行されることで、共有リソースにアクセスする。以下、プロセスが共有リソースにアクセスする、と簡略して表現することもある。同様に、排他制御プログラムは、CPUやCPUコアである排他制御装置EXにより実行されることで、排他制御を行う。以下、排他制御装置EXが排他制御を行う、と簡略して表現することもある。
【００２２】
図２は、図１の情報処理装置において第１、第２のプロセスによる共有リソースへのアクセスが競合した場合の排他制御処理を示すシーケンス図である。初期状態としていずれのプロセスも共有リソースに対してロックを取得していないものとする。したがって、ロック変数LOCK_VALのロック状態フラグLOCK_FLGはロック解放状態（LOCK_FLG=0）である。
【００２３】
第１、第２のプロセスPR_1,PR_2は、共有リソースへのアクセス実行に際して、排他制御装置EXにロック取得処理を実行させる。具体的には、第１、第２のプロセスPR_1,PR_2は、OSのAPI関数である排他制御プログラムのロック取得プログラムを呼び出す。第１のプロセスPR_1から呼び出されたロック取得プログラムを実行する排他制御装置EX_1は、ロック変数記憶装置LOC_MEMのロック変数LOCK_VALを読み出し（READ）、ロック状態フラグがロック解放状態（LOCK_FLG=0）であることを検出する。第２のプロセスPR_2から呼び出されたロック取得プログラムを実行する排他制御装置EX_2も、同様にロック変数を読み出し（READ）、ロック解放状態を検出する。
【００２４】
そこで、第１プロセスの排他制御装置は、読み出したロック変数を旧値とし、ロック取得状態のロック状態フラグ（LOCK_FLG=1）のロック変数を新値とする比較／スワップ命令（CAS命令：Compare And Swap命令）を実行し、ロック変数LOCK_VALを新値にスワップ（変更）する。CAS命令は、アトミック命令であり、旧値とロック変数記憶装置内のロック変数とを比較する処理と、旧値とロック変数記憶装置内のロック変数とが一致する場合のみロック変数記憶装置内のロック変数を新値に置き換える処理とを、アトミックに実行する命令である。
【００２５】
図２の例では、第１のプロセスの排他制御装置のCAS命令は、ロック変数記憶装置内のロック変数と、直前に読み出したロック変数である旧値とが、同じロック解放状態（LOCK_FLG=0）で一致するので、ロック取得状態の新値への変更処理を成功裡に完了する。その結果、第１のプロセスPR_1は共有リソースに対してロックを取得する。
【００２６】
一方、第２のプロセスの排他制御装置は、第１のプロセスの排他制御装置によるCAS命令の後で、同様のCAS命令を実行する。しかし、この時ロック変数LOCK_VALのロック状態フラグLOCK_FLGは既にロック取得状態（LOCK_FLG=1）に変更されているので、CAS命令は失敗に終わる。その結果、第１のプロセスPR_1は共有リソースへのアクセス処理を排他的に行うことができる。
【００２７】
その後、第１のプロセスPR_1は共有リソースへのアクセス処理を終了すると、OSのAPI関数である排他制御プログラムのロック解放プログラムを呼び出す。そこで、第１のプロセスPR_1により呼び出されたロック解放プログラムを実行する排他制御装置は、ロック解放値を書き込み、ロック変数LOCK_VALのロック状態フラグLOCK_FLGをロック解放状態（LOCK_FLG=０）に変更する。
【００２８】
図２には示されていないが、ロック変数がロック解放状態になった後、第２のプロセスPR_2により呼び出されたロック取得プログラムを実行する排他制御装置が、ロック変数記憶装置のロック変数を読み出してロック解放状態であることを検出すると、排他制御装置は読み出したロック変数を旧値としロック取得状態のロック変数を新値とするCAS命令を実行して、ロック取得に成功する。
【００２９】
図３は、図１の情報処理装置において第１のプロセスの排他制御装置がロック取得とロック解放を正常に繰り返した場合の排他制御処理を示すシーケンス図である。排他制御には、あるプロセスがロックを取得しようとした場合に、ロック状態フラグがロック取得状態なら所定時間経過後にタイムアウトを検出して強制的にロックを取得するタイムアウト処理ができることが望まれる。このタイムアウト処理は、ロックを取得したプロセスが障害などによりロックを解放できない場合は、別のプロセスにロック取得を許可する処理である。
【００３０】
図３では、ロック取得処理としてロック変数の読み出し処理を省略してCAS命令だけで示している。図３では各CAS命令にはロック変数の読み出し処理が含まれているものとする。
【００３１】
図３において、第１プロセスPR_1がロック取得とロック解放を正常に繰り返している。それに対して、第２プロセスPR_2はリトライ周期RP毎にロック取得の失敗を繰り返している。この場合、第２プロセスPR_2が呼び出したロック取得プログラムを実行する排他制御装置は、最初のロック取得の失敗からタイムアウト判定を開始し、タイムアウト時間TO経過後においてもロック取得に失敗すると、ロック状態がタイムアウトしたことを検出する。このタイムアウト検出に応答して、第２プロセスPR_2の排他制御装置は、ロック変数がロック取得状態にもかかわらず強制的にロックを取得する。
【００３２】
その結果、第１プロセスPR_1が正常にロック取得しているにもかかわらず、第２プロセスPR_2がロックを強制的に取得して、共有リソースにアクセスする。それにより、第１、第２プロセスPR_1,PR_2が共有リソースに同時にアクセスし、排他制御が適正に行われない。つまり、第２プロセスPR_2の排他制御装置が、ロック変数のロック取得状態に基づいてロック取得失敗を繰り返した後にタイムアウトを検出した結果、ロック状態のタイムアウトを誤検出している。理由は、第２プロセスの排他制御装置が、第１プロセスの排他制御装置が正常にロック取得を繰り返したのか、何らかの異常でロック取得状態を解放できないのかを区別できないからである。これでは、強制的なロック取得を伴うタイムアウト処理が適正に実行されない。
【００３３】
図４は、図１の情報処理装置において第２，第３のプロセスの排他制御装置がほぼ同じタイミングで前後してロック状態のタイムアウトを検出した場合の排他制御処理を示すシーケンス図である。図４でも、ロック取得処理としてロック変数の読み出し処理を省略してCAS命令だけで示している。図４でも各CAS命令にはロック変数の読み出し処理が含まれているものとする。
【００３４】
図４において、最初に第１プロセスPR_1の排他制御装置がロック取得している。その後、第２プロセスPR_2の排他制御装置がロック取得の失敗を繰り返し、所定時間経過後にタイムアウトを検出する（TIME_OUT_2）。このタイムアウトの検出に応答して、第２プロセスの排他制御装置がロック変数をロック解放状態に変更し、さらにCAS命令によりロック変数をロック取得状態に変更してロックを取得している。
【００３５】
一方、第３プロセスPR_3の排他制御装置もロック取得の失敗を繰り返し、所定時間経過後にタイムアウトを検出する（TIME_OUT_3）。このタイムアウトの検出に応答して、第３プロセスの排他制御装置が、第２プロセスがCAS命令で書き換えたロック変数のロック取得状態をロック解放状態に書き換え、CAS命令によりロック変数を書き換えてロックを取得している。
【００３６】
図４の場合、第１プロセスPR_1は障害発生などの理由でロックを解放できずに、第２、第３プロセスが共にタイムアウトを検出してロックを取得している。その結果、第２、第３プロセスが共有リソースに同時にアクセスして共有リソースを変更してしまうことが生じうる。これでは、排他制御を適正に行うことができない。
【００３７】
以上、図３では第１プロセスの排他制御装置がロック取得とロック解放を繰り返した場合、第２プロセスの排他制御装置が誤ってロック状態のタイムアウトを検出する。また、図４では第２、第３プロセスの排他制御装置が共にロック状態のタイムアウトを検出する。この原因は、いずれも、ロック変数がロック状態フラグしか有していないため、異なるロック取得状態を区別できないからである。
【００３８】
［本実施の形態］
本実施の形態では、ロック変数が、ロック取得状態とロック解放状態を示すロック状態フラグに加えて、ロック識別情報を有する。そして、排他制御装置は、ロックを取得する場合、ロック変数記憶装置内のロック変数のロック識別情報を、新たなロック識別情報に更新する。つまり、ロック識別情報は、ロックが取得されるたびに更新される。したがって、ロック識別情報は、異なるロック取得によるロック取得状態を区別する。
【００３９】
これにより、排他制御装置は、ロック識別情報が変更されない間にタイムアウトしたことを判定することで、ロック状態のタイムアウトを適正に検出する。排他制御装置は、ロック識別情報が変更されていないことを確認するために、ロックを取得するときに更新した新たなロック識別情報を内部変数として記憶する。そして、排他制御装置は、ロック状態のタイムアウト判定処理で、ロック取得時のロック識別情報と判定時のロック変数のロック識別情報とが一致するかを判定し、ロック取得状態が変更されずにロック取得中が所定時間継続したか否かを判定する。
【００４０】
ロック識別情報を利用すると、図３のように、第１プロセスの排他制御装置がロック取得とロック解放を繰り返した場合、第２プロセスの排他制御装置は、ロック識別情報が変更されていることで異なるロック取得状態になったことを検出し、タイムアウトしたことを検出しない。同様に、図４のように、第２、第３のプロセスが同時にタイムアウト判定を開始しても、第３プロセスの排他制御装置は、第２プロセスによりロック識別情報が変更されているので、タイムアウトしたことを検出することはない。
【００４１】
［本実施の形態における情報処理装置の構成］
図５は、本実施の形態における複数のプロセス（またはプロセス実行部）が共有リソースにアクセスする情報処理装置１の構成を示す図である。図５中、第１、第２プロセスPR_1,PR_2、第１、第２プロセス実行部PE_1,PE_2、それぞれの排他制御装置EX_1,EX_2、共有リソースCPM_RES、ロック変数記憶装置LOCK_MEMは、図１と同様である。
【００４２】
図５の情報処理装置１において図１の構成と異なる点は以下のとおりである。第１に、ロック変数記憶装置LOCK_MEMに記憶されるロック変数LOCK_VALは、ロック取得状態とロック解放状態とを示すロック状態フラグLOCK_FLGに加えて、ロックが取得されるたびに更新されるロック識別情報LOCK_IDを有する。ロック識別情報LOCK_IDは、ロックが取得されるたびに更新されるので、取得されたロックを区別するために利用される。例えば、同じプロセスが取得した異なるロックは、ロック識別情報により区別可能である。同様に、異なるプロセスが取得した異なるロックも、ロック識別情報により区別可能である。
【００４３】
ロック識別情報LOCK_IDは、例えば、タイムスタンプ、更新時に所定数増加または減少する数値など、区別可能な情報が選ばれる。以下の実施の形態では、ロック識別情報としてタイムスタンプが利用される。
【００４４】
第２に、各排他制御装置EX_1,EX_2は、それぞれの内部変数IN_VAL_1,IN_VAL_2を利用して、ロック取得処理とロック解放処理を実行する。各内部変数IN_VALは、CAS命令に利用する旧値OLD_Vと新値NEW_Vと、タイムアウト判定に利用するタイムアウト判定開始時刻S_TIME、タイムアウト判定開始時ロック変数S_LOCKと、ロック解放処理に利用するロック取得時ロック変数AQ_LOCKとを有する。
【００４５】
タイムアウト判定開始時刻S_TIMEは、排他制御装置が最初にロック取得状態を検出してタイムアウト判定を開始した時の時刻である。タイムアウト判定開始時ロック変数S_LOCKはタイムアウト判定を開始した際に読み出したロック変数である。そして、ロック取得時ロック変数AQ_LOCKは、ロック取得時に更新したロック変数LOCK_VALである。
【００４６】
タイムアウト開始時ロック変数S_LOCKは、ロック変数LOCK_VALのうちロック識別情報LOCK_IDだけでもよい。同様に、ロック取得時ロック変数AQ_LPCLもロック識別情報LOCK_IDだけでもよい。
【００４７】
これらの内部変数のうち、タイムアウト判定開始時刻S_TIMEは判定開始時刻と略称し、タイムアウト判定開始時ロック変数S_LOCKは判定開始時ロック変数と略称する。
【００４８】
第１、第２のプロセスPR_1,PR_2はそれぞれ、共有リソースにアクセスし共有変数への書き込み命令などの他のプロセスの実行に影響を与えるクリティカルな命令を含む。そのため、各プロセスは、他のプロセスの実行に影響を与えるクリティカルな命令の前に、排他制御プログラムのロック取得処理プログラムを呼び出す。そして、各プロセスは、ロック取得処理を実行する排他制御装置がロック取得した場合にクリティカルな命令を実行する。また、各プロセスは、クリティカルな命令が終了すると、排他制御プログラムのロック解放処理プログラムを呼び出し排他制御装置がロック解放処理を実行する。
【００４９】
したがって、第１、第２のプロセスPR_1,PR_2は、例えば次のような命令シーケンスを有する。
１．ロック取得処理プログラムを呼び出す命令
２．クリティカル命令
３．ロック解放処理プログラムを呼び出す命令
【００５０】
［ロック取得処理の概略］
図６は、本実施の形態における排他制御処理のうちロック取得処理のフローチャート図である。図７は、図６の工程S16の処理のフローチャート図である。図８は、図６の工程S18の処理のフローチャート図である。そして、図９は、図６，図１０のCAS命令のフローチャート図である。そして、図１０は、本実施の形態における排他制御処理のうちロック解放処理のフローチャート図である。以下、ロック取得処理とロック解放処理の概略を説明する。
【００５１】
図６のロック取得処理のフローチャートは、大きく分けて次の７つの処理フローを有する。
【００５２】
第１に、ロック変数記憶装置LOCK_MEMのロック変数LOCK_VALのロック状態フラグLOCK_FLGがロック解放状態の場合（LOCK_FLG=0）に、ロックを取得する第１の処理である。この第１の処理は、処理S10, S11, S12, S13, S14, S15, S20を有する。
【００５３】
第２に、ロック状態フラグLOCK_FLGがロック取得状態の場合（LOCK_FLG=1）、タイムアウト判定を開始するときの第２の処理である。この第２の処理は、処理S11, S12, S16, S18, S19, S21を有する。
【００５４】
第３に、ロック取得状態において、タイムアウト判定を繰り返す第３の処理である。この第３の処理は、処理S11, S12, S16, S18, S21を有する。
【００５５】
第４に、ロック取得状態において、タイムアウト判定においてロック識別情報LOCK_IDが変更されていることが判明し、それまでのタイムアウト判定がキャンセルされて新たにタイムアウト判定を開始する第４の処理である。この第４の処理は、処理S11, S12, S16:NO, S18:YES, S19, S21を有する。
【００５６】
第５に、ロック取得状態において、タイムアウトを検出し、ロックを取得する第５の処理である。この第５の処理は、処理S11, S12:NO, S16:YES, S17, S14, S15:YES, S20を有する。
【００５７】
第６に、ロック解放状態において、ロック取得しようとしたが、CAS命令を失敗する処理である。この第６の処理は、処理S11, S12:YES, S13, S14, S15:NOを有する。
【００５８】
第７に、ロック取得状態において、タイムアウトを検出したが、CAS命令を失敗する処理である。この第７の処理は、処理S11, S12:NO, S16:YES, S17, S14, S15:NOを有する。
【００５９】
図６のロック取得処理が開始されるとき、ロック変数記憶装置内のロック変数LOCK_VALはロック解放状態であるか、または、既にロック取得状態であるかのいずれかである。ロック取得状態の場合は、ロック識別情報LOCK_IDはロック取得時のタイムスタンプになっている。
【００６０】
以下、上記の第１〜第５の処理について図６を参照して説明する。
【００６１】
［第１の処理：S100］
第１の処理である、ロック解放状態の場合にロックを取得する処理では、排他制御装置EXは、最初に内部変数を初期化する（S10）。この初期化処理では、５つの内部変数に通常状態では取り得ない初期値を設定する。例えば、旧値OLD_Vと新値NEW_VをLOCK_FLG=0、LOCK_ID=０に、判定開始時刻S_TIMEを０に、判定開始時ロック変数S_LOCKとロック取得時ロック変数AQ_LOCKを、LOCK_FLG=0、LOCK_ID=０に、それぞれ設定する。
【００６２】
次に、排他制御装置EXは、ロック変数記憶装置LOCK_MEM内のロック変数LOCK_VALを読み出し、旧値OLD_Vに代入する（S11）。これにより、旧値OLD_Vは読み出したロック変数LOCK_VALと等しくなる。そして、排他制御装置は、読み出したロック変数のロック状態フラグLOCK_FLGがロック解放状態（LOCK_FLG=0）か否か判定する（S12）。第１の処理では、ロック解放状態であるので（S12がYES）、排他制御装置は、ロック状態フラグを１（LOCK_FLG=1）にし、旧値のロック識別情報LOCK_IDを新たなロック識別情報に更新した新ロック変数を、新値NEW_Vに代入する（S13）。本実施の形態の例ではロック識別情報はタイムスタンプであるので、新たなロック識別情報は現在時刻になる。
【００６３】
さらに、排他制御装置は、CAS命令を実行し、旧値とロック変数記憶装置内のロック変数とを比較し、等しい場合にロック変数記憶装置のロック変数を新値に置き換える（スワップ）する（S14）。CAS命令は、比較とスワップとをアトミックに処理する。
【００６４】
図９にCAS命令の処理が示される。CAS命令は、旧値OLD_Vとロック変数LOCK_VALとを比較する処理S41,S42と、旧値とロック変数が等しい場合（S42がYES）、ロック変数LOCK_VALを新値NEW_V（LOCK＿FLG=1、LOCK_ID=現在時刻）にスワップする処理（S43）とを有する。スワップ処理S43が行われると成功応答が返され（S44）、旧値とロック変数が等しくなくスワップ処理が行われないと失敗応答が返される（S45）。
【００６５】
CAS命令をアトミックに行うことで、工程S11でロック変数を読み出した時からCAS命令を実行するときまでにロック変数が変更されず、CAS命令中にロック変数が変更されていないことが保証される。
【００６６】
［第２の処理：S200］
第２の処理である、ロック状態フラグLOCK_FLGがロック取得状態の場合（LOCK_FLG=1）、タイムアウト判定を開始する処理は、処理S11, S12, S16, S18, S19, S21を有する。第２の処理では、既に初期化処理S10は完了し、ロック状態フラグがロック取得状態に更新された後の処理である。
【００６７】
まず、排他制御装置EXは、ロック変数記憶装置LOCK_MEMのロック変数を読み出し、旧値OLD_Vに代入する（S11）。これにより、旧値OLD_Vは読み出したロック変数LOCK_VALと等しくなる。そして、排他制御装置は、読み出したロック変数のロック状態フラグLOCK_FLGがロック解放状態（LOCK_FLG=0）か否か判定する（S12）。第２の処理では、ロック取得状態であるので（S12がNO）、排他制御装置は、同じロック中にタイムアウトしたか否かの判定を行う（S16）。第２の処理では、未だタイムアウトしていないので、判定はNOになる。そして、判定制御装置は、新しいロック取得状態の初回か否かを判定し（S18）、初回の場合は、タイムアウト判定開始処理として、判定開始時刻S_TIMEに現在時刻を、判定開始時ロック変数S_LOCKに旧値（LOCK_FLG=1、LOCK_ID＝現在ID）を代入する（S19）。そして、リトライ時間RP経過するまで待機する（S21）。
【００６８】
図７にタイムアウト判定処理S16が示される。処理S16における同じロック中にタイムアウトしたか否かの判定は、旧値（処理S11で直前に読み出したロック変数）が判定開始時ロック変数S_LOCKと等しく（S51のYES）、且つ判定開始時刻S_TIMEから現在時刻までの経過時間がタイムアウト経過時間を超えている（S52のYES）か否かである。両条件がYESの場合、同じロック中にタイムアウトしたと判断することができ、処理S16の判定はYESになる（S53）。両条件のいずれかがNOの場合、処理S16の判定はNOになる（S54）。
【００６９】
図８に処理S18が示される。処理S18における新しいロック取得状態の初回か否かの判定は、判定開始時刻S_TIME＝０（S61がYES）、または、旧値（直前に処理S11で読み出したロック変数）が判定開始時ロック変数S_LOCKと等しくない（S62がYES）場合に、YES（S63）となる。２つの条件が共にNOであれば、NO（S64）となる。
【００７０】
つまり、S10の内部変数の初期化直後に、S11で読み出したロック状態フラグLOCK_FLGが１の場合は、内部変数のうち判定開始時刻S_TIMEが初期値（S_TIME=0）であるので、処理S61がYESになる。または、S10の内部変数の初期化直後に、S11で読み出したロック状態フラグLOCK_FLGが１の場合は、内部変数のうち判定開始時ロック変数S_LOCKも初期値であるので、処理S62もYESになる。したがって、処理S61またはS62でYESになれば、新しいロック取得状態の初回と判定できる。
【００７１】
また、初期化後、ロック取得状態を検出し（S12のNO）、タイムアウト判定を開始した後にリトライ時間RP経過するまで待機（S21）した後は、判定開始時刻S_TIMEは初期値以外であり（S_TIME≠０でS61はNO）、且つ、旧値（直前に処理S11で読み出したロック変数）が判定開始時ロック変数S_LOCKと同じなら（旧値＝S_LOCKでS62がNO）、新しいロック取得状態の初回ではないと判定できる。
【００７２】
また、初期化後、ロック取得状態を検出し（S12のNO）、タイムアウト判定を開始した後にリトライ時間RP経過するまで待機（S21）した後に、新たに別のロックが取得された場合、少なくとも旧値（直前に処理S11で読み出したロック変数）が判定開始時ロック変数S_LOCKと等しくないので（旧値≠S_LOCKでS62がYES）、新しいロック取得状態の初回と判定できる。
【００７３】
図８において、処理S62を省略して、処理S61がYESであれば新しいロック取得状態の初回、NOであれば初回以外と判定してもよい。
【００７４】
［第３の処理：S300］
第３の処理である、ロック取得状態において、タイムアウト判定を繰り返す処理は、処理S11, S12, S16, S18, S21を有する。第３の処理では、タイムアウト判定の処理S16は、同じロック中であるがタイムアウト経過時間に至っていないため、NOとなる。その結果、処理S11, S12, S16, S18, S21が繰り返される。
【００７５】
［第４の処理：S400］
第４の処理は、ロック取得状態において、タイムアウト判定においてロック識別情報LOCK_IDが変更されていることが判明し、それまでのタイムアウト判定がキャンセルされて新たにタイムアウト判定を開始する。第４の処理は、処理S11, S12, S16:NO, S18:YES, S19, S21を有する。
【００７６】
第４の処理は、ロック取得状態においてタイム判定を行う点で第３の処理と類似するが、上記の第３の処理と異なり、タイムアウト判定の処理S16で、ロック変数のロック識別情報LOCK_IDが判定開始時ロック変数のロック識別情報LOCK_IDと異なることを検出し、判定結果がNOとなる。その結果、処理S18で新しいロックでの初回と判定されてYESとなり、新たに判定開始時刻S_TIMEを現在時刻に、判定開始時ロック変数S_LOCKを旧値に代入するタイムアウト開始処理を行う（S19）。その結果、再度、第３の処理S300が繰り返される。
【００７７】
［第５の処理：S500］
第５の処理である、ロック取得状態において、タイムアウトを検出し、ロックを取得する処理は、処理S11, S12, S16でYES, S17, S14, S15でYES, S20を有する。第５の処理は、第３の処理が繰り返した結果、同じロック中でタイムアウト時間を経過したため、タイムアウト判定処理S16がYESとなる。その場合、排他制御装置は、旧値（直前に処理S11で読み出したロック変数）のロック識別情報を更新した新ロック識別情報LOCK_IDを新値に代入し（S17）、CAS命令を実行する（S14）。新ロック識別情報LOCK_IDはタイムスタンプである。そして、CAS命令が成功すれば（S15のYES）、ロック取得時ロック変数AQ_LOCKに更新したロック変数が代入される（S20）。
【００７８】
［ロック解放処理の概略］
図１０に示されたロック解放処理では、排他制御装置は、ロック変数記憶装置からロック変数LOCK_VALを読み出し、そのロック変数を旧値に代入する（S31）。そして、排他制御装置は、その読み出したロック変数である旧値がロック取得時ロック変数AQ_LOCKと等しければ（旧値＝AQ_LOCK、S32がYES）、ロック状態フラグをロック解放状態に変更し旧値のロック識別情報を更新した新ロック変数（LOCK_FLG=0、LOCK_ID=タイムスタンプ）を新値に代入し（S33）、CAS命令を実行する（S34）。ロック解放処理を行う排他制御装置が取得したロックであれば、旧値（＝AQ_LOCK）＝ロック変数であるので、CAS命令が成功する（S35のYES）。他の排他制御装置が取得したロックの場合は、ロック変数記憶装置のロック識別情報がロック取得時ロック変数のロック識別情報と一致しないので、CAS命令が失敗する（S35のNO,S36）。
【００７９】
ロック解放処理を行おうとする排他制御装置自身がロック取得したときのロック変数のロック識別情報と、現在のロック変数のロック識別情報とが一致しない場合は、他の排他制御装置が取得したロックであるので、ロック解放処理はできない。一致した場合のみCAS命令が成功してロック解放処理が行われる。
【００８０】
次に、本実施の形態における様々な排他制御処理の例を説明する。以下の５つの例では、図６〜図１０の処理番号を参照して説明する。
【００８１】
［第１、第２プロセスのロック取得が競合する例１（図１１）］
図１１は、第１、第２プロセスのロック取得が競合する例１のシーケンス図である。この例１では、ロック状態フラグがロック解放状態の場合、第１プロセスPR_1と第２プロセスPR_2のロック取得が競合する。図１１に示されるとおり、第１プロセスPR_1が先にロック取得処理（図６）を開始する。つまり、第１プロセスの排他制御装置が、第１の処理（S100：S10, S11, S12, S13, S14, S15, S20）を実行し、ロックを取得する。すなわち、排他制御装置が、初期化処理S10と、ロック変数の読み出しS11と、ロック状態フラグLOCK_FLGがLOCK_FLG=０であることの検出（S12のYES）と、ロック変数を新値NEW_V（LOCK_FLG=1、LOCK_ID＝タイムスタンプ）でスワップするCAS命令（S13, S14）とを行う。CAS命令の成功でロック取得する。そして、CAS命令によりスワップしたロック変数をロック取得時ロック変数AQ_LOCKとして記憶する（S20）。
【００８２】
一方、第２プロセスがほぼ同時に、しかし遅れてロック取得処理を開始する。つまり、第２プロセスの排他制御装置がロック取得失敗の第６の処理（S600：S10, S11, S12:YES, S13, S14, S15:NO）を実行する。この排他制御装置は、ロック状態フラグがロック解放中であるため（S12：YES）、CAS命令を実行するが（S14）、第１プロセスが先にロック取得していたため、旧値とロック変数が不一致となりCAS命令が失敗し、ロック取得できない。
【００８３】
第１プロセスによるCAS命令はアトミックに処理されるので、第１プロセスによるCAS命令が成功し、第１プロセスのCAS命令の完了後に実行される第２プロセスによるCAS命令は失敗する。
【００８４】
例１では、ロック状態フラグを利用しCAS命令を実行するので、第１、第２のプロセスのロック取得が競合しても、先に取得しようとした第１プロセスのみがロックを取得でき、適切に排他制御を行うことができる。
【００８５】
［第１プロセスがロック取得後、第２プロセスがロック取得する例２（図１２）］
図１２は、第１プロセスがロック取得後、第２プロセスがロック取得する例２のシーケンス図である。例２では、第１プロセスがロック取得処理を行ってロック取得中に、第２プロセスがロック取得を試みるがロック取得中により失敗し、第１プロセスがロック解放処理を行った後に、第２プロセスが再度ロック取得を行う。
【００８６】
図１２において、最初に第１プロセスPR_1がロック取得処理（図６）を開始し、第１プロセスの排他制御装置が第１の処理（S100：S10, S11, S12, S13, S14, S15, S20）を実行し、ロックを取得する。そして、ロック取得時にロック変数に書き込んだ（スワップした）ロック変数をロック取得時ロック変数AQ_LOCKとして記憶する（S20）。
【００８７】
次に、第２プロセスの排他制御装置が、第２の処理（S200）を実行する。すなわち、第２プロセスの排他制御装置が、第１プロセスがロック取得中に、ロック取得処理を試みる（S10,S11,S12）。しかし、ロック状態フラグがロック取得中（LOCK_FLG=1）であり（S12のNO）、タイムアウト判定S16でNO、新しいロック取得後の初回判定S18でYESとなり、排他制御装置はタイムアウト開始処理S19を実行する。
【００８８】
その後、第１プロセスの排他制御装置が、ロック解放処理を行う（S31, S32でYES、S33, S34, S35でYES）。排他制御装置は、ロック変数を読み出して旧値に代入し（S31）、現在のロックが自分が取得したロック取得状態であるので、処理S32で旧値＝AQ_LOCKとなり（S32でYES）、ロック解放のためのCAS命令（S34）が成功する（S35はYES）。
【００８９】
ロック解放後に、第２プロセスの排他制御装置が、リトライ時間RP経過後に、再度ロック変数を読み出すと（S11）、今度はロック解放状態であるため（LOCK_FLG=0でS12はYES）、処理S13,S14,S15,S20を実行して、ロックを取得する。この処理は、第１の処理S100と同等である。
【００９０】
例２では、ロック取得時ロック変数AQ_LOCKを記憶しておくことで、排他制御装置は、自分が獲得したロックに対してのみロック解放処理を行うことができ、他の排他制御装置が獲得したロックに対してはロック解放処理ができない。本実施の形態では、タイムアウト検出時に強制的にロック取得が可能になっているので、このようなロック解放処理が有効である。
【００９１】
［第１プロセスがロック取得中にタイムアウトで第２プロセスがロック取得する例３（図１３）］
図１３は、第１プロセスがロック取得中にタイムアウトが発生し第２プロセスがロック取得する例３のシーケンス図である。すなわち、第１プロセスがロック取得した後、障害発生などの理由でロック解放できなくなり、第２プロセスがロックのタイムアウトを検出し、適正にロックを取得する例である。
【００９２】
図１３において、最初に第１プロセスPR_1がロック取得処理（図６）を開始し、第１プロセスの排他制御装置が第１の処理（S10, S11, S12, S13, S14, S15, S20）を実行し、ロックを取得する。そして、ロック取得時にロック変数に書き込んだ（スワップした）ロック変数をロック取得時ロック変数AQ_LOCKとして記憶する（S20）。
【００９３】
次に、第２プロセスの排他制御装置が、第２の処理（S200：S11, S12, S16, S18, S19, S21）を実行する。すなわち、排他制御装置は、第１プロセスがロック取得中に、ロック取得処理を試みる（S10,S11,S12）。しかし、ロック状態フラグがロック取得中（LOCK_FLG=1）であり（S12のNO）、タイムアウト判定S16でNO、新しいロック取得後の初回判定S18でYESとなり、排他制御装置はタイムアウト開始処理S19を実行する。この時点から第２プロセスの排他制御装置によるタイムアウト判定が開始する。ここまでは、図１２の例２と同じである。
【００９４】
そこで、第２プロセスの排他制御装置は、図６におけるロック取得状態においてタイムアウト判定を繰り返す第３の処理（S11, S12, S16でNO, S18でNO, S21）を行う。この第３の処理は、同じロック状態でタイムアウトするまで（S16のYES）まで繰り返される。
【００９５】
やがて、第２のプロセスの排他制御装置は、同じロック状態でタイムアウトを検出し（S16のYES）、ロック取得を行う。この処理は、図６におけるロック取得状態において、タイムアウトを検出し、ロックを取得する第５の処理（S500：S11, S12, S16：YES, S17, S14, S15：YES, S20）である。
【００９６】
例３において、ロック変数のロック識別情報LOCK_IDがタイムアウトの判定開始時ロック変数のロック識別情報と一致することを確認することで、排他制御装置は同じロック中にタイムアウトしたことを判定することができる。
【００９７】
［第１プロセスがロック取得、解放を繰り返した場合のタイムアウト判定の例４（図１４）］
図１４は、第１プロセスがロック取得、解放を繰り返した場合、第２プロセスが同じロックでタイムアウトを検出できずに、両プロセスが共にロックを取得することを回避する例４のシーケンス図である。例４は、図３の問題点を回避する。
【００９８】
図１４において、第１プロセスPR_1の排他制御装置が、ロック取得処理である第１の処理（S100：S10, S11, S12:YES, S13, S14, S15:YES, S20）を実行する。その結果、第１プロセスの排他制御装置が、ロック識別情報LOCK_ID=NO.1でロックを取得する。
【００９９】
第１プロセスがロックを取得した状態で、第２プロセスPR_2の排他制御装置が、ロック取得処理しようとして第２の処理（S200：S10, S11,S12:NO, S16:NO, S18:YES, S19）を実行する。ロック取得状態であるため、排他制御装置はロックを取得できず、タイムアウト判定開始処理S19を行い、判定開始時ロック変数S_LOCKとしてロック識別情報LOCK_ID=NO.1を内部変数として記憶する。
【０１００】
さらに、第１プロセスがロック取得状態において、第２プロセスの排他制御装置は、ロック判定処理を有する第３の処理S300を繰り返す。この例では、第３の処理S300でのロック判定処理S16でタイムアウトの経過時間に達しておらずタイムアウトにはならないとする。
【０１０１】
その後、第１プロセスの排他制御装置がロック解放処理（S31,S32,S33,S34,S35）を実行するが、その直後に、第１プロセスの排他制御装置がロック取得処理S100を実行し、再度新たにロックを取得する。この取得したロックのロック識別情報LOCK_IDはLOCK_ID=NO.2となる。
【０１０２】
一方、第１プロセスがロック取得状態において、第２のプロセスの排他制御装置は、ロック判定処理を有する第４の処理S400（S11, S12:NO, S16:NO, S18:YES, S19）を実行する。つまり、排他制御装置は、第４の処理S400のタイムアウト判定S16にて、判定開始時刻からタイムアウト時間を経過しているが、判定開始時ロック識別情報LOCK_IDが現在のロック変数のロック識別情報LOCK_IDと一致しない（NO.1≠NO.2）ため、判定はNOとなる。つまり、タイムアウトしたと判定できない。そして、新たなロックでの初回の判定S18がYESとなり、タイムアウト判定開始処理S19を実行する。
【０１０３】
図３の例では、個々のロック取得状態を区別せずに、最初のロック取得状態からタイムアウト時間経過したかでタイムアウトを判定していたため、第２プロセスが誤ってロックを取得していた。しかし、本実施の形態での図１４の例４では、排他制御装置は、タイムアウト判定開始時にロック変数のロック識別情報LOCK_IDを内部変数の判定開始時ロック変数S_LOCKに記憶しておき(S19)、その後のタイムアウト判定S16で現在のロック識別情報S_LOCKと判定開始時ロック変数S_LOCKのロック識別情報S_LOCKとが一致するか否かを判定する。それにより、排他制御装置は、同じロック取得状態が継続したか否かを判別する。したがって、排他制御装置は、最初のロック取得状態検出時からタイムアウト時間を経過していても、異なるロックに変更されていた場合は、タイムアウト判定を否定することができる。これにより、第２プロセスが誤ってロックを取得することが回避される。
【０１０４】
［第１プロセスがロック取得中にタイムアウトで第２、第３プロセスのロック取得が競合する例５（図１５）］
図１５は、第１プロセスがロック取得中に第２、第３プロセスがタイムアウトを検出しロック取得が競合する例５のシーケンス図である。すなわち、第１プロセスがロック取得後に障害発生などの理由でロック解放できなくなる。そして、第２、第３プロセスがほぼ同時にタイムアウトを検出し、強制ロック取得を実行する。しかし、強制ロック取得時のCAS命令S14がアトミック命令であるため、第２プロセスのCAS命令は成功し、第３プロセスのCAS命令は失敗する。例５は、図４の問題点を回避する。
【０１０５】
図１５において、第１プロセスの排他制御装置が第１の処理S100を実行し、ロックを取得する。その後、第１プロセスは障害などが原因でロック解除できなくなる。
【０１０６】
第１プロセスによるロック取得状態において、第２、第３プロセスが第２の処理S200を実行してタイムアウト判定開始し、さらにタイムアウト判定を含む第３の処理S300を繰り返す。
【０１０７】
第１プロセスによるロック（ロック識別情報LOCK_ID=NO.1）が維持されたまま、第２、第３プロセスは、タイムアウト判定S16で、同じロック中にタイムアウト経過したことを検出し（S16:YES）、それぞれ強制ロック取得処理をしようとする。このとき、第２プロセスの排他制御装置のCAS命令が先に実行開始され、第３プロセス側のCAS命令が遅れて実行開始される。その結果、第２プロセスの排他制御装置のCAS命令は成功する（S15:YES）。その結果、ロック変数のロック識別情報LOCK_IDが更新され、LOCK_ID=NO.2となる。つまり、第２プロセスの排他制御装置は、第５の処理S500を実行できる。
【０１０８】
一方、第３プロセスの排他制御装置のCAS命令は、旧値がLOCK_ID=NO.1でロック変数のロック識別情報LOCK_ID=NO.2であるため両者は不一致になり、失敗する（S15:NO）。つまり、第３プロセスの排他制御装置は、第７の処理S700を実行することになる。
【０１０９】
図１６は、図１５における第２プロセスによるCAS命令と第３プロセスによるCAS命令のシーケンス図である。第２プロセスは第５の処理S500を実行し、第３プロセスは第７の処理S700を実行する。
【０１１０】
まず、第２プロセスPR_2の排他制御装置は、タイムアウトを検出し（S16:YES）、旧値を直前（S11）に読み出したロック変数（ロック識別情報LOCK_ID=NO.1）とし、新値を更新したロック変数（ロック識別情報LOCK_ID＝NO.2）とするCAS命令を実行する（S17,S14）。このCAS命令では、旧値とロック変数記憶装置内のロック変数（ロック識別情報LOCK_ID＝NO.1）とが一致するので、新値がロック変数に書き込まれ、CAS命令は成功する（S15:YES）。その結果、ロック変数記憶装置内のロック変数は、ロック識別情報LOCK_IDはNO.2に更新される。
【０１１１】
一方、第３プロセスPR_3の排他制御装置も、タイムアウトを検出し、（S16:YES）、旧値を直前（S11）に読み出したロック変数（ロック識別情報LOCK_ID=NO.1）とし、新値を更新したロック変数（ロック識別情報LOCK_ID＝NO.2）とするCAS命令を実行する（S17,S14）。しかし、CPUコアは第２プロセス側のCAS命令をアトミックに実行し、第３プロセス側のCAS命令は待たされる。CPUコアは、第２プロセス側のCAS命令が完了した後に、第３プロセス側のCAS命令を実行する。しかし、この時既にロック変数のロック識別情報LOCK_IDは更新されてLOCK_ID=NO.2になっている。そのため、第３プロセス側のCAS命令は、旧値とロック変数とが一致せず、失敗に終わる。
【０１１２】
上記の例５においても、ロック変数LOCK_VALにロック識別情報LOCK_IDを有するので、第２、第３プロセスが同時にタイムアウトを検出したとしても、先にCAS命令を開始した第２プロセスのみがCAS命令を成功してロックを取得し、後にCAS命令を開始した第３プロセスはCAS命令を失敗する。これにより、図４の第２、第３プロセスが共にロックを取得することが回避される。
【０１１３】
［情報処理装置、情報処理システム］
図１７は、本実施の形態における情報処理装置の構成を示す図である。図１７の情報処理装置１は、複数のCPU10_1，10_2と、メモリアクセスコントローラ１１を介して接続されるメインメモリ１２と、ストレージコントローラ２０を介して接続される大容量のディスクストレージ２１と、ネットワークコントローラ２２を介して接続されるネットワークインターフェースカード２３と、シリアルコントローラ２４を介して接続される表示装置２５と、それらを接続するバス２６とを有する。
【０１１４】
メインメモリ１２にはロック変数が記憶されている。したがって、メインメモリ１２はロック変数記憶装置に対応する。ディスクストレージ２１は、オペレーションシステムOSと、アプリケーションプログラムAPL_PRを有する。これらは、メインメモリ１２内に展開されCPUにより実行される。
【０１１５】
OSは、排他制御プログラムEX_PRを有する。また、アプリケーションプログラムAPL_PRは、複数のプロセスに分割されて、同じCPUまたは異なるCPUにより並列に実行される。また、各CPUが複数のCPUコアを有する場合は、同じCPUまたは異なるCPU内の同じCPUコアまたは異なるCPUコアが、複数のプロセスを並列に実行する。
【０１１６】
情報処理装置１内のメインメモリ１２やディスクストレージ２１内のデータ記憶領域が、本実施の形態での共有リソースに対応する。そして、複数のプロセスを並列に実行するCPUやCPUコアは、共有リソースへのアクセスを、排他制御プログラムを介して互いに排他的に実行する。
【０１１７】
図１８は、図１７の２つのCPUとディスクストレージの構成を示す図である。２つのCPU10_1, 10_2は、それぞれ２つずつのCPUコアCPU_CORE_0, CPU_CORE_1と、セカンダリキャッシュL2_CACHEを有する。そして、同じまたは異なるCPUコアが、アプリケーションプログラムAPL_PR内の複数のプロセスを並列に実行する。そして、複数のプロセスは、共有リソースにアクセスしてデータを書き換える場合、OSの排他制御プログラムをコールし、プロセスを実行するCPUコアがコールした排他制御プログラムを実行する。
【０１１８】
上記の場合、プロセス実行部と、排他制御装置は、CPU内のCPUコアに対応する。
【０１１９】
図１９は、本実施の形態における情報処理システムの構成を示す図である。図１９の情報処理システムは、２つの情報処理装置１がネットワークNWを介して接続されている。各情報処理装置１は、図１７，図１８に示した情報処理装置と同じである。
【０１２０】
この情報処理システムにおいて、例えば、一方の情報処理装置１内のメインメモリ１２の共有データを記憶する領域が、共有リソースに対応する。そして、２つの情報処理装置内のCPUまたはCPUコアが、複数のプロセスを並列に実行し、一方の情報処理装置内のメインメモリ１２内の共有リソースにアクセスする場合がある。あるいは、一方の情報処理装置内のCPUまたはCPUコアが、複数のプロセスを並列に実行し、他方の情報処理装置内のメインメモリ１２内の共有リソースにアクセスする場合がある。
【０１２１】
いずれの構成でも、複数のプロセスを実行するCPUやCPUコアがプロセス実行部に対応する。また、メインメモリ内の共有変数の領域が共有リソースに対応する。そして、プロセス実行部が共有リソースにアクセスしてデータを変更する場合、OS内の排他制御プログラムをコールして実行し、プロセス間の排他制御を行う。
【０１２２】
以上の通り、本実施の形態によれば、並列に実行される複数のプロセス間での共有リソースに対する排他制御を適切に行うことができる。
【０１２３】
以上の実施の形態をまとめると，次の付記のとおりである。
【０１２４】
（付記１）
それぞれのプロセスを実行する複数のプロセス実行部と、
前記複数のプロセス実行部によりアクセスされる共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置と、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得処理と、前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得処理とを実行する排他制御装置とを有する情報処理装置。
【０１２５】
（付記２）
前記排他制御装置は、前記第１のロック取得処理において、
所望のタイミングで前記ロック変数を読み出して旧値に設定し、
前記旧値のロック状態フラグがロック解放状態の場合に、前記ロック状態フラグをロック取得状態とし前記ロック識別情報を前記新たに更新されたロック識別情報とするロック変数を新値に設定し、前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する付記１に記載の情報処理装置。
【０１２６】
（付記３）
前記排他制御装置は、前記第２のロック取得処理において、
第１のタイミングで、前記ロック変数記憶装置から読み出した前記ロック変数のロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過したか否かのタイムアウト判定を開始し、
前記第１のタイミング後の第２のタイミングで、前記ロック変数記憶装置から読み出した前記ロック変数のロック識別情報が前記第１のタイミングで読み出したロック識別情報と同じで且つ前記タイムアウト時間が経過している場合に、前記ロック変数の前記ロック識別情報を前記新たに更新されたロック識別情報に更新する付記１または２に記載の情報処理装置。
【０１２７】
（付記４）
前記第２のロック取得処理における前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新させる処理では、
前記第２のタイミングで読み出した前記ロック変数を旧値に設定し、前記ロック状態フラグをロック取得状態とし前記ロック識別情報を前記新たに更新されたロック識別情報とするロック変数を新値に設定し、前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する付記３に記載の情報処理装置。
【０１２８】
（付記５）
前記排他制御装置は、
前記ロック変数記憶装置から前記ロック変数を読み出し、前記読み出したロック変数が前記ロックを取得した時に更新したロック変数と一致する場合、前記ロック変数記憶装置のロック変数のロック状態フラグをロック解放状態に更新するロック解放処理を実行する付記１乃至４のいずれかに記載の情報処理装置。
【０１２９】
（付記６）
前記排他制御装置は、
前記ロック解放処理において、
前記ロック変数記憶装置から読み出した前記ロック変数を旧値に設定し、前記ロック状態フラグが前記ロック解放状態であるロック変数を新値に設定し、前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する付記５に記載の情報処理装置。
【０１３０】
（付記７）
それぞれのプロセスを実行する複数のプロセス実行部と、
前記複数のプロセス実行部によりアクセスされる共有リソースと、
前記共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置と、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得処理と、前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得処理とを実行する排他制御装置とを有する情報処理システム。
【０１３１】
（付記８）
それぞれのプロセスを実行する複数のプロセス実行部によりアクセスされる共有リソースに対するロックについて、ロック取得状態とロック解放状態とを示すロック状態フラグと、前記ロックが取得されるたびに更新されるロック識別情報とを有するロック変数を格納するロック変数記憶装置にアクセスすること、
前記ロック状態フラグがロック解放状態の場合に、前記ロック変数記憶装置の前記ロック変数の前記ロック状態フラグをロック取得状態に、前記ロック識別情報を新たに更新されたロック識別情報に、それぞれ更新して前記プロセス実行部に前記ロックを取得させる第１のロック取得を行うこと、
前記ロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過した後に、前記ロック変数記憶装置の前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新して前記プロセス実行部に前記ロックを取得させる第２のロック取得を行うことと
を有する排他制御処理をコンピュータに実行させるコンピュータ読み取り可能な排他制御プログラム。
【０１３２】
（付記９）
前記第１のロック取得を行うことにおいて、
所望のタイミングで前記ロック変数を読み出して旧値に設定し、
前記旧値のロック状態フラグがロック解放状態の場合に、前記ロック状態フラグをロック取得状態とし前記ロック識別情報を前記新たに更新されたロック識別情報とするロック変数を新値に設定し、
前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する付記８に記載の排他制御プログラム。
【０１３３】
（付記１０）
前記第２のロック取得を行うことにおいて、
第１のタイミングで、前記ロック変数記憶装置から読み出した前記ロック変数のロック状態フラグがロック取得状態の場合に、前記ロック変数記憶装置のロック変数が同じロック識別情報を維持している間に所定のタイムアウト時間が経過したか否かのタイムアウト判定を開始し、
前記第１のタイミング後の第２のタイミングで、前記ロック変数記憶装置から読み出した前記ロック変数のロック識別情報が前記第１のタイミングで読み出したロック識別情報と同じで且つ前記タイムアウト時間が経過している場合に、前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新する付記８または９に記載の排他制御プログラム。
【０１３４】
（付記１１）
前記第２のロック取得を行うことにおける前記ロック変数の前記ロック識別情報を新たに更新されたロック識別情報に更新させる処理は、
前記第２のタイミングで読み出した前記ロック変数を旧値に設定し、前記ロック状態フラグをロック取得状態とし前記ロック識別情報を前記新たに更新されたロック識別情報とするロック変数を新値に設定し、前記旧値と前記ロック変数記憶装置のロック変数とが一致することを条件に前記ロック変数記憶装置のロック変数を前記新値にスワップする比較及びスワップ処理をアトミック命令で実行する処理を有する付記１０に記載の排他制御プログラム。
【０１３５】
（付記１２）
前記処理は、さらに、
前記ロック変数記憶装置から前記ロック変数を読み出し、前記読み出したロック変数が前記ロックを取得した時に更新したロック変数と一致する場合、前記ロック変数記憶装置のロック変数のロック状態フラグをロック解放状態に更新するロック解放を行うことを有する付記８乃至１１のいずれかに記載の排他制御プログラム。
【符号の説明】
【０１３６】
PR_1：第１プロセス
PR_2：第２プロセス
PE_1：第１プロセス実行部（第１の動作主体）
PE_2：第２プロセス実行部（第２の動作主体）
EX_1、EX_2：排他制御装置
COM_RES：共有リソース
LOCK_MEM：ロック変数記憶装置
LOCK_VAL：ロック変数
LOCK_FLG：ロック状態フラグ（LOCK_FLG=1：ロック取得状態、LOCK_FLG=0：ロック解放状態）
LOCK_ID：ロック識別情報、タイムスタンプ、更新情報
IN_VAL：内部変数
OLD_V：旧値
NEW_V：新値
S_TIME：判定開始時刻、タイムアウトの判定開始時刻
S_LOCK：判定開始時ロック変数、タイムアウト判定開始時のロック変数
AQ_LOCK：ロック取得時ロック変数、ロック取得時に新値にスワップされたロック変数
OS：オペレーションシステム
EX_PR：排他制御プログラム
APL_PR：アプリケーションプログラム
【図１】
2016157399.tif 000003
【図２】
2016157399.tif 000004
【図３】
2016157399.tif 000005
【図４】
2016157399.tif 000006
【図５】
2016157399.tif 000007
【図６】
2016157399.tif 000008
【図７】
2016157399.tif 000009
【図８】
2016157399.tif 000010
【図９】
2016157399.tif 000011
【図１０】
2016157399.tif 000012
【図１１】
2016157399.tif 000013
【図１２】
2016157399.tif 000014
【図１３】
2016157399.tif 000015
【図１４】
2016157399.tif 000016
【図１５】
2016157399.tif 000017
【図１６】
2016157399.tif 000018
【図１７】
2016157399.tif 000019
【図１８】
2016157399.tif 000020
【図１９】
2016157399.tif 000021