(57)【要約】【課題】アプリケーションプログラムの改修をおこなうことなく、かかるアプリケーションプログラムの動作異常を効率的に検出すること。【解決手段】動作情報提供部は、オペレーティングシステム上で動作するプロセスの動作情報を収集して監視処理部に提供し、監視処理部の動作異常判定部は、動作情報提供部により提供された動作情報に含まれるプロセス動作状態、動作状態継続時間、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数に基づいて監視対象のアプリケーションプログラムに属するプロセスの動作異常を判定する。【選択図】        図４
2006277115.tif 000002
【特許請求の範囲】
【請求項１】
オペレーティングシステム上で動作するアプリケーションプログラムの動作異常を検出する異常検出プログラムであって、
前記アプリケーションプログラムに属するプロセスの動作情報を前記オペレーティングシステムから取得する取得手順と、
前記動作情報取得手順が取得した前記動作情報に基づいて前記アプリケーションプログラムの動作異常を判定する判定手順とを
コンピュータに実行させることを特徴とする異常検出プログラム。
【請求項２】
前記取得手順が取得する前記動作情報は、前記プロセスのコンテキストスイッチ回数を含んだことを特徴とする請求項１に記載の異常検出プログラム。
【請求項３】
前記コンテキストスイッチ回数は、前記プロセスが自らの指示で発生させたコンテキストスイッチの回数をあらわす自発的コンテキストスイッチ回数と、該プロセス以外の要因により引き起こされたコンテキストスイッチの回数をあらわす他発的コンテキストスイッチ回数とに区分されていることを特徴とする請求項２に記載の異常検出プログラム。
【請求項４】
前記取得手順が取得する前記動作情報は、前記プロセスの実行状態をあらわすプロセス状態を含んだことを特徴とする請求項１、２または３に記載の異常検出プログラム。
【請求項５】
前記判定手順は、前記プロセス状態が変化しないまま所定時間経過したならば、前記コンテキストスイッチ回数に基づいて前記アプリケーションプログラムの動作異常を判定することを特徴とする請求項４に記載の異常検出プログラム。
【請求項６】
前記判定手順は、前記プロセス状態が実行中のまま所定時間経過した場合であって、前記自発的コンテキストスイッチ回数が変化せず、かつ、前記他発的コンテキストスイッチ回数が変化した場合に、前記プロセスが無限ループに陥ったと判定することを特徴とする請求項５に記載の異常検出プログラム。
【請求項７】
前記判定手順は、前記プロセス状態が実行中のまま所定時間経過した場合であって、前記自発的コンテキストスイッチ回数が変化せず、かつ、前記他発的コンテキストスイッチ回数も変化しない場合に、前記プロセスがＣＰＵ待ち異常に陥ったと判定することを特徴とする請求項５または６に記載の異常検出プログラム。
【請求項８】
前記判定手順は、前記プロセス状態が実行待ちのまま所定時間経過した場合であって、前記自発的コンテキストスイッチ回数が変化せず、かつ、前記他発的コンテキストスイッチ回数も変化しない場合に、前記プロセスがＩ／Ｏ待ち異常に陥ったと判定することを特徴とする請求項５、６または７に記載の異常検出プログラム。
【請求項９】
前記取得手順が取得する動作情報は、前記アプリケーションプログラムに属する前記プロセスの親子関係を含んだことを特徴とする請求項１〜８のいずれか一つに記載の異常検出プログラム。
【請求項１０】
前記判定手順は、前記アプリケーションプログラムに属する子プロセスの親プロセスが終了して該子プロセスがゾンビプロセスとなった場合であっても該ゾンビプロセスを含む該アプリケーションプログラムの動作異常の判定を継続することを特徴とする請求項９に記載の異常検出プログラム。
【請求項１１】
前記動作情報は、前記アプリケーションプログラムに属するプロセスのプロセス優先度を含んだことを特徴とする請求項１〜１０のいずれか一つに記載の異常検出プログラム。
【請求項１２】
前記オペレーティングシステムは、前記アプリケーションプログラムに属するプロセスのプロセスディスクリプタごとに前記動作情報を収集して前記取得手順に提供する提供手順をコンピュータに実行させることを特徴とする請求項１〜１１のいずれか一つに記載の異常検出プログラム。
【請求項１３】
前記アプリケーションプログラムに属するプロセスには、マルチスレッドプロセスが含まれることを特徴とする請求項１〜１２のいずれか一つに記載の異常検出プログラム。
【請求項１４】
オペレーティングシステム上で動作するアプリケーションプログラムの動作異常を検出する異常検出方法であって、
前記アプリケーションプログラムに属するプロセスの動作情報を前記オペレーティングシステムから取得する取得工程と、
前記動作情報取得工程が取得した前記動作情報に基づいて前記アプリケーションプログラムの動作異常を判定する判定工程とを
含んだことを特徴とする異常検出方法。
【請求項１５】
前記オペレーティングシステムは、前記アプリケーションプログラムに属するプロセスのプロセスディスクリプタごとに前記動作情報を収集して前記取得工程に提供する提供工程を含んだことを特徴とする請求項１４に記載の異常検出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、オペレーティングシステム上で動作するアプリケーションプログラムの動作異常を検出する異常検出プログラムおよび異常検出方法に関し、特に、監視対象となるアプリケーションプログラムを改修することなく効率的にアプリケーションプログラムの動作異常を検出することができる異常検出プログラムおよび異常検出方法に関する。
【背景技術】
【０００２】
従来、オペレーティングシステム上で動作するアプリケーションプログラムが無限ループに陥ったり、資源競合の結果ハングアップしたりといったプログラムの動作異常を検出する異常検出プログラムが知られている。
【０００３】
たとえば、動作異常の監視対象となるアプリケーションプログラムにプログラム異常を検出するためのコードを埋め込むことにより、アプリケーションプログラムの動作異常を検出する異常検出プログラムがある。しかし、市販のアプリケーションプログラムのように、ソースコードの改修をエンドユーザがおこなうことができないプログラムについては、かかるコードを埋め込むことができないので動作異常の検出対象とすることができないという問題があった。
【０００４】
このため、動作異常の検出対象となるアプリケーションプログラムのコード改修を必要としない動作異常検出技術が提案されている。たとえば、特許文献１には、アプリケーションプログラムの暴走が引き起こすバスエラーの継続時間を計時するタイマをＣＰＵ側に用意してアプリケーションプログラムの動作異常を検出する技術が開示されている。また、特許文献２には、アプリケーションプログラムがディスプレイなどに表示する画面の表示に要する時間を計時することによりアプリケーションプログラムの動作異常を検出する技術が開示されている。
【０００５】
【特許文献１】特開平１０−３０７７３７号公報
【特許文献２】特開２００３−５８３９４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００６】
しかしながら、かかる特許文献１を用いたとしても、バスエラーを引き起こさない動作異常を検出することはできない。たとえば、アプリケーションプログラムの無限ループは、バスエラーを引き起こさない動作異常の一つである。この無限ループは、他のアプリケーションの動作に悪影響をおよぼすばかりか、場合によってはシステムダウンを引き起こすこともあるため検出対象とすべき動作異常である。しかし、特許文献１を用いても無限ループによる動作異常を検出することはできない。
【０００７】
また、特許文献２を用いたとしても、表示画面を有しないアプリケーションプログラムの動作異常を検出することはできない。たとえば、オペレーティングシステム上で動作する通信デーモンなどの常駐プロセスは表示画面を有しないので、特許文献２を用いてもかかる常駐プロセスの動作異常を検出することはできない。
【０００８】
また、アプリケーションプログラムは複数のプロセスにより構成されることが通常であるが、従来の異常検出プログラムは、アプリケーションプログラムのメインプロセスが終了した場合に、メインプロセスが生成した子プロセスの監視を継続しておこなうことができないという問題があった。このような監視できないプロセスが残存すると、他のアプリケーションに悪影響をおよぼす場合があるので、これらのプロセスを確実に監視対象とする必要がある。
【０００９】
これらのことから、動作異常の検出対象となるアプリケーションプログラムの改修をおこなうことなく、アプリケーションプログラムを構成するすべてのプロセスについて、無限ループなどの動作異常を効率的かつ確実に検出する異常検出プログラムをいかにして実現するかが大きな課題となっている。
【００１０】
この発明は、上述した従来技術による問題点を解消するためになされたものであり、動作異常の検出対象となるアプリケーションプログラムの改修をおこなうことなく、かかるアプリケーションプログラムの動作異常を効率的に検出することができる異常検出プログラムおよび異常検出方法を提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するため、請求項１の発明に係る異常検出プログラムは、オペレーティングシステム上で動作するアプリケーションプログラムの動作異常を検出する異常検出プログラムであって、前記アプリケーションプログラムに属するプロセスの動作情報を前記オペレーティングシステムから取得する取得手順と、前記動作情報取得手順が取得した前記動作情報に基づいて前記アプリケーションプログラムの動作異常を判定する判定手順とをコンピュータに実行させることを特徴とする。
【００１２】
また、請求項２の発明に係る異常検出プログラムは、請求項１の発明において、前記取得手順が取得する前記動作情報は、前記プロセスのコンテキストスイッチ回数を含んだことを特徴とする。
【００１３】
また、請求項３の発明に係る異常検出プログラムは、請求項２の発明において、前記コンテキストスイッチ回数は、前記プロセスが自らの指示で発生させたコンテキストスイッチの回数をあらわす自発的コンテキストスイッチ回数と、該プロセス以外の要因により引き起こされたコンテキストスイッチの回数をあらわす他発的コンテキストスイッチ回数とに区分されていることを特徴とする。
【００１４】
また、請求項４の発明に係る異常検出プログラムは、請求項１、２または３の発明において、前記取得手順が取得する前記動作情報は、前記プロセスの実行状態をあらわすプロセス状態を含んだことを特徴とする。
【００１５】
また、請求項５の発明に係る異常検出プログラムは、請求項４の発明において、前記判定手順は、前記プロセス状態が変化しないまま所定時間経過したならば、前記コンテキストスイッチ回数に基づいて前記アプリケーションプログラムの動作異常を判定することを特徴とする。
【００１６】
また、請求項６の発明に係る異常検出プログラムは、請求項５の発明において、前記判定手順は、前記プロセス状態が実行中のまま所定時間経過した場合であって、前記自発的コンテキストスイッチ回数が変化せず、かつ、前記他発的コンテキストスイッチ回数が変化した場合に、前記プロセスが無限ループに陥ったと判定することを特徴とする。
【００１７】
また、請求項７の発明に係る異常検出プログラムは、請求項５または６の発明において、前記判定手順は、前記プロセス状態が実行中のまま所定時間経過した場合であって、前記自発的コンテキストスイッチ回数が変化せず、かつ、前記他発的コンテキストスイッチ回数も変化しない場合に、前記プロセスがＣＰＵ待ち異常に陥ったと判定することを特徴とする。
【００１８】
また、請求項８の発明に係る異常検出プログラムは、請求項５、６または７の発明において、前記判定手順は、前記プロセス状態が実行待ちのまま所定時間経過した場合であって、前記自発的コンテキストスイッチ回数が変化せず、かつ、前記他発的コンテキストスイッチ回数も変化しない場合に、前記プロセスがＩ／Ｏ待ち異常に陥ったと判定することを特徴とする。
【００１９】
また、請求項９の発明に係る異常検出プログラムは、請求項１〜８のいずれか一つに記載の発明において、前記取得手順が取得する動作情報は、前記アプリケーションプログラムに属する前記プロセスの親子関係を含んだことを特徴とする。
【００２０】
また、請求項１０の発明に係る異常検出プログラムは、請求項９の発明において、前記判定手順は、前記アプリケーションプログラムに属する子プロセスの親プロセスが終了して該子プロセスがゾンビプロセスとなった場合であっても該ゾンビプロセスを含む該アプリケーションプログラムの動作異常の判定を継続することを特徴とする。
【００２１】
また、請求項１１の発明に係る異常検出プログラムは、請求項１〜１０のいずれか一つに記載の発明において、前記動作情報は、前記アプリケーションプログラムに属するプロセスのプロセス優先度を含んだことを特徴とする。
【００２２】
また、請求項１２の発明に係る異常検出プログラムは、請求項１〜１１のいずれか一つに記載の発明において、前記オペレーティングシステムは、前記アプリケーションプログラムに属するプロセスのプロセスディスクリプタごとに前記動作情報を収集して前記取得手順に提供する提供手順をコンピュータに実行させることを特徴とする。
【００２３】
また、請求項１３の発明に係る異常検出プログラムは、請求項１〜１２のいずれか一つに記載の発明において、前記アプリケーションプログラムに属するプロセスには、マルチスレッドプロセスが含まれることを特徴とする。
【００２４】
また、請求項１４の発明に係る異常検出方法は、オペレーティングシステム上で動作するアプリケーションプログラムの動作異常を検出する異常検出方法であって、前記アプリケーションプログラムに属するプロセスの動作情報を前記オペレーティングシステムから取得する取得工程と、前記動作情報取得工程が取得した前記動作情報に基づいて前記アプリケーションプログラムの動作異常を判定する判定工程とを含んだことを特徴とする。
【００２５】
また、請求項１５の発明に係る異常検出方法は、請求項１４の発明において、前記オペレーティングシステムは、前記アプリケーションプログラムに属するプロセスのプロセスディスクリプタごとに前記動作情報を収集して前記取得工程に提供する提供工程を含んだことを特徴とする。
【発明の効果】
【００２６】
請求項１にかかる異常検出プログラムによれば、アプリケーションプログラムに属するプロセスの動作情報をオペレーティングシステムから取得し、取得した動作情報に基づいてアプリケーションプログラムの動作異常を判定するよう構成したので、動作異常の検出対象となるアプリケーションプログラムの改修をおこなうことなく、かかるアプリケーションプログラムの動作異常を効率的に検出することができるという効果を奏する。
【００２７】
また、請求項２にかかる異常検出プログラムによれば、取得手順が取得する動作情報は、プロセスのコンテキストスイッチ回数を含むよう構成したので、アプリケーションプログラムを構成するプロセスのＣＰＵ権の取得および開放の状態を把握することによりアプリケーションプログラムの動作異常を効率的に検出することができるという効果を奏する。
【００２８】
また、請求項３にかかる異常検出プログラムによれば、コンテキストスイッチ回数は、プロセスが自らの指示で発生させたコンテキストスイッチの回数をあらわす自発的コンテキストスイッチ回数と、かかるプロセス以外の要因により引き起こされたコンテキストスイッチの回数をあらわす他発的コンテキストスイッチ回数とに区分されるよう構成したので、アプリケーションプログラムを構成するプロセスのＣＰＵ権の取得および開放の状態を詳細に把握することによりアプリケーションプログラムの動作異常を効率的に検出することができるという効果を奏する。
【００２９】
また、請求項４にかかる異常検出プログラムによれば、取得手順が取得する動作情報は、プロセスの実行状態をあらわすプロセス状態を含むよう構成したので、アプリケーションプログラムを構成するプロセスの実行状態を把握することによりアプリケーションプログラムの動作異常を効率的に検出することができるという効果を奏する。
【００３０】
また、請求項５にかかる異常検出プログラムによれば、判定手順は、プロセス状態が変化しないまま所定時間経過したならば、コンテキストスイッチ回数に基づいてアプリケーションプログラムの動作異常を判定するよう構成したので、動作異常と判定するための閾値を柔軟に設定することができるという効果を奏する。
【００３１】
また、請求項６にかかる異常検出プログラムによれば、判定手順は、プロセス状態が実行中のまま所定時間経過した場合であって、自発的コンテキストスイッチ回数が変化せず、かつ、他発的コンテキストスイッチ回数が変化した場合に、プロセスが無限ループに陥ったと判定するよう構成したので、無限ループによる動作異常を効率的に検出することができるという効果を奏する。
【００３２】
また、請求項７にかかる異常検出プログラムによれば、判定手順は、プロセス状態が実行中のまま所定時間経過した場合であって、自発的コンテキストスイッチ回数が変化せず、かつ、他発的コンテキストスイッチ回数も変化しない場合に、プロセスがＣＰＵ待ち異常に陥ったと判定するよう構成したので、ＣＰＵ待ちによる動作異常を効率的に検出することができるという効果を奏する。
【００３３】
また、請求項８にかかる異常検出プログラムによれば、判定手順は、プロセス状態が実行待ちのまま所定時間経過した場合であって、自発的コンテキストスイッチ回数が変化せず、かつ、他発的コンテキストスイッチ回数も変化しない場合に、プロセスがＩ／Ｏ待ち異常に陥ったと判定するよう構成したので、Ｉ／Ｏ待ちによる動作異常を効率的に検出することができるという効果を奏する。
【００３４】
また、請求項９にかかる異常検出プログラムによれば、取得手順が取得する動作情報は、アプリケーションプログラムに属するプロセスの親子関係を含むよう構成したので、監視対象となるアプリケーションプログラムを構成するすべてのプロセスの動作異常を効率的に検出することができるという効果を奏する。
【００３５】
また、請求項１０にかかる異常検出プログラムによれば、判定手順は、アプリケーションプログラムに属する子プロセスの親プロセスが終了してかかる子プロセスがゾンビプロセスとなった場合であってもゾンビプロセスを含むアプリケーションプログラムの動作異常の判定を継続するよう構成したので、監視対象となるアプリケーションプログラムに属するプロセスが終了し、プロセスの親子関係が崩れた場合であっても動作異常監視を継続することができるという効果を奏する。
【００３６】
また、請求項１１にかかる異常検出プログラムによれば、動作情報は、アプリケーションプログラムに属するプロセスのプロセス優先度を含むよう構成したので、プロセス優先度を考慮した動作異常判定をおこなうことにより、動作異常判定の精度を向上させることができるという効果を奏する。
【００３７】
また、請求項１２にかかる異常検出プログラムによれば、オペレーティングシステムは、アプリケーションプログラムに属するプロセスのプロセスディスクリプタごとに動作情報を収集して取得手順に提供する提供手順をコンピュータに実行させるよう構成したので、アプリケーション監視に必要な情報の提供を効率的におこなうことができるという効果を奏する。
【００３８】
また、請求項１３にかかる異常検出プログラムによれば、アプリケーションプログラムに属するプロセスには、マルチスレッドプロセスが含まれるよう構成したので、監視対象となるアプリケーションプログラムにマルチスレッドプロセスが含まれる場合であっても、非マルチスレッドプロセスと同様に取り扱うことにより、プロセスの動作異常を効率的に検出することができるという効果を奏する。
【００３９】
また、請求項１４にかかる異常検出方法によれば、アプリケーションプログラムに属するプロセスの動作情報をオペレーティングシステムから取得し、取得した動作情報に基づいてアプリケーションプログラムの動作異常を判定するよう構成したので、動作異常の検出対象となるアプリケーションプログラムの改修をおこなうことなく、かかるアプリケーションプログラムの動作異常を効率的に検出することができるという効果を奏する。
【００４０】
また、請求項１５にかかる異常検出方法によれば、オペレーティングシステムは、アプリケーションプログラムに属するプロセスのプロセスディスクリプタごとに動作情報を収集して取得手順に提供する提供工程を含むよう構成したので、アプリケーション監視に必要な情報の提供を効率的におこなうことができるという効果を奏する。
【発明を実施するための最良の形態】
【００４１】
以下に添付図面を参照して、この発明に係る異常検出プログラムおよび異常検出方法の好適な実施例を詳細に説明する。なお、以下の実施例においては、本発明を、オペレーティングシステムとしてＬｉｎｕｘ（登録商標）が動作するコンピュータに適用した場合について説明することとする。
【００４２】
図１は、本発明に係るプログラムの異常検出処理の概念を示す図である。同図に示すように、本発明に係るプログラムの異常検出処理では、オペレーティングシステム上で動作するアプリケーションプログラムの１つとして監視プロセス１００が設けられ、監視対象となる各アプリケーションの動作異常を監視する。この監視対象となるアプリケーションプログラム（図１に示す「監視対象アプリ」）は、複数のプロセスからなることが通常である。
【００４３】
これらのプロセスがオペレーティングシステム上に生成されると、各プロセスに対応するプロセスディスクリプタがオペレーティングシステム内で管理される。オペレーティングシステムは、このプロセスディスクリプタを用いて各プロセスのスケジューリングをおこなったり、入出力などの資源の割り当てをおこなったりすることになる。
【００４４】
オペレーティングシステム内に設けられた動作情報提供部２００は、かかるプロセスディスクリプタごとのプロセスの動作情報を取得し、取得した動作情報を上記監視プロセス１００に提供する処理部である。なお、Ｌｉｎｕｘ（登録商標）は、ソースコードが公開されているオペレーティングシステムの１つであり、ＲＡＰ（Resource Archive Project）によりオペレーティングシステムの機能拡張がおこなわれている。かかる動作情報提供部２００は、Ｌｉｎｕｘ（登録商標）を機能拡張することにより設けられる処理部である。
【００４５】
監視プロセス１００は、動作情報提供部２００に動作情報取得要求をおこなうことにより監視対象アプリに属するプロセスの動作情報を取得する。そして、取得した動作情報に基づいて各プロセスに動作異常があるか否かを判定することにより監視対象アプリの動作異常を検出する。また、動作異常を検出した場合には、プロセスの強制終了などの異常時処理をおこなう。
【００４６】
従来、アプリケーションプログラムを監視する場合には、監視対象となるアプリケーションプログラムに所定のソースコードを追記する改修をおこなうことが通常であった。また、かかる改修をおこなう必要のないアプリ異常検出方法も提案されていたが、検出可能な動作異常が制限されており、アプリケーションプログラムがＣＰＵを占有してしまう無限ループや、リアルタイムに実行する必要のあるアプリケーションプログラムがＩ／ＯまちやＣＰＵ待ちのため長期間動作を待たされるといった動作異常を効率的に検出することができないという問題があった。
【００４７】
本発明に係る異常検出処理では、オペレーティングシステム内で管理されるプロセスディスクリプタと対応する動作情報をオペレーティングシステム側で収集し、オペレーティングシステム上で動作する監視プロセス１００がかかる動作情報を取得し、取得した動作情報に基づいて監視対象アプリの動作異常を検出することとしている。
【００４８】
このように、監視プロセス１００は、監視対象アプリを直接的に監視するのではなく、オペレーティングシステム内のプロセスディスクリプタに対応する動作情報を用いて監視対象アプリを間接的に監視することとした。したがって、監視対象アプリの改修をおこなうことなく監視対象アプリの動作異常を検出することができるとともに、オペレーティングシステム内の詳細なプロセス動作情報を取得することができるので、監視対象アプリに属するプロセスのさまざまな動作異常を効率的に検出することができる。
【００４９】
次に、本発明に係る異常検出処理において用いられる動作情報と、かかる動作情報に基づいて判定される異常種別との関係について図２を用いて説明する。図２は、動作情報と異常種別との関係を示す図である。本発明に係る異常検出処理では、ＣＰＵ上で動作するプロセスの切り替え（以下、「コンテキストスイッチ」と言う）に着目し、コンテキストスイッチ回数の変化と異常種別との関係を用いて監視対象アプリの動作異常を検出することとした。
【００５０】
ここで、かかるコンテキストスイッチについて説明しておく。シングルＣＰＵのコンピュータ上にマルチプロセス環境を実現するためには、ＣＰＵ上で動作する各プロセスを順次切替えることにより、あたかも複数のプロセスが同時に動作しているようにスケジューリングする必要がある。たとえば、リアルタイムスケジューリングの場合にはタイマ割込みによりコンテキストスイッチがおこなわれ、実行中のプロセスにかわって実行待ちのプロセスがＣＰＵにロードされる。また、ラウンドロビンスケジューリングの場合には各プロセスにタイムスライスを割り当て、このタイムスライスを使い切ったならばコンテキストスイッチがおこなわれ実行プロセスが切替えられる。
【００５１】
また、かかるコンテキストスイッチには、自発的コンテキストスイッチと他発的コンテキストスイッチとがある。ここで、自発的コンテキストスイッチとは、ＣＰＵ上で実行中のプロセスが入出力処理やセマフォなどのリソースを獲得するために、ＣＰＵ上での実行権を自ら開放することにより引き起こすコンテキストスイッチのことをいう。また、他発的コンテキストスイッチとは、上述したオペレーティングシステムのスケジューリングなどにより実行中のプロセス以外の要因で引き起こされるコンテキストスイッチのことをいう。
【００５２】
そして、これらのコンテキストスイッチのカウントアップは、たとえば、以下のような手順でおこなわれる。すなわち、オペレーティングシステムが上記した自発的コンテキストスイッチを検出した場合、ＣＰＵを開放したプロセスから他のプロセスへ制御を移すとともに、メモリ上の自発的コンテキストスイッチ回数をインクリメントする。一方、上記した他発的コンテキストスイッチを検出した場合には、実行中のプロセスの実行を中断させ、割り込みプロセスへ制御を移すとともに、メモリ上の他発的コンテキストスイッチ回数をインクリメントする。
【００５３】
なお、このようなコンテキストスイッチのカウントアップ機能を備えないオペレーティングシステムを用いる場合であっても、プロセスがハードウェアにＩ／Ｏ要求を出した回数や、割り込みが発生した回数などをモニタすることにより、かかるカウントアップ機能を実現することができる。
【００５４】
このように、コンテキストスイッチは実行プロセスが切り替わる際に引き起こされるので、かかるコンテキストスイッチ回数に着目することによりプロセスの動作異常を検出することが可能となる。
【００５５】
具体的には、図２に示したように、無限ループによる動作異常の場合には、プロセス状態が実行中であり、他発的コンテキストスイッチ回数は増加しているものの自発的コンテキストスイッチ回数が変化していない状態となる。すなわち、オペレーティングシステムのスケジューリングによりコンテキストスイッチが引き起こされているもののプロセスの処理は完了していないので、自発的なコンテキストスイッチを引き起こしていない状態が継続していることをあらわしている。したがって、かかる状態が所定時間継続しているプロセスは、無限ループによりＣＰＵを長時間使用している可能性が高いので動作異常であると判定する。
【００５６】
また、ＣＰＵ待ちによる動作異常の場合には、プロセス状態が実行中であり、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数のいずれもが変化しない状態となる。かかる状態が所定時間継続した場合には、他のプロセスによりプロセスの実行が阻害されている可能性が高いのでＣＰＵ待ちによる動作異常であると判定する。
【００５７】
また、Ｉ／Ｏ待ちによる動作異常の場合には、プロセスが待機中であり、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数のいずれもが変化しない状態となる。かかる状態が所定時間継続した場合には、他のプロセスとのリソースの競合などによりプロセスのＩ／Ｏ処理が阻害されている可能性が高いのでＩ／Ｏ待ちによる動作異常であると判定する。
【００５８】
このように、本発明に係る異常検出処理では、コンテキストスイッチに着目し、かかるコンテキストスイッチ回数の変化とプロセス状態の継続時間とを関連づけることにより動作異常を検出することとしたので、効率的に監視対象アプリの動作異常を検出することができる。
【００５９】
また、本発明に係る異常検出処理では、監視対象アプリを構成するすべてのプロセスを監視対象とすることができる。かかる監視対象アプリのプロセス構成について図３を用いて説明しておく。図３は、監視対象アプリのプロセス構成を示す図である。
【００６０】
同図に示すように、監視対象アプリは、メインプロセスとなる親プロセス１０１と、かかる親プロセスがｆｏｒｋなどのシステムコールを発行することにより生成される子プロセス１０２とから構成されることが通常である。なお、かかる子プロセス１０２がさらに子プロセス１０２を生成する場合もあるので、監視対象アプリは、プロセスの親子関係の階層構造から構成される場合が多い。
【００６１】
本発明に係る異常検出処理では、プロセス生成時にオペレーティングシステム上に生成されるプロセスディスクリプタを用いて間接的に監視対象アプリの動作異常を検出することとしている。具体的には、オペレーティングシステム内に設けられた動作情報提供部２００がプロセスディスクリプタの内容からプロセスの親子関係を関連づけて保持することとしている。
【００６２】
通常のＬｉｎｕｘ（登録商標）などのＵＮＩＸ（登録商標）オペレーティングシステムは、親プロセスが消滅した場合には、かかる親プロセスが生成した子プロセスはマスタープロセスの配下に置かれ、いわゆるゾンビプロセスとなる。したがって、従来の異常検出処理では、親プロセスが消滅した後には、監視対象アプリに属する子プロセスを認識することができないため監視を継続することができないという問題があった。
【００６３】
本発明に係る異常検出処理では、上述したようにプロセス生成時にプロセスの親子関係を関連づけて保持することとしているので、監視対象アプリのメインプロセスが終了した後であっても、監視対象アプリを構成する子プロセスの監視を継続しておこなうことができる。なお、メインプロセス以外のプロセスが終了した場合であっても、プロセス生成時の親子関係をたどることにより、同様に監視を継続することができる。
【００６４】
次に、本発明に係る異常検出処理を含むコンピュータ１の構成について図４を用いて説明する。図４は、異常検出処理を含むコンピュータ１の構成を示す機能ブロック図である。同図に示すように、コンピュータ１は、監視処理部１０と、動作情報提供処理部１５と、記憶部２０とを備えている。なお、監視処理部１０はオペレーティングシステム上で動作する監視プログラムが備える処理部であり、動作情報提供処理部１５はオペレーティングシステムが備える処理部である。
【００６５】
監視処理部１０は、アプリケーション起動部１０ａと、動作情報取得部１０ｂと、動作異常判定部１０ｃと、動作異常時処理部１０ｄとをさらに備えており、動作情報提供処理部１５は、動作情報提供部１５ａと、動作情報管理部１５ｂとをさらに備えている。また、記憶部２０は、監視処理部１０が用いる監視対象データ２０ａと、動作情報提供処理部１５が用いる動作情報２０ｂとをさらに備えている。
【００６６】
監視処理部１０は、監視対象アプリを生成して監視対象データ２０ａを記憶部２０に書き込むとともに動作情報提供処理部１５から動作情報２０ｂを取得し、監視対象データ２０ａおよび動作情報２０ｂに基づいて監視対象アプリの動作異常を判定し、動作異常に対する処理を実行する処理部である。
【００６７】
アプリケーション起動部１０ａは、監視対象アプリを生成するとともに、監視対象アプリに関する情報を監視対象データ２０ａとして記憶部２０に書き込む処理部である。ここで、かかる監視対象データ２０ａの一例について図５を用いて説明しておく。図５は、監視対象データ２０ａの一例を示す図である。
【００６８】
同図に示すように、アプリケーション起動部１０ａが監視対象アプリを起動した場合には、起動したアプリ名と、起動したアプリのメインプロセスのメインプロセスＩＤとを含む情報が監視対象データ２０ａとして記憶部２０に書き込まれる。たとえば、図５に示した場合について説明すると、アプリケーション起動部１０ａは、アプリＡ、アプリＢおよびアプリＣの３つのアプリを監視対象としており、各監視対象アプリのメインプロセスＩＤは、それぞれ、２００、２４０および３００であることを示している。
【００６９】
なお、本実施例においては、監視処理部１０が、起動したアプリ名と、起動したアプリのメインプロセスのプロセスＩＤとを含む監視対象データ２０ａを記憶部２０に記憶し、のちに取得するプロセスの動作情報２０ｂと関連づける場合について説明するが、監視対象データ２０ａは、かかるプロセスＩＤを含まないものとすることもできる。この場合には、動作情報２０ｂにプロセス名を含ませることとし、このプロセス名と監視対象データ２０ａに含まれるアプリ名とを関連づけることにより監視対象アプリに属するプロセスを認識することになる。
【００７０】
図４の説明に戻り、動作情報取得部１０ｂについて説明する。動作情報取得部１０ｂは、所定のタイミングで動作情報提供処理部１５に動作情報取得要求をおこなってプロセスの動作情報２０ｂを取得し、取得した動作情報２０ｂを動作異常判定部１０ｃに渡す処理をおこなう処理部である。ここで、動作情報取得部１０ｂが取得するプロセスの動作情報２０ｂの一例について図６を用いて説明しておく。図６は、動作情報２０ｂの一例を示す図である。
【００７１】
図６に示すように、この動作情報２０ｂは、プロセスＩＤと、親プロセスＩＤと、プロセス動作状態と、動作状態継続時間と、他発的コンテキストスイッチ回数と、自発的コンテキストスイッチ回数とを含んだ情報であり、動作情報提供処理部１５が収集し、動作情報取得部１０ｂの求めに応じて提供する情報である。
【００７２】
図６に示したように、動作情報２０ｂは、プロセスＩＤと親プロセスＩＤとを含んでおり、監視対象アプリに属するプロセスが生成された際に、このプロセスのプロセスＩＤと、かかるプロセスを生成した親プロセスＩＤとが動作情報提供処理部１５によりセットされる。したがって、監視対象アプリに属するプロセスが終了して親子関係が崩れた場合であっても動作情報２０ｂの親プロセスＩＤをたどることで、監視対象アプリに属するすべてのプロセスに関する情報を監視プロセスに対して提供することができる。
【００７３】
ここで、親プロセスが終了した場合におけ監視対象アプリのプロセス構成について図７を用いて説明する。図７は、親プロセスが終了した場合における監視対象アプリのプロセス構成を示す図である。同図に示すように、親プロセス１０１が終了した場合であっても、監視プロセス１００は、監視対象アプリケーションに属する子プロセス１０２の監視を継続することができる。
【００７４】
その理由は、動作情報２０ｂには、監視対象アプリに属するプロセスが生成された際に、プロセスＩＤと、その親プロセスＩＤがセットされているため、親プロセスが終了した場合であってもプロセスツリーをたどることにより監視対象アプリに属するすべてのプロセスを把握することができるからである。なお、監視対象アプリに属するすべてのプロセスが終了した際に、動作情報提供処理部１５は、動作情報２０ｂからかかる監視対象アプリに属するプロセスに関する情報を削除することになる。
【００７５】
図６の説明に戻って、プロセス動作状態について説明する。プロセス動作状態は、プロセスの実行状態をあらわす項目であり、「実行中」または「実行待ち」の状態がある。「実行中」状態とは、プロセスがＣＰＵ権を取得してＣＰＵ上で動作中である状態、またはＣＰＵ上で動作していたプロセスが他発的コンテキストスイッチにより他のプロセスにＣＰＵ権を横取りされた状態をあらわす。また、「実行待ち」状態とは、ＣＰＵ上で動作していたプロセスがＣＰＵ権を自ら開放して自発的コンテキストスイッチを引き起こした状態をあらわす。
【００７６】
動作状態継続時間は、プロセス動作状態が変化せず継続している時間をあらわす項目である。たとえば、プロセス動作状態が「実行待ち」から「実行中」に変化し、「実行中」のまま１ｓｅｃが経過した場合には、この動作状態継続時間は１ｓｅｃとなる。
【００７７】
他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数は、上述した他発的コンテキストスイッチおよび自発的コンテキストスイッチが、プロセス動作状態が変化しない状態で何回発生したかを累計したものである。したがって、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数は、プロセス動作状態が変化した場合にはリセットされ、あらたに累計が開始される。なお、これらの回数をリセットせずに、プロセス動作状態が変化した時点の回数との差分をとることとしてもよい。
【００７８】
次に、プロセスの動作情報２０ｂのデータ例について図８を用いて説明する。図８は、動作情報のデータの一例を示す図である。同図の５１に示したデータは、プロセスＩＤが２００のプロセスを親として、プロセスＩＤが２０４、２１０および２３０の子プロセスが生成されている状態を示したものである。この状態において、プロセスＩＤが２００のプロセスが終了した場合には、動作情報２０ｂは同図の５２に示したようになる。このように、プロセスが終了した場合であっても、プロセスＩＤと親プロセスＩＤは消去されることなく残るため、プロセスＩＤおよび親プロセスＩＤを用いてプロセスツリーをたどることができる。したがって、監視対象アプリに属するプロセスを継続して監視することができる。
【００７９】
図４の説明に戻り、動作異常判定部１０ｃについて説明する。動作異常判定部１０ｃは、動作情報取得部１０ｂが動作情報提供処理部１５から取得した動作情報２０ｂと、監視対象データ２０ａとを用いて監視対象アプリの動作異常を判定する処理をおこなう処理部である。
【００８０】
具体的には、この動作異常判定部１０ｃは、図５に示したアプリ名とメインプロセスＩＤとを含む監視対象データ２０ａと、図６に示したプロセスＩＤと親プロセスＩＤとを含む動作情報２０ｂとを関連付けることによりプロセスがどの監視対象アプリに属するかを把握する。そして、各プロセスのプロセス状態、動作状態継続時間、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数を用いてかかるプロセスに動作異常が発生しているか否かを判定する。
【００８１】
たとえば、図２に示したように、無限ループによる動作異常の場合には、プロセス状態が実行中であり、他発的コンテキストスイッチ回数は増加しているものの自発的コンテキストスイッチ回数が変化していない状態となる。すなわち、オペレーティングシステムのスケジューリングによりコンテキストスイッチが引き起こされているもののプロセスの処理は完了していないので、自発的にはコンテキストスイッチを引き起こしていない状態が継続していることをあらわしている。したがって、かかる状態が所定時間継続した場合には、無限ループによりＣＰＵを占有している可能性が高いので動作異常であると判定する。
【００８２】
また、ＣＰＵ待ちによる動作異常の場合には、プロセス状態が実行中であり、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数のいずれもが変化しない状態となる。かかる状態が所定時間継続した場合には、他のプロセスによりプロセスの実行が阻害されている可能性が高いのでＣＰＵ待ちによる動作異常であると判定する。
【００８３】
また、Ｉ／Ｏ待ちによる動作異常の場合には、プロセスが待機中であり、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数のいずれもが変化しない状態となる。かかる状態が所定時間継続した場合には、他のプロセスとのリソースの競合などによりプロセスのＩ／Ｏ処理が阻害されている可能性が高いのでＩ／Ｏ待ちによる動作異常であると判定する。
【００８４】
なお、動作異常判定部１０ｃは、上述した各プロセスのプロセス状態、動作状態継続時間、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数に加え、他のプロセス情報を用いて判定処理をおこなうことができる。たとえば、プロセスのスケジューリングポリシー、スケジューリングの優先度を含んだスケジューリングパラメータ、消費したＣＰＵ割り当て時間をあらわすティックカウンタ値、プロセスの実行時間などを用いることにより、動作異常判定の精度を向上させることが可能となる。
【００８５】
たとえば、無限ループ動作異常と判定するような場合であっても、プロセスのスケジューリング優先度が高ければ、無限ループに陥っているのではなく単に正常処理をつづけていることがある。このような場合に、プロセスのスケジューリング優先度を加味して動作異常継続時間の閾値を設定することにより、無限ループの動作異常判定の精度を向上させることができる。
【００８６】
動作異常時処理部１０ｄは、動作異常判定部１０ｃが動作異常であると判定した場合に、該当する監視対象アプリの終了処理や、エラー表示処理などをおこなう処理部である。また、動作情報提供処理部１５は、プロセスディスクリプタごとにオペレーティングシステム内に作成されるプロセス情報を収集して動作情報２０ｂとして記憶部２０に書き込むととともに、監視プログラムの動作情報取得部１０ｂの求めに応じてかかる動作情報２０ｂを提供する処理をおこなう処理部である。
【００８７】
動作情報提供部１５ａは、動作情報取得部１０ｂから動作情報取得要求を受け付けると記憶部２０から動作情報２０ｂを読み出して動作情報取得部１０ｂに渡す処理をおこなう処理部である。また、動作情報管理部１５ｂは、オペレーティングシステム内に作成されるプロセス情報を収集し、収集したプロセス情報を動作情報２０ｂとして記憶部２０に書き込む処理をおこなう処理部である。
【００８８】
記憶部２０は、ＲＡＭ（Random Access Memory）などのメモリから構成され、監視対象データ２０ａおよび動作情報２０ｂを記憶する記憶部である。監視対象データ２０ａは、アプリケーション起動部１０ａにより記憶部２０に書き込まれ、動作異常判定部１０ｃにより読み出されるデータである。なお、監視対象データ２０ａは、図５を用いてすでに説明したように、アプリ名およびメインプロセスＩＤを含んだデータである。
【００８９】
また、動作情報２０ｂは、動作情報管理部１５ｂにより記憶部２０に書き込まれ、動作情報提供部１５ａにより読み出されるプロセス情報である。なお、動作情報２０ｂは、図６を用いてすでに説明したように、プロセスＩＤ、親プロセスＩＤ、動作状態継続時間、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数を含んだプロセス情報である。
【００９０】
次に、上述した監視プログラムが監視対象アプリの動作異常を検出する場合の処理手順について図９〜図１１を用いて説明する。図９は、無限ループによる動作異常を検出する場合における処理手順を示すフローチャートである。
【００９１】
図９に示すように、まず、動作異常判定部１０ｃが動作情報取得部１０ｂから動作情報２０ｂを受け取ると（ステップＳ１０１）、動作情報２０ｂのプロセス動作状態および動作状態継続時間を参照し、所定時間継続してプロセス動作状態が「実行中」であるか否かを判定する（ステップＳ１０２）。そして、所定時間継続して「実行中」ではない場合には（ステップＳ１０２否定）、無限ループによる動作異常はないと判定して（ステップＳ１０５）処理を終了する。
【００９２】
つづいて、所定時間継続して「実行中」である場合には（ステップＳ１０２肯定）、取得した動作情報２０ｂの自発的コンテキストスイッチ回数を参照し、自発的コンテキストスイッチ回数に変化があるか否かを判定する（ステップＳ１０３）。そして、自発的コンテキストスイッチ回数に変化がある場合には（ステップＳ１０３否定）、無限ループによる動作異常はないと判定して（ステップＳ１０５）処理を終了する。
【００９３】
つづいて、自発的コンテキストスイッチ回数に変化がない場合には（ステップＳ１０３肯定）、取得した動作情報２０ｂの他発的コンテキストスイッチ回数を参照し、他発的コンテキストスイッチ回数に変化があるか否かを判定する（ステップＳ１０４）。そして、他発的コンテキストスイッチに変化がない場合には（ステップＳ１０４肯定）、無限ループによる動作異常はないと判定して（ステップＳ１０５）処理を終了する。一方、他発的コンテキストスイッチ回数に変化がある場合には（ステップＳ１０４否定）、無限ループによる動作異常があると判定して（ステップＳ１０６）処理を終了する。
【００９４】
次に、監視プログラムがＣＰＵ待ちによる動作異常を検出する場合の処理手順について図１０を用いて説明する。図１０は、ＣＰＵ待ちによる動作異常を検出する場合における処理手順を示すフローチャートである。
【００９５】
図１０に示すように、まず、動作異常判定部１０ｃが動作情報取得部１０ｂから動作情報２０ｂを受け取ると（ステップＳ２０１）、動作情報２０ｂのプロセス動作状態および動作状態継続時間を参照し、所定時間継続してプロセス動作状態が「実行中」であるか否かを判定する（ステップＳ２０２）。そして、所定時間継続して「実行中」ではない場合には（ステップＳ２０２否定）、ＣＰＵ待ちによる動作異常はないと判定して（ステップＳ２０６）処理を終了する。
【００９６】
つづいて、所定時間継続して「実行中」である場合には（ステップＳ２０２肯定）、取得した動作情報２０ｂの自発的コンテキストスイッチ回数を参照し、自発的コンテキストスイッチ回数に変化があるか否かを判定する（ステップＳ２０３）。そして、自発的コンテキストスイッチ回数に変化がある場合には（ステップＳ２０３否定）、ＣＰＵ待ちによる動作異常はないと判定して（ステップＳ２０６）処理を終了する。
【００９７】
つづいて自発的コンテキストスイッチ回数に変化がない場合には（ステップＳ２０３肯定）、取得した動作情報２０ｂの他発的コンテキストスイッチ回数を参照し、他発的コンテキストスイッチ回数に変化があるか否かを判定する（ステップＳ２０４）。そして、他発的コンテキストスイッチに変化がある場合には（ステップＳ２０４否定）、ＣＰＵ待ちによる動作異常はないと判定して（ステップＳ２０６）処理を終了する。一方、他発的コンテキストスイッチ回数に変化がない場合には（ステップＳ２０４肯定）、ＣＰＵ待ちによる動作異常があると判定して（ステップＳ２０５）処理を終了する。
【００９８】
次に、監視プログラムがＩ／Ｏ待ちによる動作異常を検出する場合の処理手順について図１１を用いて説明する。図１１は、Ｉ／Ｏ待ちによる動作異常を検出する場合における処理手順を示すフローチャートである。
【００９９】
図１１に示すように、まず、動作異常判定部１０ｃが動作情報取得部１０ｂから動作情報２０ｂを受け取ると（ステップＳ３０１）、動作情報２０ｂのプロセス動作状態および動作状態継続時間を参照し、所定時間継続してプロセス動作状態が「待機中（実行待ち）」であるか否かを判定する（ステップＳ３０２）。そして、所定時間継続して「待機中」ではない場合には（ステップＳ３０２否定）、Ｉ／Ｏ待ちによる動作異常はないと判定して（ステップＳ３０６）処理を終了する。
【０１００】
つづいて、所定時間継続して「待機中」である場合には（ステップＳ３０２肯定）、取得した動作情報２０ｂの自発的コンテキストスイッチ回数を参照し、自発的コンテキストスイッチ回数に変化があるか否かを判定する（ステップＳ３０３）。そして、自発的コンテキストスイッチ回数に変化がある場合には（ステップＳ３０３否定）、Ｉ／Ｏ待ちによる動作異常はないと判定して（ステップＳ３０６）処理を終了する。
【０１０１】
つづいて、自発的コンテキストスイッチ回数に変化がない場合には（ステップＳ３０３肯定）、取得した動作情報２０ｂの他発的コンテキストスイッチ回数を参照し、他発的コンテキストスイッチ回数に変化があるか否かを判定する（ステップＳ３０４）。そして、他発的コンテキストスイッチに変化がある場合には（ステップＳ３０４否定）、Ｉ／Ｏ待ちによる動作異常はないと判定して（ステップＳ３０６）処理を終了する。一方、他発的コンテキストスイッチ回数に変化がない場合には（ステップＳ３０４肯定）、ＣＰＵ待ちによる動作異常があると判定して（ステップＳ３０５）処理を終了する。
【０１０２】
上述してきたように、本実施例に係る異常検出処理では、動作情報提供部がオペレーティングシステム上で動作するプロセスの動作情報を収集して監視処理部に提供し、監視処理部の動作異常判定部は、動作情報提供部により提供された動作情報に含まれるプロセス動作状態、動作状態継続時間、他発的コンテキストスイッチ回数および自発的コンテキストスイッチ回数に基づいて監視対象のアプリケーションプログラムに属するプロセスの動作異常を判定するよう構成したので、監視対象となるアプリケーションプログラムの改修をおこなうことなく、かかるアプリケーションプログラムの動作異常を効率的に検出することができる。
【産業上の利用可能性】
【０１０３】
以上のように、本発明にかかる異常検出プログラムおよび異常検出方法は、アプリケーションプログラムの動作異常検出に有用であり、特に、市販アプリケーションなどの改修をおこなうことができないアプリケーションプログラムの動作異常検出に適している。
【図面の簡単な説明】
【０１０４】
【図１】本発明に係るプログラムの異常検出処理の概念を示す図である。
【図２】動作情報と異常種別との関係を示す図である。
【図３】監視対象アプリのプロセス構成を示す図である。
【図４】異常検出処理を含むコンピュータの構成を示す機能ブロック図である。
【図５】監視対象データの一例を示す図である。
【図６】動作情報の一例を示す図である。
【図７】親プロセスが終了した場合における監視対象アプリのプロセス構成を示す図である。
【図８】動作情報のデータの一例を示す図である。
【図９】無限ループによる動作異常を検出する場合における処理手順を示すフローチャートである。
【図１０】ＣＰＵ待ちによる動作異常を検出する場合における処理手順を示すフローチャートである。
【図１１】Ｉ／Ｏ待ちによる動作異常を検出する場合における処理手順を示すフローチャートである。
【符号の説明】
【０１０５】
１  データ提供装置
１０  監視処理部
１０ａ  アプリケーション起動部
１０ｂ  動作情報取得部
１０ｃ  動作異常判定部
１０ｄ  動作異常時処理部
１５  動作情報提供処理部
１５ａ  動作情報提供部
１５ｂ  動作情報管理部
２０  記憶部
２０ａ  監視対象データ
２０ｂ  動作情報
５１、５２  動作情報例
１００  監視プロセス
１０１  親プロセス
１０２  子プロセス
２００  動作情報提供部
【図１】
2006277115.tif 000003
【図２】
2006277115.tif 000004
【図３】
2006277115.tif 000005
【図４】
2006277115.tif 000006
【図５】
2006277115.tif 000007
【図６】
2006277115.tif 000008
【図７】
2006277115.tif 000009
【図８】
2006277115.tif 000010
【図９】
2006277115.tif 000011
【図１０】
2006277115.tif 000012
【図１１】
2006277115.tif 000013