(57)【要約】【課題】１つのプログラムの実行が正常であるか否かを従来よりも容易に監視できるようにする。【解決手段】モジュール１Ｍの１つまたは複数の箇所に動作ポイント値３Ｐを示す動作ポイントコード２Ｐを予め記述しておき、モジュール１Ｍの実行中に実行位置が動作ポイントコード２Ｐの箇所になった場合に、その動作ポイントコード２Ｐが示す動作ポイント値３Ｐをカウンタにカウントさせ、カウンタがカウントした数値とスコア値３Ｓとの差が所定の数値でない場合に、モジュール１Ｍが正常に実行されていないと判別する。【選択図】図３
2008040973.tif 000002
【特許請求の範囲】
【請求項１】
プログラムの実行が正常であるか否か監視するプログラム監視方法であって、
前記プログラムの１つまたは複数の箇所に第一の数値を示すコードを予め記述しておき、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウンタにカウントさせ、
前記カウンタがカウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する、
ことを特徴とするプログラム監視方法。
【請求項２】
前記プログラムの前記箇所ごとの前記コードに係る前記第一の数値を互いに異なるように記述しておく、
請求項１記載のプログラム監視方法。
【請求項３】
同時期に実行する複数の前記プログラムごとに前記カウンタを用意しておき、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値を当該プログラムに係る前記カウンタにカウントさせる、
請求項１または請求項２記載のプログラム監視方法。
【請求項４】
１つまたは複数の箇所に第一の数値を示すコードが記述されたプログラムを実行するプログラム実行手段と、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウントするカウント手段と、
前記カウント手段がカウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する、異常判別手段と、
を有することを特徴とするコンピュータ。
【請求項５】
１つまたは複数の箇所に第一の数値を示すコードが記述されたプログラムを実行する機能を有するコンピュータに用いられる異常監視用プログラムであって、
前記コンピュータに、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウントする処理を実行させ、
カウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する処理を実行させる、
ことを特徴とする異常監視用プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの実行が正常であるか否かを監視する方法などに関する。
【背景技術】
【０００２】
従来より、コンピュータにおけるプログラムの実行が正常であるか否かを監視する方式および方法が提案されている。
【０００３】
特許文献１に記載される方式によると、複数のファームウェアモジュール間のエントリごとに分岐アドレス、上限アドレス、下限アドレス、モジュール種別、および階層レベルを設けて格納するためのモジュール間コールテーブルと、前記ファームウェアモジュールごとに種別番号を割り当て、実行中の種別を保持するための実行種別レジスタと、前記ファームウェアモジュール間の階層構造を示す階層レベルを設け、実行中のレベルを保持するための実行レベルレジスタと、前記上限アドレスおよび前記下限アドレスをそれぞれ保持するための上限／下限レジスタ手段と、前記ファームウェアモジュールの内部で、前記モジュール間コールテーブルのアドレスを有して前記モジュール種別および前記階層レベルを読み出すことができる分岐命令の前記分岐アドレスが前記上限アドレスと前記下限アドレスとにより囲まれた範囲外であることを検出するとともに、前記モジュール種別および前記階層レベルの無効性を検出するための検出手段とを具備する。
【０００４】
特許文献２に記載される方法によると、計算機システムの、連係動作する各プログラムに一意に決まるプログラム番号を付加し、各プログラムのメモリ２５上での開始番地と領域の大きさを記録しておく対応表２６をもち、被呼出側プログラムは、スタック２４からリターンアドレスを読み出し、前記対応表２６から求めた呼出側プログラムの番号と被呼出側プログラムの番号をスタック２４に保存してから本来の処理を実行し、その処理終了後にスタック２４上から被呼出側プログラムの番号を読み出し自プログラムの番号と比較し、一致し、かつ呼出側プログラムの番号と対応表より求めた呼出側プログラムのアドレスの範囲にリターンアドレスが含まれている場合にのみ呼出側プログラムに動作復帰させるようにする。
【０００５】
特許文献３に記載される方法によると、ＣＰＵ１２がプログラムのループ開始端で出力するラップタイムパルスＬＴＰの周期を監視し、このパルス周期が正規の範囲を逸脱したときにループ処理シーケンス異常信号を出力することにより、ループ処理周期の異常から暴走を発見するとともに、ＣＰＵ１２がプログラム内要所に組み込まれたステップを実行するつど出力するフラグパルスＦＰを監視し、一定ループ数が実行された時点でフラグパルスＦＰの積算値が正規の数値に一致しない場合にステップ処理シーケンス異常信号を出力することにより、ＣＰＵ監視装置１１がプログラムの実行状況にまで踏み込んだＣＰＵ監視を行う。
【特許文献１】特開昭６３−２５０７４０号公報
【特許文献２】特開平４−３３２０５５号公報
【特許文献３】特開平６−１６８１６３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかし、上に挙げた従来の方式および方法では、次のような問題点がある。特許文献１に記載される方式によると、ファームウェアモジュール同士の関連性についての情報を管理しなければならず、仕組みが複雑である。
【０００７】
特許文献２に記載される方法によると、プログラムの連携処理を行う時点でプログラムが暴走しているか否かを検出できる。しかし、１つのプログラムが正常に実行されたか否かを判別することはできない。
【０００８】
特許文献３に記載される方法によると、実行が必要なコードの未実行の異常を検出することが難しい。
【０００９】
本発明は、このような問題点に鑑み、１つのプログラムの実行が正常であるか否かを従来よりも容易に監視できるようにすることを目的とする。
【課題を解決するための手段】
【００１０】
本発明に係るプログラム監視方法は、プログラムの実行が正常であるか否か監視するプログラム監視方法であって、前記プログラムの１つまたは複数の箇所に第一の数値を示すコードを予め記述しておき、前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウンタにカウントさせ、前記カウンタがカウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する、ことを特徴とする。
【００１１】
好ましくは、前記プログラムの前記箇所ごとの前記コードに係る前記第一の数値を互いに異なるように記述しておく。
【００１２】
または、同時期に実行する複数の前記プログラムごとに前記カウンタを用意しておき、前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値を当該プログラムに係る前記カウンタにカウントさせる。
【発明の効果】
【００１３】
本発明によると、１つのプログラムの実行が正常であるか否かを従来よりも容易に監視することができる。請求項２の発明によると、プログラムのどの箇所についての異常が発生したのかを容易に推定することができる。請求項３の発明によると、同時期に複数のプログラムを起動するコンピュータにおいても、これらのプログラムの監視を容易に行うことができる。
【発明を実施するための最良の形態】
【００１４】
図１はコンピュータ１の外観およびハードウェア構成の例を示す図、図２はコンピュータ１にインストールされているソフトウェアの構成の例を示す図、図３はモジュール１Ｍの構成の例を示す図である。
【００１５】
コンピュータ１は、図１（ａ）に示すように、コンピュータ本体１０、ディスプレイ１１、キーボード１２、およびマウス１３などによって構成される。
【００１６】
コンピュータ本体１０は、図１（ｂ）に示すように、ＣＰＵ１０ａ、ＲＡＭ１０ｂ、ＲＯＭ１０ｃ、ハードディスク１０ｄ、画像インタフェース１０ｅ、入出力インタフェース１０ｆ、およびＬＡＮカード１０ｇなどによって構成される。コンピュータ１として、パーソナルコンピュータまたはワークステーションなどが用いられる。なお、本実施形態では、ＣＰＵ１０ａが１つである場合を例に説明する。
【００１７】
ハードディスク１０ｄには、図２に示すようにオペレーティングシステム１Ｓおよび複数のモジュール１Ｍなどがインストールされている。
【００１８】
オペレーティングシステム１Ｓは、コンピュータ１のシステム全体の管理および基本的なユーザインタフェースなどを提供する。特に、本実施形態に係るコンピュータ１のオペレーティングシステム１Ｓには、モジュール切替制御部１０１、モジュール実行監視部１０２、レジスタテーブル管理部１０３、異常対処処理部１０４などの機能を実現するためのプログラムおよびデータが含まれている。
【００１９】
モジュール１Ｍは、コンピュータ１に応用的な機能を実現させるためのプログラムである。また、これらのモジュール１Ｍには、図３に示すように、１つまたは複数の箇所に、本発明に係るプログラム監視方法による監視を行うための２種類のコードが予め埋め込まれている。
【００２０】
一方の種類のコードには、「ＰＯＩＮＴ」という文字列および定数値が示されている。以下、このコードを「動作ポイントコード２Ｐ」と記載し、この定数値を「動作ポイント値３Ｐ」と記載する。
【００２１】
もう一方の種類のコードには、「ＳＣＯＲＥ」という文字列および定数値が示されている。この定数値は、そのモジュール１Ｍが正常に実行された場合に参照される動作ポイントコード２Ｐが示す動作ポイント値３Ｐの合計値である。なお、そのモジュール１Ｍを実行した場合に同一の動作ポイントコード２Ｐが複数回参照されるのであれば、その回数分、その動作ポイントコード２Ｐの動作ポイント値３Ｐを合計しておく。以下、このコードを「スコアコード２Ｓ」と記載し、この定数値を「スコア値３Ｓ」と記載する。
【００２２】
動作ポイントコード２Ｐおよびスコアコード２Ｓは、モジュール１Ｍのコーディングの作業を行う際に埋め込んでもよいが、既製のモジュール１Ｍに新たにモジュール１Ｍを埋め込むこともできる。この場合は、モジュール１Ｍの内容をディスプレイ１１に表示させ、動作ポイントコード２Ｐを埋め込む場所をユーザが任意に指定できるようにすればよい。また、動作ポイントコード２Ｐに係る動作ポイント値３Ｐもユーザが任意に指定できるようにしてもよい。スコアコード２Ｓは所定の場所に自動的に埋め込めばよい。スコアコード２Ｓのスコア値３Ｓは、各動作ポイント値３Ｐに基づいて決定すればよい。
【００２３】
動作ポイントコード２Ｐおよびスコアコード２Ｓがどのように使用されるのかについては、後に説明する。
【００２４】
オペレーティングシステム１Ｓおよび各モジュール１Ｍは、必要に応じてＲＡＭ１０ｂにロードされ、ＣＰＵ１０ａによって実行される。
【００２５】
図４は１つのモジュール１Ｍに対して用意されるレジスタおよびテーブルの組合せの例を示す図、図５はモジュール１Ｍの実行の監視の処理の流れの例を説明するフローチャートである。
【００２６】
次に、図２に示す各部の機能について詳細に説明する。
【００２７】
モジュール切替制御部１０１は、複数のモジュール１Ｍが起動している場合に、ＣＰＵ１０ａに処理させるモジュール１Ｍを切り替えるための制御を行う。つまり、マルチタスクの処理を行う。切り替える方式は、プリエンプティブマルチタスクの方式および疑似マルチタスクの方式のどちらでも構わない。
【００２８】
モジュール実行監視部１０２は、モジュール１Ｍが正常に実行されたか否かの監視を行う。レジスタテーブル管理部１０３は、監視の対象であるモジュール１Ｍごとに、図４に示すような実行位置レジスタＲＧＪ、スコアレジスタＲＧＳ、および動作ポイントテーブルＴＬＰを１組用意し管理する。さらに、現在どのモジュールがＣＰＵ１０ａによる実行の対象になっているのか（つまり、どのモジュール１Ｍがアクティブであるのか）を示す実行中モジュールレジスタＲＧＭを管理する。
【００２９】
異常対処処理部１０４は、モジュール１Ｍが正常に実行されていないことつまりモジュール１Ｍの異常がモジュール実行監視部１０２によって検出された場合に、その異常に対処するための処理を実行する。
【００３０】
モジュール実行監視部１０２、レジスタテーブル管理部１０３、および異常対処処理部１０４は、図５のフローチャートのような手順でそのモジュール１Ｍの監視および異常時の対処のための処理を行う。
【００３１】
モジュール１Ｍが起動されると、モジュール実行監視部１０２は、そのモジュール１Ｍの動作ポイントテーブルＴＬＰの何らかの数値が格納されている欄のうちの一番下の欄（以下、「動作ポイントテーブルＴＬＰの最下欄」と記載する。）の値が「０」でないかどうかをチェックする（＃１）。後に説明するように、もしも、モジュール１Ｍの実行が正常に完了すれば、動作ポイントテーブルＴＬＰの最下欄には「０」が格納される。したがって、「０」でない場合は、そのモジュール１Ｍを前回実行した際に異常が発生したにも関わらずその異常に対処するための処理が実行されなかったと考えられる。なお、その原因として、モジュール１Ｍの実行途中における再度の呼出または不当なジャンプなどが考えられる。ただし、初めてモジュール１Ｍを実行する場合は、動作ポイントテーブルＴＬＰのすべての欄は空白である。
【００３２】
そこで、動作ポイントテーブルＴＬＰの欄のうちのいずれかに何らかの数値が格納されておりかつ動作ポイントテーブルＴＬＰの最下欄が「０」でない場合は（＃２でＮｏ）、異常対処処理部１０４は、そのモジュール１Ｍの前回の異常に対処するための処理を行う（＃１３）。係る処理の内容は、後に説明する。
【００３３】
一方、動作ポイントテーブルＴＬＰの最下欄が「０」でありまたは動作ポイントテーブルＴＬＰのすべての欄が空白である場合は（＃２でＹｅｓ）、レジスタテーブル管理部１０３は、そのモジュール１Ｍの実行位置レジスタＲＧＪ、スコアレジスタＲＧＳ、および動作ポイントテーブルＴＬＰの全欄をリセットして空白にすることによって初期設定を行い（＃３）、そのモジュール１Ｍのスコアコード２Ｓに係るスコア値３Ｓ（図３参照）を、動作ポイントテーブルＴＬＰの先頭の欄に取り込む（＃４）。そして、そのモジュール１Ｍの実行を開始させる。なお、この時点では、動作ポイントテーブルＴＬＰの最下欄は、スコア値３Ｓが取り込まれた欄である。
【００３４】
原則として、そのモジュール１Ｍの記述言語の規則に従って、そのモジュール１Ｍに記述されているコードが従来通りに順次実行される。
【００３５】
つまり、実行位置のコードがスコアコード２Ｓでも動作ポイントコード２Ｐでもない場合は（＃５でＮｏ）、従来通り、そのコードに基づく処理が実行される（＃８）。
【００３６】
ただし、実行位置のコードが動作ポイントコード２Ｐである場合は（＃５でＹｅｓ）、レジスタテーブル管理部１０３は、現在の動作ポイントテーブルＴＬＰの最下欄の値からその動作ポイントコード２Ｐに係る動作ポイント値３Ｐを減算した値を、その下の欄に格納する（＃６）。つまり、動作ポイントテーブルＴＬＰの最新の値からその動作ポイント値３Ｐの分だけカウントダウンする。このように、動作ポイントテーブルＴＬＰは、カウンタの役割を果たしている。また、この際に、そのモジュール１ＭのスコアレジスタＲＧＳに、その動作ポイント値３Ｐを格納する（＃７）。
【００３７】
モジュール１Ｍの実行中、実行位置が移動するごとに、移動した位置を示す情報をそのモジュール１Ｍの実行位置レジスタＲＧＪに格納する。このように、実行位置レジスタＲＧＪは、モジュール１Ｍのポインタの役割を果たす。
【００３８】
なお、既に実行位置レジスタＲＧＪおよびスコアレジスタＲＧＳに何らかの値が格納されている場合は、それを削除し、最新の実行位置および動作ポイント値３Ｐを格納し直す。つまり、上書きする。また、実行位置を示す情報として、アドレスまたは行番号などが用いられる。または、「’」、「／＊」、または「ＲＥＭ」などのコードによって記述されるコメント文を用いてもよい。
【００３９】
そのモジュール１Ｍを実行し終わるまで（＃９でＮｏ）、実行位置の各コードに基づいてステップ＃６、＃７の処理またはステップ＃８の処理のいずれかが実行される。そうすると、動作ポイントテーブルＴＬＰには、カウントダウンされた値が次々に格納されていく。
【００４０】
そのモジュール１Ｍを実行し終わったら（＃９でＹｅｓ）、モジュール実行監視部１０２は、動作ポイントテーブルＴＬＰの最下欄の値が「０」であるか否かをチェックする（＃１０）。そして、「０」であれば（＃１１でＹｅｓ）、そのモジュール１Ｍが正常に実行されたと判別する（＃１２）。
【００４１】
一方、「０」でない場合は（＃１１でＮｏ）、モジュール実行監視部１０２はそのモジュール１Ｍが正常に実行されなかったと判別し、異常対処処理部１０４はそのモジュール１Ｍの異常に対処するための処理を実行する（＃１３）。係る処理として、異常対処処理部１０４は、例えば、異常が発生した旨を管理者に通知する処理、どの箇所でどのような異常が発生したのかを特定する処理、そのモジュール１Ｍに関連する他のモジュール１Ｍの実行を停止する処理、またはハードウェアまたはソフトウェアの設定値をそのモジュール１Ｍの実行前の状態にリカバリ（回復）する処理などを実行する。異常対処処理部１０４がこれらの処理を実行した後、レジスタテーブル管理部１０３は、動作ポイントテーブルＴＬＰの最下欄に「０」を格納する（＃１４）。
【００４２】
図６は図３に示す構成を有するモジュール１Ｍの監視を行う際のコンピュータ１の処理の流れの例を説明するフローチャート、図７は動作ポイントテーブルＴＬＰの変化の例を示す図である。
【００４３】
ここで、図３に示すモジュール１Ｍを実行した場合を例に、モジュール実行監視部１０２、レジスタテーブル管理部１０３、および異常対処処理部１０４の具体的な処理の流れを、図６に示すフローチャートおよび図７に示す動作ポイントテーブルＴＬＰなどの遷移を参照して説明する。
【００４４】
モジュール実行監視部１０２は、図５のステップ＃１で説明したように、最初にそのモジュール１Ｍの動作ポイントテーブルＴＬＰを参照することによって、前回そのモジュール１Ｍを実行した際に異常が発生したにも関わらずその異常に対処するための処理が実行されなかったかどうかをチェックする（＃２０１）。
【００４５】
異常が発生したにも関わらずその異常に対処するための処理が実行されなかった場合は（＃２０２でＹｅｓ）、異常対処処理部１０４はその処理を実行し（＃２１４）、レジスタテーブル管理部１０３は動作ポイントテーブルＴＬＰの最下欄に「０」を格納する（＃２１５）。
【００４６】
一方、その対処の処理が実行された場合または前回そのモジュール１Ｍを実行した際に異常が発生しなかった場合は（＃２０２でＮｏ）、そのモジュール１Ｍの実行位置レジスタＲＧＪ、スコアレジスタＲＧＳ、および動作ポイントテーブルＴＬＰを図７（ａ）のようにリセットし（＃２０３）、そのモジュール１Ｍのスコアコード２Ｓに係るスコア値３Ｓつまり「４０」を図７（ｂ）のように動作ポイントテーブルＴＬＰの先頭の欄に格納する（＃２０４）。
【００４７】
モジュール１Ｍの実行を開始すると、図３に示すソースによると、まず、処理α１用のコード群に基づいて処理α１が行われる（＃２０５）。そして、レジスタテーブル管理部１０３は、そのコード群の次に記述されている動作ポイントコード２Ｐ１を参照し、図７（ｂ）の動作ポイントテーブルＴＬＰの最下欄の値からその動作ポイントコード２Ｐ１に係る動作ポイント値３Ｐ１つまり「１０」を減算した値を、図７（ｃ）のように、その下の欄に格納する（＃２０６）。この際に、実行位置レジスタＲＧＪおよびスコアレジスタＲＧＳに、それぞれ、その実行位置を示す情報およびその動作ポイント値３Ｐ１を格納しておく。
【００４８】
さらに、図３に示すソースによると、処理α２用のコード群に基づいて処理α２が行われる（＃２０７）。そして、レジスタテーブル管理部１０３は、そのコード群の次に記述されている動作ポイントコード２Ｐ２を参照し、図７（ｃ）の動作ポイントテーブルＴＬＰの最下欄の値からその動作ポイントコード２Ｐ２に係る動作ポイント値３Ｐ２つまり「１７」を減算した値を、図７（ｄ）のように、その下の欄に格納する（＃２０８）。この際に、実行位置レジスタＲＧＪおよびスコアレジスタＲＧＳに、それぞれ、その実行位置を示す情報およびその動作ポイント値３Ｐ２を格納しておく。
【００４９】
さらに、同様に、処理α３が行われた後（＃２０９）、レジスタテーブル管理部１０３は、その次に記述されている動作ポイントコード２Ｐ３を参照し、図７（ｄ）の動作ポイントテーブルＴＬＰの最下欄の値からその動作ポイントコード２Ｐ３に係る動作ポイント値３Ｐ３つまり「１３」を減算した値を、図７（ｅ）のように、その下の欄に格納する（＃２１０）。この際に、実行位置レジスタＲＧＪおよびスコアレジスタＲＧＳに、それぞれ、その実行位置を示す情報およびその動作ポイント値３Ｐ３を格納しておく。
【００５０】
そのモジュール１Ｍに基づく処理が終了したら、モジュール実行監視部１０２は、動作ポイントテーブルＴＬＰの最下欄の値が「０」であるか否かをチェックする（＃２１１）。そして、「０」であれば（＃２１２でＹｅｓ）、そのモジュール１Ｍが正常に実行されたと判別する（＃２１３）。
【００５１】
「０」でない場合は（＃２１２でＮｏ）、そのモジュール１Ｍの実行中、何らかの異常が発生したと判別する。そして、異常対処処理部１０４はその異常に対処するための処理を行い（＃２１４）、レジスタテーブル管理部１０３は動作ポイントテーブルＴＬＰの最下欄に「０」を格納する（＃２１５）。
【００５２】
異常対処処理部１０４は、そのモジュール１Ｍのどの箇所でどのような異常が発生したのかを、動作ポイントテーブルＴＬＰの最下欄の値に基づいて推定することができる。例えば、その値が「１０」である場合は、処理α１が実行されずに処理α２のコード群にジャンプされてしまったと推定することができる。または、その値が「−１０」である場合は、不当なループによって処理α１が１回余計に実行されてしまったと推定することができる。
【００５３】
このように推定することを容易にするために、１つのモジュール１Ｍに記述される各動作ポイントコード２Ｐに係る動作ポイント値３Ｐを、例えば図３の動作ポイント値３Ｐ１、３Ｐ２、３Ｐ３のように、互いに異なるように設定しておくのが望ましい。さらに、これらの動作ポイント値３Ｐを、互いに素になるように設定しておくの望ましい。また、ループの回数が多い場合は、その回数よりも大きい、互いに素である値を、設定しておくのが望ましい。または、例えば、動作ポイント値３Ｐ１、３Ｐ２、３Ｐ３をそれぞれ「１」、「１００」、「１００００」のように、互いに桁数の違う数値を設定しておいてもよい。
【００５４】
〔複数のモジュール１Ｍを並行して実行する場合〕
前に説明したように、モジュール切替制御部１０１は、モジュール１Ｍを複数のモジュール１Ｍが起動され実行される場合に、適宜、ＣＰＵ１０ａに処理させるモジュール１Ｍを切り替える。このような場合は、モジュール実行監視部１０２、レジスタテーブル管理部１０３、および異常対処処理部１０４は、起動中のそれぞれのモジュール１Ｍについて、前に説明した処理を行う。以下、モジュール１Ｍ１、１Ｍ２、および１Ｍ３が同時期に起動され実行される場合を例に、図２の各部の処理内容について説明する。
【００５５】
レジスタテーブル管理部１０３は、図４で説明した実行位置レジスタＲＧＪ、スコアレジスタＲＧＳ、および動作ポイントテーブルＴＬＰの組合せを、モジュール１Ｍ１、１Ｍ２、および１Ｍ３のそれぞれに対して用意し管理する。
【００５６】
前に述べたようにＣＰＵ１０ａは１つなので、複数のモジュール１Ｍが同時に実行されることはない。モジュール切替制御部１０１によって切り替えられたモジュール１Ｍのみが実行される。
【００５７】
モジュール切替制御部１０１によって、実行の対象があるモジュール１Ｍに切り替えられると、レジスタテーブル管理部１０３は、そのモジュール１Ｍの識別情報（例えば、モジュール名）を実行中モジュールレジスタＲＧＭに格納する。既に何らかの識別情報が格納されている場合は、上書きする。例えば、実行中モジュールレジスタＲＧＭにモジュール１Ｍ２の識別情報が格納されているが、モジュール切替制御部１０１によって実行対象がモジュール１Ｍ２に切り替えられたら、モジュール１Ｍ１の識別情報を上書きする。
【００５８】
モジュール実行監視部１０２、レジスタテーブル管理部１０３、および異常対処処理部１０４は、モジュール１Ｍ１、１Ｍ２、および１Ｍ３のそれぞれについて、図５などで説明した、監視処理を並列的に行う。ただし、係る処理も、複数、同時に実行することはできない。そこで、実行中モジュールレジスタＲＧＭに現在示されるモジュール１Ｍに係る監視処理を実行し、それ以外のモジュール１Ｍに係る監視処理は一時停止させておく。
【００５９】
〔モジュールにサブモジュールが含まれる場合〕
図８はサブモジュールを含む場合のモジュール１Ｍの構成の例を示す図、図９はサブモジュール１Ｎの構成の例を示す図、図１０は図８に示す構成を有するモジュール１Ｍの監視を行う際のコンピュータ１の処理の流れの例を説明するフローチャート、図１１は図９に示す構成を有するサブモジュール１Ｎの実行中におけるコンピュータ１の処理の流れの例を説明するフローチャートである。
【００６０】
図８に示すように、モジュール１Ｍの中に図９のようなサブモジュール１Ｎをサブルーチンとして呼び出すコードが含まれている場合がある。この場合において、そのサブモジュールの実行の不具合の有無を監視したいのであれば、そのモジュール１Ｍに、そのサブモジュールを呼び出すコードと対応付けて動作ポイントコード２Ｐを記述しておけばよい。
【００６１】
また、この場合において、モジュール実行監視部１０２、レジスタテーブル管理部１０３、および異常対処処理部１０４は、図１０および図１１に示すような手順でそのモジュール１Ｍの実行の監視を行えばよい。
【００６２】
図１０において、ステップ＃３０１〜＃３０８の処理は、前に図６で説明したステップ＃２０１〜＃２０８の処理内容と同様であるので、説明を省略する。モジュール１Ｍの記述に従って、処理α１、α２の実行後、従来通り、サブモジュール１Ｎがコールされ実行される。
【００６３】
すると、サブモジュール１Ｎに記述されるコードに従って処理βが実行される（図１１の＃３２１）。そして、レジスタテーブル管理部１０３は、そのモジュール１Ｍの動作ポイントテーブルＴＬＰの最下欄の値からそのサブモジュール１Ｎに記述されている動作ポイントコード２Ｐに係る動作ポイント値３Ｐを減算した値を、その下の欄に格納する（３２２）。
【００６４】
図１０に戻って、サブモジュール１Ｎの実行が完了し、さらにモジュール１Ｍの実行が完了したら、サブモジュール１Ｎを含むモジュール１Ｍが正常に行われたか否かの判定の処理を行い、異常があればそれに対処するための処理を行う（＃３１０〜＃３１４）。これらの処理の内容は、前に説明した図６の＃２１１〜＃２１５の処理の内容と同様である。
【００６５】
本実施形態によると、１つのモジュール１Ｍの中にスコアコード２Ｓおよび動作ポイントコード２Ｐを埋め込んでおく。そして、そのモジュール１Ｍの実行が正常であるか否かを、実行位置が示した各動作ポイントコード２Ｐに係る動作ポイント値３Ｐの合計値およびスコアコード２Ｓに係るスコア値３Ｓだけを参照して判別する。よって、１つのプログラムの実行が正常であるか否かを従来よりも容易に監視することができる。
【００６６】
異常ループまたは論理的に実行が必要なコードの未実行などの異常が発生した場合であっても、その異常を検出することができる。しかも、どの箇所でどのような異常が発生したのかを容易に推定することができる。モジュールにサブモジュールが含まれる場合であっても、それらを容易に推定することができる。つまり、本実施形態によると、コールおよびリターンの論理的なマッチングに対応することができる。
【００６７】
マルチタスクまたはマルチスレッドなどを採用したコンピュータであっても、本来のモジュール１Ｍ（プログラム）の実行にほとんど影響を及ぼすことなく、監視を行うことができる。同時期に多数のモジュール１Ｍが実行される場合であっても、その数に応じてカウンタすなわち動作ポイントテーブルＴＬＰを増やすだけでよいので、コンピュータ１の資源の消費を抑えることができる。どのモジュール１Ｍで異常が発生したのかを特定することも容易である。
【００６８】
本実施形態では、コンピュータ１としてパーソナルコンピュータまたはワークステーションが用いられる場合を例に説明したが、本発明は、他の形態のコンピュータにも適用可能である。例えば、ルータ、モデム、カーナビゲーション端末、携帯電話端末、プログラム制御の電化製品、またはＰＤＡ（Personal Digital Assistant）などに組み込まれているファームウェア（組み込みプログラム）の実行が正常であるか否かを監視するためにも適用することができる。
【００６９】
本実施形態では、プログラムの単位が「モジュール」である場合を例に説明したが、本発明は、「アプリケーション」のように、モジュールよりも大きな単位のプログラムを監視するためにも適用可能である。
【００７０】
モジュール１Ｍの中に分岐またはループがある場合は、実行される処理またはその回数が条件によって異なる場合がある。そうすると、スコア値３Ｓが１つだけであると、モジュール１Ｍが正常に終了したにも関わらず、動作ポイントテーブルＴＬＰの最下欄の値が「０」にならない場合がある。そこで、スコア値３Ｓおよび動作ポイントテーブルＴＬＰを、実行されると予期される処理またはその回数に応じて複数組用意しておき、スコア値３Ｓごとにカウントダウンを行い、いずれか１つでも「０」になればモジュール１Ｍが正常に実行されたと判別し、すべて「０」以外の数値になれば異常が発生したと判別してもよい。
【００７１】
本実施形態では、実行した処理に対応する動作ポイント値３Ｐをスコア値３Ｓから減算し、モジュール１Ｍの実行後に残りの数値が「０」になったか否かで、モジュール１Ｍの実行が正常であるか否かを判別したが、他の方法で判別してもよい。例えば、実行した処理に対応する動作ポイント値３Ｐの合計値を算出し、その合計値とスコア値３Ｓとが一致した場合にモジュール１Ｍの実行が正常であると判別し、一致しなかった場合に異常が発生したと判別してもよい。
【００７２】
本実施形態では、モジュール１Ｍの終了後に正常に実行されたか否かを判別したが、モジュール１Ｍの実行中も動作ポイントテーブルＴＬＰを監視し、その最下欄の値が「０」を下回った時点で、異常が発生したと判別してもよい。また、実行位置レジスタＲＧＪ、スコアレジスタＲＧＳ、および動作ポイントテーブルＴＬＰの変化の様子をリアルタイムにディスプレイ１１に表示してもよい。または、これらの変化の履歴をログファイルに記録し、モジュール１Ｍの実行の終了後、そのファイルに基づいてこれらの変化の様子をディスプレイ１１に表示してもよい。
【００７３】
本実施形態では、いわゆるシングルＣＰＵのコンピュータ１を例に説明したが、本発明は、デュアルＣＰＵのコンピュータにも適用可能である。
【００７４】
その他、コンピュータ１の全体または各部の構成、モジュール１Ｍの構成、コンピュータ言語、処理内容、処理順序、テーブルの構成などは、本発明の趣旨に沿って適宜変更することができる。
【００７５】
上に述べた実施例には、以下に述べるような付記も開示されている。
（付記１）
プログラムの実行が正常であるか否か監視するプログラム監視方法であって、
前記プログラムの１つまたは複数の箇所に第一の数値を示すコードを予め記述しておき、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウンタにカウントさせ、
前記カウンタがカウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する、
ことを特徴とするプログラム監視方法。
（付記２）
前記プログラムの前記箇所ごとの前記コードに係る前記第一の数値を互いに異なるように記述しておく、
付記１記載のプログラム監視方法。
（付記３）
同時期に実行する複数の前記プログラムごとに前記カウンタを用意しておき、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値を当該プログラムに係る前記カウンタにカウントさせる、
付記１または付記２記載のプログラム監視方法。
（付記４）
ユーザが指定した前記箇所に前記コードを記述しておく、
付記１ないし付記３のいずれかに記載のプログラム監視方法。
（付記５）
前記カウンタの変化の様子を出力する、
付記１ないし付記４のいずれかに記載のプログラム監視方法。
（付記６）
１つまたは複数の箇所に第一の数値を示すコードが記述されたプログラムを実行するプログラム実行手段と、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウントするカウント手段と、
前記カウント手段がカウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する、異常判別手段と、
を有することを特徴とするコンピュータ。
（付記７）
１つまたは複数の箇所に第一の数値を示すコードが記述されたプログラムを実行する機能を有するコンピュータに用いられる異常監視用プログラムであって、
前記コンピュータに、
前記プログラムの実行中に実行位置が前記箇所になった場合に、当該コードが示す前記第一の数値をカウントする処理を実行させ、
カウントした数値と第二の数値との差が所定の数値でない場合に、前記プログラムが正常に実行されていないと判別する処理を実行させる、
ことを特徴とする異常監視用プログラム。
【図面の簡単な説明】
【００７６】
【図１】コンピュータの外観およびハードウェア構成の例を示す図である。
【図２】コンピュータにインストールされているソフトウェアの構成の例を示す図である。
【図３】モジュールの構成の例を示す図である。
【図４】１つのモジュールに対して用意されるレジスタおよびテーブルの組合せの例を示す図である。
【図５】モジュールの実行の監視の処理の流れの例を説明するフローチャートである。
【図６】図３に示す構成を有するモジュールの監視を行う際のコンピュータの処理の流れの例を説明するフローチャートである。
【図７】動作ポイントテーブルの変化の例を示す図である。
【図８】サブモジュールを含む場合のモジュールの構成の例を示す図である。
【図９】サブモジュールの構成の例を示す図である。
【図１０】図８に示す構成を有するモジュールの監視を行う際のコンピュータ１の処理の流れの例を説明するフローチャートである。
【図１１】図９に示す構成を有するサブモジュールの実行中におけるコンピュータ１の処理の流れの例を説明するフローチャートである。
【符号の説明】
【００７７】
１  コンピュータ
１Ｍ  モジュール（プログラム）
１０ａ  ＣＰＵ（プログラム実行手段）
１０２  モジュール実行監視部（異常判別手段）
１０３  レジスタテーブル管理部（カウント手段）
２Ｐ  動作ポイントコード
３Ｐ  動作ポイント値（第一の数値）
３Ｓ  スコア値（第二の数値）
ＴＬＰ  動作ポイントテーブル（カウント手段）
【図１】
2008040973.tif 000003
【図２】
2008040973.tif 000004
【図３】
2008040973.tif 000005
【図４】
2008040973.tif 000006
【図５】
2008040973.tif 000007
【図６】
2008040973.tif 000008
【図７】
2008040973.tif 000009
【図８】
2008040973.tif 000010
【図９】
2008040973.tif 000011
【図１０】
2008040973.tif 000012
【図１１】
2008040973.tif 000013