(57)【要約】【課題】スレッドごとに、その実行を制御するスレッド実行制御部を作成し、該スレッド実行制御部が優先度に基づいて選択的に動作することにより、スレッドを切り替えながら実行するマルチスレッドシステムにおいて、優先度の高い２スレッド間で相互遷移してしまい、優先度の低いスレッドが実行対象とならない状況を検知できる新しい枠組みを提供する。【解決手段】監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも低い優先度で動作する動作機会監視部と、前記監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも高い優先度で間欠的に動作する動作異常検知部と、を備え、前記動作異常検知部が、前記動作機会監視部が一定期間以上動作していない場合、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知することを特徴とする。【選択図】図６
2008204011.tif 000002
【特許請求の範囲】
【請求項１】
スレッドごとに、その実行を制御するスレッド実行制御部を作成し、該スレッド実行制御部が優先度に基づいて選択的に動作することにより、スレッドを切り替えながら実行するマルチスレッドシステムであって、
監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも低い優先度で動作する動作機会監視部と、
前記監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも高い優先度で間欠的に動作する動作異常検知部と、を備え、
前記動作異常検知部が、前記動作機会監視部が一定期間以上動作していない場合、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知することを特徴とするマルチスレッドシステム。
【請求項２】
スレッド切替が行われた場合に、監視対象スレッドの動作情報をメモリに記憶する遷移情報保持部を備え、
前記動作異常検知部は、
動作異常を検知した場合に、前記メモリに記憶されるスレッド動作情報に基づいて前記監視対象スレッドの停止順序を決定し、前記決定した停止順序に基づいて前記監視対象スレッドを停止するとともに、前記監視対象スレッドを停止する都度、所定期間にわたって当該動作異常検知部から実行権限が手放されるように制御し、該所定期間中に前記動作機会監視部が動作したことを確認できた場合に、該確認できるまでに停止した前記監視対象スレッドを動作異常の原因可能性スレッドであると判断することを特徴とする請求項１記載のマルチスレッドシステム。
【請求項３】
前記動作異常検知部は、スレッド遷移順序の逆順、実行時間の長い順、動作回数の多い順のうち、いずれかの順序となるように、前記監視対象スレッドの停止順序を決定することを特徴とする請求項２記載のマルチスレッドシステム。
【請求項４】
前記動作異常検知部は、前記メモリに記憶されるスレッド動作情報のうち前記原因可能性スレッドの動作情報をデバッグ情報として出力することを特徴とする請求項２又は３に記載のマルチスレッドシステム。
【請求項５】
マルチスレッドシステムにおけるスレッド動作異常検知方法であって、
前記マルチスレッドシステムは、スレッドごとに、その実行を制御するスレッド実行制御部を作成し、該スレッド実行制御部が優先度に基づいて選択的に動作することにより、スレッドを切り替えながら実行するマルチスレッドシステムであり、
監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも低い優先度で動作する動作機会監視部を作成する工程と、
前記監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも高い優先度で間欠的に動作する動作異常検知部を作成する工程と、
前記動作異常検知部が、前記動作機会監視部が一定期間以上動作していない場合、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知する工程と、を備えることを特徴とするスレッド動作異常検知方法。
【請求項６】
請求項５記載のスレッド動作異常検知方法をコンピュータで実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッドシステムにおけるスレッド動作異常検知技術に関する。
【背景技術】
【０００２】
従来より、様々な情報処理システムにおいて、スレッド又はタスク（以下、まとめて「スレッド」という）を複数生成し、各スレッドに設定されている優先度に基づいてスレッドを切り替えながら実行することが可能なマルチスレッドシステムが採用されている。
【０００３】
このようなマルチスレッドシステムにおけるスレッドの無限ループ等の動作異常を検知する方法として、監視対象となるスレッドとは別に、検知スレッド、監視スレッドを設ける方法が知られている。
【０００４】
例えば、特許文献１には、各タスクの動作状態を監視する監視タスクを優先度ごとに設けると共に、監視タスクの動作状態を監視する検知タスクを設け、検知タスクが監視タスクの動作状態に基づいて優先度ごとのタスクの異常を検知する構成が開示されている。
【特許文献１】特開２００６−１１６８６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかし、上記のように優先度ごとに監視スレッドを設ける場合、優先度のレベル単位での動作異常しか検知できないことに加え、優先度のレベルが増えるとそれに応じて監視スレッドも増加するため、スレッド動作異常を検知するために使用するリソースが増加してしまうという問題がある。
【０００６】
また、例えば優先度のレベルが３以上ある場合に、優先度の高い２レベルのスレッド間で相互遷移を繰り返してしまい、その結果、それら２レベルより優先度の低いレベルのスレッドに実行権限が与えられないといった態様の無限ループが発生する場合があるが（以下、このような無限ループを「複合無限ループ」という）、この場合、優先度の各レベル単体では無限ループは発生していないので、上記のような従来構成によっては動作異常を検知することができない。
【０００７】
更に、特許文献１記載のシステムは、同一優先度に複数の監視対象スレッド（タスク）が存在する場合に、監視スレッドが前記複数の監視対象スレッドを順に実行する構成となっており、監視スレッドによってスレッドの遷移を制御することができるマルチスレッド実行環境を前提としているため、ＯＳがスレッドの遷移を制御する（換言すれば、監視スレッドによってスレッドの遷移を制御できない）マルチスレッド実行環境に対してはそもそも適用することができない。
【０００８】
そこで、本発明は、これら種々の課題を解決することができる新しい枠組みを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明のマルチスレッドシステムは、スレッドごとに、その実行を制御するスレッド実行制御部を作成し、該スレッド実行制御部が優先度に基づいて選択的に動作することにより、スレッドを切り替えながら実行するマルチスレッドシステムであって、監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも低い優先度で動作する動作機会監視部と、前記監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも高い優先度で間欠的に動作する動作異常検知部と、を備え、前記動作異常検知部が、前記動作機会監視部が一定期間以上動作していない場合、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知することを特徴とする。
【００１０】
かかる構成によれば、複数の監視対象スレッド間で複合無限ループが発生した結果、実行対象とならない監視対象スレッドが存在する場合、該実行対象とならない監視対象スレッドよりも優先度の低い動作機会監視部も動作しないことから、動作機会監視部の未動作期間をチェックすることで、複合無限ループの発生を検知することができる。
【００１１】
また、監視対象スレッドの動作異常を検知するために優先度のレベルごとに監視スレッドを設ける必要がないので、スレッド動作異常を検知するために使用するリソースを抑制することができる。
【００１２】
また、動作機会監視部や動作異常検知部がスレッド実行制御部の実行を制御できることを前提としておらず、優先度に基づいてスレッドの遷移を制御するマルチスレッド実行環境であれば、適切に機能する。
【００１３】
好適には、スレッド切替が行われた場合に、監視対象スレッドの動作情報をメモリに記憶する遷移情報保持部を備え、前記動作異常検知部は、動作異常を検知した場合に、前記メモリに記憶されるスレッド動作情報に基づいて前記監視対象スレッドの停止順序を決定し、前記決定した停止順序に基づいて前記監視対象スレッドを停止するとともに、前記監視対象スレッドを停止する都度、所定期間にわたって当該動作異常検知部から実行権限が手放されるように制御し、該所定期間中に前記動作機会監視部が動作したことを確認できた場合に、該確認できるまでに停止した前記監視対象スレッドを動作異常の原因可能性スレッドであると判断する。
【００１４】
この場合、前記動作異常検知部は、スレッド遷移順序の逆順、実行時間の長い順、動作回数の多い順のうち、いずれかの順序となるように、前記監視対象スレッドの停止順序を決定することが望ましい。
【００１５】
また、前記動作異常検知部は、前記メモリに記憶されるスレッド動作情報のうち前記原因可能性スレッドの動作情報をデバッグ情報として出力することが望ましい。
【００１６】
かかる構成によれば、動作異常の原因となった可能性のある監視対象スレッドを適切に決定することができ、その原因となった可能性のある監視対象スレッドの動作情報に基づき、アプリケーションの修正作業を行うことができる。
【００１７】
本発明のスレッド動作異常検知方法は、マルチスレッドシステムにおけるスレッド動作異常検知方法であって、前記マルチスレッドシステムは、スレッドごとに、その実行を制御するスレッド実行制御部を作成し、該スレッド実行制御部が優先度に基づいて選択的に動作することにより、スレッドを切り替えながら実行するマルチスレッドシステムであり、監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも低い優先度で動作する動作機会監視部を作成する工程と、前記監視対象スレッドについて作成されたスレッド実行制御部の優先度よりも高い優先度で間欠的に動作する動作異常検知部を作成する工程と、前記動作異常検知部が、前記動作機会監視部が一定期間以上動作していない場合、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知する工程と、を備えることを特徴とする。
【００１８】
本発明のスレッド動作異常検知方法は、コンピュータにおいてＣＰＵにより実行することができるが、そのためのコンピュータプログラムは、ＣＤ−ＲＯＭ、磁気ディスク、半導体メモリ及び通信ネットワークなどの各種の媒体を通じてコンピュータにインストールまたはロードすることができる。
【発明の効果】
【００１９】
以上、本発明によれば、ＯＳがスレッドの遷移を制御するマルチスレッド実行環境においても、スレッド動作異常を検知するために使用するリソースを抑制しつつ、複合無限ループを検出することができる。
【発明を実施するための最良の形態】
【００２０】
（第１の実施形態）
以下に図面を参照しながら本発明の実施形態を説明する。
【００２１】
図１は、本実施形態におけるマルチスレッドシステム１が構築されるコンピュータ２のハードウェア構成の概略を示す。コンピュータ２は、ＣＰＵ（プロセッサ）、ＲＯＭ、ＲＡＭ、ユーザインタフェース、ＨＤＤなど、通常のコンピュータ装置と同様のハードウェアを備えている。
【００２２】
図２は、本実施形態におけるマルチスレッドシステム１の機能構成の概略を示す。マルチスレッドシステム１は、ＯＳ１０、仮想マシン２０、スレッド情報記憶手段３０などを備えている。
【００２３】
スレッド情報記憶手段３０は、監視対象となるユーザスレッド（アプリケーション上の並列実行の対象となる処理単位；以下、単に「スレッド」又は「監視対象スレッド」と記載した場合、ユーザスレッドを指すものとする）に対応するバイトコード（特定のＯＳやハードウェアに依存しないように定義された命令、又はその集合によって記述された実行形式のプログラム）等の情報を記憶している。
【００２４】
ＯＳ１０及び仮想マシン２０は、各スレッドに設定されている優先度に基づいてスレッドを切り替えながら実行するマルチスレッド実行環境を構築する。例えば、優先度が同じスレッドが２つ存在する場合、一方のスレッドのスレッド実行制御部に実行権限が与えられると、該スレッド実行制御部が実行権限を放棄する（該スレッドが終了する／停止する）まで他方のスレッドへスレッド切換は行われない。また優先度が異なるスレッドが２以上存在する場合、優先度が低いスレッドのスレッド実行制御部は、優先度の高いスレッドのスレッド実行制御部が実行権限を放棄している間のみ、実行権限を得ることができる。従って、優先度が低いスレッドの実行中、優先度の高いスレッドが実行可能になると、該優先度の低いスレッドの実行は停止され、該優先度の高いスレッドが実行されることになる。
【００２５】
このようなマルチスレッド実行環境を実現するために、ＯＳ１０は、Ｌｉｎｕｘ等の従来のＯＳと同様に、スレッドの動作管理のために優先度等の情報を格納するスレッド管理テーブル１１などを備えている。また仮想マシン２０は、Ｊａｖａ（登録商標）仮想マシン等の従来の仮想マシンと同様に、スレッドごとに作成され、その実行を制御するスレッド実行制御部２１などを備えている。
【００２６】
ただし、本実施形態の仮想マシン２０は、図３に示すように、スレッド動作異常検知ユニットとして、監視対象スレッドについて作成されたスレッド実行制御部２１の優先度よりも低い優先度で動作する動作機会監視部２２、監視対象スレッドについて作成されたスレッド実行制御部２１の優先度よりも高い優先度で間欠的に動作する動作異常検知部２３、スレッド切替が行われた場合に、監視対象スレッドの動作情報をメモリに記憶する遷移情報保持部２４を備えている点、及び、動作異常検知部２３が、動作機会監視部２２が一定期間以上動作しない場合に、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知する点で、従来の仮想マシン２０とは異なっている。
【００２７】
なお、仮想マシン２０はＯＳ１０上で動作するソフトウェアによって実現されることから、スレッド実行制御部２１、動作機会監視部２２、動作異常検知部２３、遷移情報保持部２４は、ＯＳ１０上の仮想マシンスレッドとして把握することができる。
【００２８】
また仮想マシン２０のためのプログラムは、コンピュータ２が備えるＲＯＭやＨＤＤ等の不揮発性記憶装置上に記憶されている。またスレッド情報記憶手段３０等はコンピュータ２が備えるＲＯＭやＨＤＤ等の不揮発性記憶装置上に実現され、スレッド管理テーブル１１はコンピュータ２が備えるＲＡＭ上に実現される。
【００２９】
以下、図４〜図６の各フローチャートを参照して、マルチスレッドシステム１におけるスレッド動作異常検知の枠組みを説明する。なお、所定の言語で記述されたアプリケーションソースコードをコンパイルした結果、各スレッドのバイトコードが得られており、スレッド識別情報に対応づけてスレッド情報記憶手段３０に格納されているものとする。また、各工程（符号が付与されていない部分的な工程を含む）は処理内容に矛盾を生じない範囲で任意に順番を変更して又は並列に実行することができる。
【００３０】
（アプリケーションの開始）
仮想マシン２０は、アプリケーションの実行指示を受け付けると、仮想マシンスレッドとして、ｍａｉｎスレッドに対応するスレッド実行制御部２１、動作機会監視部２２、動作異常検知部２３、遷移情報保持部２４を作成する。この場合、ＯＳ１０は、スレッド管理テーブル１１に、ｍａｉｎスレッドに対応するスレッド実行制御部２１、動作機会監視部２２、動作異常検知部２３、遷移情報保持部２４の情報（優先度など）を登録し、それらのステータスをＲｅａｄｙ状態とする。なお、スレッド実行制御部２１等の仮想マシンスレッドは、Ｒｕｎ状態（実行状態）のほか、Ｒｅａｄｙ状態（実行可能状態）、Ｗａｉｔ状態（実行待ち状態）などのステータスを取り得る。
【００３１】
またＯＳ１０は、優先度に基づいてスレッド切換を制御すべく、スレッド管理テーブル１１に登録されるＲｅａｄｙ状態の仮想マシンスレッドから優先度に基づいて１つを選択し、該選択した仮想マシンスレッドをＲｕｎ状態とする（実行権限を与える）。
【００３２】
ここで、本実施形態では、ユーザによって監視対象スレッドに設定できる優先度のレベルはＰ1〜ＰNのＮレベル（Ｐ1がユーザ設定可能な最高レベル、ＰNが設定可能な最低レベル）に限定されている。一方、動作機会監視部２２には、ＰNよりも低いレベルＰMの優先度が設定されており、動作異常検知部２３には、Ｐ1よりも高いレベルＰ0の優先度が設定されている。また、遷移情報保持部２４には、Ｐ0よりも高いレベルの優先度Ｐzが設定されている。
【００３３】
従って、アプリケーションの実行指示を受け付けた段階では、まず優先度Ｐzの遷移情報保持部２４がＲｕｎ状態となる。後述するように、遷移情報保持部２４は動作を開始すると、スレッド切換（遷移）が発生するまでＷａｉｔ状態となり、実行権限が他の仮想マシンスレッドに移行する。
【００３４】
この場合、優先度Ｐ0の動作異常検知部２３がＲｅａｄｙ状態となっていれば、実行権限が与えられてＲｕｎ状態となる。後述するように、動作異常検知部２３は動作を開始すると、一旦スリープしてＷａｉｔ状態となり、実行権限が他の仮想マシンスレッドに移行する。
【００３５】
遷移情報保持部２４及び動作異常検知部２３がＷａｉｔ状態となっている場合、Ｒｅａｄｙ状態となっているスレッド実行制御部２１のうち優先度に基づいて選択されたいずれかがＲｕｎ状態となる。
【００３６】
更に、遷移情報保持部２４、動作異常検知部２３及び各スレッドのスレッド実行制御部２１が全てＷａｉｔ状態となっている場合、動作機会監視部２２がＲｕｎ状態となる。
【００３７】
以下、上記のような優先度に基づくスレッド切換制御が行われることを前提として、各部の処理内容を説明する。
【００３８】
（スレッド実行制御部２１：図４）
実行権限を与えられた（すなわち、Ｒｕｎ状態の）スレッド実行制御部２１は、スレッド情報記憶手段３０を参照して、対応するスレッドのバイトコードを順次、取得する（Ｓ１００）。
【００３９】
Ｓ１００においてバイトコードを取得できなかった場合（読み出すバイトコードが無かった場合）（Ｓ１０１：Ｎｏ）、仮想マシン２０は、Ｒｕｎ状態のスレッド実行制御部２１を解放する（Ｓ１０２）。この場合、ＯＳ１０は、解放されたスレッド実行制御部２１の情報をスレッド管理テーブル１１から削除するとともに、スレッド管理テーブル１１に登録されるＲｅａｄｙ状態の仮想マシンスレッドから優先度に基づいて１つを選択し、該選択した仮想マシンスレッドをＲｕｎ状態とする。なお、スレッド管理テーブル１１にスレッド実行制御部２１が登録されていない場合は、アプリケーションが終了することになる。
【００４０】
一方、バイトコードを取得できた場合（Ｓ１０１：Ｙｅｓ）、スレッド実行制御部２１は、前記取得したバイトコードをコンピュータ２で実行可能なネイティブコードに変換して実行する（Ｓ１０３）。
【００４１】
例えば、前記取得したバイトコードがスレッドの生成を示すものであった場合、Ｒｕｎ状態のスレッド実行制御部２１は、生成スレッドに対応するスレッド実行制御部２１を作成する。この場合、ＯＳ１０は、スレッド管理テーブル１１に生成スレッドに対応するスレッド実行制御部２１の情報を登録し、そのステータスをＷａｉｔ状態とする。
【００４２】
また例えば、前記取得したバイトコードが他のスレッドの開始を示すものであった場合、ＯＳ１０は、スレッド管理テーブル１１を参照し、開始スレッドに対応するスレッド実行制御部２１のステータスをＲｅａｄｙ状態とする。なお、ＯＳ１０は、スリープ時間が経過したスレッド実行制御部２１、ロックを獲得できたスレッド実行制御部２１、イベント待ちのイベントが起きたスレッド実行制御部２１等についても、そのステータスをＲｅａｄｙ状態とする。
【００４３】
Ｓ１０３の工程の後、仮想マシン２０は、Ｒｕｎ状態のスレッド実行制御部２１について処理を続行させるべく、Ｓ１０１に再帰する。
【００４４】
ただし、例えば、Ｓ１００で取得したバイトコードがスレッド切換を発生させるものであった場合（INVOKESTATIC命令によるスリープ関数呼び出し、MONITOR#ENTER命令によるロック確保待ちなど）、ＯＳ１０は、スレッド管理テーブル１１を参照し、Ｒｕｎ状態のスレッド実行制御部２１のステータスをＷａｉｔ状態とする一方、Ｒｅａｄｙ状態のスレッド実行制御部２１から各スレッドの優先度に基づいて１つを選択して、Ｒｕｎ状態とする（スレッドを切り替える）。
【００４５】
この結果、Ｓ１０３の工程を実行したスレッド実行制御部２１は一旦停止し、他の仮想マシンスレッドに実行権限が移ることになる。
【００４６】
（動作機会監視部２２）
実行権限を与えられた動作機会監視部２２は、動作フラグが０の場合、これを１に変更する。一方、動作フラグが１の場合、実質的な処理を行うことなく、実行権限が他に移行するのを待つ。なお、動作フラグは、動作機会監視部２２の動作状況を示すためにＲＡＭ上に準備され（１：動作、０：未動作）、初期値は０であるものとする。
【００４７】
（遷移情報保持部２４：図５）
実行権限を与えられた遷移情報保持部２４は、スレッド切換（遷移）の発生をイベント待ちする（Ｓ２００）。
【００４８】
この場合、上述したように、優先度に基づくスレッド切換制御を行うＯＳ１０は、スレッド管理テーブル１１を参照し、スレッド切換が発生するまで、遷移情報保持部２４のステータスをＷａｉｔ状態に制御する。また、スレッド管理テーブル１１に登録されるＲｅａｄｙ状態の仮想マシンスレッドから優先度に基づいて１つを選択し、該選択した仮想マシンスレッドをＲｕｎ状態とする。一方、スレッド切換が発生すると、ＯＳ１０は、遷移情報保持部２４にスレッド切換イベントの発生を通知し、遷移情報保持部２４のステータスをＲｅａｄｙ状態とする。この場合、遷移情報保持部２４は他の仮想マシンスレッドよりも優先度が高いので、再びＲｕｎ状態となる。
【００４９】
スレッド切換の発生によって再び実行権限が与えられた遷移情報保持部２４は、ＯＳ１０から通知される切換前後の監視対象スレッドの動作情報を遷移情報テーブルに格納する（Ｓ２０１）。
【００５０】
遷移情報テーブルは、監視対象スレッドの動作情報を遷移順に格納するためにＲＡＭ上に準備される。図７に遷移情報テーブルの例を概念的に示す。該例に示すように、遷移情報テーブルには、動作情報として、スレッド識別情報、スレッド名、実行時間、スタック情報などを格納することができ、例えば、Ｓ２０１では、スレッド切換後に実行対象となった監視対象スレッドのスレッド識別情報に対応づけて、スレッド名が格納される。また、スレッド切換前に実行対象となっていた監視対象スレッドのスレッド識別情報、スレッド名に対応づけて、実行時間、スタック情報などが格納される。なお該例では、図においてより上の動作情報ほど、最近に遷移した監視対象スレッドの情報である。
【００５１】
次に、遷移情報保持部２４は、遷移情報テーブルの動作情報格納領域に空きがあるか否かを判断し（Ｓ２０２）、空きがある場合は、Ｓ２００に再帰する。
【００５２】
一方、空きがない場合、遷移情報保持部２４は、遷移情報テーブルに格納される動作情報のうち最も古い動作情報を削除し（Ｓ２０３）、その後、Ｓ２００に再帰する。
【００５３】
（動作異常検知部２３：図６）
実行権限を与えられた動作異常検知部２３は、間欠的に（すなわち、定期的に実行権限の取得／放棄を繰り返すように）動作すべく、一定期間Ｐスリープする（Ｓ３００）。一定期間Ｐは、設計に応じて定めることができ、予めＲＯＭ又はＨＤＤ上に（例えばプログラムの一部として）記憶されているものとする。
【００５４】
この場合、上述したように、優先度に基づくスレッド切換制御を行うＯＳ１０は、スレッド管理テーブル１１を参照し、一定期間Ｐ、動作異常検知部２３のステータスをＷａｉｔ状態に制御する。また、スレッド管理テーブル１１に登録されるＲｅａｄｙ状態の仮想マシンスレッドから優先度に基づいて１つを選択し、該選択した仮想マシンスレッドをＲｕｎ状態とする。一方、一定期間Ｐが経過した時点で、ＯＳ１０は、動作異常検知部２３のステータスをＲｅａｄｙ状態とする。この結果、動作異常検知部２３は遷移情報保持部２４を除く他の仮想マシンスレッドよりも優先度が高いので、遷移情報保持部２４がＲｅａｄｙ状態となっていなければ、再びＲｕｎ状態となる。
【００５５】
一定期間Ｐの経過によって再び実行権限が与えられた動作異常検知部２３は、動作フラグが１であるか０であるかを判断する（Ｓ３０１）。
【００５６】
動作フラグが１の場合、動作異常検知部２３は、これを０に変更するとともに（Ｓ３０２）、連続未動作カウンタを０にリセットし（Ｓ３０３）、Ｓ３００に再帰する。なお、連続未動作カウンタは、動作異常検知部２３による動作機会監視部２２の未動作状態の確認回数（連続未動作回数）を格納するためにＲＡＭ上に準備され、初期値は０であるものとする。
【００５７】
一方、動作フラグが０の場合、動作異常検知部２３は、連続未動作カウンタに１を加算する（Ｓ３０４）。
【００５８】
次に、動作異常検知部２３は、連続未動作カウンタの値が予め定めた閾値Ｔを越えたか否かを判断する（Ｓ３０５）。閾値Ｔは、設計に応じて定めることができ、予めＲＯＭ又はＨＤＤ上に（例えばプログラムの一部として）記憶されているものとする。
【００５９】
閾値Ｔを越えていない場合、動作異常検知部２３は、動作異常が生じていないと判断し、Ｓ３００に再帰する。
【００６０】
一方、閾値Ｔを越えている場合、動作機会監視部２２が一定期間Ｑ（＝Ｐ×Ｔ）以上動作していないことになるので、動作異常検知部２３は、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知する（Ｓ３０６）。このとき、遷移情報保持部２４が、該タイミングにおいて実行対象となっている監視対象スレッドの動作情報を遷移情報テーブルに格納するように構成してもよい。
【００６１】
本実施形態では、動作機会監視部２２の優先度は監視対象スレッドのスレッド実行制御部２１よりも低いので、動作機会監視部２２が動作した場合、全ての監視対象スレッドのスレッド実行制御部２１がＲｅａｄｙ状態でないこと、従って、Ｒｅａｄｙ状態であるにもかかわらずＲｕｎ状態に移行されないスレッド実行制御部２１は存在しないことが保証される。そこで、本実施形態では、動作機会監視部２２が一定期間Ｑ以上動作していない場合、すなわち、一定期間Ｑ以上にわたって上記保証が行われていない場合、Ｒｅａｄｙ状態のままＲｕｎ状態へ移行されないスレッド実行制御部２１（すなわち、実行対象とならない監視対象スレッド）が存在する可能性が高いと判断し、そのような状況を動作異常として検知している。
【００６２】
次に、動作異常検知部２３は、動作異常の原因となっている可能性のあるスレッドを決定する（Ｓ３０７〜Ｓ３１３）。
【００６３】
具体的には、動作異常検知部２３は、遷移情報保持部２４を強制停止する（Ｓ３０７）。
【００６４】
次に、動作異常検知部２３は、遷移情報テーブルに格納される監視対象スレッドの動作情報に基づいて、監視対象スレッドの停止順序を決定する（Ｓ３０８）。
【００６５】
停止順序の決定方法としては、１）スレッド遷移順序の逆順となるように決定する、２）実行時間の長い順となるように決定する、３）動作回数の多い順となるように決定することが考えられる。それぞれ、１）動作異常検知タイミングに動作タイミングが近いスレッドほど、２）実行時間が長いスレッドほど、３）動作回数が多いスレッドほど、動作異常検知時の状況に対して支配的であり、動作異常の原因となっている可能性が高いとの判断基準に基づく。
【００６６】
例えば、図７に示す例では、監視対象スレッドとしてスレッド１〜３の３つが存在しているが、１）スレッド遷移順序の逆順となるように決定する場合であれば、停止順序はスレッド１、スレッド３、スレッド２の順序となる。また、２）実行時間の長い順となるように決定する場合であれば、停止順序はスレッド１（実行時間合計６）、スレッド２（実行時間合計４）、スレッド３（実行時間合計３）の順序となる。また、３）動作回数の多い順となるように決定する場合であれば、停止順序はスレッド１（動作回数３）、スレッド３（動作回数２）、スレッド２（動作回数１）の順序となる。
【００６７】
次に、動作異常検知部２３は、前記決定した停止順序に基づいて、まだ停止されていない監視対象スレッドのうち一つを選択し、該選択した監視対象スレッドを停止する（Ｓ３０９）。この場合、ＯＳ１０は、前記選択した監視対象スレッドに対応するスレッド実行制御部２１のステータスをＷａｉｔ状態に変更する。
【００６８】
次に、動作異常検知部２３は、一定期間Ｒにわたって動作異常検知部２３から実行権限が手放されるように制御すべく、一定期間Ｒスリープする（Ｓ３１０）。一定期間Ｒは、設計に応じて定めることができ、予めＲＯＭ又はＨＤＤ上に（例えばプログラムの一部として）記憶されているものとする。
【００６９】
この場合、上述したように、優先度に基づくスレッド切換制御を行うＯＳ１０は、スレッド管理テーブル１１を参照し、一定期間Ｒ、動作異常検知部２３のステータスをＷａｉｔ状態に制御する。また、スレッド管理テーブル１１に登録されるＲｅａｄｙ状態の仮想マシンスレッドから優先度に基づいて１つを選択し、該選択した仮想マシンスレッドをＲｕｎ状態とする。一方、一定期間Ｒが経過した時点で、ＯＳ１０は、動作異常検知部２３のステータスをＲｅａｄｙ状態とする。この結果、動作異常検知部２３は、遷移情報保持部２４がＲｅａｄｙ状態となっていなければ、再びＲｕｎ状態となる。
【００７０】
一定期間Ｒの経過によって再び実行権限が与えられた遷移情報保持部２４は、動作フラグが１であるか０であるかを判断する（Ｓ３１１）。
【００７１】
動作フラグが０の場合、動作異常検知部２３は、Ｓ３０９に再帰する。
【００７２】
一方、動作フラグが１の場合、すなわち、直近のスリープの一定期間Ｒ中に動作機会監視部２２が動作したことを確認できた場合、動作異常検知部２３は、該確認できるまでに停止した監視対象スレッドを動作異常の原因可能性スレッドであると判断する（Ｓ３１２）。これらを停止したことにより、複合無限ループが解消したと考えられるからである。
【００７３】
次に、動作異常検知部２３は、例えば標準エラー出力に、遷移情報テーブルに格納される監視対象スレッドの動作情報のうち前記原因可能性スレッドの動作情報をデバッグ情報として出力する（Ｓ３１３）。
【００７４】
次に、動作異常検知部２３は、遷移情報保持部２４の強制停止を解除し（Ｓ３１４）、その後、Ｓ３０２に再帰する。なお、デバッグ情報を出力した段階で、アプリケーションを終了するように構成してもよい。
【００７５】
このように本実施形態では、監視対象スレッドよりも低い優先度で動作する動作機会監視部２２と、監視対象スレッドよりも高い優先度で間欠的に動作する動作異常検知部２３とを設けるとともに、動作異常検知部２３が、動作機会監視部２２が一定期間Ｑ以上動作していない場合、実行対象とならない監視対象スレッドが存在する可能性が高いと判断し、動作異常を検知する構成を採用している。
【００７６】
かかる構成によれば、複数の監視対象スレッド間で複合無限ループが発生した結果、実行対象とならない監視対象スレッドが存在する場合、該実行対象とならない監視対象スレッドよりも優先度の低い動作機会監視部２２も動作しないことから、動作機会監視部２２の未動作期間をチェックすることで、複合無限ループの発生を検知することができる。
【００７７】
また、監視対象スレッドの動作異常を検知するための監視スレッドを優先度のレベルごとに設ける必要がないので、スレッド動作異常を検知するために使用するリソースを抑制することができる。
【００７８】
また、本実施形態の構成は、仮想マシンスレッド（例えば、動作機会監視部２２や動作異常検知部２３）が他の仮想マシンスレッド（例えば、スレッド実行制御部２１）の実行を制御できることを前提としておらず、優先度に基づいてスレッドの遷移を制御するマルチスレッド実行環境であれば、適切に機能する。
【００７９】
（変形例）
本発明は、上記実施形態に限定されることなく種々に変形して適用することが可能である。例えば、上記各実施形態では、ユーザインタフェース、ＨＤＤを備えるコンピュータ２上にマルチスレッドシステム１を構築しているが、本発明は、ユーザインタフェース、ＨＤＤを備えていないデバイスにおいても適用可能である。
【００８０】
また例えば、上記実施形態では、優先度に基づいてスレッドを切り替えながら実行するマルチスレッドシステムについて説明しているが、優先度及び時分割制御に基づいてスレッドを切り替えながら実行するマルチスレッドシステムに対して本発明を適用してもよい。
【００８１】
また例えば、上記実施形態では、遷移情報保持部２４がスレッド切換の発生を条件として切換後の監視対象スレッドの動作情報を遷移情報テーブルに格納する構成としているが、遷移情報保持部２４を設ける代わりに、各スレッド実行制御部２１がそれぞれ、スレッド切替が行われた場合に、切換後の監視対象スレッドの動作情報をメモリに記憶する構成（各スレッド実行制御部２１が遷移情報保持部を備える構成）としてもよい。
【００８２】
このような構成を採る場合、例えば、スレッド実行制御部２１は、Ｓ１０３の工程を実行する前に、前回Ｓ１０３の工程が実行されてからスレッド切換が発生したか否かを判断する。該判断方法としては、例えば、前回Ｓ１０３を実行したスレッド実行制御部に対応するスレッドの識別情報、及び今回Ｓ１０３を実行したスレッド実行制御部に対応するスレッドの識別情報をそれぞれＲＡＭに記憶するように構成し、両者が一致しない場合にスレッド切換が発生したと判断することが考えられる。スレッド切換が発生している場合、スレッド実行制御部２１は、自己に対応する監視対象スレッドの動作情報を遷移情報テーブルに格納する。
【００８３】
また例えば、上記実施形態では、動作機会監視部２２の未動作状態の確認回数（連続未動作回数）をカウントし、連続未動作回数が閾値Ｔを超えた場合に動作異常を検知する構成としているが、未動作状態を確認できた場合（動作フラグが０であった場合）に直ちに動作異常を検知する構成としてもよい。なお、一定期間Ｐや閾値Ｔは設計に応じて定めることができ、これらのパラメータを適宜調整することで、複合無限ループの検知感度を柔軟に設定することができる。
【００８４】
また例えば、上記実施形態では、動作機会監視部２２が動作した場合に動作フラグを変更する構成としているが、例えば、動作フラグを変更する代わりに、動作した時点の時間情報（タイマ値など）を記録するように構成してもよい。この場合、動作異常検知部２３は、前記記録された時間情報と現在時間情報とを比較して直接的に未動作期間を求めて動作異常を判断する構成とすることが考えられる。
【００８５】
また、上記実施形態では、優先度に基づくスレッドのスケジューリングをＯＳ１０が実行するマルチスレッド実行環境としているが、該スケジューリングを仮想マシン２０が行うように構成してもよい。また、ＯＳ１０がＬＷＰ（Light Weight Process）に対応している場合は、ＯＳ１０及び仮想マシン２０においてそれぞれスケジューリングを行う２層構造のマルチスレッド実行環境を採用してもよい。また、上記実施形態では、マルチスレッド実行環境をＯＳ１０及び仮想マシン２０によって構築しているが、本発明は必ずしもこのような態様に限られない。例えば、仮想マシンを介さずにＯＳ単体でマルチスレッド実行環境を構築する態様であってもよい。
【図面の簡単な説明】
【００８６】
【図１】本発明の実施形態におけるマルチスレッドシステム１のハードウェア構成を示すブロック図である。
【図２】本発明の実施形態におけるマルチスレッドシステム１の機能構成を示すブロック図である。
【図３】本発明の実施形態における仮想マシン２０の機能構成を示すブロック図である。
【図４】本発明の実施形態におけるスレッド実行制御部２１の処理を説明するためのフローチャートである。
【図５】本発明の実施形態における遷移情報保持部２４の処理を説明するためのフローチャートである。
【図６】本発明の実施形態における動作異常検知部２３の処理を説明するためのフローチャートである。
【図７】遷移情報テーブルの例を説明するための図である。
【符号の説明】
【００８７】
１  マルチスレッドシステム；２  コンピュータ；１０  ＯＳ；２０  仮想マシン；２１  スレッド実行制御部；２２  動作機会監視部；２３  動作異常検知部；２４  遷移情報保持部；３０  スレッド情報記憶手段
【図１】
2008204011.tif 000003
【図２】
2008204011.tif 000004
【図３】
2008204011.tif 000005
【図４】
2008204011.tif 000006
【図５】
2008204011.tif 000007
【図６】
2008204011.tif 000008
【図７】
2008204011.tif 000009