(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0014】
[第1の実施形態]
本発明の第1の実施形態を
図1乃至
図53を参照して説明する。
図1は、情報処理装置1の構成の一例を示すブロック図である。
図2は、占有情報スタック領域40の一例を示す図である。
図3は、プロセス情報格納領域50の一例を示す図である。
図4は、ロック情報格納領域60の一例を示す図である。
図5は、資源情報部61の一例を示す図である。
図6は、循環情報部62の一例を示す図である。
図7は、スタック情報蓄積部63の一例を示す図である。
図8は、ロック循環チェック手段220が利用する作業用テーブルの一覧の一例を示す図である。
図9は、作業用資源登録部220Aの一例を示す図である。
図10は、作業用内側ロックリスト220Bと作業用外側ロックリスト220Cとの一例を示す図である。
図11は、作業用循環情報登録表220Dの一例を示す図である。
図12は、作業用追加循環リスト登録部220Eと作業用追加循環リスト220Fとの一例を示す図である。
図13は、作業用循環チェックリスト220Gの一例を示す図である。
図14は、デッドロック検証手段230が利用する作業用テーブルの一覧の一例を示す図である。
図15は、作業用追加スタック対応表230Aの一例を示す図である。
図16は、作業用占有資源チェックリスト230Bの一例を示す図である。
図17は、作業用プロセス番号チェックリスト230Cの一例を示す図である。
図18は、作業用プロセス排他番号チェックリスト230Dの一例を示す図である。
図19は、開始手段110の動作の一例を示すフローチャートである。
図20は、占有資源取得手段120の動作の一例を示すフローチャートである。
図21は、占有資源解放手段130の動作の一例を示すフローチャートである。
図22は、プロセス起動手段140の動作の一例を示すフローチャートである。
図23は、プロセス終了待合せ手段150の動作の一例を示すフローチャートである。
図24は、プロセスの動作の一例を示す図である。
図25は、
図24で示すプロセスの動作時のプロセス情報格納領域50の遷移の一例を示す図である。
図26は、ロック循環チェック手段220の動作の一例を示すフローチャートである。
図27は、
図26で示すステップS0501の動作の詳細な一例を示すフローチャートである。
図28、
図29は、
図26で示すステップS0502の動作の詳細な一例を示すフローチャートである。
図30は、
図26で示すステップS0503の動作の詳細な一例を示すフローチャートである。
図31乃至
図33は、循環チェックルーチンを行う際の動作の一例を示すフローチャートである。
図34は、デッドロック検証手段230の動作の一例を示すフローチャートである。
図35、
図36は、
図34で示すステップS1001の動作の詳細な一例を示すフローチャートである。
図37は、
図34で示すステップS1002の動作の詳細な一例を示すフローチャートである。
図38、
図39は、資源チェックルーチンを行う際の動作の一例を示すフローチャートである。
図40、
図41は、ロック情報登録手段240の動作の一例を示すフローチャートである。
図42は、占有情報スタック領域40に格納される情報の一例を示す図である。
図43は、プロセス情報格納領域50に格納される情報の一例を示す図である。
図44は、
図4で示す資源情報部61に格納される情報の一例を示す図である。
図45は、循環登録部62に格納される情報の一例を示す図である。
図46は、スタック情報蓄積部63に格納される情報の一例を示す図である。
図47乃至
図53は、情報処理装置1の動作の一例を説明するための図である。
【0015】
本発明の第1の実施形態では、デッドロックを引き起こす可能性のある資源の組み合わせをチェックし、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが発生するか否かを検証する情報処理装置について説明する。後述するように、情報処理装置は、局所的にロック取得順序が循環(または逆転)するデッドロックを引き起こす可能性のある占有資源30(資源)の組み合わせを検出すると、スタック情報44やプロセス情報格納領域50、ロック情報格納領域60を参照して大域的にデッドロックが発生するか否かを検証する。
【0016】
図1を参照すると、本実施形態における情報処理装置1は、処理プロセス10(処理手段)と、監視プロセス20(監視手段)と、占有資源30と、占有情報スタック領域40と、スタック情報44(占有資源情報)と、プロセス情報格納領域50(プロセス関係情報)と、ロック情報格納領域60(蓄積情報)と、を有している。
【0017】
情報処理装置1は、図示しない演算装置と記憶装置とを有しており、記憶装置が有するプログラムを演算装置が実行することで、処理プロセス10や処理プロセス10が有する各手段、監視プロセス20や監視プロセス20が有する各手段を実現する。また、占有資源30は、ディスクやファイルなどであり、占有資源30へのアクセスは例えばセマフォで管理されている。また、占有情報スタック領域40と、スタック情報44と、プロセス情報格納領域50と、ロック情報格納領域60と、は、情報処理装置1が有するメモリなどの記憶装置に格納されている。
【0018】
占有情報スタック領域40は、後述する開始手段110によりプロセスごとに用意される。
図2を参照すると、占有情報スタック領域40は、ヘッダ情報41とスタック情報部42と送信履歴情報部43とを有している。
【0019】
ヘッダ情報41は、履歴情報先頭ポインタと送信フラグから構成されている。履歴情報先頭ポインタには、送信履歴情報部43の先頭エントリへのポインタが格納されている。送信フラグは、監視プロセス20へのスタック情報44の送信要否を表している。後述するように、送信フラグは、プロセスが取得して占有する占有資源の数が2以上である場合に、オンに設定されることになる。
【0020】
スタック情報部42は、占有資源確保数とプロセス番号と占有資源種別と占有資源識別子とから構成されている。占有資源確保数は、プロセスが取得して占有する占有資源30の数を示している。プロセス番号は、プロセスを識別するための番号である。占有資源種別は、占有資源30の種別を示しており、例えば、占有資源30がセマフォで管理されるか、装置毎に管理されるかを示している。また、占有資源識別子は、占有資源30を識別するための情報である。
【0021】
送信履歴情報部43には、監視プロセス20へ送信したスタック情報44が格納されている。
【0022】
図42は、占有情報スタック領域40に格納される情報の一例を示している。
図42を参照すると、プロセスは3つの占有資源30を取得して占有しており、プロセスのプロセス番号は25であることが分かる。また、スタック情報部42は、エントリ1、エントリ2、エントリ3の順番で占有資源30を確保したことを示している。つまり、
図42によると、占有資源種別「02」、占有資源識別子「00230058」の占有資源30を確保した後、占有資源種別「01」、占有資源識別子「0DE00348」の占有資源30を確保していることが分かる。また、占有資源種別「01」、占有資源識別子「0DE00348」の占有資源30を確保した後、占有資源種別「01」、占有資源識別子「0DE0035ZC」の占有資源30を確保していることが分かる。また、
図42の場合、送信フラグがオンに設定されている。また、情報履歴送信部43は、エントリ1とエントリ2の送信スタック情報を監視プロセス20へ送信したことを表している。なお、本実施形態においては、送信履歴情報部43の各エントリをリンクして繋げているが、ハッシュテーブルで管理しても構わない。
【0023】
図1で示すスタック情報44は、処理プロセス10が監視プロセス20へ送信したスタック情報である。処理プロセス10が監視プロセス20へ送信したスタック情報は、監視プロセス20が受信するまでスタック情報44でキューイングされる。スタック情報44の形式は、
図2で示すスタック情報部42の形式と同一である。
【0024】
プロセス情報格納領域50は、後述するプロセス起動手段140によりプロセスごとに用意される。
図3を参照すると、プロセス情報格納領域50は、終了待合せ情報部51とプロセス排他情報部52(プロセス排他情報)とを有している。
【0025】
終了待合せ情報部51には、終了を待ち合わせたプロセスのプロセス番号が格納されている。また、プロセス排他情報部52には、他プロセスと並列に動作しないことを示す番号が格納されている。
【0026】
図43は、プロセス情報格納領域50に格納される情報の一例を示している。例えば、
図43のうちのプロセス情報格納領域50−1は、プロセス番号25に用意されるプロセス情報格納領域の一例であり、プロセス情報格納領域50−2は、プロセス番号26に用意されるプロセス情報格納領域の一例である。
図43を参照すると、プロセス情報格納領域50−1のプロセス排他情報部52−1とプロセス情報格納領域50−2のプロセス排他情報部52−2とには同一の排他番号「1026151131030」が格納されている。このことから、プロセス番号25のプロセスとプロセス番号26のプロセスとが並列に動作しないことが分かる。
【0027】
図4を参照すると、ロック情報格納領域60は、資源情報部61と循環情報部62とスタック情報蓄積部63とを有している。
【0028】
資源情報部61は、資源登録部61Aと内側ロックリスト部61Bと外側ロックリスト部61Cと循環情報対応表61Dとから構成されている。
【0029】
図5を参照すると、資源登録部61Aは、ヘッダに登録資源数が格納されている。また、資源登録部61Aの各エントリには、占有資源種別と占有資源識別子と内側出現カウンタと内側ロック数と内側ロックリストポインタと外側ロック数と外側ロックリストポインタが格納されている。資源登録部61Aにおいては、占有資源30ごとにエントリが用意される。エントリのキーは、占有資源種別と占有資源識別子の組合せである。
【0030】
内側出現カウンタ(回数情報)は、当該エントリの占有資源30が、スタック情報44の最終エントリの資源であった回数が格納される。つまり、内側出現カウンタは、プロセスが占有資源30を占有してから解放するまでの間で最後に占有した占有資源30の占有回数を示している。
【0031】
エントリに対応する占有資源30を取得した状態でさらに取得される他の資源を示す占有資源種別と占有資源識別子が、内側ロックリスト部61Bに格納される。内側ロック数には、当該エントリに対応する占有資源30を取得した状態でさらに取得される他の占有資源30の数が格納される。また、内側ロックリストポインタには、内側ロックリスト部61Bの対応する内側ロックリストへのアドレスが格納される。
【0032】
また、エントリに対応する占有資源30の取得前に既に取得していた他の資源を示す占有資源種別と占有資源識別子が、外側ロックリスト部61Cに格納される。外側ロック数には、当該エントリに対応する占有資源30の取得前に既に取得していた他の占有資源30の数が格納される。また、外側ロックリストポインタには、外側ロックリスト部61Cの対応する外側ロックリストへのアドレスが格納される。
【0033】
内側ロックリスト部61Bには、占有資源種別と占有資源識別子と循環フラグと循環情報対応表ポインタが格納される。循環フラグは、内側ロックリストが対応する占有資源30の取得順序が循環(または逆転)しているか否かを表している。また、占有資源30の取得順序が循環(逆転)している場合、循環情報部62へのリンクが循環情報対応表61Dに格納され、内側ロックリスト部61Bの循環情報対応表ポインタに、対応する循環情報対応表61Dへのアドレスが格納される。
【0034】
外側ロックリスト部61Cには、占有資源種別と占有資源識別子と循環フラグと循環情報対応表ポインタが格納される。循環フラグは、外側ロックリストが対応する占有資源30の取得順序が循環(または逆転)しているか否かを表している。また、占有資源30の取得順序が循環(逆転)している場合、循環情報部62へのリンクが循環情報対応表61Dに格納され、外側ロックリスト部61Cの循環情報対応表ポインタに、対応する循環情報対応表61Dへのアドレスが格納される。
【0035】
循環情報対応表61Dは、循環(逆転)している資源の取得順序ごとに用意される。循環情報対応表61Dには、循環情報部62へのリンク情報が格納されている。例えば、循環情報対応表61Dは、パターン数とパターン番号とエントリ番号とを有している。循環情報対応表61Dが有するパターン番号は、後述する循環登録部62Aのパターンに対応した値を示している。また、循環情報対応表61Dが有するエントリ番号は、後述する循環リスト62Bのエントリに対応した値を示している。
【0036】
図44は、資源情報部61に格納される情報の一例を示している。
図44では、資源登録部61Aのエントリ2とエントリ3に対応する内側ロックリストと外側ロックリストの両方に、お互いの占有資源種別と占有資源識別子とが格納されている。このような状況は、例えば、資源登録部61Aのエントリ2とエントリ3の取得順序が逆転している場合に生じることになる。
【0037】
なお、内側ロックリスト部61Bのうちの内側ロックリスト2のエントリ1は、占有資源識別子「0DE00348」の後に占有資源識別子「0DE00A14」を取得したことを示している。また、外側ロックリスト部61Cのうちの外側ロックリスト3のエントリ2は、占有資源識別子「0DE00A14」の取得前に占有資源識別子「0DE00348」を取得していることを示している。このように、内側ロックリスト2のエントリ1と外側ロックリスト3のエントリ2は、同じ取得順序を意味している。そのため、内側ロックリスト2のエントリ1と外側ロックリスト3のエントリ2には、同一の循環情報対応表のアドレスが格納されることになる。同様に、内側ロックリスト3のエントリ1および外側ロックリスト2のエントリ2も、同一の循環情報対応表のアドレスが格納される。なお、本実施形態においては、資源登録部61Aなどのエントリの順番は、スタック情報44(占有資源種別と占有資源識別子)を受信した順番で決まることになる。しかしながら、資源登録部61Aなどのエントリの順番は、占有資源種別と占有資源識別子のハッシュ値をキーにした順番であっても構わない。
【0038】
循環情報部62は、循環登録部62Aと循環リスト62Bとスタック対応表62Cとから構成されている。
【0039】
図6を参照すると、循環登録部62Aは、ヘッダに取得順序が循環(または逆転)しているパターン数が格納されている。また、循環登録部62Aの各エントリ(パターン)には、循環(または逆転)している占有資源30の数と、循環リスト62Bへのアドレスである循環リストへのポインタが格納されている。なお、循環情報対応表61Dのパターン番号は、循環登録部62Aのパターンに対応した値を示している。
【0040】
循環リスト62Bには、循環(または逆転)している資源を示す占有資源種別と占有資源識別子と、スタック対応表62Cのアドレスが格納されている。なお、循環情報対応表61Dのエントリ番号は、循環リスト62Bのエントリに対応した値を示している。
【0041】
スタック対応表62Cは、循環している資源の取得順序毎に用意される。スタック対応表62Cには、スタック情報蓄積部63へのリンク情報が格納されている。例えば、スタック対応表62Cのスタック対応表は、パターン数とスタック番号とエントリ番号とを有している。スタック対応表が有するスタック番号は、後述するスタック登録部63Aのエントリ(スタック)に対応する値(スタック部63Bのスタック情報の番号に対応する値)を示している。また、スタック対応表が有するエントリ番号は、後述するスタック部63Bのうちのスタック番号が示すスタック情報のエントリに対応する値を示している。
【0042】
図45は、循環情報部62に格納される情報の一例を示している。
図45を参照すると、循環リスト62Bの循環リスト1は、エントリ1とエントリ2の占有資源30取得順序が逆転していることを示している。スタック対応表62Cのスタック対応表1には、エントリ1の占有資源30(「0DE00A14」)を取得したまま、エントリ2の占有資源30(「0DE00348」)を取得しているスタック情報へのリンクが格納されている。また、スタック対応表2には、エントリ2の占有資源30を取得したまま、エントリ1の占有資源30を取得しているスタック情報へのリンクが格納されている。
【0043】
また、循環リスト62Bの循環リスト2は、エントリ1とエントリ2とエントリ3の占有資源30取得順序が循環していることを示している。スタック対応表62Cのスタック対応表3は、エントリ1の占有資源30(「0DDF051C」)を取得したまま、エントリ2の占有資源30(「0DDF0538」)を取得しているスタック情報へのリンクが格納されている。また、エントリ2の資源を取得したまま、エントリ3の資源を取得しているスタック情報へのリンクが、スタック対応表4に格納され、エントリ3の資源を取得したまま、エントリ1の資源を取得しているスタック情報へのリンクが、スタック対応表5に格納されることになる。なお、循環リスト62Bのうちの、循環リスト2のエントリ1と循環リスト3のエントリ2は、同じ取得順序を表すため、いずれもスタック対応表3のアドレスが格納されている。
【0044】
スタック情報蓄積部63は、スタック登録部63Aとスタック部63B(資源順序情報)とから構成されている。
【0045】
図7を参照すると、スタック登録部63Aは、ヘッダに蓄積しているスタック情報の数が格納されている。また、スタック登録部63Aの各エントリ(スタック)には、スタック部63Bのアドレスが格納されている。なお、スタック対応表62Cのスタック番号は、スタック登録部63Aのエントリ(スタック)に対応する値を示している。
【0046】
スタック部63Bには、スタック情報が格納されている。スタック部63Bに格納されるスタック情報の形式は、
図2で示すスタック情報部42の形式と同一である。なお、スタック対応表62Cのエントリ番号は、後述するスタック部63Bのうちのスタック番号が示すスタック情報のエントリに対応する値を示している。
【0047】
図46は、スタック情報蓄積部63に格納される情報の一例を示している。
図46を参照すると、スタック登録部63Aには3つのアドレスが格納されており、それぞれのエントリ(スタック)には、対応するエントリへのアドレスが格納されている。
【0048】
処理プロセス10は、必要に応じてプロセスが使用する占有資源30を占有して、当該プロセスを実行する。
図1を参照すると、処理プロセス10は、開始手段110と、占有資源取得手段120と、占有資源解放手段130と、プロセス起動手段140と、プロセス終了待合せ手段150と、終了手段160と、を有している。
【0049】
開始手段110は、自プロセスの占有情報スタック領域40を確保する。そして、開始手段10は、自プロセスのプロセス番号を占有情報スタック領域40のスタック情報部42にセットする。
【0050】
占有資源取得手段120は、自プロセスからの要求に応じて、必要な占有資源30を取得する。そして、占有資源取得手段120は、取得した占有資源30を識別するための占有資源種別、占有資源識別子をスタック情報部42に登録する。また、占有資源取得手段120は、プロセスが2個以上の占有資源30を確保している場合、ヘッダ情報部41の送信フラグをオンに設定する。
【0051】
占有資源解放手段130は、自プロセスからの要求に応じて、占有資源30を解放する。そして、占有資源解放手段130は、ヘッダ情報部41の送信フラグがオン、かつ、スタック情報部42に登録されている情報が送信履歴情報部43に登録されている情報と一致しない場合に、スタック情報部42の内容を監視プロセス20に送信する。また、占有資源解放手段130は、送信したスタック情報部42の内容を送信履歴情報部43に追加する。そして、占有資源解放手段130は、ヘッダ情報部41の送信フラグをオフにし、スタック情報部42から解放した占有資源識別子を削除する。一方、ヘッダ情報部41の送信フラグがオフの場合や、スタック情報部42に登録されている情報が送信履歴情報部43に登録されている情報と一致する場合、占有資源解放手段130は、スタック情報部42の送信を行わない。
【0052】
プロセス起動手段140は、自プロセスからの要求に応じて、新たに起動するプロセスのプロセス情報格納領域50を確保する。次に、プロセス起動手段140は、自プロセスの終了待合せ情報部51を、新たに起動するプロセスの終了待合せ情報部51にコピーする。また、プロセス起動手段140は、必要に応じて、自プロセスの終了待合せ情報部51に格納されているプロセス、及び、新たに起動するプロセスのプロセス排他情報部52に、同一の排他番号を登録する。その後、プロセス起動手段140は、当該新たに起動するプロセスを起動する。
【0053】
プロセス終了待合せ手段150は、プロセスの終了を待ち合わせる。そして、プロセス終了待合せ手段150は、自プロセスの終了待合せ情報部51に、終了を待ち合わせたプロセスのプロセス番号を登録する。また、プロセス終了待合せ手段150は、終了を待ち合わせたプロセスの終了待合せ情報部51に格納されているプロセス番号のうち、自プロセスの終了待合せ情報部51に登録されていないプロセス番号が存在する場合、当該プロセス番号を自プロセスの終了待合せ情報部51に追加する。
【0054】
終了手段160は、プロセスの終了時に、自プロセスの占有情報スタック領域40を解放する。
【0055】
監視プロセス20は、複数のプロセス実行時に、プロセス同士の使用する占有資源30が競合することによりデッドロックが発生するか否かを監視する。
図1を参照すると、監視プロセス20は、占有情報受信手段210と、ロック循環チェック手段220(検出手段)と、デッドロック検証手段230(検証手段)と、ロック情報登録手段240と、を有している。
【0056】
占有情報受信手段210は、占有資源解放手段130から送信されたスタック情報44を受信する。つまり、占有情報受信手段210は、スタック情報44をキューから取り出す。
【0057】
ロック循環チェック手段220は、スタック情報44(占有資源情報)などに基づいて、デッドロックを引き起こす可能性のある占有資源30の組み合わせである、占有資源取得順序の循環または逆転を検出する。具体的には、ロック循環チェック手段220は、占有情報受信手段210が受信したスタック情報44を参照し、2つの占有資源の取得順序の全組合せを抽出する。そして、ロック循環チェック手段220は、ロック情報格納領域60に格納されている情報に従って、占有資源取得順序が循環または逆転しているか否かをチェックする。また、ロック循環チェック手段220は、内側出現カウンタに基づいて設定される内側フラグに基づいて、上記チェックを行う。例えば、ロック循環チェック手段220は、内側フラグに基づいて、対象となる資源よりも前に取得している占有資源30をチェックして取得順序の循環・逆転をチェックするか、対象となる資源よりも後に取得する占有資源30をチェックして取得順序の循環・逆転をチェックするか、を決定する。そして、ロック循環チェック手段220は、占有資源30の取得順序が循環または逆転していると判断した場合に、デッドロック検証手段230を呼び出す。
【0058】
本実施形態におけるロック循環チェック手段220は、占有資源取得順序が循環または逆転しているか否かをチェックする際に、所定の作業用テーブルを用いてチェックを行う。
図8を参照すると、ロック循環チェック手段220は、作業用テーブルとして、作業用資源登録部220Aと作業用内側ロックリスト220Bと作業用外側ロックリスト220Cと作業用循環情報登録表220Dと作業用追加循環リスト登録部220Eと作業用追加循環リスト220Fと作業用循環チェックリスト220Gとを用いる。
【0059】
作業用資源登録部220A、作業用内側ロックリスト220B、及び、作業用外側ロックリスト220Cには、占有情報受信手段210が受信したスタック情報44に登録されている資源の更新情報を格納する。
【0060】
図9を参照すると、作業用資源登録部220Aの形式は、
図5で示す資源登録部61Aのエントリに、内側更新フラグおよび外側更新フラグを追加した形式である。また、
図10を参照すると、作業用内側ロックリスト220B、及び、作業用外側ロックリスト220Cの形式は、
図5で示す内側ロックリスト部61B、及び、外側ロックリスト部61Cの形式と同じ形式である。
【0061】
占有情報受信手段210が受信したスタック情報44により内側ロック、外側ロック(いずれか一方、又は、両方)の追加が必要な場合、ロック循環チェック手段220は、作業用内側ロックリスト220B、作業用外側ロックリスト220Cに新たな情報を追加することになる。そして、ロック循環チェック手段220は、新たに情報を追加した場合、新たに情報を追加したフラグ(内側更新フラグ、外側更新フラグ)をオンに設定する。なお、この場合、作業用資源登録部220Aに含まれる内側ロックリストポインタや外側ロックリストポインタは、作業用内側ロックリスト220Bや作業用外側ロックリスト220Cのアドレスに切り替わることになる。
【0062】
図11を参照すると、作業用循環情報登録票220Dは、エントリ数と循環情報対応表ポインタとを有している。エントリ数は、循環情報対応表ポインタの数を示している。また、循環情報対応表ポインタは、対応する循環情報対応表61Dへのアドレスを示している。占有情報受信手段210が受信したスタック情報44の資源取得順序が既に循環(または逆転)していることがわかっている場合(すなわち、循環フラグがオンの場合)に、循環情報対応表ポインタが格納されることになる。
【0063】
図12を参照すると、作業用追加循環リスト登録部220E、及び、作業用追加循環リスト220Fは、受信したスタック情報44の資源取得順序について、新たに循環(または逆転)を検出した場合の循環情報を示している。作業用追加循環リスト登録部220Eと作業用追加循環リスト220Fのテーブルの形式は、
図6で示す循環登録部62Aと循環リスト62Bの形式と同じである。
【0064】
作業用循環チェックリスト220Gは、循環(または逆転)しているかチェックするためのテーブルである。
図13を参照すると、作業用循環チェックリスト220Gは、内側フラグとエントリ数とを有するヘッダと、占有資源種別と占有資源識別子とスタック対応表ポインタとを有する各エントリと、を有している。
【0065】
内側フラグは、内側の資源をチェックして占有資源30の取得順序が循環(または逆転)しているか否かを判断するか、または、外側の資源をチェックして占有資源30の取得順序が循環(または逆転)しているか否かを判断する際に用いられる。ここで、内側の資源とは、対象となる占有資源30を取得した状態でさらに取得される他の占有資源30のことをいう。また、外側の資源とは、対象となる占有資源30の取得前に既に取得していた他の占有資源30のことをいう。
【0066】
内側フラグは、作業用資源登録部220Aの内側出現カウンタ(回数情報)の値に基づいて、オフにするかオンにするかが決定される。内側フラグは、例えば、下記数式の結果が固定値よりも大きい場合にオンにセットされ、下記数式の結果が固定値以下である場合に、オフにセットされる。
[数式]
(作業用資源登録部220Aのn番目のエントリの内側出現カウンタ)×100÷変数z
なお、nは、例えば、1以上スタック情報44の占有資源確保数以下の任意の値である。また、変数zは、スタック登録部63Aの登録パターン数に1加算した値である。また、上記数式と比較される固定値は、任意の設定値で構わないが、例えば、50とすることが考えられる(それ以外の値でも構わない)。
【0067】
なお、作業用資源登録部220A、作業用内側ロックリスト220B、作業用外側ロックリスト220C、作業用追加循環リスト登録部220E、作業用追加循環リスト220Fは、大域的にもデッドロックが発生する場合に、スタック情報44をロック情報格納領域60に蓄積・登録しないようにするために用いられる。
【0068】
デッドロック検証手段230は、ロック循環チェック手段220から、循環または逆転している旨の情報を受信する。すると、デッドロック検証手段230は、スタック情報44(占有資源情報)やロック情報格納領域60(蓄積情報)に含まれているスタック情報(資源順序情報)、プロセス排他情報部52(プロセス排他情報)などを参照し、デッドロックが発生するか否かを検証する。
【0069】
本実施形態におけるデッドロック検証手段230は、デッドロックが発生するか否かを検証する際に、所定の作業用テーブルを用いてチェックを行う。
図14を参照すると、デッドロック検証手段230は、作業用テーブルとして、作業用追加スタック対応表230Aと作業用占有資源チェックリスト230Bと作業用プロセス番号チェックリスト230Cと作業用プロセス排他番号チェックリスト230Dとを用いる。
【0070】
図15を参照すると、作業用追加スタック対応表230Aには、ロック循環チェック手段220で、資源の取得順序に新たな循環(または逆転)を検出した場合に、スタック情報蓄積部63の該当するスタック情報へのリンクが格納される。作業用追加スタック対応表230Aのテーブルの形式は、
図6で示すスタック対応表62Cの形式と同じである。
【0071】
図16を参照すると、作業用占有資源チェックリスト230Bは、ヘッダにエントリ数を有し、各エントリに占有資源種別と占有資源識別子とを有している。また、
図17を参照すると、作業用プロセス番号チェックリスト230Cは、ヘッダにエントリ数を有し、各エントリにプロセス番号を有している。また、
図18を参照すると、作業用プロセス排他番号チェックリスト230Dは、ヘッダにエントリ数を有し、各エントリに排他番号を有している。作業用占有資源チェックリスト230B、作業用プロセス番号チェックリスト230C、及び、作業用プロセス排他番号チェックリスト230Dは、大域的にデッドロックが発生するかをチェックするために、取得順序が循環(または逆転)する前に取得していた占有資源、プロセス番号、及び、排他番号を格納するテーブルである。
【0072】
デッドロック検証手段230は、作業用循環情報登録表220D、作業用追加循環リスト登録部220E、および、作業用追加循環リスト220Fに格納されている全循環(逆転)パターンについて、循環(逆転)する全てのスタック情報を組み合わせる。そして、デッドロック検証手段230は、組み合わせの結果に基づいて、大域的にはデッドロックが発生しないかを検証する。
【0073】
具体的には、デッドロック検証手段230は、例えば、各スタック情報の組み合わせについて、循環(逆転)する前に取得していた占有資源、プロセス番号、排他番号を、それぞれ作業用占有資源チェックリスト230B、作業用プロセス番号チェックリスト230C、および、作業用プロセス排他番号チェックリスト230Dに格納する。そして、デッドロック検証手段230は、循環(逆転)する前に取得していた占有資源、プロセス番号、排他番号に、同一占有資源、同一プロセス番号、同一排他番号が一つでもあれば、大域的にはデッドロックが発生しないと判断する。
【0074】
なお、本実施形態における動作例では、作業用のチェックリストに全て格納した後で同一資源・同一番号があるかを確認する方法ではなく、作業用のチェックリストに一つ一つ格納していく際に、既に同一資源・同一番号が格納されているかをチェックする。そして、同一資源・同一番号が格納されていれば、当該各スタックの組み合わせではデッドロックは発生しないものと判断する。このような動作例について説明する。しかしながら、デッドロック検証手段230は、作業用のチェックリストに全て格納した後で同一資源・同一番号があるかを確認するよう構成しても構わない。
【0075】
ロック情報登録手段240は、占有情報受信手段210で受信したスタック情報44をスタック情報蓄積部63に蓄積すると共に、資源情報部61と循環情報部62を更新する。
【0076】
以上が、情報処理装置1の構成の一例についての説明である。次に、情報処理装置1の動作の一例について説明する。まずは、
図19を参照して、開始手段110の動作の一例について説明する。
【0077】
図19を参照すると、開始手段110は、処理プロセス10の開始時、自プロセスの占有情報スタック領域40を確保する(ステップS0001)。続いて、開始手段110は、確保した自プロセスの占有情報スタック領域40を初期化(0クリア)する(ステップS0002)。その後、開始手段110は、スタック情報部42のプロセス番号格納領域に自プロセス番号をセットする。そして、開始手段110は、処理を終了する。
【0078】
続いて、
図20を参照して、占有資源取得手段120の動作の一例について説明する。
【0079】
図20を参照すると、占有資源取得手段120は、自プロセスからの要求に応じて、要求された占有資源30を取得する(ステップS0101)。なお、要求された占有資源を他プロセスが使用中の場合は、解放されるまで待ち合わせることになる。
【0080】
続いて、占有資源取得手段120は、自プロセスのスタック情報部42の占有資源確保数に1加算した数を、変数nにセットする(ステップS0102)。続いて、占有資源取得手段120は、自プロセスのスタック情報部42のn番目のエントリに、ステップS0101で取得した占有資源30を示す占有資源種別と占有資源識別子をセットする(ステップS0103)。また、占有資源取得手段120は、自プロセスのスタック情報部42の占有資源確保数に、変数nの値をセットする(ステップS0104)。
【0081】
占有資源取得手段120は、変数nが2以上であるか否かを確認する(ステップS0105)。変数nが2以上である場合(ステップS0105、Yes)、占有資源取得手段120は、ヘッダ情報部41の送信フラグをオンに設定する。その後、占有資源取得手段120は、処理を終了する。一方、変数nが2よりも小さい場合(ステップS0105、No)、占有資源取得手段120は、処理を終了する。
【0082】
続いて、
図21を参照して、占有資源解放手段130の動作の一例について説明する。
【0083】
図21を参照すると、占有資源解放手段130は、自プロセスからの要求に応じて、要求された占有資源30を解放する(ステップS0201)。
【0084】
続いて、占有資源解放手段130は、ヘッダ情報部41の送信フラグがオンに設定されているか否かを確認する(ステップS0202)。
【0085】
ヘッダ情報部41の送信フラグはオンに設定されていない場合(ステップS0202、No)、ステップS0211の処理に進む。一方、ヘッダ情報部41の送信フラグがオンに設定されている場合(ステップS0202、Yes)、占有資源解放手段130は、自プロセスのスタック情報部42と一致した内容のエントリが自プロセスの送信履歴情報部43に存在するか否かを確認する(ステップS0203)。
【0086】
自プロセスのスタック情報部42と一致した内容のエントリが自プロセスの送信履歴情報部43に存在する場合(ステップS0203、Yes)、占有資源解放手段130は、一致しているエントリが先頭エントリになるようにリンクをはりかえる(ステップS0204)。その後、ステップS0210の処理に進むことになる。一方、自プロセスのスタック情報部42と一致した内容のエントリが自プロセスの送信履歴情報部43に存在しない場合(ステップS0203、No)、占有資源解放手段130は、スタック情報部42の内容をスタック情報44として監視プロセス20に送信(キューイング)する(ステップS0205)。続いて、占有資源解放手段130は、送信履歴情報部43に空きエントリが存在するか否かを確認する(ステップS0206)。
【0087】
送信履歴情報部43に空きエントリが存在する場合(ステップS0206、Yes)、占有資源解放手段130は、送信履歴情報部43の空きエントリにスタック情報部42の内容をコピーする(ステップS0207)。一方、送信履歴情報部43に空きエントリが存在しない場合(ステップS0206、No)、占有資源解放手段130は、送信履歴情報部43の最終エントリにスタック情報部42の内容をコピーする(ステップS0208)。
【0088】
ステップS0207、又は、ステップS0208の処理の後、占有資源解放手段130は、スタック情報部42の内容をコピーしたエントリが先頭のエントリになるように、送信履歴情報部43に対するリンクをはりかえる(ステップS0209)。
【0089】
ステップS0204、又は、ステップS0209の処理の後、占有資源解放手段130は、ヘッダ情報部41の送信フラグをオフにする(ステップS0210)。そして、占有資源解放手段130は、解放した占有資源30のエントリを自プロセスのスタック情報部42から削除する(ステップS0211)。なお、エントリの途中に解放した占有資源が存在する場合には、占有資源解放手段130は、削除対象のエントリを削除した後、エントリを上につめる。その後、占有資源解放手段130は、自プロセスのスタック情報部42の占有資源確保数を1減算する(ステップS0212)。上記処理の後、占有資源解放手段130は、処理を終了する。
【0090】
続いて、
図22を参照して、プロセス起動手段140の動作の一例について説明する。
【0091】
プロセス起動手段140は、自プロセスからの要求に応じて、新たなプロセスを起動する処理を開始する。
図22を参照すると、プロセス起動手段140は、新たに起動するプロセスのプロセス番号を変数pにセットし、自プロセスのプロセス番号を変数cにセットする(ステップS0301)。
【0092】
プロセス起動手段140は、プロセス番号pに対応するプロセス情報格納領域50を確保する(ステップS0302)。
【0093】
続いて、プロセス起動手段140は、プロセス番号c(自プロセス)の終了待合せ情報部51の待合せプロセス数を変数mにセットする(ステップS0303)。そして、プロセス起動手段140は、変数mが1以上であるか否か確認する(ステップS0304)。
【0094】
変数mが1よりも小さい場合(ステップS304、No)、プロセス起動手段140は、プロセスpを起動する(ステップS0315)。その後、プロセス起動手段140は、処理を終了する。一方、変数mが1以上である場合(ステップS304、Yes)、プロセス起動手段140は、プロセス番号cの終了待合せ情報部51の内容を、プロセス番号pの終了待合せ情報部51へコピーする(ステップS0305)。そして、プロセス起動手段140は、プロセス番号pのプロセス排他情報部52の排他プロセス数に変数mをセットする(ステップS0306)。
【0095】
続いて、プロセス起動手段140は、変数aに1をセットする(ステップS0307)。また、プロセス起動手段140は、プロセス番号cの終了待合せ情報部51のa番目のエントリの待合せプロセス番号を変数qにセットする(ステップS0308)。また、プロセス起動手段140は、変数kに任意の他と重ならない排他番号(例えば、自プロセス番号と変数qと現在日時を並べた値)をセットする(ステップS0309)。また、プロセス起動手段140は、プロセス番号qのプロセス排他情報部52の排他プロセス数に1加算した値を変数nにセットする(ステップS0310)。
【0096】
そして、プロセス起動手段140は、プロセス番号pのプロセス排他情報部52のa番目のエントリの排他番号、および、プロセス番号qのプロセス排他情報部52のn番目のエントリの排他番号に変数kをセットする(ステップS0311)。また、プロセス起動手段140は、プロセス番号qのプロセス排他情報部52の排他プロセス数に変数nをセットする(ステップS0312)。
【0097】
その後、プロセス起動手段140は、変数aを1加算する(ステップS313)。そして、プロセス起動手段140は、変数aが変数mより大きいか否かを確認する(ステップS314)。
【0098】
変数aが変数mより大きい場合(ステップS314、Yes)、プロセス起動手段140は、プロセスpを起動する(ステップS0315)。その後、プロセス起動手段140は、処理を終了する。一方、変数aが変数m以下である場合(ステップS314、No)、ステップS0308の処理に進むことになる。
【0099】
続いて、
図23を参照して、プロセス終了待合せ手段150の動作の一例について説明する。
【0100】
図23を参照すると、プロセス終了待合せ手段150は、プロセス終了待ち合わせ要求時に、終了を待ち合わせる対象となるプロセスのプロセス番号を変数pにセットし、自プロセスのプロセス番号を変数cにセットする(ステップS0401)。
【0101】
プロセス終了待合せ手段150は、プロセスpの終了を待ち合わせる(ステップS0402)。
【0102】
プロセス終了待合せ手段150は、プロセス番号cの終了待合せ情報部51の待合せプロセス数を変数mにセットし、プロセス番号pの終了待合せ情報部51の待合せプロセス数を変数nにセットする(ステップS0403)。また、プロセス終了待合せ手段150は、変数aに1をセットする(ステップS0404)。
【0103】
続いて、プロセス終了待合せ手段150は、変数aが変数nより大きいか否かを確認する(ステップS0405)。変数aが変数n以下である場合(ステップS0405、No)、プロセス終了待合せ手段150は、プロセス番号pの終了待合せ情報部51のa番目のエントリの待合せプロセス番号を変数qにセットする(ステップS0406)。そして、プロセス終了待合せ手段150は、プロセス番号cの終了待合せ情報部51の待合せプロセス番号に変数qが存在するか否かを確認する(ステップS0407)。
【0104】
プロセス番号cの終了待合せ情報部51の待合せプロセス番号に変数qが存在しない場合(ステップS0407、No)、プロセス終了待合せ手段150は、変数mを1加算する(ステップS0408)。そして、プロセス終了待合せ手段150は、プロセス番号cの終了待合せ情報部51のm番目の待合せプロセス番号に変数qをセットする(ステップS0409)。
【0105】
一方、プロセス番号cの終了待合せ情報部51の待合せプロセス番号に変数qが存在する場合(ステップS0407、Yes)、又は、ステップS0409の処理の後、プロセス終了待合せ手段150は、変数aを1加算する(ステップS0410)。その後、ステップS0405の処理に進む。
【0106】
ステップS0405の処理において、変数aが変数nより大きい場合(ステップS0405、Yes)、プロセス終了待合せ手段150は、変数mを1加算する(ステップS0411)。そして、プロセス終了待合せ手段150は、プロセス番号cの終了待合せ情報部51のm番目の待合せプロセス番号に変数pをセットする(ステップS0412)。また、プロセス終了待合せ手段150は、プロセス番号cの終了待合せ情報部51の待合せプロセス数に変数mをセットする(ステップS0413)。その後、プロセス終了待合せ手段150は、その処理を終了する。
【0107】
ここで、プロセス起動手段140およびプロセス終了待合せ手段150動作時のプロセス情報格納領域50の遷移について、
図24、
図25を参照して説明する。具体的には、例えば、
図24で示すようにプロセスが動作する場合のプロセス情報格納領域50の遷移について説明する。
【0108】
図24を参照すると、プロセス番号10は、[1]プロセス番号20を起動し、[4]プロセス番号20の終了を待ち合わせた後、[5]プロセス番号40を起動する。また、プロセス番号20は、プロセス番号10から起動され、[2]プロセス番号30を起動し、[3]プロセス番号30の終了を待ち合わせた後、終了する。また、プロセス番号30は、プロセス番号20から起動された後、終了する。また、プロセス番号40は、プロセス番号10から起動される。
【0109】
このような状況における、プロセス情報格納領域50の遷移を
図25に示す。なお、プロセス番号10がプロセス番号20を起動する前の終了待合せ情報部51およびプロセス排他情報部52の待合せプロセス数および排他プロセス数は、共に0であるとする。
【0110】
図25を参照すると、[1]プロセス番号10がプロセス番号20を起動する前においては、プロセス番号10のみがプロセス情報格納領域50を用意されている。また、上記のように、プロセス番号10のプロセス情報格納領域50の待合せプロセス数および排他プロセス数は、共に0である。
【0111】
[1]プロセス番号10がプロセス番号20を起動した後においては、新たにプロセス番号20のプロセス情報格納領域50が用意される。一方で、プロセス番号10及びプロセス番号20のプロセス情報格納領域50の待合せプロセス数および排他プロセス数は、共に0である。
【0112】
[2]プロセス番号20がプロセス番号30を起動した後においては、新たにプロセス番号30のプロセス情報格納領域50が用意される。一方で、プロセス番号10、プロセス番号20、プロセス番号30のプロセス情報格納領域50の待合せプロセス数および排他プロセス数は、共に0である。
【0113】
[3]プロセス番号20がプロセス番号30の終了を待ち合わせ後は、プロセス番号20の終了待合せ情報部51にプロセス番号30が追加される。
【0114】
[4]プロセス番号10がプロセス番号20の終了を待ち合わせ後は、プロセス番号10の終了待合せ情報部51にプロセス番号30およびプロセス番号20が追加される。
【0115】
[5]プロセス番号10がプロセス番号40を起動した後は、新たにプロセス番号40のプロセス情報格納領域50が用意される。そして、プロセス番号40の終了待合せ情報部51にプロセス番号30およびプロセス番号20が追加される。また、プロセス番号30とプロセス番号40のプロセス排他情報部52に同一の排他番号がセットされ、プロセス番号20とプロセス番号40のプロセス排他情報部52に同一の排他番号がセットされる。
【0116】
以上が、
図24で示す状況における、プロセス情報格納領域50の遷移である。
【0117】
続いて、終了手段160の動作の一例について説明する。終了手段160は、処理プロセス10において、プロセス終了時に、自プロセスの占有情報スタック領域40を解放する。その後、終了手段160は、処理を終了する。
【0118】
続いて、占有情報受信手段210の動作の一例について説明する。占有情報受信手段210は、処理プロセス10から送信されたスタック情報44を受信し、キューから取り出す。また、占有情報受信手段210は、キューにスタック情報44が残っていない場合、キューに送信されるまで待ち合わせる。
【0119】
続いて、ロック循環チェック手段220の動作の一例について説明する。まず、
図26を参照して、ロック循環チェック手段220の全体の動作について説明する。
【0120】
図26を参照すると、ロック循環チェック手段220は、作業用資源登録部220Aを作成する(ステップS0501)。続いて、ロック循環チェック手段220は、作業用内側ロックリスト220Bおよび作業用外側ロックリスト220Cに内側・外側ロックを登録する(ステップS0502)。そして、ロック循環チェック手段220は、必要に応じて、循環チェックを行う(ステップS0503)。その後、ロック循環チェック手段220は、処理を終了する。
【0121】
続いて、
図27を参照して、
図26で示すステップS0501の処理の詳細な流れの一例について説明する。
【0122】
図27を参照すると、ロック循環チェック手段220は、作業用資源登録部220Aの初期化(0セット)を行う(ステップS0601)。
【0123】
続いて、ロック循環チェック手段220は、変数sw_loop及び変数sw_newをオフにセットする(ステップS0602)。また、ロック循環チェック手段220は、スタック情報44の占有資源確保数を変数nにセットする(ステップS0603)。また、ロック循環チェック手段220は、変数xに1をセットする(ステップS0604)。
【0124】
次に、ロック循環チェック手段220は、スタック情報44のx番目のエントリの占有資源種別と占有資源識別子を変数aにセットする(ステップS0604)。そして、ロック循環チェック手段220は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致するエントリがあるか否かを確認する(ステップS0605)。
【0125】
資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致するエントリがある場合(ステップS0605、Yes)、ロック循環チェック手段220は、変数aと一致するエントリの内容を作業用資源登録部220Aのx番目のエントリへコピーする(ステップS606)。一方で、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致するエントリがない場合(ステップS0605、No)、ロック循環チェック手段220は、変数sw_newをONにセットする(ステップS0607)。そして、ロック循環チェック手段220は、作業用資源登録部220Aのx番目のエントリの占有資源種別と占有資源識別子に変数aをセットする(ステップS0608)。
【0126】
ステップS0606、又は、ステップS0608、の処理の後、ロック循環チェック手段220は、変数xに1を加算する(ステップS0609)。その後、ロック循環チェック手段220は、変数xが変数nより大きいか否かを確認する(ステップS0610)。
【0127】
変数xが変数n以下である場合(ステップS610、No)、ロック循環チェック手段220は、ステップS0604の処理に進む。一方、変数xが変数nより大きい場合(ステップS610、Yes)、ロック循環チェック手段220は、作業用資源登録部220Aのn番目のエントリの内側出現カウンタを1加算する(ステップS0611)。その後、ロック循環チェック手段220は、ステップS0501の処理を終了する。
【0128】
続いて、
図28、
図29を参照して、
図26で示すステップS0502の処理の詳細な流れの一例について説明する。
【0129】
図28を参照すると、ロック循環チェック手段220は、作業用循環情報登録表220Dのエントリ数に0をセットする(ステップS0701)。また、ロック循環チェック手段220は、スタック情報44の占有資源確保数を変数nにセットする(ステップS0703)。
【0130】
また、ロック循環チェック手段220は、変数xに1をセットする(ステップS0703)。
【0131】
また、ロック循環チェック手段220は、スタック情報44のx番目のエントリの占有資源種別と占有資源識別子を変数aにセットする(ステップS0704)。
【0132】
そして、ロック循環チェック手段220は、作業用資源登録部220Aのn番目のエントリの外側ロックリストポインタが示す外側ロックリストに変数aと一致する占有資源種別と占有資源識別子のエントリがあるか否かを確認する(ステップS0705)。
【0133】
業用資源登録部220Aのn番目のエントリの外側ロックリストポインタが示す外側ロックリストに変数aと一致する占有資源種別と占有資源識別子のエントリがある場合(ステップS0705、Yes)、ロック循環チェック手段220は、変数aと一致する外側ロックリストのエントリの循環フラグがオンであるか否かを確認する(ステップS0706)。
【0134】
変数aと一致する外側ロックリストのエントリの循環フラグがオンである場合(ステップS0706、Yes)、ロック循環チェック手段220は、変数aと一致するエントリの循環情報対応表ポインタを作業用循環情報登録表220Dに追加する。また、ロック循環チェック手段220は、作業用循環情報登録表220Dのエントリ数を1加算する(ステップS0707)。そして、ロック循環チェック手段220は、変数sw_loopをオンにセットする(ステップS0708)。
【0135】
変数aと一致する外側ロックリストのエントリの循環フラグがオンでない場合(ステップS0706、No)、又は、ステップS0708の処理の後、ロック循環チェック手段220は、
図29で示すステップS0723の処理に進むことになる。
【0136】
業用資源登録部220Aのn番目のエントリの外側ロックリストポインタが示す外側ロックリストに変数aと一致する占有資源種別と占有資源識別子のエントリがない場合(ステップS0705、No)、ロック循環チェック手段220は、作業用資源登録部220Aのn番目のエントリの外側更新フラグがオフであるか否かを確認する(ステップS0709)。
【0137】
作業用資源登録部220Aのn番目のエントリの外側更新フラグがオフである場合(ステップS0709、Yes)、ロック循環チェック手段220は、作業用資源登録部220Aのn番目エントリの外側ロックリストポインタが示す外側ロックリスト部61Cの内容を、未使用の作業用外側ロックリスト220Cへコピーする(ステップS0710)。そして、ロック循環チェック手段220は、作業用資源登録部220Aのn番目エントリの外側ロックリストポインタに、作業用外側ロックリスト220Cのアドレスを格納する(ステップS0711)。その後、ロック循環チェック手段220は、作業用資源登録部220Aのn番目エントリの外側更新フラグをオンにセットする(ステップS0712)。
【0138】
作業用資源登録部220Aのn番目のエントリの外側更新フラグがオフでない場合(ステップS0709、No)、又は、ステップS0712の処理の後、ロック循環チェック手段220は、作業用資源登録部220Aのn番目エントリの外側ロックリストポインタが示す作業用外側ロックリスト220Cに変数aを追加する(ステップS0713)。そして、ロック循環チェック手段220は、作業用資源登録部220Aのn番目エントリの外側ロック数を1加算する(ステップS0714)。その後、ロック循環チェック手段220は、変数sw_newをオンにセットする(ステップS0715)。
【0139】
続いて、ロック循環チェック手段220は、スタック情報44のn番目のエントリの占有資源種別と占有資源識別子を変数bにセットする(ステップS0716)。
【0140】
ステップS0716の処理の後、
図29を参照すると、ロック循環チェック手段220は、作業用資源登録部220Aのx番目のエントリの内側更新フラグがオフであるか否かを確認する(ステップS0717)。
【0141】
作業用資源登録部220Aのx番目のエントリの内側更新フラグがオフである場合(ステップS0717、Yes)、ロック循環チェック手段220は、作業用資源登録部220Aのx番目エントリの内側ロックリストポインタが示す内側ロックリスト部61Bの内容を、未使用の作業用内側ロックリスト220Bへコピーする(ステップS0718)。そして、ロック循環チェック手段220は、作業用資源登録部220Aのx番目エントリの内側ロックリストポインタに、作業用内側ロックリスト220Bのアドレス格納する(ステップS0719)。その後、ロック循環チェック手段220は、作業用資源登録部220のx番目エントリの内側更新フラグをオンにセットする(ステップS0720)。
【0142】
作業用資源登録部220Aのx番目のエントリの内側更新フラグがオフでない場合(ステップS0717、No)、又は、ステップS0720の処理の後、ロック循環チェック手段220は、作業用資源登録部220Aのx番目エントリの内側ロックリストポインタが示す作業用内側ロックリスト220Bに、変数bを追加する(ステップS0721)。そして、ロック循環チェック手段220は、作業用資源登録部220Aのx番目エントリの内側ロック数を1加算する(ステップS0722)。
【0143】
ステップS0706がNoである場合、又は、ステップS0708の処理の後、又は、ステップS0722の処理の後、ロック循環チェック手段220は、変数xに1加算する(ステップS0723)。
【0144】
ロック循環チェック手段220は、変数xが変数n以上であるか否かを確認する(ステップS0724)。
【0145】
変数xが変数nよりも小さい場合(ステップS0724、No)、ロック循環チェック手段220は、ステップS0704の処理に進む。一方、変数xが変数n以上である場合(ステップS0724、Yes)、ロック循環チェック手段220は、変数nを1減算する(ステップS0725)。そして、ロック循環チェック手段220は、変数nが1以下であるか否かを確認する(ステップS0726)。
【0146】
変数nが1よりも大きい場合(ステップS0726、No)、ロック循環チェック手段220は、ステップS0703の処理に進む。一方、変数nが1以下である場合(ステップS0726、Yes)、ロック循環チェック手段220は、変数sw_newがオンであるか否かを確認する(ステップS0727)。
【0147】
変数sw_newがオンである場合(ステップS0727、Yes)、ロック循環チェック手段220は、
図26のステップS0503の処理である循環チェックを実行する。一方、変数sw_newがオンでない場合(ステップS0727、No)、ロック循環チェック手段220は、変数sw_loopがオンであるか否かを確認する(ステップS0728)。
【0148】
変数sw_loopがオンである場合(ステップS0728、Yes)、ロック循環チェック手段220は、デッドロック検証手段230に制御を渡して、デッドロックが発生するか否かの検証を行わせる。一方、変数sw_loopがオンでない場合(ステップS0728、No)、ロック循環チェック手段220は、ロック情報登録手段240に制御を渡す。デッドロック検証手段230、又は、ロック情報登録手段240に制御を渡した後、ロック循環チェック手段220は、処理を終了する。
【0149】
続いて、
図30を参照して、
図26で示すステップS0503の処理の詳細な流れの一例について説明する。
【0150】
図30を参照すると、ロック循環チェック手段220は、作業用追加循環リスト登録部220Eの登録パターン数に0をセットする(ステップS0801)。また、ロック循環チェック手段220は、スタック情報44の占有資源確保数を変数nにセットする(ステップS0802)。
【0151】
また、ロック循環チェック手段220は、スタック登録部63Aの登録数に1加算した値を変数zにセットする(ステップS0803)。
【0152】
ロック循環チェック手段220は、(作業用資源登録部220Aのn番目のエントリの内側出現カウンタ)×100÷変数zが固定値(%)より大きいか否かを確認する(ステップS0804)。なお、固定値は、任意の設定値でよいが、半分の50(%)としてもよい。
【0153】
(作業用資源登録部220Aのn番目のエントリの内側出現カウンタ)×100÷変数zが固定値(%)より大きい場合(ステップS0804、Yes)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグをオンにセットする(ステップS0805)。一方、(作業用資源登録部220Aのn番目のエントリの内側出現カウンタ)×100÷変数zが固定値(%)以下である場合(ステップS0804、No)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグをオフにセットする(ステップS0806)。
【0154】
続いて、ロック循環チェック手段220は、変数xに1をセットする(ステップS0807)。そして、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグがオンであるか否かを確認する(ステップS0808)。
【0155】
作業用循環チェックリスト220Gの内側フラグがオンである場合(ステップS0808、Yes)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの先頭のエントリに、スタック情報44のx番目のエントリの占有資源種別と占有資源識別子をセットする(ステップS0809)。また、ロック循環チェック手段220は、作業用循環チェックリスト220Gの2番目のエントリに、スタック情報44のn番目のエントリの占有資源種別と占有資源識別子をセットする(ステップS0810)。
【0156】
一方、作業用循環チェックリスト220Gの内側フラグがオンでない場合(ステップS0808、No)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの先頭のエントリに、スタック情報44のn番目のエントリの占有資源種別と占有資源識別子をセットする(ステップS0811)。また、ロック循環チェック手段220は、作業用循環チェックリスト220Gの2番目のエントリに、スタック情報44のx番目のエントリの占有資源種別と占有資源識別子をセットする。
【0157】
ステップS0810、又は、ステップS0812の処理の後、ロック循環チェック手段220は、作業用循環チェックリスト220Gのエントリ数に2をセットする(ステップS0813)。その後、ロック循環チェック手段220は、循環チェックルーチンを呼び出す(ステップS0814)。なお、循環チェックルーチンを実行する際の詳細な流れの一例については、後述する。
【0158】
ロック循環チェック手段220は、変数xに1加算する(ステップS0815)。そして、ロック循環チェック手段220は、変数xが変数n以上であるか否かを確認する(ステップS0816)。
【0159】
変数xが変数nよりも小さい場合(ステップS0816、No)、ロック循環チェック手段220は、ステップS0808の処理に進む。一方、変数xが変数n以上の場合(ステップS0816、Yes)、ロック循環チェック手段220は、変数nを1減算する(ステップS0817)。そして、ロック循環チェック手段220は、変数nが1以下であるか否かを確認する(ステップS0818)。
【0160】
変数nが1よりも大きい場合(ステップS0818、No)、ロック循環チェック手段220は、ステップS0803の処理に進む。一方、変数nが1以下の場合(ステップS0818、Yes)、ロック循環チェック手段220は、変数sw_loopがオンであるか、または、作業用追加循環リスト登録部220Eの登録パターン数が0よりも大きいか、を確認する(ステップS0819)。変数sw_loopがオンである場合、又は、作業用追加循環リスト登録部220Eの登録パターン数が0よりも大きい場合(ステップS0819、Yes)、ロック循環チェック手段220は、デッドロック検証手段230に制御を渡して、デッドロックが発生するか否かの検証を行わせる。一方、変数sw_loopがオンでなく、かつ、作業用追加循環リスト登録部220Eの登録パターン数が0よりも大きくない場合(ステップS0819、No)、ロック循環チェック手段220は、ロック情報登録手段240に制御を渡す。デッドロック検証手段230、又は、ロック情報登録手段240に制御を渡した後、ロック循環チェック手段220は、処理を終了する。
【0161】
続いて、
図31乃至
図33を参照して、循環チェックルーチンを実行する際の詳細な流れの一例について説明する。
【0162】
図31を参照すると、ロック循環チェック手段220は、作業用循環チェックリスト220Gのエントリ数を変数eにセットする(ステップS0901)。また、ロック循環チェック手段220は、作業用循環チェックリスト220Gのe番目エントリの占有資源種別と占有資源識別子を変数aにセットする(ステップS0902)。
【0163】
続いて、ロック循環チェック手段220は、作業用資源登録部220Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリがあるか否かを確認する(ステップS0903)。
【0164】
作業用資源登録部220Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリがある場合(ステップS0903、Yes)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグがオンであるか否かを確認する(ステップS0904)。そして、作業用循環チェックリスト220Gの内側フラグがオンである場合(ステップS0904、Yes)、ロック循環チェック手段220は、変数aと一致するエントリの内側ロック数を変数bにセットし、変数aと一致するエントリの内側ロックリストポインタを変数pにセットする(ステップS0905)。一方、作業用循環チェックリスト220Gの内側フラグがオンでない場合(ステップS0904、No)、ロック循環チェック手段220は、変数aと一致するエントリの外側ロック数を変数bにセットし、変数aと一致するエントリの外側ロックリストポインタを変数pにセットする(ステップS0906)。
【0165】
また、作業用資源登録部220Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリがない場合(ステップS0903、No)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグがオンであるか否かを確認する(ステップS0907)。そして、作業用循環チェックリスト220Gの内側フラグがオンである場合(ステップS0907、Yes)、ロック循環チェック手段220は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリの内側ロック数を変数bにセットする。また、ロック循環チェック手段220は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリの内側ロックリストポインタを変数pにセットする(ステップS0908)。一方、作業用循環チェックリスト220Gの内側フラグがオンでない場合(ステップS0907、No)、ロック循環チェック手段220は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリの外側ロック数を変数bにセットする。また、ロック循環チェック手段220は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリの外側ロックリストポインタを、変数pにセットする(ステップS0909)。
【0166】
ステップS0905、又は、ステップS0906、又は、ステップS0908、又は、ステップS0909、の処理の後、ロック循環チェック手段220は、変数cに1をセットする(ステップS0910)。
【0167】
続いて、
図32を参照すると、ロック循環チェック手段220は、変数cが変数bよりも大きいか否かの確認を行う(ステップS0911)。
【0168】
変数cが変数bよりも大きい場合(ステップS0911、Yes)、ロック循環チェック手段220は、循環チェックルーチンを終了する。一方、変数cが変数b以下である場合(ステップS0911、No)、ロック循環チェック手段220は、変数pがさすロックリストポインタのc番目のエントリの占有資源種別と占有資源識別子を変数dにセットする(ステップS0912)。
【0169】
続いて、ロック循環チェック手段220は、作業用循環チェックリスト220Gに登録されている占有資源種別と占有資源識別子のうち、変数dと一致しているエントリがあるか否かを確認する(ステップS0913)。
【0170】
作業用循環チェックリスト220Gに登録されている占有資源種別と占有資源識別子のうち、変数dと一致しているエントリがない場合(ステップS0913、No)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの(e+1)番目のエントリに変数d(占有資源種別と占有資源識別子)を登録する(ステップS0914)。また、ロック循環チェック手段220は、作業用循環チェックリスト220Gのエントリ数を1加算する(ステップS0915)。そして、ロック循環チェック手段220は、循環チェックルーチンを再帰呼び出しする(ステップS0916)。
【0171】
その後、ロック循環チェック手段220は、作業用循環チェックリスト220Gのエントリ数を1減算する(ステップS0917)。そして、ロック循環チェック手段220は、変数cを1加算する(ステップS0918)。ステップS0918の処理の後、ロック循環チェック手段220は、ステップS0911の処理に進む。
【0172】
作業用循環チェックリスト220Gに登録されている占有資源種別と占有資源識別子のうち、変数dと一致しているエントリがある場合(ステップS0913、Yes)、ロック循環チェック手段220は、変数dと一致しているエントリが先頭のエントリであるか否かを確認する(ステップS0919)。
【0173】
変数dと一致しているエントリが先頭のエントリでない場合(ステップS0919、No)、ロック循環チェック手段220は、ステップS0918の処理に進む。一方、変数dと一致しているエントリが先頭のエントリである場合(ステップS0919、Yes)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの循環パターンが循環情報部62に登録済の循環パターンであるか否かを確認する(ステップS0920)。
【0174】
作業用循環チェックリスト220Gの循環パターンが循環情報部62に登録済の循環パターンである場合(ステップS0920、Yes)、ロック循環チェック手段220は、ステップS0918の処理に進む。一方、作業用循環チェックリスト220Gの循環パターンが循環情報部62に登録済の循環パターンでない場合(ステップS0920、No)、ロック循環チェック手段220は、ステップS0921の処理に進む。なお、作業用循環チェックリスト220Gの内側フラグがオフの場合には、循環リスト62Bと逆順を示すことになる。そのため、ロック循環チェック手段220は、順番を逆にして比較する。例えば、内側フラグがオフの作業用循環チェックリスト220Gの占有資源30がS1、S2、S3の順番となっている場合、循環リスト62BがS3、S2、S1の順番となっていれば、登録済と判断する。また、ロック循環チェック手段220は、循環リストの先頭の資源が異なっていても、並び順が同じ場合には、登録済と判断する。例えば、内側フラグがオンの作業用循環チェックリスト220Gの占有資源がS1、S2、S3の順番となっている場合、例えば循環リスト62BがS2、S3、S1となっている場合も登録済と判断する。
【0175】
ステップS0921の処理では、ロック循環チェック手段220は、作業用追加循環リスト登録部220Eの登録パターン数に1加算した値を、変数fにセットする(ステップS0921)。
【0176】
ロック循環チェック手段220は、未使用の作業用追加循環リスト220Fを確保し、初期化(0セット)する(ステップS0922)。続いて、ロック循環チェック手段220は、作業用追加循環リスト登録部220Eのf番目エントリの作業用追加循環リストへのポインタに、確保した作業用追加循環リスト220Fのアドレスをセットする(ステップS0923)。また、ロック循環チェック手段220は、作業用追加循環リスト登録部220Eのf番目エントリの循環資源数に変数eの値をセットする(ステップS0924)。また、ロック循環チェック手段220は、作業用追加循環リスト登録部220Eの登録パターン数に、変数fの値をセットする(ステップS0925)。
【0177】
続いて、ロック循環チェック手段220は、変数gに1をセットする(ステップS0926)。
【0178】
そして、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグがオンであるか否かを確認する(ステップS0927)。
【0179】
作業用循環チェックリスト220Gの内側フラグがオンである場合(ステップS0927、Yes)、ロック循環チェック手段220は、変数hに1をセットする(ステップS0928)。一方、作業用循環チェックリスト220Gの内側フラグがオンでない場合(ステップS0927、No)、ロック循環チェック手段220は、変数hに2をセットする(ステップS0929)。
【0180】
続いて、ロック循環チェック手段220は、作業用循環チェックリスト220Gのh番目エントリの占有資源種別と占有資源識別子を、作業用追加循環リスト220Fのg番目エントリの占有資源種別と占有資源識別子にセットする(ステップS0930)。
【0181】
次に、ロック循環チェック手段220は、変数gを1加算する(ステップS931)。そして、ロック循環チェック手段220は、変数gが変数eより大きいか否かを確認する(ステップS0932)。
【0182】
変数gが変数eよりも大きい場合(ステップS0932、Yes)、ロック循環チェック手段220は、
図32で示すステップS0918の処理に進む。一方、変数gが変数e以下である場合(ステップS0932、No)、ロック循環チェック手段220は、作業用循環チェックリスト220Gの内側フラグがオンであるか否かを確認する(ステップS0933)。
【0183】
作業用循環チェックリスト220Gの内側フラグがオンである場合(ステップS0933、Yes)、ロック循環チェック手段220は、変数hを1加算する(ステップS0934)。一方、作業用循環チェックリスト220Gの内側フラグがオンでない場合(ステップS0933、No)、ロック循環チェック手段220は、変数hが1以下であるか否かを確認する(ステップS0935)。そして、変数hが1以下である場合(ステップS0935、Yes)、ロック循環チェック手段220は、変数hに変数eの値をセットする(ステップS0936)。一方で、変数hが1よりも大きい場合(ステップS0935、No)、ロック循環チェック手段220は、変数hを1減算する(ステップS0937)。ステップS0934、又は、ステップS0936、又は、ステップS0937、の処理の後、ロック循環チェック手段220は、ステップS0930の処理に進むことになる。
【0184】
続いて、デッドロック検証手段230の動作の一例について説明する。まず、
図34を参照して、デッドロック検証手段230の全体の動作について説明する。
【0185】
図34を参照すると、デッドロック検証手段230は、作業用追加スタック対応表230Aを作成する(ステップS1001)。続いて、デッドロック検証手段230は、占有資源のチェックを行う(ステップS1002)。その後、デッドロック検証手段230は、処理を終了する。
【0186】
続いて、
図35、
図36を参照して、
図34で示すステップS1001の処理の詳細な流れの一例について説明する。
【0187】
図35を参照すると、デッドロック検証手段230は、変数sw_newがオンにセットされているか否かを確認する(ステップS1101)。変数sw_newがオンにセットされていない場合(ステップS1101、No)、デッドロック検証手段230は、
図34で示すステップS1002の処理である占有資源のチェックを開始する。一方、変数sw_newがオンにセットされている場合(ステップS1101、Yes)、デッドロック検証手段230は、作業用追加循環リスト登録部220Eの登録パターン数の値を変数eにセットする(ステップS1102)。また、デッドロック検証手段230は、変数fに1をセットする(ステップS1103)。
【0188】
デッドロック検証手段230は、変数fが変数eよりも大きいか否か確認する(ステップS1104)。変数fが変数eよりも大きい場合(ステップS1104、Yes)、デッドロック検証手段230は、
図34で示すステップS1002の処理である占有資源のチェックを開始する。一方、変数fが変数e以下である場合、デッドロック検証手段230は、作業用追加循環リスト登録部220Eのf番目エントリの循環資源数を変数gにセットする。また、デッドロック検証手段230は、作業用追加循環リスト登録部220Eのf番目エントリの作業用追加循環リストへのポインタを変数pにセットする(ステップS1105)。また、デッドロック検証手段230は、変数hに1をセットするとともに、変数hに1加算した値を変数jにセットする(ステップS1106)。
【0189】
さらに、デッドロック検証手段230は、変数pが示す作業用追加循環リスト220Fのh番目エントリの占有資源種別と占有資源識別子を変数aにセットする。また、デッドロック検証手段230は、変数pが示す作業用追加循環リスト220Fのj番目エントリの占有資源種別と占有資源識別子を変数bにセットする(ステップS1107)。
【0190】
続いて、デッドロック検証手段230は、作業用資源登録部220Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリがあるか否かを確認する(ステップS1108)。
【0191】
作業用資源登録部220Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリがある場合(ステップS1108、Yes)、デッドロック検証手段230は、変数aと一致しているエントリの内側ロックリストポインタを変数qにセットする(ステップS1109)。一方、作業用資源登録部220Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリがない場合(ステップS1108、No)、デッドロック検証手段230は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致しているエントリの内側ロックリストポインタを変数qにセットする(ステップS1110)。
【0192】
ステップS1109、又は、ステップS1110の処理の後、デッドロック検証手段230は、変数qが示す内側ロックリストに登録されている占有資源種別と占有資源識別子のうち、変数bと一致するエントリの循環フラブがオンであるか否かを確認する(ステップS1111)。
【0193】
変数bと一致するエントリの循環フラブがオンである場合(ステップS1111、Yes)、デッドロック検証手段230は、変数bと一致するエントリの循環対応表ポインタが示す循環情報対応表61Dの先頭パターンのパターン番号とエントリ番号取得する(ステップS1112)。また、デッドロック検証手段230は、取得したパターン番号の循環リスト62B中の取得したエントリ番号のエントリに格納されているスタック対応表ポインタを取得する(ステップS1113)。また、デッドロック検証手段230は、取得したスタック対応表ポインタを、変数pが示す作業用追加循環リスト220Fのh番目エントリのスタック対応表ポインタにセットする(ステップS1114)。その後、デッドロック検証手段230は、
図36で示すステップS1123の処理に進む。
【0194】
一方、変数bと一致するエントリの循環フラブがオンでない場合(ステップS1111、No)、デッドロック検証手段230は、未使用の作業用追加スタック対応表230Aを確保して初期化(0クリア)する(ステップS1115)。次に、デッドロック検証手段230は、作業用追加スタック対応表230Aのアドレスを、作業用追加循環リスト220Fのh番目エントリのスタック対応表ポインタにセットする(ステップS1116)。また、デッドロック検証手段230は、変数kに1をセットする(ステップS1117)。
【0195】
図36を参照すると、
図35で示すステップS1117の処理の後、デッドロック検証手段230は、変数kがスタック登録部63Aの登録パターン数よりも大きいか否か確認する(ステップS1118)。変数kがスタック登録部63Aの登録パターン数よりも大きい場合(ステップS1118、Yes)、デッドロック検証手段230は、ステップS1123の処理に進む。一方、変数kがスタック登録部63Aの登録パターン数以下である場合(ステップS1118、No)、デッドロック検証手段230は、k番目のスタック情報(スタック情報部63B)の占有資源種別と占有資源識別子に変数aが登録されており、かつ、変数aより下のエントリに変数bが登録されているか否かを確認する(ステップS1119)。
【0196】
k番目のスタック情報(スタック情報部63B)の占有資源種別と占有資源識別子に変数aが登録されており、かつ、変数aより下のエントリに変数bが登録されている場合(ステップS1119、Yes)、デッドロック検証手段230は、作業用追加スタック対応表230Aに、スタック番号k、および、変数aが登録されているエントリ番号を追加する(ステップS1120)。そして、デッドロック検証手段230は、作業用追加スタック対応表230Aのパターン数を1加算する(ステップS1121)。
【0197】
k番目のスタック情報(スタック情報部63B)の占有資源種別と占有資源識別子に変数aが登録されていない場合や、変数aより下のエントリに変数bが登録されていない場合(ステップS1119、No)、又は、ステップS1121の処理の後、デッドロック検証手段230は、変数kを1加算する。その後、デッドロック検証手段230は、ステップS1118の処理に進む。
【0198】
図35で示すステップS1114の処理の後、又は、ステップS1118で確認する、変数kがスタック登録部63Aの登録パターン数よりも大きい場合、デッドロック検証手段230は、変数hが変数gよりも大きいか否か確認する(ステップS1123)。
【0199】
変数hが変数g以下である場合(ステップS1123、No)、デッドロック検証手段230は、変数hを1加算する(ステップS1124)。続いて、デッドロック検証手段230は、変数jが変数g以上であるか否かを確認する(ステップS1125)。変数jが変数gよりも小さい場合(ステップS1125、No)、デッドロック検証手段230は、変数jを1加算する(ステップS1126)。一方、変数jが変数g以上である場合(ステップS1125、Yes)、デッドロック検証手段230は、変数jに1をセットする(ステップS1127)。ステップS1126、又は、ステップS1127の処理の後、デッドロック検証手段230は、デッドロック検証手段230は、ステップs1107の処理へ進む。
【0200】
一方、変数hが変数gよりも大きい場合(ステップS1123、Yes)、デッドロック検証手段230は、変数fを1加算する(ステップS1128)。その後、デッドロック検証手段230は、ステップS1104の処理に進む。
【0201】
続いて、
図37を参照して、
図34で示すステップS1002の処理の詳細な流れの一例について説明する。
【0202】
図37を参照すると、デッドロック検証手段230は、作業用占有資源チェックリスト230B、作業用プロセス番号チェックリスト230C、及び、作業用プロセス排他番号チェックリスト230Dの領域を確保し、初期化(0クリア)する(ステップS1201)。
【0203】
続いて、デッドロック検証手段230は、グローバル変数sw_deadlockをオフにセットする(ステップS1202)。また、デッドロック検証手段230は、作業用循環情報登録表220Dのエントリ数を変数eにセットする(ステップS1203)。また、デッドロック検証手段230は、変数fに1をセットする(ステップS1204)。
【0204】
デッドロック検証手段230は、変数fが変数eよりも大きいか否かを確認する(ステップS1205)。
【0205】
変数fが変数e以下である場合(ステップS1205、No)、デッドロック検証手段230は、作業用循環情報登録表220Dのf番目のエントリの循環情報対応表ポインタを変数pにセットする(ステップS1206)。また、デッドロック検証手段230は、変数pが示す循環情報対応表61Dのパターン数を変数gにセットする(ステップS1207)。また、デッドロック検証手段230は、変数hに1をセットする(ステップS1208)。
【0206】
さらに、デッドロック検証手段230は、変数pが示す循環情報対応表61Dのh番目エントリのパターン番号を変数rにセットする(ステップS1209)。そして、デッドロック検証手段230は、変数pが示す循環情報対応表61Dのh番目エントリのエントリ番号をグローバル変数geにセットする。また、デッドロック検証手段230は、循環登録部62Aのパターン番号rの循環リストへのポインタをグローバル変数gpにセットする。また、デッドロック検証手段230は、循環登録部62Aのパターン番号rの循環資源数をグローバル変数gnにセットする(ステップS1210)。
【0207】
その後、デッドロック検証手段230は、資源チェックルーチンを呼び出す(ステップS1211)。なお、グローバル変数は、呼び出される資源チェックルーチンに引き継がれるものとする。
【0208】
ステップS1211の処理の後、デッドロック検証手段230は、変数hを1加算する(ステップS1212)。そして、デッドロック検証手段230は、変数hが変数gよりも大きいか否かを確認する(ステップS1213)。
【0209】
変数hが変数gよりも大きい場合(ステップS1213、Yes)、デッドロック検証手段230は、変数fを1加算する(ステップS1214)。その後、デッドロック検証手段230は、ステップS1205の処理に進む。一方、変数hが変数g以下である場合(ステップS1213、No)、デッドロック検証手段230は、ステップS1209の処理に進む。
【0210】
ステップS1205での確認の結果、変数fが変数eよりも大きい場合(ステップS1205、Yes)、デッドロック検証手段230は、変数sw_newがオンであるか否かを確認する(ステップS1215)。
【0211】
変数sw_newがオンである場合(ステップS1215、Yes)、デッドロック検証手段230は、作業用追加循環リスト登録部220Eの登録パターン数を変数eにセットする(ステップS1216)。また、デッドロック検証手段230は、変数fに1をセットする(ステップS1217)。
【0212】
そして、デッドロック検証手段230は、変数fが変数eよりも大きいか否かを確認する(ステップS1218)。変数fが変数e以下である場合(ステップS1218、No)、デッドロック検証手段230は、グローバル変数geに1をセットする。また、デッドロック検証手段230は、作業用追加循環リスト登録部220Eのf番目エントリの循環情報対応表ポインタをグローバル変数gpにセットする。また、デッドロック検証手段230は、作業用追加循環リスト登録部220Eのf番目エントリの循環資源数をグローバル変数gnにセットする(ステップS1219)。その後、デッドロック検証手段230は、資源チェックルーチンを呼び出す(ステップS1220)。なお、グローバル変数は、呼び出される資源チェックルーチンに引き継がれるものとする。ステップS1220の処理の後、デッドロック検証手段230は、変数fを1加算する(ステップS1221)。その後、デッドロック検証手段230は、ステップS1216の処理に進む。
【0213】
ステップS1215での確認の結果、変数sw_newがオンでない場合(ステップS1215、No)、又は、ステップS1218での確認の結果、変数fが変数eよりも大きい場合(ステップS1218、Yes)、デッドロック検証手段230は、グローバル変数sw_deadlockaがオンであるか否かを確認する(ステップS1222)。グローバル変数sw_deadlockaがオンである場合(ステップS1222、Yes)、デッドロック検証手段230は、占有情報受信手段210に制御を渡し処理を終了する。一方、グローバル変数sw_deadlockaがオンでない場合(ステップS1222、No)、デッドロック検証手段230は、ロック情報登録手段240に制御を渡して処理を終了する。
【0214】
続いて、
図38乃至
図39を参照して、資源チェックルーチンを実行する際の詳細な流れの一例について説明する。
【0215】
図38を参照すると、デッドロック検証手段230は、作業用占有資源チェックリスト230Bのエントリ数を変数save_rscにセットする。また、デッドロック検証手段230は、デッドロック検証手段230は、作業用プロセス番号チェックリスト230Cのエントリ数を変数save_prcにセットする。また、デッドロック検証手段230は、作業用プロセス排他番号チェックリスト230Dのエントリ数を変数save_excにセットする(ステップS1301)。また、デッドロック検証手段230は、変数save_prcに1加算した値を、変数eにセットする(ステップS1302)。
【0216】
デッドロック検証手段230は、変数eがグローバル変数geと一致しているか否かを確認する(ステップS1303)。変数eがグローバル変数geと一致していない場合(ステップS1303、No)、デッドロック検証手段230は、グローバル変数gpが示す循環リストのe番目のエントリのスタック対応表のポインタを変数sにセットする。また、デッドロック検証手段230は、変数sが示すスタック対応表のパターン数を変数fにセットする(ステップS1304)。一方、変数eがグローバル変数geと一致している場合(ステップS1303、Yes)、デッドロック検証手段230は、変数fに1をセットする(ステップS1305)。
【0217】
ステップS1304、又は、ステップS1305の処理の後、デッドロック検証手段230は、変数gに1をセットする(ステップS1306)。
【0218】
デッドロック検証手段230は、変数gが変数fよりも大きいか否か確認する(ステップS1307)。変数gが変数fよりも大きい場合(ステップS1307、Yes)、デッドロック検証手段230は、資源チェックルーチンの処理を終了する。一方、変数gが変数f以下である場合(ステップS1307、No)、デッドロック検証手段230は、変数eがグローバル変数geと一致しているか否かを確認する(ステップS1308)。変数eがグローバル変数geと一致していない場合(ステップ1308、No)、デッドロック検証手段230は、変数sが示すスタック対応表のg番目のエントリのスタック番号を変数hにセットする。また、デッドロック検証手段230は、変数sが示すスタック対応表のg番目のエントリのエントリ番号を変数jにセットする(ステップS1309)。また、デッドロック検証手段230は、スタック登録部63Aのh番目エントリのスタック情報へのポインタを変数pにセットする(ステップS1310)。一方、変数eがグローバル変数geと一致している場合(ステップ1308、Yes)、デッドロック検証手段230は、スタック情報44のアドレスを変数pにセットする(ステップS1311)。また、デッドロック検証手段230は、グローバル変数gpが示す循環情報対応表のe番目のエントリの占有資源種別と占有資源識別子を変数aにセットする(ステップS1312)。また、デッドロック検証手段230は、スタック情報44に登録されている占有資源種別と占有資源識別子のうち、変数aと一致するエントリのエントリ番号を変数jにセットする(ステップS1313)。
【0219】
ステップS1310、又は、ステップS1313の処理の後、デッドロック検証手段230は、変数qに1をセットする(ステップS1314)。そして、デッドロック検証手段230は、変数qが変数j以上であるか否かを確認する(ステップS1315)。
【0220】
変数qが変数よりも小さい場合(ステップS1315、No)、デッドロック検証手段230は、変数pが示すスタック部のq番目エントリの占有資源種別と占有資源識別子を変数chk_sにセットする(ステップS1316)。そして、デッドロック検証手段230は、作業用占有資源チェックリスト230Bに、変数chk_sと同じ占有資源種別と占有資源識別子が既に登録されているか否かを確認する(ステップS1317)。
【0221】
変数chk_sと同じ占有資源種別と占有資源識別子が既に登録されている場合(ステップS1317、Yes)、デッドロック検証手段230は、
図39で示すステップS1336の処理に進む。一方、変数chk_sと同じ占有資源種別と占有資源識別子が登録されていない場合(ステップS1317、No)、デッドロック検証手段230は、変数chk_sを作業用占有資源チェックリスト230Bに追加する(ステップS1318)。また、デッドロック検証手段230は、作業用占有資源チェックリスト230Bのエントリ数を1加算する(ステップS1319)。その後、デッドロック検証手段230は、変数qを1加算する(ステップS1320)。そして、デッドロック検証手段230は、ステップS1315の処理に進む。
【0222】
ステップS1315の処理において、変数qが変数j以上である場合(ステップS1315、Yes)、デッドロック検証手段230は、
図39で示すステップS1321の処理に進む。つまり、デッドロック検証手段230は、変数pが示すスタック部63Bまたはスタック情報44のプロセス番号を、変数chk_pにセットする(ステップS1321)。
【0223】
続いて、デッドロック検証手段230は、作業用プロセス番号チェックリスト230Cに変数chk_pと同じプロセス番号が既に登録されているか否かを確認する(ステップS1322)。
【0224】
変数chk_pと同じプロセス番号が既に登録されている場合(ステップS1322、Yes)、デッドロック検証手段230は、ステップS1336の処理に進む。一方、変数chk_pと同じプロセス番号が登録されていない場合(ステップS1322、No)、デッドロック検証手段230は、変数chk_pを作業用プロセス番号チェックリスト230Cに追加する(ステップS1323)。また、デッドロック検証手段230は、作業用プロセス番号チェックリスト230Cのエントリ数を1加算する(ステップS1324)。更に、デッドロック検証手段230は、変数qに1をセットする。また、デッドロック検証手段230は、変数chk_pのプロセス排他情報部52の排他プロセス数を変数rにセットする(ステップS1325)。
【0225】
デッドロック検証手段230は、変数qが変数rよりも大きいか否かを確認する(ステップS1326)。変数qが変数r以下である場合(ステップS1326、No)、デッドロック検証手段230は、変数chk_pのプロセス排他情報部52のq番目エントリの排他番号を、変数chk_eにセットする(ステップS1327)。
【0226】
続いて、デッドロック検証手段230は、作業用プロセス排他番号チェックリスト230Dに変数chk_eと同じ排他番号が既に登録されているか否かを確認する(ステップS1328)。
【0227】
変数chk_eと同じ排他番号が既に登録されている場合(ステップS1328、Yes)、デッドロック検証手段230は、ステップS1336の処理に進む。一方、変数chk_eと同じ排他番号が登録されていない場合(ステップS1328、No)、デッドロック検証手段230は、変数chk_eを作業用プロセス排他番号チェックリスト230Dに追加する(ステップS1329)。また、デッドロック検証手段230は、作業用プロセス排他番号チェックリスト230Dのエントリ数を1加算する(ステップS1330)。更に、デッドロック検証手段230は、変数qを1加算する(ステップS1331)。その後、デッドロック検証手段230は、ステップS1326の処理に進む。
【0228】
ステップS1326の処理において、変数qが変数rよりも大きい場合(ステップS1326、Yes)、デッドロック検証手段230は、ステップS1332の処理に進む。つまり、デッドロック検証手段230は、変数eがグローバル変数gn以上であるか否かを確認する(ステップS1332)。
【0229】
変数eがグローバル変数gnより小さい場合(ステップS1332、No)、デッドロック検証手段230は、資源チェックルーチンを再帰呼出しする(ステップS1333)。なお、グローバル変数は、呼び出される資源チェックルーチンに引き継がれる。一方、変数eがグローバル変数gn以上である場合(ステップS1332、Yes)、デッドロック検証手段230は、グローバル変数sw_deadlockをオンにセットする(ステップS1334)。そして、デッドロック検証手段230は、デッドロック検出メッセージを出力する(ステップS1335)。
【0230】
ステップS1333の処理の後、又は、ステップS1335の処理の後、デッドロック検証手段230は、作業用占有資源チェックリスト230Bのエントリ数に、変数save_rscの値をセットする。また、デッドロック検証手段230は、作業用プロセス番号チェックリスト230Cのエントリ数に、変数save_prcの値をセットする。また、デッドロック検証手段230は、作業用プロセス排他番号チェックリスト230Dのエントリ数に、変数save_excの値をセットする(ステップS1336)。その後、デッドロック検証手段230は、変数gを1加算する(ステップS1337)。そして、デッドロック検証手段230は、ステップS1307の処理に進む。
【0231】
続いて、
図40、
図41を参照して、ロック情報登録手段240の動作の一例について説明する。
【0232】
図40を参照すると、ロック情報登録手段240は、スタック情報44の占有資源確保数を変数nにセットする(ステップS1401)。また、ロック情報登録手段240は、変数xに1をセットする(ステップS1402)。
【0233】
更に、ロック情報登録手段240は、スタック情報44のx番目のエントリの占有資源種別と占有資源識別子を変数aにセットする(ステップS1403)。そして、ロック情報登録手段240は、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致するエントリがあるか否かを確認する(ステップS1404)。
【0234】
変数aと一致するエントリがある場合(ステップS1404、Yes)、ロック情報登録手段240は、変数aと一致するエントリの内側出現カウンタに、作業用資源登録部220Aのx番目のエントリの内側出現カウンタをセットする(ステップS1405)。
【0235】
続いて、ロック情報登録手段240は、変数aと一致するエントリの内側ロック数が、作業用資源登録部220Aのx番目エントリの内側ロック数よりも小さいか否かを確認する(ステップS1406)。変数aと一致するエントリの内側ロック数が、作業用資源登録部220Aのx番目エントリの内側ロック数よりも小さい場合(ステップS1406、Yes)、ロック情報登録手段240は、作業用資源登録部220Aのx番目のエントリが示す作業用内側ロックリスト220Bの内容を、変数aと一致するエントリの内側ロックリスト部61Bへコピーする(ステップS1407)。また、ロック情報登録手段240は、変数aと一致するエントリの内側ロック数に、作業用資源登録部220Aのx番目のエントリの内側ロック数をセットする(ステップS1408)。
【0236】
変数aと一致するエントリの内側ロック数が、作業用資源登録部220Aのx番目エントリの内側ロック数よりも小さくなかった場合(ステップS1406、No)、又は、ステップS1408の処理の後、ロック情報登録手段240は、ステップS1409の処理に進む。つまり、ロック情報登録手段240は、変数aと一致するエントリの外側ロック数が、作業用資源登録部220Aのx番目エントリの外側ロック数よりも小さいか否かを確認する(ステップS1409)。変数aと一致するエントリの外側ロック数が、作業用資源登録部220Aのx番目のエントリの外側ロック数よりも小さい場合(ステップS1409、Yes)、ロック情報登録手段240は、作業用資源登録部220Aのx番目のエントリが示す作業用外側ロックリスト220Cの内容を、変数aと一致するエントリの外側ロックリスト部61Cへコピーする(ステップS1410)。また、ロック情報登録手段240は、変数aと一致するエントリの外側ロック数に、作業用資源登録部220Aのx番目のエントリの外側ロック数をセットする(ステップS1411)。変数aと一致するエントリの外側ロック数が、作業用資源登録部220Aのx番目エントリの外側ロック数よりも小さくなかった場合(ステップS1409、No)、又は、ステップS1411の処理の後、ロック情報登録手段240は、ステップS1415の処理に進む。
【0237】
ステップS1401の処理において、資源登録部61Aに登録されている占有資源種別と占有資源識別子のうち、変数aと一致するエントリがない場合(ステップS1404、No)、ロック情報登録手段240は、ステップS1412の処理に進む。つまり、ロック情報登録手段240は、資源登録部61Aの登録資源数に1加算した値を変数fにセットする(ステップS1412)。また、ロック情報登録手段240は、作業用資源登録部220Aのx番目エントリの内容(占有資源種別〜外側ロックリストポインタまでの内容)を、資源登録部61Aのf番目のエントリへコピーする(ステップS1413)。また、ロック情報登録手段240は、資源登録部61Aの登録資源数に、変数fの値をセットする(ステップS1414)。
【0238】
ステップS1409がNoであった場合、又は、ステップS1411の処理の後、又は、ステップS1414の処理の後、ロック情報登録手段240は、変数xを1加算する(ステップS1415)。
【0239】
続いて、ロック情報登録手段240は、変数xが変数nよりも大きいか否か確認する(ステップS1416)。変数xが変数n以下である場合(ステップS1416、No)、ロック情報登録手段240は、ステップS1403の処理に進む。一方、変数xが変数nよりも大きい場合(ステップS1416、Yes)、ロック情報登録手段240は、
図41で示すステップS1417の処理に進む。つまり、ロック情報登録手段240は、変数sw_newがオンであるか否かを確認する(ステップS1417)。
【0240】
変数sw_newがオンである場合(ステップS1417、Yes)、ロック情報登録手段240は、作業用追加循環リスト登録部220Eの登録パターン数を変数eにセットする(ステップS1418)。また、ロック情報登録手段240は、変数fに1をセットする(ステップS1419)。
【0241】
ロック情報登録手段240は、変数fが変数eよりも大きいか否かを確認する(ステップS1420)。変数fが変数e以下である場合(ステップS1420、No)、ロック情報登録手段240は、作業用追加循環リスト登録部220Eのf番目のエントリの作業用追加循環リスト220Fへのポインタを変数pにセットする(ステップS1421)。そして、ロック情報登録手段240は、変数pが示す作業用追加循環リスト220Fが、f番目のエントリより前の作業用追加循環リスト220Fのいずれかと循環が一致しているか否かを確認する(ステップS1422)。
【0242】
循環が一致していない場合(ステップS1422、No)、ロック情報登録手段240は、循環登録部62Aの登録パターン数に1加算した値を変数qにセットする(ステップS1423)。また、ロック情報登録手段240は、作業用追加循環リスト登録部220Eのf番目のエントリの内容を循環登録部62Aのq番目のエントリへコピーする(ステップS1424)。これにより、作業用追加循環リスト登録部220Eのf番目のエントリが示す作業用追加循環リスト220Fおよび当該作業用追加循環リスト220Fが示す作業用追加スタック対応表230Aは、循環リスト62Bおよびスタック対応表62Cとして登録されることになる。
【0243】
また、ロック情報登録手段240は、循環登録部62Aの登録パターン数に、変数qの値をセットする(ステップS1425)。また、ロック情報登録手段240は、追加した循環リスト62Bに従い、内側ロックリスト部61Bおよび外側ロックリスト部61Cの循環フラグをオンにセットする(ステップS1426)。そして、ロック情報登録手段240は、循環フラグをオンにした内側ロックリスト部61Bおよび外側ロックリスト部61Cからリンクされる循環情報対応表61Dにパターン番号(変数q)およびエントリ番号(対応する循環リスト62Bのエントリ番号)を追加する(ステップS1427)。
【0244】
変数pが示す作業用追加循環リスト220Fが、f番目のエントリより前の作業用追加循環リスト220Fのいずれかと循環が一致している場合(ステップS1422、Yes)、又は、ステップS1427の処理の後、ロック情報登録手段240は、ステップS1428に進む。なお、例えば、変数pが示す作業用追加循環リスト220Fの占有資源がS1、S2、S3の順番のとき、f番目のエントリより前の作業用追加循環リスト220Fの占有資源にS2、S3、S1の順番がある場合などにおいて、循環が一致していると判断する。
【0245】
ステップS1428においては、ロック情報登録手段240は、変数fを1加算する(ステップS1428)。その後、ロック情報登録手段240は、ステップS1420の処理に進む。
【0246】
ステップS1420の処理において、変数fが変数eよりも大きい場合(ステップS1420、Yes)、ロック情報登録手段240は、ステップS1429の処理に進む。また、ステップS1417の処理において、変数sw_newがオンになっていない場合(ステップS1417、No)、ロック情報登録手段240は、ステップS1429の処理に進む。
【0247】
ステップS1429の処理において、ロック情報登録手段240は、スタック登録部63Aの登録数に1加算した値を変数qにセットする(ステップS1429)。また、ロック情報登録手段240は、スタック情報44の内容を未使用のスタック部63Bへコピーする(ステップS1430)。更に、ロック情報登録手段240は、スタック登録部63Aのq番目のエントリに、コピーしたスタック部63Bのアドレスをセットする(ステップS1431)。また、ロック情報登録手段240は、スタック登録部63Aの登録数に、変数qの値をセットする(ステップS1432)。そして、ロック情報登録手段240は、スタック情報44の2つの占有資源の取得順序の全組み合わせのうち、内側ロックリストおよび外側ロックリストの循環フラグがオンになっている取得順序について、当該循環情報対応表61Dからリンクされる循環リスト62Bからリンクされるスタック対応表62Cに、追加したスタック情報のスタック番号と外側の占有資源が登録されているスタック情報中のエントリ番号を追加する(ステップS1433)。その後、ロック情報登録手段240は、処理を終了する。
【0248】
以上が、情報処理装置1の動作の一例である。
【0249】
続いて、
図47乃至
図53を参照して、実際の動作時のロック情報格納領域60の遷移と、デッドロック検証の一例について説明する。
【0250】
まず、
図47で示す[1]受信スタック情報(スタック情報44)を受信したとする。つまり、占有資源確保数3、プロセス番号25、エントリ1「01」「0DDF0014」、エントリ2「01」「0DE00348」、エントリ3「01」「0DE00A14」のスタック情報44を受信したとする。
【0251】
この場合、受信したスタック情報44に格納されている3個の占有資源が資源登録部61Aに登録される。また、スタック情報44のエントリ1、エントリ2、エントリ3の占有資源の内側ロックとして、それぞれ2個、1個、0個の占有資源が内側ロックリスト部61Bに登録される。また、スタック情報44のエントリ1、エントリ2、エントリ3の占有資源の外側ロックとして、それぞれ0個、1個、2個の占有資源が外側ロックリスト部61Cに登録される。また、受信したスタック情報44がスタック登録部63A及びスタック部63Bに登録される。
【0252】
このような状態において、更に、[2]受信スタック情報(スタック情報44)を受信した場合について、
図48で示す。つまり、新たに、占有資源確保数2、プロセス番号10、エントリ1「01」「0DE00A14」、エントリ2「01」「0DE208A8」のスタック情報44を受信したとする。なお、
図48では、[2]受信スタック情報で更新される値を下線部で示している。
【0253】
この場合、
図48を参照すると、スタック情報44のエントリ2の占有資源が、資源登録部61Aに追加されることになる。また、スタック情報44のエントリ1に対応する(つまり、資源登録部61Aのエントリ3に対応する)内側ロックリスト部61Bが追加されることになる。また、スタック情報44のエントリ2に対応する(つまり、資源登録部61Aのエントリ4に対応する)外側ロックリスト部61Cが登録されることになる。更に、受信したスタック情報44がスタック登録部63Aおよびスタック部63Bに追加される。
【0254】
このような状態において、
図49で示すように、更に、[3]受信スタック情報(スタック情報44)を受信したとする。
【0255】
この場合、受信した新たなスタック情報44に基づいて、同様に、内側ロックリスト部61Bおよび、外側ロックリスト部61Cに占有資源が追加されることになる。
【0256】
ここで、
図49の資源登録部61Aのエントリ2及び対応する内側ロックリスト部61B及び外側ロックリスト部61Cを参照する。すると、「0DE00348」を取得する前に「0DDF0014」又は「0DE208A8」を取得しており、「0DE00348」の取得後に「0DE00A14」を取得していることが分かる。同様に、資源登録部61Aのエントリ3によると、「0DE00A14」の取得前に「0DDF0014」又は「0DE00348」を取得しており、「0DE00A14」の取得後に「0DE208A8」を取得していることが分かる。同様に、資源登録部61Aのエントリ4によると、「0DE208A8」の取得前に「0DE00A14」又は「0DDF0014」を取得しており、「0DE208A8」の取得後に「0DE00348」を取得していることが分かる。以上からすると、「0DE00348」の取得後に「0DE00A14」が取得され、「0DE00A14」の取得後に「0DE208A8」が取得され、「0DE208A8」の取得後に「0DE00348」が取得されることが分かる。つまり、資源登録部61Aのエントリ2〜4の占有資源30の取得順序が循環していることになる。そのため、
図49で示す場合、
図50で示すように、循環情報が登録される。
【0257】
図50を参照すると、循環登録部62Aには、パターン数1、循環資源数3で登録されることになる(「0DE00348」、「0DE00A14」、「0DE208A8」の順番で循環するため)。また、循環リスト62Bによると、「0DE208A8」、「0DE00348」の順番を含むスタック情報(スタック情報3)と循環リスト1中のエントリ1が紐付けられていることが分かる。同様に、「0DE00348」、「0DE00A14」の順番を含むスタック情報(スタック情報1)と循環リスト1中のエントリ2が紐付けられていることが分かる。同様に、「0DE00A14」、「0DE208A8」の順番を含むスタック情報(スタック情報2)と循環リスト1中のエントリ3が紐付けられていることが分かる。
【0258】
図50で示す場合、スタック部63Bの各スタック情報を参照すると、スタック情報1とスタック情報3において、循環している占有資源30の組み合わせよりも前に、同一の占有資源30である「0DDF0014」が占有されている。そのため、
図50で示す場合、デッドロック検証手段230は、デッドロックは発生しないと判断することになる。
【0259】
また、上記場合において、更に、[4]受信スタック情報(スタック情報44)を受信したとする。
【0260】
この場合、
図51で示すように、同一の取得順序(「0DE208A8」から「0DE00348」の順番)を格納しているスタック対応表3に、新たなスタック情報を追加することになる。
【0261】
図51で示す場合では、デッドロック検証手段230は、新たに追加された循環である、スタック情報1、スタック情報2、スタック情報4をチェックすることになる。
図51で示す場合、循環している占有資源30の組み合わせよりも前に、同一の占有資源は取得していない。しかしながら、
図51のプロセス排他情報部52を参照すると、スタック情報1のプロセス番号25のプロセス排他情報部52と、スタック情報4のプロセス番号26のプロセス排他情報部52に同一の排他番号が登録されている。そのため、デッドロック検証手段230は、デッドロックは発生しないと判断する。
【0262】
また、上記場合において、更に、[5]受信スタック情報(スタック情報44)を受信したとする。
【0263】
この場合、
図52で示すように、スタック対応表62Cが追加されることになる。そのため、デッドロック検証手段230は、新たに追加された循環である、2つのパターンについて、デッドロックが発生するか否か検証することになる。つまり、デッドロック検証手段230は、スタック情報5、スタック情報2、スタック情報3(パターン1)について検証するとともに、スタック情報5、スタック情報2、スタック情報4(パターン2)について検証することになる。
【0264】
図53で示すように、パターン1の場合、循環している占有資源30の組み合わせよりも前に、同一の占有資源30である「0DDF0014」が占有されている。そのため、パターン1の場合、デッドロック検証手段230は、デッドロックは発生しないと判断する。一方で、パターン2の場合、循環している占有資源30の組み合わせよりも前に、同一の占有資源は取得していない。また、
図53で示すように、プロセス番号は、それぞれ28、10、26であり、全て異なっている。さらに、各プロセス排他情報部52には、同一の排他番号は無い。このため、デッドロック検証手段230は、デッドロックが発生すると判断することになる。なお、
図52、
図53で示す場合、デッドロックが発生するパターンが存在することから、ロック情報格納領域60は更新しないことになる。
【0265】
このように、本実施形態における情報処理装置1は、ロック循環チェック手段220とデッドロック検証手段230とを有している。このような構成により、情報処理装置1は、ロック循環チェック手段220が局所的にデッドロック発生の要件を満たす占有資源30の組み合わせを検出した場合、デッドロック検証手段230により、大域的にデッドロックが発生するか否かを検証することが出来る。その結果、局所的にデッドロック発生の要件を満たす場合でも、大域的にはデッドロックが発生しない場合に、デッドロック発生の可能性があると判断することを防ぐことが可能となる。
【0266】
次に、
図54を参照して、第2の実施形態について説明する。第2の実施形態では、情報処理装置7の構成の概要について説明する。
【0267】
図54を参照すると、本実施形態における情報処理装置7は、処理手段71と監視手段72とを有している。また、監視手段72は、検出手段73と検証手段74とを有している。
【0268】
処理手段71は、プロセスが使用する資源を占有して当該プロセスを実行する。また、処理手段71は、プロセスが占有する資源を示す占有資源情報を監視手段72に送信する。
【0269】
監視手段72は、複数のプロセス実行時にプロセス同士が使用する資源が競合することによりデッドロックが発生するか否かを監視する。
【0270】
検出手段73は、占有資源情報に基づいて、デッドロックを引き起こす可能性のある資源の組み合わせを検出する。また、検証手段74は、検出手段73がデッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する。
【0271】
このように、本実施形態における情報処理装置7は、検出手段73と検証手段74とを有している。このような構成により、情報処理装置7は、検出手段73がデッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、検証手段74により、当該資源の組み合わせによりデッドロックが生じるか否かを検証することが出来る。その結果、デッドロックを引き起こす可能性のある資源の組み合わせがあったとしても、デッドロックが生じない場合に、デッドロック発生の可能性があると判断することを防ぐことが可能となる。
【0272】
なお、上記情報処理装置7は、当該情報処理装置7に所定のプログラムが組み込まれることで実現できる。具体的に、本発明の他の形態であるプログラムは、情報処理装置に、プロセスが使用する資源を占有して当該プロセスを実行する処理手段と、複数のプロセス実行時に、プロセス同士の使用する資源が競合することによりデッドロックが発生するか否かを監視する監視手段と、を実現させ、処理手段は、プロセスが占有する資源を示す占有資源情報を監視手段に送信し、監視手段として、占有資源情報に基づいてデッドロックを引き起こす可能性のある資源の組み合わせを検出する検出手段と、検出手段がデッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する検証手段と、を実現させるためのプログラムである。
【0273】
また、上述した情報処理装置7が作動することにより実行される情報処理方法は、プロセスが使用する資源を占有して当該プロセスを実行し、プロセスが占有する資源を示す占有資源情報を送信し、複数のプロセス実行時に、プロセス同士の使用する資源が競合することによりデッドロックが発生するか否かを監視し、監視は、占有資源情報に基づいてデッドロックを引き起こす可能性のある資源の組み合わせを検出し、デッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する、という方法である。
【0274】
上述した構成を有する、プログラム、又は、情報処理方法、の発明であっても、上記情報処理装置7と同様の作用を有するために、上述した本発明の目的を達成することが出来る。
【0275】
<付記>
上記実施形態の一部又は全部は、以下の付記のようにも記載されうる。以下、本発明における情報処理装置などの概略を説明する。但し、本発明は、以下の構成に限定されない。
【0276】
(付記1)
プロセスが使用する資源を占有して当該プロセスを実行する処理手段と、
複数のプロセス実行時にプロセス同士が使用する資源が競合することによりデッドロックが発生するか否かを監視する監視手段と、を有し、
前記処理手段は、プロセスが占有する資源を示す占有資源情報を前記監視手段に送信するよう構成され、
前記監視手段は、前記占有資源情報に基づいてデッドロックを引き起こす可能性のある複数の前記占有資源情報内の資源の組み合わせを検出する検出手段と、前記検出手段がデッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する検証手段と、を有する
情報処理装置。
【0277】
(付記2)
付記1に記載の情報処理装置であって、
前記検証手段は、前記占有資源情報を蓄積した蓄積情報を参照し、当該蓄積情報に基づいてデッドロックが生じるか否かを検証する
情報処理装置。
【0278】
(付記3)
付記2に記載の情報処理装置であって、
前記蓄積情報には、プロセスが資源を占有してから解放するまでの資源の取得順序を示す資源順序情報が含まれており、
前記検証手段は、前記蓄積情報に含まれる、デッドロックを引き起こす可能性のある資源の組み合わせを含む前記資源順序情報に基づいて、デッドロックが生じるか否かを検証する
情報処理装置。
【0279】
(付記4)
付記3に記載の情報処理装置であって、
前記検証手段は、前記資源順序情報のうち、デッドロックを引き起こす可能性のある資源の組み合わせより前に占有されていた資源に基づいて、デッドロックが生じるか否かを検証する
情報処理装置。
【0280】
(付記5)
付記3又は4に記載の情報処理装置であって、
前記検証手段は、デッドロックを引き起こす可能性のある資源の組み合わせを含む複数の前記資源順序情報の中に、当該デッドロックを引き起こす可能性のある組み合わせより前に同一の資源を占有する前記資源順序情報が含まれている場合、デッドロックは生じないと判断する
情報処理装置。
【0281】
(付記6)
付記1乃至5のいずれかに記載の情報処理装置であって、
前記検証手段は、プロセス間の関係を示すプロセス関係情報を取得し、当該プロセス関係情報に基づいて、デッドロックを引き起こす組み合わせによりデッドロックが生じるか否かを検証する
情報処理装置。
【0282】
(付記7)
付記6に記載の情報処理装置であって、
前記プロセス関係情報は、排他的に動作するプロセスを示すプロセス排他情報を含んでおり、
前記検証手段は、前記プロセス排他情報に基づいて、デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する
情報処理装置。
【0283】
(付記8)
付記1乃至7のいずれかに記載の情報処理装置であって、
前記蓄積情報には、プロセスが資源を占有してから解放するまでの間で最後に占有した資源の占有回数を資源ごとに示す回数情報が含まれており、
前記検出手段は、前記回数情報を使用して、デッドロックを引き起こす可能性のある資源の組み合わせを検出する
情報処理装置。
【0284】
(付記9)
プロセスが使用する資源を占有して当該プロセスを実行し、
プロセスが占有する資源を示す占有資源情報を送信し、
複数のプロセス実行時に、プロセス同士の使用する資源が競合することによりデッドロックが発生するか否かを監視し、
前記監視は、前記占有資源情報に基づいてデッドロックを引き起こす可能性のある複数の前記占有資源情報内の資源の組み合わせを検出し、デッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する
情報処理方法。
【0285】
(付記10)
情報処理装置に、
プロセスが使用する資源を占有して当該プロセスを実行する処理手段と、
複数のプロセス実行時に、プロセス同士の使用する資源が競合することによりデッドロックが発生するか否かを監視する監視手段と、を実現させ、
前記処理手段は、プロセスが占有する資源を示す占有資源情報を前記監視手段に送信し、
前記監視手段として、前記占有資源情報に基づいてデッドロックを引き起こす可能性のある複数の前記占有資源情報内の資源の組み合わせを検出する検出手段と、前記検出手段がデッドロックを引き起こす可能性のある資源の組み合わせを検出した際に、当該デッドロックを引き起こす可能性のある資源の組み合わせによりデッドロックが生じるか否かを検証する検証手段と、を実現させるためのプログラム。
【0286】
なお、上記各実施形態及び付記において記載したプログラムは、記憶装置に記憶されていたり、コンピュータが読み取り可能な記録媒体に記録されていたりする。例えば、記録媒体は、フレキシブルディスク、光ディスク、光磁気ディスク、及び、半導体メモリ等の可搬性を有する媒体である。
【0287】
以上、上記各実施形態を参照して本願発明を説明したが、本願発明は、上述した実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明の範囲内で当業者が理解しうる様々な変更をすることが出来る。