(57)【要約】【課題】  マイクロプロセッサの性能監視カウンタからのタスク毎の性能監視情報取得処理におけるメモリ使用量を削減した処理装置を得る。【解決手段】  性能監視カウンタ２ａの測定値を取得する測定値取得部１２と、タスクの開始時に取得した測定値を保持する測定情報テーブル３１にこのタスク用の領域を確保し、このタスクの終了時にこのタスク用の領域を解放する更新部１３と、この確保したメモリ領域にタスクの開始時に取得した開始時測定値と、タスクが中断している間の割り込みイベント数を保持する測定情報テーブル３１を含む情報保持部１４と、タスクの終了時に取得した終了時測定値から開始時測定値を減算し、さらに、割り込みイベント数を減算して、終了したタスクの実行中測定値増分として算出する算出部１５と、算出部１５で算出した実行中測定値増分をログファイルに出力するログ出力部１６を備える。【選択図】          図４
2014170464.tif 000002
【特許請求の範囲】
【請求項１】
マイクロプロセッサが備える性能監視カウンタから測定値を取得する測定値取得部と、
タスクの開始時に前記性能監視カウンタから取得した測定値を保持する測定情報テーブルにこのタスク用の領域を確保し、このタスクの終了時にこのタスク用の領域を解放する更新部と、
前記タスクの開始時に確保された前記領域に前記タスクの開始時に前記測定値取得部が前記性能監視カウンタから取得した開始時測定値と、前記タスクが中断している間の前記性能監視カウンタの測定値の増分である割込みイベント数を保持する前記測定情報テーブルを含む情報保持部と、
前記タスクの終了時に前記測定値取得部が前記性能監視カウンタより取得した終了時測定値から、前記測定情報テーブルに保持されたこの終了したタスクの前記開始時測定値を減算して終了時測定値増分として求め、さらに、この終了時測定値増分から前記測定情報テーブルに保持されたこの終了したタスクの前記割込みイベント数を減算して、この終了したタスクの実行中測定値増分として算出する算出部と、
前記算出部で算出した前記実行中測定値増分をログファイルに出力するログ出力部と、
を備えることを特徴とする処理装置。
【請求項２】
前記算出部は、前記タスクの終了時に、この終了したタスクが別の先開始タスクを中断して実行された割込みタスクである場合には、前記測定情報テーブルに保持されたこの先開始タスクの前記割込みイベント数にこの終了したタスクの前記終了時測定値増分を加算することを特徴とする請求項１に記載の処理装置。
【請求項３】
前記測定情報テーブルは、中断したのちに再開したタスクについて、この再開したタスクを中断させた割込みタスクの前記終了時測定値をこの再開したタスクの分断時測定値として保持し、
前記算出部は、前記再開したタスクが割込みタスクによって再び中断したときに、前記再開したタスクを再び中断させた割込みタスクの前記開始時測定値から、前記分断時測定値を減算して分断時測定値増分として求めることを特徴とする請求項１もしくは請求項２に記載の処理装置。
【請求項４】
性能監視カウンタを備えたマイクロプロセッサに、
タスクを開始するときに前記マイクロプロセッサに接続された記憶媒体に設けられた前記性能監視カウンタから取得した測定値を保持するための測定情報テーブルにこのタスク用の領域を確保するステップと、
前記タスクを開始するときに前記タスクの開始時測定値として前記性能監視カウンタからカウント値を取得するステップと、
前記測定情報テーブルに確保した前記タスク用の前記領域に取得した前記タスクの開始時測定値を保持するステップと、
前記タスクが終了したときに前記タスクの終了時測定値として前記性能監視カウンタからカウント値を取得するステップと、
取得した前記タスクの終了時測定値から前記タスクの開始時測定値を減算して前記タスクの終了時測定値増分を求めるステップと、
前記タスクを実行するために中断されたタスクがある場合に、この中断されたタスクの開始時にこの中断されたタスクのために前記測定情報テーブルに確保された領域に保持された割込みイベント数に、前記タスクの終了時測定値増分を加算するステップと、
前記タスクの終了時測定値増分から、前記測定情報テーブルに確保された前記タスク用の前記領域に保持された割込みイベント数を減算して前記タスクの実行中測定値増分を算出するステップと、
算出した前記タスクの実行中測定値増分をログファイルに出力するステップと、
前記測定情報テーブルに確保した前記タスク用の前記領域を前記タスクの終了後に解放するステップと、
を実行させるプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明はマイクロプロセッサが備える性能監視カウンタからの性能監視情報取得技術に関する。
【背景技術】
【０００２】
近年のマイクロプロセッサは、性能監視ユニット（Ｐｅｒｆｏｒｍａｎｃｅ  Ｍｏｎｉｔｏｒｉｎｇ  Ｕｎｉｔ：ＰＭＵ）と呼ばれる性能監視カウンタを備えている。このようなマイクロプロセッサを適用した処理装置においては、マイクロプロセッサにおけるプログラム実行の性能改善などを目的として、性能監視カウンタから性能監視情報を取得することが求められる。
【０００３】
通常、マイクロプロセッサによるプログラムの実行はオペレーティングシステムによってタスクと呼ばれる単位で管理される。組み込みシステムなどの処理装置では、１個のタスクを実行中に、例えば実行中のタスクよりも優先度の高い別タスクを実行する必要が生じた場合などに、実行中のタスクが中断されて別のタスクが割り込んで実行され（この割り込んだタスクを先に開始していたタスクに対する割込みタスクと称す）、割込みタスクの終了後に中断されていたタスクの実行が再開されることがある。このような場合には、精度の高い性能監視情報を得るために、性能監視カウンタからの測定値の取得をタスク毎に行う必要がある。
【０００４】
特許文献１に性能監視カウンタで測定したカウント値をプログラム（プロセス）毎に取得する方法が開示されている。特許文献１では、タスクスイッチの際に実施されるＴＬＢ（Ｔｒａｎｓｌａｔｉｏｎ  Ｌｏｏk−ａｓｉｄｅ  Ｂｕｆｆｅｒ）エントリ無効化に伴って実行される割込み処理を検出し、この割込み処理を検出したタイミングでタスクスイッチの判断を行って性能監視カウンタのカウント値を読み出し、読み出したカウント値をタスクスイッチの直前に動作していたプロセスの測定情報として集計・記録することにより、カウント値の取得をプログラム（プロセス）毎に行うものである。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００９−２２３４５１号公報（図１）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
前述のように、特許文献１で開示されている性能監視カウンタのカウント値の取得方法では、ＴＬＢエントリ無効化に伴って行われる割込み処理によってタスクスイッチを検出して、タスクスイッチ検出時に読み出した性能カウンタのカウント値はタスクスイッチの直前に動作していたプログラムの測定情報として集計・記録される。
【０００７】
したがって、１つのタスクを実行中にこのタスクを中断して、別のタスクの実行を開始して終了するような場合でも、タスクの終了は考慮されず、タスク毎の測定情報を集計・記録するテーブルは終了済みのタスクの測定情報も保持することとなり、必要なメモリ量が増大するという問題があった。
【０００８】
この発明は上記の課題を解決するためになされたものであり、実行中のタスクが中断されて別のタスクが実行されるプロセッサの性能監視情報取得において、性能監視カウンタから得た測定情報を保持するために必要なメモリ量を削減することを目的とする。
【課題を解決するための手段】
【０００９】
本発明の処理装置は、マイクロプロセッサが備える性能監視カウンタから測定値を取得する測定値取得部と、タスクの開始時に性能監視カウンタから取得した測定値を保持する測定情報テーブルにこのタスク用の領域を確保し、このタスクの終了時にこのタスク用の領域を解放する更新部と、タスクの開始時に確保された各タスク用の領域に、タスクの開始時に測定値取得部が性能監視カウンタから取得した開始時測定値と、タスクが中断している間の性能監視カウンタの測定値の増分である割込みイベント数を保持する測定情報テーブルを含む情報保持部と、タスクの終了時に測定値取得部が性能監視カウンタより取得した終了時測定値から、測定情報テーブルに保持されたこの終了したタスクの開始時測定値を減算して終了時測定値増分として求め、さらに、この終了時測定値増分から測定情報テーブルに保持されたこの終了したタスクの割込みイベント数を減算して、この終了したタスクの実行中測定値増分として算出する算出部と、算出部で算出した実行中測定値増分をログファイルに出力するログ出力部と、を備えるものである。
【００１０】
本発明の性能監視情報取得プログラムは、性能監視カウンタを備えたマイクロプロセッサに、タスクを開始するときにマイクロプロセッサに接続された記憶媒体に設けられた性能監視カウンタから取得した測定値を保持するための測定情報テーブルにこのタスクのための領域を確保するステップと、タスクを開始するときにこの開始するタスクの開始時測定値として性能監視カウンタからカウント値を取得するステップと、測定情報テーブルに確保したこの開始するタスクのための領域に取得した開始時測定値を保持するステップと、タスクが終了したときにこの終了したタスクの終了時測定値として性能監視カウンタからカウント値を取得するステップと、取得した終了時測定値から同じタスクの開始時測定値を減算してこの終了したタスクの終了時測定値増分を求めるステップと、この終了したタスクを実行するために中断されたタスクがある場合に、この中断されたタスクの開始時にこの中断されたタスクのために測定情報テーブルに確保された領域に保持された割込みイベント数に、算出した終了時測定値増分を加算するステップと、この終了したタスクの終了時測定値増分から、測定情報テーブルに確保されたこのタスクのための領域に保持された割込みイベント数を減算してこのタスクの実行中測定値増分を算出するステップと、算出したこの終了したタスクの実行中測定値増分をログファイルに出力するステップと、測定情報テーブルに確保したこの終了したタスクのための領域をこのタスクの終了後に解放するステップと、を実行させるものである。
【発明の効果】
【００１１】
以上に詳述したように、本発明によればマイクロプロセッサが先に開始されて実行中のタスクを中断して、別の割込みタスクを実行する場合に、マイクロプロセッサが備える性能監視カウンタから測定情報をタスク毎に取得するとき、未終了のタスクに係る測定情報をメモリに保持して、終了したタスクに係る測定情報はメモリに保持しないようにするので、性能監視情報取得において必要なメモリ量を削減することができる。
【図面の簡単な説明】
【００１２】
【図１】この発明の実施の形態１の処理装置の構成図である。
【図２】タスク実行中に別タスクが実行される様子を示す線図である。
【図３】この発明の実施の形態１における前処理と後処理の実行を示す線図である。
【図４】この発明の実施の形態１の性能監視情報取得部の構成図である。
【図５】この発明の実施の形態１の更新部と情報保持部と算出部の構成図である。
【図６】この発明の実施の形態１の測定情報テーブルのフォーマットである。
【図７】この発明の実施の形態１の前処理のフロー図である。
【図８】この発明の実施の形態１の後処理のフロー図である。
【図９】この発明の実施の形態１の終了タスクのイベント数算出処理のフロー図である。
【図１０】この発明の実施の形態１の動作例におけるタスク実行を示す線図である。
【図１１】この発明の実施の形態１の動作例における測定情報テーブルである。
【図１２】この発明の実施の形態１の動作例におけるログファイルの出力例である。
【図１３】この発明の実施の形態２の更新部と情報保持部と算出部の構成図である。
【図１４】この発明の実施の形態２の測定情報テーブルのフォーマットである。
【図１５】この発明の実施の形態２の前処理のフロー図である。
【図１６】この発明の実施の形態２の後処理のフロー図である。
【図１７】この発明の実施の形態２の終了タスクのイベント数算出処理のフロー図である。
【図１８】この発明の実施の形態２の動作例におけるタスク実行を示す線図である。
【図１９】この発明の実施の形態２の動作例における測定情報テーブルである。
【図２０】この発明の実施の形態２の動作例におけるログファイルの出力例である。
【発明を実施するための形態】
【００１３】
以下、この発明の実施の形態を、図を参照して説明する。なお、以下の説明においては同一もしくは相当する部分には同一の符号を付している。
実施の形態１．
【００１４】
図１は、この発明の実施の形態１に係る処理装置１の構成図である。ここでは組み込みシステムを例としている。なお、本発明は組み込みシステムに限定されるものではない。
【００１５】
マイクロプロセッサ２は性能監視カウンタ２ａを備えている。性能監視カウンタ２ａは、例えば分岐命令数、バストランザクション数、実行命令数、キャッシュヒット数、キャッシュミス数などのマイクロプロセッサ２のプログラム実行に係るイベントの発生数（イベント数と称す）を測定する。
【００１６】
このようなカウンタはＰＭＵと呼ばれ、例えばインテル社製のＸＥＯＮ（登録商標）や、ＡＲＭ社のＣＯＲＴＥＸ（商標）−Ａなど多くのプロセッサが備えている。
【００１７】
なおこの実施の形態では、性能監視カウンタ２ａはカウント値が増加するものとして説明するが、例えばリードクリアカウンタなどの異なる形式のカウンタの場合には、カウンタ形式に適した処理に変更すれば良い。
【００１８】
メモリ３はマイクロプロセッサ２に接続された記憶媒体である。周辺機器４は、ネットワークインタフェース、各種のセンサ、あるいはモータや発光ダイオードなどのマイクロプロセッサ２によって制御される機器である。
【００１９】
メモリ３は、マイクロプロセッサ２で実行されるプログラムである、オペレーティングシステム５、アプリケーションプログラム６、性能監視情報取得部７を記憶している。
【００２０】
オペレーティングシステム５は、マイクロプロセッサ２でのタスクの実行を管理するタスク管理部５ａを備えている。ここでタスクとは、プロセスあるいはスレッドなどのオペレーティングシステム５によって管理するマイクロプロセッサ２でのプログラム実行の管理単位である。
【００２１】
アプリケーションプログラム６はオペレーティングシステム５のタスク管理部５ａによってその実行が管理されるマイクロプロセッサ２で実行されるプログラムであり、例えば、家電機器の制御プログラムや産業用機器の制御プログラムなどである。
【００２２】
性能監視情報取得部７は性能監視カウンタ２ａの測定結果からタスク毎の性能監視情報を求めるためのマイクロプロセッサ２で実行されるプログラムである。
【００２３】
タスク管理部５ａの制御によって、先に実行を開始したタスクを実行中に例えば優先度の高い別のタスクを割り込ませて実行するとき、実行状態のタスク（実行中タスク）と割り込まれて実行可能状態のまま実行中タスクの終了を待つタスクは図２に示すように階層構造となる。図２はタスクＡを実行中にタスクＢが割り込みをして開始され、さらにタスクＢを実行中にタスクＣが割込みをした例を示している。
【００２４】
性能監視情報取得部７はタスク管理部５ａのタスク実行処理にフックされており、例えば図２のようにタスクＡ，タスクＢ、タスクＣが実行されるとき、図３に示すように各タスクの実行の前後に、それぞれ性能監視情報取得部７による処理（以下では、タスク実行前に行う性能監視情報取得部７による処理を前処理、タスク実行後に行う性能監視情報取得部７による処理を後処理と称す）が実行される。図３において例えば前処理（Ａ）はタスクＡに対応する前処理を表している。ここで、フックとはプログラム中のある箇所に、別のプログラムの処理を追加するための仕組みであり、タスク管理部５ａがフックの仕組みを備えている。
【００２５】
図４は性能監視情報取得部７の構成図である。性能監視情報取得部７は、性能監視情報取得部７による処理を制御するための処理制御部１１、性能監視カウンタ２ａから測定値を取得するための測定値取得部１２、性能監視情報取得部７内に保持する性能監視カウンタ２ａから取得した測定値に係る測定情報などを更新するための更新部１３、性能監視情報取得部７内で測定情報などを保持するための情報保持部１４、性能監視カウンタ２ａから取得した測定値からタスク毎のイベント数を算出するための算出部１５、タスク毎のイベント数を性能監視情報としてログファイルに出力するためのログ出力部１６を備えている。性能監視情報取得部７が備える各部は、前処理の実行中であるのか、それとも後処理の実行中であるのかでタスクの開始と終了を認識することができる。
【００２６】
この実施の形態では、性能監視情報取得部７での測定情報の保持をテーブル形式で行っている。以下で使用する「エントリ」はこのテーブルの行に対応し、「エントリ番号」はその行番号である。
【００２７】
図５（ａ）、（ｂ）、（ｃ）はそれぞれ更新部１３、情報保持部１４、算出部１５の詳細構成図である。更新部１３は、性能監視情報取得部７に保持する測定情報の更新処理をするための測定情報更新部２１、実行中タスクのエントリ番号を更新するためのエントリ番号更新部２２、実行中タスクの１つ上の階層のタスクのエントリ番号を更新するための上階層番号更新部２３、実行中タスクの階層を更新するためのタスク階層更新部２４を備える。
【００２８】
情報保持部１４は、測定情報を記憶するための測定情報テーブル３１、実行中タスクのエントリ番号を記憶するための実行エントリ番号３２、実行中タスクの１つ上の階層のタスクのエントリ番号を記憶するための上階層エントリ番号３３、実行中タスクの階層を記憶するためのタスク階層３４を備える。
【００２９】
図６は測定情報テーブル３１のフォーマットの一例を示す図である。このフォーマットは一例であり、この発明は図６のフォーマットであることに限定されるものではない。測定情報テーブルの各エントリは、それぞれマイクロプロセッサ２が実行する各タスク用の領域である。図６においてタスクＩＤフィールドはそのエントリに対応するタスクの識別情報（この識別情報をタスクＩＤと称す）を記録するフィールドである。開始時測定値および終了時測定値のフィールドはそれぞれそのエントリに対応するタスクの開始時と終了時に性能監視カウンタ２ａから取得した測定値である。割込みイベント数フィールドは、そのエントリに対応するタスクを開始してから終了するまでの間の、割込みタスク実行中のイベント数を記録するフィールドである。階層フィールドはそのエントリに対応するタスクの階層を記録するフィールドである。
【００３０】
なお、ここでは説明を簡略化するために測定情報テーブル３１で各エントリの開始時測定値フィールド、終了時測定値フィールド、割込みイベント数フィールドを１個のフィールドで表している。性能監視カウンタ２ａが測定するカウント項目は前述の通り複数の項目があり、これら複数項目の情報を処理するには各フィールド内を細分化するなどして、カウント項目毎に処理を行うようにすれば良い。
【００３１】
算出部１５は算出処理を制御する算出制御部４１、測定情報テーブル３１から情報を読み出す読出部４２、加算処理を行う加算部４３、減算処理を行う減算部４４を備える。
【００３２】
次に、この発明の実施の形態１の処理装置１の性能監視情報取得の動作を説明する。マイクロプロセッサ２は、タスク管理部５ａによる処理で、マイクロプロセッサ２が実行するタスクの開始、終了を制御し、タスクを開始する前に、性能監視情報取得部７による前処理を実行する。このとき、タスク管理部５ａから性能監視情報取得部７に実行するタスクのタスクＩＤを通知する。
【００３３】
図７に前処理の処理フローを示す。最初に処理制御部１１より更新部１３のエントリ番号更新部２２に要求を出して、エントリ番号更新部２２による実行エントリ番号更新の処理を実行する（Ｓ１００）。
【００３４】
Ｓ１００の処理では、エントリ番号更新部２２により情報保持部１４の実行エントリ番号３２を読み出し、読み出した値に１を加算して、実行エントリ番号３２に更新した値を記憶する。この実行エントリ番号３２の更新によって、測定情報テーブル３１にこれからプロセッサ２が実行を開始するタスク用のエントリ(領域)を確保する。なお、実行エントリ番号３２の初期値は０とする。
【００３５】
Ｓ１００の処理が終了すると次に、処理制御部１１より更新部１３のタスク階層更新部２４に要求を出して、タスク階層更新部２４によるタスク階層更新の処理を実行する（Ｓ１１０）。Ｓ１１０の処理では、タスク階層更新部２４により情報保持部１４のタスク階層３４を読み出し、読み出した値に１を加算して、タスク階層３４に更新した値を記憶する。なお、タスク階層３４の初期値は０とする。
【００３６】
Ｓ１１０の処理が終了すると次に、処理制御部１１より更新部１３の測定情報更新部２１に要求を出し、測定情報更新部２１による測定情報更新の処理を実行する（Ｓ１２０）。このときの要求に前処理の後に実行開始するタスクのタスクＩＤが含まれる。Ｓ１２０の処理では、まず、実行エントリ番号３２が示すエントリ（すなわち開始するタスクのエントリ）のタスクＩＤを処理制御部１１より通知された値に更新する。また、測定値取得部１２によって性能監視カウンタ２ａからこの時点の測定値（カウント値）を取得し、取得した測定値で開始時測定値を更新する。そして、階層をタスク階層３４の値で更新する。また、割込みイベント数は初期値として０に更新する。
【００３７】
Ｓ１２０の処理が終了すると次に、処理制御部１１より上階層番号更新部２３に要求を出し、上階層番号更新部２３による上階層エントリ番号更新の処理を実行する（Ｓ１３０）。Ｓ１３０の処理では、まず、上階層エントリ番号３３を読み出す。次に、実行エントリ番号３２を読み出して、実行エントリ番号３２が示す測定情報テーブル３１のエントリの階層（すなわち開始するタスクの階層）を読み出す。そして、開始するタスクの階層をチェックし、階層が２以上の場合に読み出しておいた上階層エントリ番号３３の値に１を加算する。階層が１以下である場合には、加算を行わない。上階層エントリ番号３３に更新した値を記憶する。なお、上階層エントリ番号３３の初期値は０とする。
【００３８】
以上で前処理は終了する。マイクロプロセッサ２はタスク管理部５ａによる管理でタスクを実行する。タスクの実行を終了すると、性能監視情報取得部７による後処理を実行する。
【００３９】
図８に後処理の処理フローを示す。最初に処理制御部１１より更新部１３の測定情報更新部２１に要求を出し、測定情報更新部２１による測定情報更新の処理を実施する（Ｓ１４０）。Ｓ１４０の処理では、実行エントリ番号３２が示す測定情報テーブル３１のエントリを対象として、測定値取得部１２によって性能監視カウンタ２ａから取得したタスク終了後の測定値で終了時測定値を更新する。
【００４０】
Ｓ１４０の処理が終了すると次に、処理制御部１１は算出部１５の算出制御部４１に終了したタスク（終了タスク）実行中のイベント数算出をするように要求を出す。これにより、算出制御部４１による制御で終了タスクのイベント数算出処理を実施する（Ｓ１５０）。
【００４１】
図９にＳ１５０の処理の詳細なフローを示す。まず、算出制御部４１の処理で終了タスクのエントリ番号である実行エントリ番号３２を読み出す（Ｓ１５１）。
【００４２】
次に、読み出したエントリ番号が示す測定情報テーブル３１のエントリ（すなわち終了タスクのエントリ）の読み出しを読出部４２に要求する。読出部４２の処理で測定情報テーブル３１から終了タスクのタスクＩＤ、開始時測定値、終了時測定値、割込みイベント数を読み出す。そして、読み出した値を算出制御部４１に渡す。（Ｓ１５２）。
【００４３】
次に、算出制御部４１より読み出した開始時測定値、終了時測定値を減算部４４に渡し、減算部４４による処理で、終了時測定値から開始時測定値を減算して、終了時測定値増分として求め、求めた終了時測定値増分を算出制御部４１に渡す（Ｓ１５３）。
【００４４】
次に、算出制御部４１の処理で、上階層エントリ番号３３を読み出し、その値が０でないかチェックする（Ｓ１５４）。０でない場合、上階層エントリ番号３３が示す測定情報テーブル３１のエントリ（すなわち終了したタスクの上階層タスクのエントリ）の読み出しを読出部４２に要求する。読出部４２の処理で指定されたエントリの割込みイベント数（上階層タスクの割込みイベント数）を読み出して算出制御部４１に渡す（Ｓ１５５）。
【００４５】
次に算出制御部４１より、上階層タスクの割込みイベント数と減算部４４で算出した終了時測定値増分を加算部４３に渡し、加算部４３の処理で上階層タスクの割込みイベント数と終了時測定値増分を加算して、加算した結果を算出制御部４１に上階層タスクの割込みイベント数の更新値として渡す（Ｓ１５６）。
【００４６】
次に算出制御部４１により、上階層タスクのエントリの割込みイベント数を更新値で更新する（Ｓ１５７）。上階層エントリ番号３３が０である場合には、Ｓ１５５〜Ｓ１５７の処理は実施されない。
【００４７】
次に、算出制御部４１による処理で、減算部４４で算出した終了時測定値増分とＳ１５２で読み出した終了タスクの割込みイベント数を減算部４４に渡す。そして、減算部４４の処理で、終了時測定値増分から終了タスクの割込みイベント数を減算して、終了タスクの実行中測定値増分を求め、算出制御部４１に算出した終了タスクの実行中測定値増分を終了タスクのイベント数として渡す（Ｓ１５８）。
【００４８】
次に算出制御部４１の処理により、ログ出力部１６にタスクＩＤ、終了タスクのイベント数、階層を渡す（Ｓ１５９）。
【００４９】
Ｓ１５０（Ｓ１５１〜Ｓ１５９）の処理の後、ログ出力部１６による処理で算出制御部４１から渡されたタスクＩＤ、終了タスクのイベント数、階層をログファイルに出力する（Ｓ１６０）。ログファイルへの出力は、出力する情報を一時的にメモリに保存して後でまとめてログファイルに出力しても良いし、その都度ログファイルに出力しても良い。
【００５０】
Ｓ１６０の処理が終了すると次に、処理制御部１１より上階層番号更新部２３に上階層エントリ番号３３の更新を要求する。上階層番号更新部２３の処理により、上階層エントリ番号３３を読み出して値が２以上の場合には１を減算して上階層エントリ番号３３の更新値とする。１以下の場合には変更せずに更新値とする。上階層エントリ番号３３に更新値を記憶する（Ｓ１７０）。
【００５１】
Ｓ１７０の処理が終了すると次に、処理制御部１１よりタスク階層更新部２４にタスク階層３４の更新を要求する。タスク階層更新部２４の処理により、タスク階層３４を読み出して、読み出した値から１を減算し、タスク階層３４の更新値とする。タスク階層３４に更新値を記憶する（Ｓ１８０）。
【００５２】
Ｓ１８０の処理が終了すると次に、処理制御部１１よりエントリ番号更新部２２に実行エントリ番号３２の更新を要求する。エントリ番号更新部２２の処理により、実行エントリ番号３２を読み出して、測定情報テーブル３１の実行エントリ番号３２が示すエントリ用のメモリ領域を解放する。そして、読出した実行エントリ番号３２の値から１を減算して実行エントリ番号３２の更新値とする。実行エントリ番号３２に更新値を記憶する（Ｓ１９０）。
【００５３】
この実行エントリ番号３２の更新によって、測定情報テーブル３１に確保されていた終了したタスク用のエントリ（領域）を解放する。これにより、新しいタスクが開始されるときにはこの解放したエントリの再利用をすることができる。
【００５４】
Ｓ１４０〜Ｓ１９０の処理を実施して後処理は終了する。なお、Ｓ１６０のログ出力とＳ１７０以降の処理は並列に実行されても良い。
【００５５】
上記で説明した前処理および後処理の具体的な処理手順および処理内容に関しては、同等の処理結果となる限り、異なる手順および内容で実施するようにしても良い。
【００５６】
以下に、上記で説明した動作の簡単な具体例を示す。図１０はこの具体例のタスク実行の様子を示している。時刻ｔ１〜時刻ｔ８の間に、それぞれのタスクＩＤが１〜４である、タスクＡ〜タスクＤの４個のタスクが実行されており、タスクＡはタスクＢおよびタスクＤに、タスクＢはタスクＣに割り込まれてタスク実行中に中断が発生している。図１０で性能監視カウンタ２ａのカウント値は各時刻に性能監視カウンタ２ａから取得する測定値の値を示している。また、図１０には実行エントリ番号３２、上階層エントリ番号３３、タスク階層３４の値の遷移を示している。なお、図１０には前処理、後処理は省略して示していない。
【００５７】
マイクロプロセッサ２は、時刻ｔ１にタスクＡの実行を開始する。図１０に示す通り、実行エントリ番号３２は１を加算して０から１に更新し、これにより測定情報テーブル３１のエントリ番号１のエントリをタスクＡ用の領域として確保する。また、タスク階層３４は１を加算して０から１に更新する。測定情報テーブル３１のエントリ番号１のエントリにタスクＡの情報を保持する。時刻ｔ１における測定情報テーブル３１を図１１の（１）に示す。エントリ番号１のエントリは、タスクＩＤが１、開始時測定値が１０、階層が１であり、割込みイベント数は初期値０である。また、図１０に示す通り、階層が１であるので上階層エントリ番号３３は０のままである。
【００５８】
時刻ｔ２にタスクＢを開始する。実行エントリ番号３２は１を加算して１から２に更新し、これにより測定情報テーブル３１のエントリ番号２のエントリをタスクＢ用の領域として確保する。また、タスク階層３４は１を加算して１から２に更新する。測定情報テーブル３１のエントリ番号２のエントリにタスクＢの情報を保持する。時刻ｔ２における測定情報テーブル３１を図１１の（２）に示す。エントリ番号２のエントリは、タスクＩＤが２、開始時測定値が２０、階層が２であり、割込みイベント数は初期値０である。また、図１０に示す通り、階層が２であるので上階層エントリ番号３３は１が加算して０から１に更新する。
【００５９】
時刻ｔ３にタスクＣを開始する。実行エントリ番号３２は１を加算して２から３に更新し、これにより測定情報テーブル３１のエントリ番号３のエントリをタスクＣ用の領域として確保する。また、タスク階層３４は１を加算して２から３に更新する。測定情報テーブル３１のエントリ番号３のエントリにタスクＣの情報を保持する。時刻ｔ３における測定情報テーブル３１を図１１の（３）に示す。エントリ番号３のエントリのタスクＩＤは３、開始時測定値は３０、階層は３であり、割込みイベント数は初期値０である。また、図１０に示す通り、階層が３であるので上階層エントリ番号３３は１を加算して１から２に更新する。
【００６０】
時刻ｔ４にタスクＣを終了すると、実行エントリ番号３２が３であるので、測定情報テーブル３１のエントリ番号３のエントリにタスクＣの情報として終了時測定値＝４０を保持する。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を（終了時測定値−開始時測定値）＝４０−３０＝１０と算出する。そして、上階層エントリ番号３３が２であるので、上階層タスクの割込みイベント数算出を行い、上階層タスク（タスクＢ）の割込みイベント数は元の値０に終了時測定値増分１０を加算して１０と算出して、この値で測定情報テーブル３１のエントリ番号２の割込みイベント数を更新する。この時点における測定情報テーブル３１を図１１の（４）に示す。なおエントリ番号３のエントリは、後処理終了の時点で解放されてタスクＣ用の領域ではなくなるので、図１１ではテーブルの枠を破線にして示している（以降、他でも同様である）。
【００６１】
そして、終了時測定値増分からエントリ番号３のエントリの割込みイベント数を減算して、タスクＣのイベント数を１０−０＝１０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図１２の（１）に示す。終了したタスクＣのタスクＩＤ，タスクＣ実行中のイベント数、階層がログファイルに記録されている。
【００６２】
また、図１０に示す通り、タスク階層３４は１を減算して３から２に、上階層エントリ番号３３は１を減算して２から１に、実行エントリ番号３２は１を減算して３から２に更新する。これにより、エントリ番号３のエントリを解放する。
【００６３】
時刻ｔ５にタスクＢを終了すると、実行エントリ番号３２が２であるので、測定情報テーブル３１のエントリ番号２のエントリにタスクＢの情報として終了時測定値＝５０を保持する。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を５０−２０＝３０と算出する。そして、上階層エントリ番号３３が１であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク（タスクＡ）の割込みイベント数に終了時測定値増分３０を加算して３０と算出し、測定情報テーブル３１のエントリ番号１の割込みイベント数を更新する。時刻ｔ５の時点の測定情報テーブル３１を図１１の（５）に示す。
【００６４】
そして、終了時測定値増分からエントリ番号２のエントリの割込みイベント数を減算して、タスクＢのイベント数を３０−１０＝２０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図１２の（２）に示す。終了したタスクＢのタスクＩＤ，タスクＢ実行中のイベント数、階層がログファイルに追加されている。
【００６５】
また、図１０に示す通り、タスク階層３４は１を減算して２から１に、上階層エントリ番号３３は１を減算して１から０に、実行エントリ番号３２は１を減算して２から１に更新する。これにより、エントリ番号２のエントリを解放する。
【００６６】
時刻ｔ６にタスクＤを開始する。実行エントリ番号３２は１を加算して１から２に更新し、これにより測定情報テーブル３１のエントリ番号２のエントリをタスクＤ用の領域として確保する。また、タスク階層３４は１を加算して１から２に更新する。測定情報テーブル３１のエントリ番号２のエントリにタスクＤの情報を保持する。時刻ｔ６における測定情報テーブル３１を図１１の（６）に示す。エントリ番号２のエントリのタスクＩＤは４、開始時測定値は６０、階層は２であり、割込みイベント数は初期値０である。また、図１０に示す通り、階層が２であるので上階層エントリ番号３３は１を加算して０から１に更新する。
【００６７】
時刻ｔ７にタスクＤを終了すると、実行エントリ番号３２が２であるので、測定情報テーブル３１のエントリ番号２のエントリにタスクＤの情報として終了時測定値＝７０を保持する。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を７０−６０＝１０と算出する。そして、上階層エントリ番号３３が１であるので、上階層タスクの割込みイベント数算出を行い、上階層タスク（タスクＡ）の割込みイベント数を３０＋１０＝４０と算出して、この値で測定情報テーブル３１のエントリ番号１の割込みイベント数を更新する。時刻ｔ７における測定情報テーブル３１を図１１の（７）に示す。
【００６８】
そして、終了時測定値増分からエントリ番号２のエントリの割込みイベント数を減算して、タスクＤのイベント数を１０−０＝１０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図１２の（３）に示す。終了したタスクＤのタスクＩＤ，タスクＤ実行中のイベント数、階層がログファイルに追加されている。
【００６９】
また、図１０に示す通り、タスク階層３４は１を減算して２から１に、上階層エントリ番号３３は１を減算して１から０に、実行エントリ番号３２は１を減算して２から１に更新する。これにより、エントリ番号２のエントリを解放する。
【００７０】
時刻ｔ８にタスクＡを終了すると、実行エントリ番号３２が１であるので、測定情報テーブル３１のエントリ番号１のエントリにタスクＡの情報として終了時測定値＝８０を保持する。そして、終了タスクのイベント数算出を行い、終了時測定値増分を８０−１０＝７０と算出する。上階層エントリ番号３３が０であるので、上階層タスクの割込みイベント数算出は行わない。時刻ｔ８における測定情報テーブル３１を図１１の（８）に示す。
【００７１】
そして、終了時測定値増分からエントリ番号１のエントリの割込みイベント数を減算して、タスクＡのイベント数を７０−４０＝３０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図１２の（４）に示す。終了したタスクＡのタスクＩＤ，タスクＤ実行中のイベント数、階層がログファイルに追加されている。
【００７２】
また、図１０に示す通り、タスク階層３４は１を減算されて１から０に、実行エントリ番号３２は１を減算して１から０に更新する。上階層エントリ番号３３は０のままである。これにより、エントリ番号１のエントリを解放する。
【００７３】
以上のように、本発明の実施の形態１の処理装置は、タスク開始時に性能監視カウンタから取得した測定値を保持する測定情報テーブルに開始するタスクのための領域を確保し、性能監視カウンタから取得した開始時測定値と、タスクを中断して割込みタスクを実行中の性能監視カウンタの増分である割込みイベント数と、タスク終了時に測定した終了時測定値とをこの領域に保持し、そして、終了時測定値から開始時測定値を減算し、さらに割込みイベント数を減算して、得られた性能監視情報をログファイルに出力し、この終了したタスクを開始するときに確保した領域を解放するようにしたので、解放した測定情報テーブルの領域は別のタスクを開始するときに再利用することができ、未終了のタスクの測定情報をメモリに保持し、終了済みのタスクの測定情報はメモリに保持しないことで、メモリ使用量を削減してタスク毎に性能監視情報の取得を行うことができる。
【００７４】
また、ＯＳのタスク管理部にフックした性能監視情報取得部によりタスク開始前の前処理と、タスク終了後の前処理を行って、性能監視カウンタから性能監視情報を取得する処理を行うので、ＴＬＢ無効化に伴う割り込み処理を実行しない場合にもタスク毎に性能監視情報を取得することができる。
【００７５】
なお、測定情報テーブル３１は論理的にテーブル構造となっていれば良く、必ずしも連続領域である必要はない。
実施の形態２．
【００７６】
以下に、この発明の実施の形態２に係る処理装置を、図を参照して説明する。タスク実行中に別のタスクが実行された場合に、先に実行されていたタスクは２つ以上に分断されて実行されることになる（このような分断されたタスクを分断タスクと称す）が、実施の形態１の処理装置では、分断タスクの分断されたそれぞれの実行についての性能監視情報を得ることができなかった。
【００７７】
例えば、１個のタスクが複数の割込みタスクによって中断して分断された場合、どのタスクが割込んだかによって分断タスクを再開後に取得する性能監視情報が変わってくることがある。このような場合、分断されたそれぞれの部分の性能監視情報を得られていると、プログラム実行状況の解析に役立てることができる。
【００７８】
キャッシュヒットを例にとると、分断前と分断後でキャッシュヒット数が大きく変わっていた場合には、このとき割り込んだ割込みタスクがキャッシュのデータを書き換えたためにキャッシュヒット数が変化したと判断することができ、性能改善に役立てることができる。
【００７９】
実施の形態２の処理装置では、分断されたそれぞれの実行の性能監視情報を得ることができるようにする。
【００８０】
実施の形態２の構成は、実施の形態１の構成と同様であるので、実施の形態１との差分を中心に構成を説明する。図１３（ａ）、（ｂ）、（ｃ）はそれぞれ実施の形態２の性能監視情報取得部７の更新部１３、情報保持部１４、算出部１５の詳細構成を示す図である。更新部１３は、測定情報更新部２１ａ、エントリ番号更新部２２、上階層番号更新部２３、タスク階層更新部２４と、分断番号更新部２５、一時保持更新部２６を備える。
【００８１】
また、情報保持部１４は測定情報テーブル３１ａ、実行エントリ番号３２、上階層エントリ番号３３、タスク階層３４と、分断エントリ番号３５、測定値一時保持３６を備える。算出部１５は算出制御部４１ａ、読出部４２、加算部４３、減算部４４を備える。
【００８２】
図１４は測定情報テーブル３１ａのフォーマットの一例を説明する図である。実施の形態１の測定情報テーブル３１との違いは、分断時測定値フィールドを備えることである。
【００８３】
次に、この発明の実施の形態２の処理装置１の性能監視情報取得の動作を、実施の形態１との差分を中心に説明する。また、実施の形態１と同様に具体例を示す。
【００８４】
図１５に実施の形態２の性能監視情報取得部７による前処理のフローを示す。Ｓ１００、Ｓ１１０の処理は実施の形態１と同様である。
【００８５】
Ｓ１１０の処理の後、処理制御部１１より分断番号更新部２５に分断タスクのエントリ番号更新の要求を出し、分断エントリ番号更新部２５の処理を実行する（Ｓ１１１）。Ｓ１１１の処理では、まずタスク階層３４を読み出して、階層が２以上の場合に分断エントリ番号３５を読み出し、読み出した値に１を加算する。階層が１である場合には、加算を行わない。分断エントリ番号３５に更新した値を記憶する。なお、分断エントリ番号３５の初期値は０とする。
【００８６】
Ｓ１１１の処理の後に実施するＳ１２０の処理は実施の形態１と同様である。
【００８７】
Ｓ１２０の処理の後、処理制御部１１より測定情報更新部２１ａに要求して、実施の形態２の測定情報更新部２１ａによる分断時測定値更新の処理を実施する（Ｓ１２１）。Ｓ１２１の処理では、まずタスク階層３４を読み出して、階層が２以上である場合に、測定値一時保持３６を読み出す。次に、分断エントリ番号３５を読み出して、分断エントリ番号３５が示す測定情報テーブル３１ａのエントリの分断時測定値を、読み出した測定値一時保持３６の値で更新する。階層が１の場合には分断時測定値を更新しない。
【００８８】
Ｓ１２１の処理の後、処理制御部１１より一時保持更新部２６に要求し、一時保持更新部２６による測定値一時保持更新の処理を実施する（Ｓ１２２）。Ｓ１２２の処理では、実行エントリ番号３２が示す測定情報テーブル３１ａのエントリの開始時測定値を読み出して、読み出した値を測定値一時保持３６に記憶する。
【００８９】
Ｓ１２２の処理の後にはＳ１３０の処理を実施する。Ｓ１３０は実施の形態１と同様であり、Ｓ１３０の処理を実施して前処理を終了する。
【００９０】
次に後処理について説明する。図１６に実施の形態２の性能監視情報取得部７の後処理のフローを示す。Ｓ１４０の処理は実施の形態１と同様である。
【００９１】
Ｓ１４０の処理の後、処理制御部１１より一時保持更新部２６に要求して、一時保持更新部２６による測定値一時保持更新の処理を実施する（Ｓ１４１）。Ｓ１４１の処理では、まず実行エントリ番号３２が示す測定情報テーブル３１ａのエントリの終了時測定値を読み出して、その値を測定値一時保持３６に記憶する。
【００９２】
Ｓ１４１の処理が終了すると次に、処理制御部１１より算出部１５の算出制御部４１ａに終了タスク実行中に発生したイベント数を算出するように要求を出し、算出制御部４１ａによる制御で終了タスクのイベント数算出処理を実施する（Ｓ１５０ａ）。Ｓ１５０ａの処理では、終了タスクを実行中に発生したイベント数の算出に加えて、分断タスクの実行中に発生したイベント数算出も実施する。
【００９３】
図１７にＳ１５０ａの処理の詳細なフローを示す。図１７において、Ｓ２００、Ｓ２０１の処理は、それぞれ実施の形態１のＳ１５１、Ｓ１５２の処理と同様である。Ｓ２０１の処理の後、算出制御部４１ａの処理で、分断エントリ番号３５を読み出し、その値が０でないかチェックする（Ｓ２０２）。
【００９４】
分断エントリ番号３５の値が０でない場合、分断エントリ番号３５が示す測定情報テーブル３１ａのエントリの読み出しを読出部４２に要求する。そして、読出部４２の処理では指定されたエントリの情報を測定情報テーブル３１ａから読み出して算出制御部４１ａに渡す（Ｓ２０３）。
【００９５】
次に、Ｓ２０１の処理で読み出した終了タスクの開始時測定値とＳ２０３の処理で読み出した分断タスクの分断時測定値を減算部４４に渡し、減算部４４において終了タスクの開始時測定値から分断タスクの分断時測定値を減算して、分断時測定値増分として算出する（Ｓ２０４）。この分断時測定値増分は、分断タスク再開から次の中断までの分断タスクのイベント数である。
【００９６】
次に、Ｓ２０３で読み出した分断タスクのタスクＩＤと階層とＳ２０４で算出した分断タスクのイベント数と分断タスクの情報であることを示すフラグ（分断フラグ）を分断タスク情報としてログ出力部１６に渡す（Ｓ２０５）。ここでは、分断フラグは論理値１が分断タスクの情報であることを示すこととする。
【００９７】
Ｓ２０２において分断タスクエントリ番号が０であった場合には、Ｓ２０３からＳ２０５までの処理は実施せずに、次の処理を実施する。
【００９８】
次に実施するＳ２０６の処理からＳ２１２までの処理はそれぞれ実施の形態１のＳ１５３からＳ１５９までの処理と同様である。
【００９９】
Ｓ１５０ａの処理の後、ログ出力部１６による処理で算出制御部４１ａから渡された分断タスク情報と、終了タスクのタスクＩＤ、終了タスクのイベント数、階層をログファイルに出力する（Ｓ１６０ａ）。ログ出力は、出力する情報を一時的にメモリに保存して後でまとめてログファイルに出力しても良いし、その都度ログファイルに出力しても良い。
【０１００】
Ｓ１６０ａの処理の後で実施するＳ１７０の処理は実施の形態１と同様である。
【０１０１】
Ｓ１７０の処理の後、処理制御部１１より分断番号更新部２５に分断エントリ番号更新を要求する。分断番号更新部２５の処理により、分断エントリ番号３５を読み出して値が２以上の場合には１を減算して分断エントリ番号３５の更新値とする。１以下の場合には変更せずに更新値とする。分断エントリ番号３５に更新値を記憶する（Ｓ１７１）。
【０１０２】
Ｓ１７１の処理の後に実施するＳ１８０とＳ１９０の処理は実施の形態１と同様である。
【０１０３】
以下に、上記で説明した動作の簡単な具体例を示す。図１８はこの具体例のタスク実行の様子を示している。時刻ｔ１〜時刻ｔ８の間に、それぞれのタスクＩＤが１〜４である、タスクＡ〜タスクＤの４個のタスクが実行されている。性能監視カウンタ２ａのカウント値は各時刻に性能監視カウンタ２ａから取得するイベント数の値を示している。また、実施の形態１の実行エントリ番号３２、上階層エントリ番号３３、タスク階層３４に加えて、分断エントリ番号３５と測定値一時保持３６の値の遷移を示している。なお、前処理、後処理は省略して図示していない。
【０１０４】
マイクロプロセッサ２は、時刻ｔ１にタスクＡの実行を開始する。図１８に示す通り、実行エントリ番号３２は１を加算して０から１に更新し、これにより測定情報テーブル３１のエントリ番号１のエントリをタスクＡ用の領域として確保する。また、タスク階層３４は１を加算して０から１に更新する。階層が１であるので分断エントリ番号３５は０のままである。測定情報テーブル３１のエントリ番号１のエントリにタスクＡの情報を保持する。時刻ｔ１における測定情報テーブル３１ａを図１９の（１）に示す。エントリ番号１のエントリのタスクＩＤは１、開始時測定値は１０、階層は１であり、割込みイベント数は初期値０である。また、図１８に示す通り、階層が１であるので上階層エントリ番号３３は０のままである。測定値一時保持３６には、測定情報テーブル３１ａのエントリ１のタスクＡの開始時測定値である１０を保持する。
【０１０５】
時刻ｔ２にタスクＢを開始する。図１８に示す通り、実行エントリ番号３２は１を加算して１から２に更新し、これにより測定情報テーブル３１のエントリ番号２のエントリをタスクＢ用の領域として確保する。また、タスク階層３４は１を加算して１から２に更新する。階層が２であるので分断エントリ番号３５は１を加算して０から１に更新する。測定情報テーブル３１のエントリ番号２のエントリにタスクＢの情報を保持する。また、階層が２であるので、分断エントリ番号３５が示すエントリ番号１のエントリの分断時測定値を測定値一時保持３６の値（時刻ｔ１の処理で１０となっている）に更新する。
【０１０６】
時刻ｔ２における測定情報テーブル３１ａを図１９の（２）に示す。エントリ番号２のエントリのタスクＩＤは２、開始時測定値は２０、階層は２であり、割込みイベント数は初期値０である。また、エントリ番号１のエントリの分断時測定値は１０になっている。
【０１０７】
そして、階層が２であるので上階層エントリ番号３３は１を加算して０から１に更新する。測定値一時保持３６には、測定情報テーブル３１ａのエントリ２のタスクＢの開始時測定値である２０を記憶する。
【０１０８】
時刻ｔ３にタスクＣを開始する。図１８に示す通り、実行エントリ番号３２は１を加算して２から３に更新し、これにより測定情報テーブル３１のエントリ番号３のエントリをタスクＣ用の領域として確保する。また、タスク階層３４は１を加算して２から３に更新する。階層が３であるので分断エントリ番号３５は１を加算して１から２に更新する。測定情報テーブル３１のエントリ番号３のエントリにタスクＣの情報を保持する。また、階層が３であるので、分断エントリ番号３５が示すエントリ番号２のエントリの分断時測定値を測定値一時保持３６の値（時刻ｔ２の処理で２０となっている）に更新する。
【０１０９】
時刻ｔ３における測定情報テーブル３１ａを図１９の（３）に示す。エントリ番号３のエントリのタスクＩＤは３、開始時測定値は３０、階層は３であり、割込みイベント数は初期値０である。また、エントリ番号２のエントリの分断時測定値は２０になっている。
【０１１０】
そして、階層が３であるので上階層エントリ番号３３は１を加算して１から２に更新する。測定値一時保持３６には、測定情報テーブル３１ａのエントリ３のタスクＣの開始時測定値である３０を記録する。
【０１１１】
時刻ｔ４にタスクＣを終了すると、実行エントリ番号３２が３であるので、測定情報テーブル３１ａのエントリ番号３のエントリにタスクＣの情報として終了時測定値＝４０を保持する。そして、測定値一時保持３６を測定情報テーブル３１ａのエントリ番号３のエントリの終了時測定値の値４０で更新する。分断エントリ番号３５が２であるので、分断タスクのイベント数算出を行い、分断タスクのイベント数を（終了タスクの開始時測定値）―（分断タスクの分断処理開始時測定値）＝３０−２０＝１０と算出する。この結果は分断タスクのタスクＩＤ（分断タスクはタスクＢであるので２）と、階層（タスクＢの階層２）と、分断フラグとともにログファイルに出力する。
【０１１２】
また、終了タスクのイベント数算出を行う。まず、終了時測定値増分を４０−３０＝１０と算出する。上階層エントリ番号３３が２であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク（タスクＢ）の割込みイベント数を０＋１０＝１０と算出し、測定情報テーブル３１ａを更新する。時刻ｔ４の時点の測定情報テーブル３１ａを図１９の（４）に示す。
【０１１３】
そして、終了時測定値増分からエントリ番号３のエントリの割込みイベント数を減算して、タスクＣのイベント数を１０−０＝１０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図２０の（１）に示す。分断タスクＢのタスクＩＤ、タスクＢ実行中のイベント数、階層と分断フラグおよび終了したタスクＣのタスクＩＤ，タスクＣ実行中のイベント数、階層がログファイルに記録されている。
【０１１４】
また、上階層エントリ番号３３は１を減算して２から１に、分断エントリ番号３５は１を減算して２から１に、タスク階層３４は１を減算して３から２に、実行エントリ番号３２は１を減算して３から２に更新する。これにより、エントリ番号３のエントリを解放する。
【０１１５】
時刻ｔ５にタスクＢを終了すると、実行エントリ番号３２が２であるので、測定情報テーブル３１ａのエントリ番号２のエントリにタスクＢの情報として終了時測定値＝５０を保持する。そして、測定値一時保持３６を測定情報テーブル３１ａのエントリ番号２の終了時測定値の値５０で更新する。分断エントリ番号３５が１であるので、分断タスクのイベント数算出を行い、分断タスクのイベント数を２０−１０＝１０と算出する。この結果は分断タスクのタスクＩＤ（分断タスクはタスクＡであるので１）と、階層（タスクＡの階層１）と、分断フラグとともにログファイルに出力する。
【０１１６】
また、終了タスクのイベント数算出を行う。まず、終了時測定値増分を５０−２０＝３０と算出する。上階層エントリ番号３３が１であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク（タスクＡ）の割込みイベント数を０＋３０＝３０と算出し、測定情報テーブル３１ａを更新する。時刻ｔ５の時点の測定情報テーブル３１ａを図１９の（５）に示す。
【０１１７】
そして、終了時測定値増分からエントリ番号２のエントリの割込みイベント数を減算して、タスクＢのイベント数を３０−１０＝２０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図２０の（２）に示す。分断タスクＡのタスクＩＤ、タスクＢ実行中のイベント数、階層と分断フラグおよび終了したタスクＢのタスクＩＤ，タスクＢ実行中のイベント数、階層がログファイルに追加されている。
【０１１８】
また、上階層エントリ番号３３は１を減算して１から０に、分断エントリ番号３５は１を減算して１から０に、タスク階層３４は１を減算して２から１に、実行エントリ番号３２は１を減算して２から１に更新する。これにより、エントリ番号２のエントリを解放する。
【０１１９】
時刻ｔ６にタスクＤを開始する。図１８に示す通り、実行エントリ番号３２は１を加算して１から２に更新し、これにより測定情報テーブル３１のエントリ番号２のエントリをタスクＤ用の領域として確保する。また、タスク階層３４は１を加算して１から２に更新する。階層が２であるので分断エントリ番号３５は１を加算して０から１に更新する。測定情報テーブル３１のエントリ番号２のエントリにタスクＤの情報を保持する。また、階層が２であるので、分断エントリ番号３５が示すエントリ番号２の分断時測定値を測定値一時保持３６の値（時刻ｔ５の処理で５０となっている）に更新する。
【０１２０】
時刻ｔ６における測定情報テーブル３１ａを図１９の（６）に示す。エントリ番号２のエントリのタスクＩＤは４、開始時測定値は６０、階層は２であり、割込みイベント数は初期値０である。また、エントリ番号１のエントリの分断時測定値は５０になっている。
【０１２１】
そして、階層が２であるので上階層エントリ番号３３は１を加算して０から１に更新する。測定値一時保持３６に、測定情報テーブル３１ａのエントリ番号２のタスクＤの開始時測定値である６０を記録する。
【０１２２】
時刻ｔ７にタスクＤを終了すると、実行エントリ番号３２が２であるので、測定情報テーブル３１ａのエントリ番号２にタスクＤの情報として終了時測定値＝７０を保持する。そして、測定値一時保持３６を測定情報テーブル３１ａのエントリ番号２の終了時測定値の値７０で更新する。分断エントリ番号３５が１であるので、分断タスクのイベント数算出を行い、分断タスクのイベント数を６０−５０＝１０と算出する。この結果は分断タスクのタスクＩＤ（分断タスクはタスクＡであるので１）と、階層（タスクＡの階層１）と、分断フラグとともにログファイルに出力する。
【０１２３】
また、終了タスクのイベント数算出を行う。まず、終了時測定値増分を７０−６０＝１０と算出する。上階層エントリ番号３３が１であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク（タスクＡ）の割込みイベント数を３０＋１０＝４０と算出し、測定情報テーブル３１ａを更新する。時刻ｔ７における測定情報テーブル３１ａを図１９の（７）に示す。
【０１２４】
そして、終了時測定値増分からエントリ番号２の割込みイベント数を減算して、タスクＤのイベント数を１０−０＝１０と算出し、ログファイルに出力する。このときのログファイルの内容を図２０の（３）に示す。分断タスクＡのタスクＩＤ、タスクＡ実行中のイベント数、階層と分断フラグおよび終了したタスクＢのタスクＩＤ，タスクＢ実行中のイベント数、階層がログファイルに追加されている。
【０１２５】
また、タスク階層３４は１を減算して２から１に、分断エントリ番号３５は１を減算して１から０に、上階層エントリ番号３３は１を減算して１から０に、実行エントリ番号３２は１を減算して２から１に更新する。これにより、エントリ番号２のエントリを解放する。
【０１２６】
時刻ｔ８にタスクＡを終了すると、実行エントリ番号３２が１であるので、測定情報テーブル３１ａのエントリ番号１のエントリにタスクＡの情報として終了時測定値＝８０を保持する。そして、測定値一時保持３６を測定情報テーブル３１ａのエントリ番号１の終了時測定値の値８０で更新する。分断エントリ番号３５は０であるので分断タスクのイベント数算出は行わない。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を８０−１０＝７０と算出する。上階層エントリ番号３３が０であるので、上階層タスクの割込みイベント数算出は行わない。時刻ｔ８における測定情報テーブル３１ａを図１９の（８）に示す。
【０１２７】
そして、終了時測定値増分からエントリ番号１のエントリの割込みイベント数を減算して、タスクＡのイベント数を７０−４０＝３０と算出し、結果をログファイルに出力する。このときのログファイルの内容を図２０の（４）に示す。終了したタスクＡのタスクＩＤ，タスクＤ実行中のイベント数、階層がログファイルに追加されている。
【０１２８】
また、図１８に示す通り、タスク階層３４は１を減算して１から０に、実行エントリ番号３２は１を減算して１から０に更新する。分断エントリ番号３５および上階層エントリ番号３３は０のままである。これにより、エントリ番号１のエントリを解放する。
【０１２９】
以上のように、本発明の実施の形態２の処理装置は、タスク開始時に性能監視カウンタから取得した測定値を保持する測定情報テーブルに開始するタスクのための領域を確保し、性能監視カウンタから取得した開始時測定値と、タスクを中断して割込みタスクを実行中の性能監視カウンタの増分である割込みイベント数と、タスク終了時に測定した終了時測定値とをこの領域に保持し、そして、終了時測定値から開始時測定値を減算し、さらに割込みイベント数を減算して、得られた性能監視情報をログファイルに出力し、この終了したタスクを開始するときに確保した領域を解放するようにしたので、解放した測定情報テーブルの領域は別のタスクを開始するときに再利用することができ、未終了のタスクの測定情報をメモリに保持し、終了済みのタスクの測定情報はメモリに保持しないことで、メモリ使用量を削減してタスク毎に性能監視情報の取得を行うことができる。
【０１３０】
また、ＯＳのタスク管理部にフックした性能監視情報取得部によりタスク開始前の前処理と、タスク終了後の前処理を行って、性能監視カウンタから性能監視情報を取得する処理を行うので、ＴＬＢ無効化に伴う割り込み処理を実行しない場合にもタスク毎に性能監視情報を取得することができる。
【０１３１】
さらに、タスクを中断して割込みタスクが実行された場合に、中断の直前のタスクの開始もしくは再開時の性能監視カウンタの測定値を分断時測定値として記憶し、中断時にはこの中断時に実行する割込みタスクの開始時測定値を分断時測定値から減算して、タスクの開始もしくは再開から次の中断までの性能監視カウンタの測定値の増分を求めるようにしたので、個々の分割された実行についての性能監視情報を取得することができる。
【０１３２】
なお、実施の形態２では下階層となるタスクの終了時に上階層の分断タスクの性能情報を取得するようにしているが、下階層となるタスクの開始時に取得するように変更することも可能である。
【符号の説明】
【０１３３】
１  処理装置、２  マイクロプロセッサ、２ａ  性能監視カウンタ、３  メモリ、４  周辺機器、５  オペレーティングシステム、５ａ  タスク管理部、６  アプリケーションプログラム、７  性能監視情報取得部、１１  処理制御部、１２  測定値取得部、１３  更新部、１４  情報保持部、１５  算出部、１６  ログ出力部、２１，２１ａ  測定情報更新部、２２  エントリ番号更新部、２３  上階層番号更新部、２４  タスク階層更新部、２５  分断番号更新部、２６  一時保持更新部、３１，３１ａ  測定情報テーブル、３２  実行エントリ番号、３３  上階層エントリ番号、３４  タスク階層、３５  分断エントリ番号、３６  測定値一時保持、４１，４１ａ  算出制御部、４２  読出部、４３  加算部、４４  減算部
【図１】
2014170464.tif 000003
【図２】
2014170464.tif 000004
【図３】
2014170464.tif 000005
【図４】
2014170464.tif 000006
【図５】
2014170464.tif 000007
【図６】
2014170464.tif 000008
【図７】
2014170464.tif 000009
【図８】
2014170464.tif 000010
【図９】
2014170464.tif 000011
【図１０】
2014170464.tif 000012
【図１１】
2014170464.tif 000013
【図１２】
2014170464.tif 000014
【図１３】
2014170464.tif 000015
【図１４】
2014170464.tif 000016
【図１５】
2014170464.tif 000017
【図１６】
2014170464.tif 000018
【図１７】
2014170464.tif 000019
【図１８】
2014170464.tif 000020
【図１９】
2014170464.tif 000021
【図２０】
2014170464.tif 000022