(58)【調査した分野】(Int.Cl.,DB名)
前記測定情報テーブルは、中断したのちに再開したタスクについて、この再開したタスクを中断させた割込みタスクの前記終了時測定値をこの再開したタスクの分断時測定値として保持し、
前記算出部は、前記再開したタスクが割込みタスクによって再び中断したときに、前記再開したタスクを再び中断させた割込みタスクの前記開始時測定値から、前記分断時測定値を減算して分断時測定値増分として求めることを特徴とする請求項1に記載の処理装置。
【発明を実施するための形態】
【0013】
以下、この発明の実施の形態を、図を参照して説明する。なお、以下の説明においては同一もしくは相当する部分には同一の符号を付している。
実施の形態1.
【0014】
図1は、この発明の実施の形態1に係る処理装置1の構成図である。ここでは組み込みシステムを例としている。なお、本発明は組み込みシステムに限定されるものではない。
【0015】
マイクロプロセッサ2は性能監視カウンタ2aを備えている。性能監視カウンタ2aは、例えば分岐命令数、バストランザクション数、実行命令数、キャッシュヒット数、キャッシュミス数などのマイクロプロセッサ2のプログラム実行に係るイベントの発生数(イベント数と称す)を測定する。
【0016】
このようなカウンタはPMUと呼ばれ、例えばインテル社製のXEON(登録商標)や、ARM社のCORTEX(商標)−Aなど多くのプロセッサが備えている。
【0017】
なおこの実施の形態では、性能監視カウンタ2aはカウント値が増加するものとして説明するが、例えばリードクリアカウンタなどの異なる形式のカウンタの場合には、カウンタ形式に適した処理に変更すれば良い。
【0018】
メモリ3はマイクロプロセッサ2に接続された記憶媒体である。周辺機器4は、ネットワークインタフェース、各種のセンサ、あるいはモータや発光ダイオードなどのマイクロプロセッサ2によって制御される機器である。
【0019】
メモリ3は、マイクロプロセッサ2で実行されるプログラムである、オペレーティングシステム5、アプリケーションプログラム6、性能監視情報取得部7を記憶している。
【0020】
オペレーティングシステム5は、マイクロプロセッサ2でのタスクの実行を管理するタスク管理部5aを備えている。ここでタスクとは、プロセスあるいはスレッドなどのオペレーティングシステム5によって管理するマイクロプロセッサ2でのプログラム実行の管理単位である。
【0021】
アプリケーションプログラム6はオペレーティングシステム5のタスク管理部5aによってその実行が管理されるマイクロプロセッサ2で実行されるプログラムであり、例えば、家電機器の制御プログラムや産業用機器の制御プログラムなどである。
【0022】
性能監視情報取得部7は性能監視カウンタ2aの測定結果からタスク毎の性能監視情報を求めるためのマイクロプロセッサ2で実行されるプログラムである。
【0023】
タスク管理部5aの制御によって、先に実行を開始したタスクを実行中に例えば優先度の高い別のタスクを割り込ませて実行するとき、実行状態のタスク(実行中タスク)と割り込まれて実行可能状態のまま実行中タスクの終了を待つタスクは
図2に示すように階層構造となる。
図2はタスクAを実行中にタスクBが割り込みをして開始され、さらにタスクBを実行中にタスクCが割込みをした例を示している。
【0024】
性能監視情報取得部7はタスク管理部5aのタスク実行処理にフックされており、例えば
図2のようにタスクA,タスクB、タスクCが実行されるとき、
図3に示すように各タスクの実行の前後に、それぞれ性能監視情報取得部7による処理(以下では、タスク実行前に行う性能監視情報取得部7による処理を前処理、タスク実行後に行う性能監視情報取得部7による処理を後処理と称す)が実行される。
図3において例えば前処理(A)はタスクAに対応する前処理を表している。ここで、フックとはプログラム中のある箇所に、別のプログラムの処理を追加するための仕組みであり、タスク管理部5aがフックの仕組みを備えている。
【0025】
図4は性能監視情報取得部7の構成図である。性能監視情報取得部7は、性能監視情報取得部7による処理を制御するための処理制御部11、性能監視カウンタ2aから測定値を取得するための測定値取得部12、性能監視情報取得部7内に保持する性能監視カウンタ2aから取得した測定値に係る測定情報などを更新するための更新部13、性能監視情報取得部7内で測定情報などを保持するための情報保持部14、性能監視カウンタ2aから取得した測定値からタスク毎のイベント数を算出するための算出部15、タスク毎のイベント数を性能監視情報としてログファイルに出力するためのログ出力部16を備えている。性能監視情報取得部7が備える各部は、前処理の実行中であるのか、それとも後処理の実行中であるのかでタスクの開始と終了を認識することができる。
【0026】
この実施の形態では、性能監視情報取得部7での測定情報の保持をテーブル形式で行っている。以下で使用する「エントリ」はこのテーブルの行に対応し、「エントリ番号」はその行番号である。
【0027】
図5(a)、(b)、(c)はそれぞれ更新部13、情報保持部14、算出部15の詳細構成図である。更新部13は、性能監視情報取得部7に保持する測定情報の更新処理をするための測定情報更新部21、実行中タスクのエントリ番号を更新するためのエントリ番号更新部22、実行中タスクの1つ上の階層のタスクのエントリ番号を更新するための上階層番号更新部23、実行中タスクの階層を更新するためのタスク階層更新部24を備える。
【0028】
情報保持部14は、測定情報を記憶するための測定情報テーブル31、実行中タスクのエントリ番号を記憶するための実行エントリ番号32、実行中タスクの1つ上の階層のタスクのエントリ番号を記憶するための上階層エントリ番号33、実行中タスクの階層を記憶するためのタスク階層34を備える。
【0029】
図6は測定情報テーブル31のフォーマットの一例を示す図である。このフォーマットは一例であり、この発明は
図6のフォーマットであることに限定されるものではない。測定情報テーブルの各エントリは、それぞれマイクロプロセッサ2が実行する各タスク用の領域である。
図6においてタスクIDフィールドはそのエントリに対応するタスクの識別情報(この識別情報をタスクIDと称す)を記録するフィールドである。開始時測定値および終了時測定値のフィールドはそれぞれそのエントリに対応するタスクの開始時と終了時に性能監視カウンタ2aから取得した測定値である。割込みイベント数フィールドは、そのエントリに対応するタスクを開始してから終了するまでの間の、割込みタスク実行中のイベント数を記録するフィールドである。階層フィールドはそのエントリに対応するタスクの階層を記録するフィールドである。
【0030】
なお、ここでは説明を簡略化するために測定情報テーブル31で各エントリの開始時測定値フィールド、終了時測定値フィールド、割込みイベント数フィールドを1個のフィールドで表している。性能監視カウンタ2aが測定するカウント項目は前述の通り複数の項目があり、これら複数項目の情報を処理するには各フィールド内を細分化するなどして、カウント項目毎に処理を行うようにすれば良い。
【0031】
算出部15は算出処理を制御する算出制御部41、測定情報テーブル31から情報を読み出す読出部42、加算処理を行う加算部43、減算処理を行う減算部44を備える。
【0032】
次に、この発明の実施の形態1の処理装置1の性能監視情報取得の動作を説明する。マイクロプロセッサ2は、タスク管理部5aによる処理で、マイクロプロセッサ2が実行するタスクの開始、終了を制御し、タスクを開始する前に、性能監視情報取得部7による前処理を実行する。このとき、タスク管理部5aから性能監視情報取得部7に実行するタスクのタスクIDを通知する。
【0033】
図7に前処理の処理フローを示す。最初に処理制御部11より更新部13のエントリ番号更新部22に要求を出して、エントリ番号更新部22による実行エントリ番号更新の処理を実行する(S100)。
【0034】
S100の処理では、エントリ番号更新部22により情報保持部14の実行エントリ番号32を読み出し、読み出した値に1を加算して、実行エントリ番号32に更新した値を記憶する。この実行エントリ番号32の更新によって、測定情報テーブル31にこれからプロセッサ2が実行を開始するタスク用のエントリ(領域)を確保する。なお、実行エントリ番号32の初期値は0とする。
【0035】
S100の処理が終了すると次に、処理制御部11より更新部13のタスク階層更新部24に要求を出して、タスク階層更新部24によるタスク階層更新の処理を実行する(S110)。S110の処理では、タスク階層更新部24により情報保持部14のタスク階層34を読み出し、読み出した値に1を加算して、タスク階層34に更新した値を記憶する。なお、タスク階層34の初期値は0とする。
【0036】
S110の処理が終了すると次に、処理制御部11より更新部13の測定情報更新部21に要求を出し、測定情報更新部21による測定情報更新の処理を実行する(S120)。このときの要求に前処理の後に実行開始するタスクのタスクIDが含まれる。S120の処理では、まず、実行エントリ番号32が示すエントリ(すなわち開始するタスクのエントリ)のタスクIDを処理制御部11より通知された値に更新する。また、測定値取得部12によって性能監視カウンタ2aからこの時点の測定値(カウント値)を取得し、取得した測定値で開始時測定値を更新する。そして、階層をタスク階層34の値で更新する。また、割込みイベント数は初期値として0に更新する。
【0037】
S120の処理が終了すると次に、処理制御部11より上階層番号更新部23に要求を出し、上階層番号更新部23による上階層エントリ番号更新の処理を実行する(S130)。S130の処理では、まず、上階層エントリ番号33を読み出す。次に、実行エントリ番号32を読み出して、実行エントリ番号32が示す測定情報テーブル31のエントリの階層(すなわち開始するタスクの階層)を読み出す。そして、開始するタスクの階層をチェックし、階層が2以上の場合に読み出しておいた上階層エントリ番号33の値に1を加算する。階層が1以下である場合には、加算を行わない。上階層エントリ番号33に更新した値を記憶する。なお、上階層エントリ番号33の初期値は0とする。
【0038】
以上で前処理は終了する。マイクロプロセッサ2はタスク管理部5aによる管理でタスクを実行する。タスクの実行を終了すると、性能監視情報取得部7による後処理を実行する。
【0039】
図8に後処理の処理フローを示す。最初に処理制御部11より更新部13の測定情報更新部21に要求を出し、測定情報更新部21による測定情報更新の処理を実施する(S140)。S140の処理では、実行エントリ番号32が示す測定情報テーブル31のエントリを対象として、測定値取得部12によって性能監視カウンタ2aから取得したタスク終了後の測定値で終了時測定値を更新する。
【0040】
S140の処理が終了すると次に、処理制御部11は算出部15の算出制御部41に終了したタスク(終了タスク)実行中のイベント数算出をするように要求を出す。これにより、算出制御部41による制御で終了タスクのイベント数算出処理を実施する(S150)。
【0041】
図9にS150の処理の詳細なフローを示す。まず、算出制御部41の処理で終了タスクのエントリ番号である実行エントリ番号32を読み出す(S151)。
【0042】
次に、読み出したエントリ番号が示す測定情報テーブル31のエントリ(すなわち終了タスクのエントリ)の読み出しを読出部42に要求する。読出部42の処理で測定情報テーブル31から終了タスクのタスクID、開始時測定値、終了時測定値、割込みイベント数を読み出す。そして、読み出した値を算出制御部41に渡す。(S152)。
【0043】
次に、算出制御部41より読み出した開始時測定値、終了時測定値を減算部44に渡し、減算部44による処理で、終了時測定値から開始時測定値を減算して、終了時測定値増分として求め、求めた終了時測定値増分を算出制御部41に渡す(S153)。
【0044】
次に、算出制御部41の処理で、上階層エントリ番号33を読み出し、その値が0でないかチェックする(S154)。0でない場合、上階層エントリ番号33が示す測定情報テーブル31のエントリ(すなわち終了したタスクの上階層タスクのエントリ)の読み出しを読出部42に要求する。読出部42の処理で指定されたエントリの割込みイベント数(上階層タスクの割込みイベント数)を読み出して算出制御部41に渡す(S155)。
【0045】
次に算出制御部41より、上階層タスクの割込みイベント数と減算部44で算出した終了時測定値増分を加算部43に渡し、加算部43の処理で上階層タスクの割込みイベント数と終了時測定値増分を加算して、加算した結果を算出制御部41に上階層タスクの割込みイベント数の更新値として渡す(S156)。
【0046】
次に算出制御部41により、上階層タスクのエントリの割込みイベント数を更新値で更新する(S157)。上階層エントリ番号33が0である場合には、S155〜S157の処理は実施されない。
【0047】
次に、算出制御部41による処理で、減算部44で算出した終了時測定値増分とS152で読み出した終了タスクの割込みイベント数を減算部44に渡す。そして、減算部44の処理で、終了時測定値増分から終了タスクの割込みイベント数を減算して、終了タスクの実行中測定値増分を求め、算出制御部41に算出した終了タスクの実行中測定値増分を終了タスクのイベント数として渡す(S158)。
【0048】
次に算出制御部41の処理により、ログ出力部16にタスクID、終了タスクのイベント数、階層を渡す(S159)。
【0049】
S150(S151〜S159)の処理の後、ログ出力部16による処理で算出制御部41から渡されたタスクID、終了タスクのイベント数、階層をログファイルに出力する(S160)。ログファイルへの出力は、出力する情報を一時的にメモリに保存して後でまとめてログファイルに出力しても良いし、その都度ログファイルに出力しても良い。
【0050】
S160の処理が終了すると次に、処理制御部11より上階層番号更新部23に上階層エントリ番号33の更新を要求する。上階層番号更新部23の処理により、上階層エントリ番号33を読み出して値が2以上の場合には1を減算して上階層エントリ番号33の更新値とする。1以下の場合には変更せずに更新値とする。上階層エントリ番号33に更新値を記憶する(S170)。
【0051】
S170の処理が終了すると次に、処理制御部11よりタスク階層更新部24にタスク階層34の更新を要求する。タスク階層更新部24の処理により、タスク階層34を読み出して、読み出した値から1を減算し、タスク階層34の更新値とする。タスク階層34に更新値を記憶する(S180)。
【0052】
S180の処理が終了すると次に、処理制御部11よりエントリ番号更新部22に実行エントリ番号32の更新を要求する。エントリ番号更新部22の処理により、実行エントリ番号32を読み出して、測定情報テーブル31の実行エントリ番号32が示すエントリ用のメモリ領域を解放する。そして、読出した実行エントリ番号32の値から1を減算して実行エントリ番号32の更新値とする。実行エントリ番号32に更新値を記憶する(S190)。
【0053】
この実行エントリ番号32の更新によって、測定情報テーブル31に確保されていた終了したタスク用のエントリ(領域)を解放する。これにより、新しいタスクが開始されるときにはこの解放したエントリの再利用をすることができる。
【0054】
S140〜S190の処理を実施して後処理は終了する。なお、S160のログ出力とS170以降の処理は並列に実行されても良い。
【0055】
上記で説明した前処理および後処理の具体的な処理手順および処理内容に関しては、同等の処理結果となる限り、異なる手順および内容で実施するようにしても良い。
【0056】
以下に、上記で説明した動作の簡単な具体例を示す。
図10はこの具体例のタスク実行の様子を示している。時刻t1〜時刻t8の間に、それぞれのタスクIDが1〜4である、タスクA〜タスクDの4個のタスクが実行されており、タスクAはタスクBおよびタスクDに、タスクBはタスクCに割り込まれてタスク実行中に中断が発生している。
図10で性能監視カウンタ2aのカウント値は各時刻に性能監視カウンタ2aから取得する測定値の値を示している。また、
図10には実行エントリ番号32、上階層エントリ番号33、タスク階層34の値の遷移を示している。なお、
図10には前処理、後処理は省略して示していない。
【0057】
マイクロプロセッサ2は、時刻t1にタスクAの実行を開始する。
図10に示す通り、実行エントリ番号32は1を加算して0から1に更新し、これにより測定情報テーブル31のエントリ番号1のエントリをタスクA用の領域として確保する。また、タスク階層34は1を加算して0から1に更新する。測定情報テーブル31のエントリ番号1のエントリにタスクAの情報を保持する。時刻t1における測定情報テーブル31を
図11の(1)に示す。エントリ番号1のエントリは、タスクIDが1、開始時測定値が10、階層が1であり、割込みイベント数は初期値0である。また、
図10に示す通り、階層が1であるので上階層エントリ番号33は0のままである。
【0058】
時刻t2にタスクBを開始する。実行エントリ番号32は1を加算して1から2に更新し、これにより測定情報テーブル31のエントリ番号2のエントリをタスクB用の領域として確保する。また、タスク階層34は1を加算して1から2に更新する。測定情報テーブル31のエントリ番号2のエントリにタスクBの情報を保持する。時刻t2における測定情報テーブル31を
図11の(2)に示す。エントリ番号2のエントリは、タスクIDが2、開始時測定値が20、階層が2であり、割込みイベント数は初期値0である。また、
図10に示す通り、階層が2であるので上階層エントリ番号33は1が加算して0から1に更新する。
【0059】
時刻t3にタスクCを開始する。実行エントリ番号32は1を加算して2から3に更新し、これにより測定情報テーブル31のエントリ番号3のエントリをタスクC用の領域として確保する。また、タスク階層34は1を加算して2から3に更新する。測定情報テーブル31のエントリ番号3のエントリにタスクCの情報を保持する。時刻t3における測定情報テーブル31を
図11の(3)に示す。エントリ番号3のエントリのタスクIDは3、開始時測定値は30、階層は3であり、割込みイベント数は初期値0である。また、
図10に示す通り、階層が3であるので上階層エントリ番号33は1を加算して1から2に更新する。
【0060】
時刻t4にタスクCを終了すると、実行エントリ番号32が3であるので、測定情報テーブル31のエントリ番号3のエントリにタスクCの情報として終了時測定値=40を保持する。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を(終了時測定値−開始時測定値)=40−30=10と算出する。そして、上階層エントリ番号33が2であるので、上階層タスクの割込みイベント数算出を行い、上階層タスク(タスクB)の割込みイベント数は元の値0に終了時測定値増分10を加算して10と算出して、この値で測定情報テーブル31のエントリ番号2の割込みイベント数を更新する。この時点における測定情報テーブル31を
図11の(4)に示す。なおエントリ番号3のエントリは、後処理終了の時点で解放されてタスクC用の領域ではなくなるので、
図11ではテーブルの枠を破線にして示している(以降、他でも同様である)。
【0061】
そして、終了時測定値増分からエントリ番号3のエントリの割込みイベント数を減算して、タスクCのイベント数を10−0=10と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図12の(1)に示す。終了したタスクCのタスクID,タスクC実行中のイベント数、階層がログファイルに記録されている。
【0062】
また、
図10に示す通り、タスク階層34は1を減算して3から2に、上階層エントリ番号33は1を減算して2から1に、実行エントリ番号32は1を減算して3から2に更新する。これにより、エントリ番号3のエントリを解放する。
【0063】
時刻t5にタスクBを終了すると、実行エントリ番号32が2であるので、測定情報テーブル31のエントリ番号2のエントリにタスクBの情報として終了時測定値=50を保持する。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を50−20=30と算出する。そして、上階層エントリ番号33が1であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク(タスクA)の割込みイベント数に終了時測定値増分30を加算して30と算出し、測定情報テーブル31のエントリ番号1の割込みイベント数を更新する。時刻t5の時点の測定情報テーブル31を
図11の(5)に示す。
【0064】
そして、終了時測定値増分からエントリ番号2のエントリの割込みイベント数を減算して、タスクBのイベント数を30−10=20と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図12の(2)に示す。終了したタスクBのタスクID,タスクB実行中のイベント数、階層がログファイルに追加されている。
【0065】
また、
図10に示す通り、タスク階層34は1を減算して2から1に、上階層エントリ番号33は1を減算して1から0に、実行エントリ番号32は1を減算して2から1に更新する。これにより、エントリ番号2のエントリを解放する。
【0066】
時刻t6にタスクDを開始する。実行エントリ番号32は1を加算して1から2に更新し、これにより測定情報テーブル31のエントリ番号2のエントリをタスクD用の領域として確保する。また、タスク階層34は1を加算して1から2に更新する。測定情報テーブル31のエントリ番号2のエントリにタスクDの情報を保持する。時刻t6における測定情報テーブル31を
図11の(6)に示す。エントリ番号2のエントリのタスクIDは4、開始時測定値は60、階層は2であり、割込みイベント数は初期値0である。また、
図10に示す通り、階層が2であるので上階層エントリ番号33は1を加算して0から1に更新する。
【0067】
時刻t7にタスクDを終了すると、実行エントリ番号32が2であるので、測定情報テーブル31のエントリ番号2のエントリにタスクDの情報として終了時測定値=70を保持する。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を70−60=10と算出する。そして、上階層エントリ番号33が1であるので、上階層タスクの割込みイベント数算出を行い、上階層タスク(タスクA)の割込みイベント数を30+10=40と算出して、この値で測定情報テーブル31のエントリ番号1の割込みイベント数を更新する。時刻t7における測定情報テーブル31を
図11の(7)に示す。
【0068】
そして、終了時測定値増分からエントリ番号2のエントリの割込みイベント数を減算して、タスクDのイベント数を10−0=10と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図12の(3)に示す。終了したタスクDのタスクID,タスクD実行中のイベント数、階層がログファイルに追加されている。
【0069】
また、
図10に示す通り、タスク階層34は1を減算して2から1に、上階層エントリ番号33は1を減算して1から0に、実行エントリ番号32は1を減算して2から1に更新する。これにより、エントリ番号2のエントリを解放する。
【0070】
時刻t8にタスクAを終了すると、実行エントリ番号32が1であるので、測定情報テーブル31のエントリ番号1のエントリにタスクAの情報として終了時測定値=80を保持する。そして、終了タスクのイベント数算出を行い、終了時測定値増分を80−10=70と算出する。上階層エントリ番号33が0であるので、上階層タスクの割込みイベント数算出は行わない。時刻t8における測定情報テーブル31を
図11の(8)に示す。
【0071】
そして、終了時測定値増分からエントリ番号1のエントリの割込みイベント数を減算して、タスクAのイベント数を70−40=30と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図12の(4)に示す。終了したタスクAのタスクID,タスクD実行中のイベント数、階層がログファイルに追加されている。
【0072】
また、
図10に示す通り、タスク階層34は1を減算されて1から0に、実行エントリ番号32は1を減算して1から0に更新する。上階層エントリ番号33は0のままである。これにより、エントリ番号1のエントリを解放する。
【0073】
以上のように、本発明の実施の形態1の処理装置は、タスク開始時に性能監視カウンタから取得した測定値を保持する測定情報テーブルに開始するタスクのための領域を確保し、性能監視カウンタから取得した開始時測定値と、タスクを中断して割込みタスクを実行中の性能監視カウンタの増分である割込みイベント数と、タスク終了時に測定した終了時測定値とをこの領域に保持し、そして、終了時測定値から開始時測定値を減算し、さらに割込みイベント数を減算して、得られた性能監視情報をログファイルに出力し、この終了したタスクを開始するときに確保した領域を解放するようにしたので、解放した測定情報テーブルの領域は別のタスクを開始するときに再利用することができ、未終了のタスクの測定情報をメモリに保持し、終了済みのタスクの測定情報はメモリに保持しないことで、メモリ使用量を削減してタスク毎に性能監視情報の取得を行うことができる。
【0074】
また、OSのタスク管理部にフックした性能監視情報取得部によりタスク開始前の前処理と、タスク終了後の前処理を行って、性能監視カウンタから性能監視情報を取得する処理を行うので、TLB無効化に伴う割り込み処理を実行しない場合にもタスク毎に性能監視情報を取得することができる。
【0075】
なお、測定情報テーブル31は論理的にテーブル構造となっていれば良く、必ずしも連続領域である必要はない。
実施の形態2.
【0076】
以下に、この発明の実施の形態2に係る処理装置を、図を参照して説明する。タスク実行中に別のタスクが実行された場合に、先に実行されていたタスクは2つ以上に分断されて実行されることになる(このような分断されたタスクを分断タスクと称す)が、実施の形態1の処理装置では、分断タスクの分断されたそれぞれの実行についての性能監視情報を得ることができなかった。
【0077】
例えば、1個のタスクが複数の割込みタスクによって中断して分断された場合、どのタスクが割込んだかによって分断タスクを再開後に取得する性能監視情報が変わってくることがある。このような場合、分断されたそれぞれの部分の性能監視情報を得られていると、プログラム実行状況の解析に役立てることができる。
【0078】
キャッシュヒットを例にとると、分断前と分断後でキャッシュヒット数が大きく変わっていた場合には、このとき割り込んだ割込みタスクがキャッシュのデータを書き換えたためにキャッシュヒット数が変化したと判断することができ、性能改善に役立てることができる。
【0079】
実施の形態2の処理装置では、分断されたそれぞれの実行の性能監視情報を得ることができるようにする。
【0080】
実施の形態2の構成は、実施の形態1の構成と同様であるので、実施の形態1との差分を中心に構成を説明する。
図13(a)、(b)、(c)はそれぞれ実施の形態2の性能監視情報取得部7の更新部13、情報保持部14、算出部15の詳細構成を示す図である。更新部13は、測定情報更新部21a、エントリ番号更新部22、上階層番号更新部23、タスク階層更新部24と、分断番号更新部25、一時保持更新部26を備える。
【0081】
また、情報保持部14は測定情報テーブル31a、実行エントリ番号32、上階層エントリ番号33、タスク階層34と、分断エントリ番号35、測定値一時保持36を備える。算出部15は算出制御部41a、読出部42、加算部43、減算部44を備える。
【0082】
図14は測定情報テーブル31aのフォーマットの一例を説明する図である。実施の形態1の測定情報テーブル31との違いは、分断時測定値フィールドを備えることである。
【0083】
次に、この発明の実施の形態2の処理装置1の性能監視情報取得の動作を、実施の形態1との差分を中心に説明する。また、実施の形態1と同様に具体例を示す。
【0084】
図15に実施の形態2の性能監視情報取得部7による前処理のフローを示す。S100、S110の処理は実施の形態1と同様である。
【0085】
S110の処理の後、処理制御部11より分断番号更新部25に分断タスクのエントリ番号更新の要求を出し、分断エントリ番号更新部25の処理を実行する(S111)。S111の処理では、まずタスク階層34を読み出して、階層が2以上の場合に分断エントリ番号35を読み出し、読み出した値に1を加算する。階層が1である場合には、加算を行わない。分断エントリ番号35に更新した値を記憶する。なお、分断エントリ番号35の初期値は0とする。
【0086】
S111の処理の後に実施するS120の処理は実施の形態1と同様である。
【0087】
S120の処理の後、処理制御部11より測定情報更新部21aに要求して、実施の形態2の測定情報更新部21aによる分断時測定値更新の処理を実施する(S121)。S121の処理では、まずタスク階層34を読み出して、階層が2以上である場合に、測定値一時保持36を読み出す。次に、分断エントリ番号35を読み出して、分断エントリ番号35が示す測定情報テーブル31aのエントリの分断時測定値を、読み出した測定値一時保持36の値で更新する。階層が1の場合には分断時測定値を更新しない。
【0088】
S121の処理の後、処理制御部11より一時保持更新部26に要求し、一時保持更新部26による測定値一時保持更新の処理を実施する(S122)。S122の処理では、実行エントリ番号32が示す測定情報テーブル31aのエントリの開始時測定値を読み出して、読み出した値を測定値一時保持36に記憶する。
【0089】
S122の処理の後にはS130の処理を実施する。S130は実施の形態1と同様であり、S130の処理を実施して前処理を終了する。
【0090】
次に後処理について説明する。
図16に実施の形態2の性能監視情報取得部7の後処理のフローを示す。S140の処理は実施の形態1と同様である。
【0091】
S140の処理の後、処理制御部11より一時保持更新部26に要求して、一時保持更新部26による測定値一時保持更新の処理を実施する(S141)。S141の処理では、まず実行エントリ番号32が示す測定情報テーブル31aのエントリの終了時測定値を読み出して、その値を測定値一時保持36に記憶する。
【0092】
S141の処理が終了すると次に、処理制御部11より算出部15の算出制御部41aに終了タスク実行中に発生したイベント数を算出するように要求を出し、算出制御部41aによる制御で終了タスクのイベント数算出処理を実施する(S150a)。S150aの処理では、終了タスクを実行中に発生したイベント数の算出に加えて、分断タスクの実行中に発生したイベント数算出も実施する。
【0093】
図17にS150aの処理の詳細なフローを示す。
図17において、S200、S201の処理は、それぞれ実施の形態1のS151、S152の処理と同様である。S201の処理の後、算出制御部41aの処理で、分断エントリ番号35を読み出し、その値が0でないかチェックする(S202)。
【0094】
分断エントリ番号35の値が0でない場合、分断エントリ番号35が示す測定情報テーブル31aのエントリの読み出しを読出部42に要求する。そして、読出部42の処理では指定されたエントリの情報を測定情報テーブル31aから読み出して算出制御部41aに渡す(S203)。
【0095】
次に、S201の処理で読み出した終了タスクの開始時測定値とS203の処理で読み出した分断タスクの分断時測定値を減算部44に渡し、減算部44において終了タスクの開始時測定値から分断タスクの分断時測定値を減算して、分断時測定値増分として算出する(S204)。この分断時測定値増分は、分断タスク再開から次の中断までの分断タスクのイベント数である。
【0096】
次に、S203で読み出した分断タスクのタスクIDと階層とS204で算出した分断タスクのイベント数と分断タスクの情報であることを示すフラグ(分断フラグ)を分断タスク情報としてログ出力部16に渡す(S205)。ここでは、分断フラグは論理値1が分断タスクの情報であることを示すこととする。
【0097】
S202において分断タスクエントリ番号が0であった場合には、S203からS205までの処理は実施せずに、次の処理を実施する。
【0098】
次に実施するS206の処理からS212までの処理はそれぞれ実施の形態1のS153からS159までの処理と同様である。
【0099】
S150aの処理の後、ログ出力部16による処理で算出制御部41aから渡された分断タスク情報と、終了タスクのタスクID、終了タスクのイベント数、階層をログファイルに出力する(S160a)。ログ出力は、出力する情報を一時的にメモリに保存して後でまとめてログファイルに出力しても良いし、その都度ログファイルに出力しても良い。
【0100】
S160aの処理の後で実施するS170の処理は実施の形態1と同様である。
【0101】
S170の処理の後、処理制御部11より分断番号更新部25に分断エントリ番号更新を要求する。分断番号更新部25の処理により、分断エントリ番号35を読み出して値が2以上の場合には1を減算して分断エントリ番号35の更新値とする。1以下の場合には変更せずに更新値とする。分断エントリ番号35に更新値を記憶する(S171)。
【0102】
S171の処理の後に実施するS180とS190の処理は実施の形態1と同様である。
【0103】
以下に、上記で説明した動作の簡単な具体例を示す。
図18はこの具体例のタスク実行の様子を示している。時刻t1〜時刻t8の間に、それぞれのタスクIDが1〜4である、タスクA〜タスクDの4個のタスクが実行されている。性能監視カウンタ2aのカウント値は各時刻に性能監視カウンタ2aから取得するイベント数の値を示している。また、実施の形態1の実行エントリ番号32、上階層エントリ番号33、タスク階層34に加えて、分断エントリ番号35と測定値一時保持36の値の遷移を示している。なお、前処理、後処理は省略して図示していない。
【0104】
マイクロプロセッサ2は、時刻t1にタスクAの実行を開始する。
図18に示す通り、実行エントリ番号32は1を加算して0から1に更新し、これにより測定情報テーブル31のエントリ番号1のエントリをタスクA用の領域として確保する。また、タスク階層34は1を加算して0から1に更新する。階層が1であるので分断エントリ番号35は0のままである。測定情報テーブル31のエントリ番号1のエントリにタスクAの情報を保持する。時刻t1における測定情報テーブル31aを
図19の(1)に示す。エントリ番号1のエントリのタスクIDは1、開始時測定値は10、階層は1であり、割込みイベント数は初期値0である。また、
図18に示す通り、階層が1であるので上階層エントリ番号33は0のままである。測定値一時保持36には、測定情報テーブル31aのエントリ1のタスクAの開始時測定値である10を保持する。
【0105】
時刻t2にタスクBを開始する。
図18に示す通り、実行エントリ番号32は1を加算して1から2に更新し、これにより測定情報テーブル31のエントリ番号2のエントリをタスクB用の領域として確保する。また、タスク階層34は1を加算して1から2に更新する。階層が2であるので分断エントリ番号35は1を加算して0から1に更新する。測定情報テーブル31のエントリ番号2のエントリにタスクBの情報を保持する。また、階層が2であるので、分断エントリ番号35が示すエントリ番号1のエントリの分断時測定値を測定値一時保持36の値(時刻t1の処理で10となっている)に更新する。
【0106】
時刻t2における測定情報テーブル31aを
図19の(2)に示す。エントリ番号2のエントリのタスクIDは2、開始時測定値は20、階層は2であり、割込みイベント数は初期値0である。また、エントリ番号1のエントリの分断時測定値は10になっている。
【0107】
そして、階層が2であるので上階層エントリ番号33は1を加算して0から1に更新する。測定値一時保持36には、測定情報テーブル31aのエントリ2のタスクBの開始時測定値である20を記憶する。
【0108】
時刻t3にタスクCを開始する。
図18に示す通り、実行エントリ番号32は1を加算して2から3に更新し、これにより測定情報テーブル31のエントリ番号3のエントリをタスクC用の領域として確保する。また、タスク階層34は1を加算して2から3に更新する。階層が3であるので分断エントリ番号35は1を加算して1から2に更新する。測定情報テーブル31のエントリ番号3のエントリにタスクCの情報を保持する。また、階層が3であるので、分断エントリ番号35が示すエントリ番号2のエントリの分断時測定値を測定値一時保持36の値(時刻t2の処理で20となっている)に更新する。
【0109】
時刻t3における測定情報テーブル31aを
図19の(3)に示す。エントリ番号3のエントリのタスクIDは3、開始時測定値は30、階層は3であり、割込みイベント数は初期値0である。また、エントリ番号2のエントリの分断時測定値は20になっている。
【0110】
そして、階層が3であるので上階層エントリ番号33は1を加算して1から2に更新する。測定値一時保持36には、測定情報テーブル31aのエントリ3のタスクCの開始時測定値である30を記録する。
【0111】
時刻t4にタスクCを終了すると、実行エントリ番号32が3であるので、測定情報テーブル31aのエントリ番号3のエントリにタスクCの情報として終了時測定値=40を保持する。そして、測定値一時保持36を測定情報テーブル31aのエントリ番号3のエントリの終了時測定値の値40で更新する。分断エントリ番号35が2であるので、分断タスクのイベント数算出を行い、分断タスクのイベント数を(終了タスクの開始時測定値)―(分断タスクの分断処理開始時測定値)=30−20=10と算出する。この結果は分断タスクのタスクID(分断タスクはタスクBであるので2)と、階層(タスクBの階層2)と、分断フラグとともにログファイルに出力する。
【0112】
また、終了タスクのイベント数算出を行う。まず、終了時測定値増分を40−30=10と算出する。上階層エントリ番号33が2であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク(タスクB)の割込みイベント数を0+10=10と算出し、測定情報テーブル31aを更新する。時刻t4の時点の測定情報テーブル31aを
図19の(4)に示す。
【0113】
そして、終了時測定値増分からエントリ番号3のエントリの割込みイベント数を減算して、タスクCのイベント数を10−0=10と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図20の(1)に示す。分断タスクBのタスクID、タスクB実行中のイベント数、階層と分断フラグおよび終了したタスクCのタスクID,タスクC実行中のイベント数、階層がログファイルに記録されている。
【0114】
また、上階層エントリ番号33は1を減算して2から1に、分断エントリ番号35は1を減算して2から1に、タスク階層34は1を減算して3から2に、実行エントリ番号32は1を減算して3から2に更新する。これにより、エントリ番号3のエントリを解放する。
【0115】
時刻t5にタスクBを終了すると、実行エントリ番号32が2であるので、測定情報テーブル31aのエントリ番号2のエントリにタスクBの情報として終了時測定値=50を保持する。そして、測定値一時保持36を測定情報テーブル31aのエントリ番号2の終了時測定値の値50で更新する。分断エントリ番号35が1であるので、分断タスクのイベント数算出を行い、分断タスクのイベント数を20−10=10と算出する。この結果は分断タスクのタスクID(分断タスクはタスクAであるので1)と、階層(タスクAの階層1)と、分断フラグとともにログファイルに出力する。
【0116】
また、終了タスクのイベント数算出を行う。まず、終了時測定値増分を50−20=30と算出する。上階層エントリ番号33が1であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク(タスクA)の割込みイベント数を0+30=30と算出し、測定情報テーブル31aを更新する。時刻t5の時点の測定情報テーブル31aを
図19の(5)に示す。
【0117】
そして、終了時測定値増分からエントリ番号2のエントリの割込みイベント数を減算して、タスクBのイベント数を30−10=20と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図20の(2)に示す。分断タスクAのタスクID、タスクB実行中のイベント数、階層と分断フラグおよび終了したタスクBのタスクID,タスクB実行中のイベント数、階層がログファイルに追加されている。
【0118】
また、上階層エントリ番号33は1を減算して1から0に、分断エントリ番号35は1を減算して1から0に、タスク階層34は1を減算して2から1に、実行エントリ番号32は1を減算して2から1に更新する。これにより、エントリ番号2のエントリを解放する。
【0119】
時刻t6にタスクDを開始する。
図18に示す通り、実行エントリ番号32は1を加算して1から2に更新し、これにより測定情報テーブル31のエントリ番号2のエントリをタスクD用の領域として確保する。また、タスク階層34は1を加算して1から2に更新する。階層が2であるので分断エントリ番号35は1を加算して0から1に更新する。測定情報テーブル31のエントリ番号2のエントリにタスクDの情報を保持する。また、階層が2であるので、分断エントリ番号35が示すエントリ番号2の分断時測定値を測定値一時保持36の値(時刻t5の処理で50となっている)に更新する。
【0120】
時刻t6における測定情報テーブル31aを
図19の(6)に示す。エントリ番号2のエントリのタスクIDは4、開始時測定値は60、階層は2であり、割込みイベント数は初期値0である。また、エントリ番号1のエントリの分断時測定値は50になっている。
【0121】
そして、階層が2であるので上階層エントリ番号33は1を加算して0から1に更新する。測定値一時保持36に、測定情報テーブル31aのエントリ番号2のタスクDの開始時測定値である60を記録する。
【0122】
時刻t7にタスクDを終了すると、実行エントリ番号32が2であるので、測定情報テーブル31aのエントリ番号2にタスクDの情報として終了時測定値=70を保持する。そして、測定値一時保持36を測定情報テーブル31aのエントリ番号2の終了時測定値の値70で更新する。分断エントリ番号35が1であるので、分断タスクのイベント数算出を行い、分断タスクのイベント数を60−50=10と算出する。この結果は分断タスクのタスクID(分断タスクはタスクAであるので1)と、階層(タスクAの階層1)と、分断フラグとともにログファイルに出力する。
【0123】
また、終了タスクのイベント数算出を行う。まず、終了時測定値増分を70−60=10と算出する。上階層エントリ番号33が1であるので、上階層タスクの割込みイベント数算出を行って、上階層タスク(タスクA)の割込みイベント数を30+10=40と算出し、測定情報テーブル31aを更新する。時刻t7における測定情報テーブル31aを
図19の(7)に示す。
【0124】
そして、終了時測定値増分からエントリ番号2の割込みイベント数を減算して、タスクDのイベント数を10−0=10と算出し、ログファイルに出力する。このときのログファイルの内容を
図20の(3)に示す。分断タスクAのタスクID、タスクA実行中のイベント数、階層と分断フラグおよび終了したタスクBのタスクID,タスクB実行中のイベント数、階層がログファイルに追加されている。
【0125】
また、タスク階層34は1を減算して2から1に、分断エントリ番号35は1を減算して1から0に、上階層エントリ番号33は1を減算して1から0に、実行エントリ番号32は1を減算して2から1に更新する。これにより、エントリ番号2のエントリを解放する。
【0126】
時刻t8にタスクAを終了すると、実行エントリ番号32が1であるので、測定情報テーブル31aのエントリ番号1のエントリにタスクAの情報として終了時測定値=80を保持する。そして、測定値一時保持36を測定情報テーブル31aのエントリ番号1の終了時測定値の値80で更新する。分断エントリ番号35は0であるので分断タスクのイベント数算出は行わない。そして、終了タスクのイベント数算出を行う。まず、終了時測定値増分を80−10=70と算出する。上階層エントリ番号33が0であるので、上階層タスクの割込みイベント数算出は行わない。時刻t8における測定情報テーブル31aを
図19の(8)に示す。
【0127】
そして、終了時測定値増分からエントリ番号1のエントリの割込みイベント数を減算して、タスクAのイベント数を70−40=30と算出し、結果をログファイルに出力する。このときのログファイルの内容を
図20の(4)に示す。終了したタスクAのタスクID,タスクD実行中のイベント数、階層がログファイルに追加されている。
【0128】
また、
図18に示す通り、タスク階層34は1を減算して1から0に、実行エントリ番号32は1を減算して1から0に更新する。分断エントリ番号35および上階層エントリ番号33は0のままである。これにより、エントリ番号1のエントリを解放する。
【0129】
以上のように、本発明の実施の形態2の処理装置は、タスク開始時に性能監視カウンタから取得した測定値を保持する測定情報テーブルに開始するタスクのための領域を確保し、性能監視カウンタから取得した開始時測定値と、タスクを中断して割込みタスクを実行中の性能監視カウンタの増分である割込みイベント数と、タスク終了時に測定した終了時測定値とをこの領域に保持し、そして、終了時測定値から開始時測定値を減算し、さらに割込みイベント数を減算して、得られた性能監視情報をログファイルに出力し、この終了したタスクを開始するときに確保した領域を解放するようにしたので、解放した測定情報テーブルの領域は別のタスクを開始するときに再利用することができ、未終了のタスクの測定情報をメモリに保持し、終了済みのタスクの測定情報はメモリに保持しないことで、メモリ使用量を削減してタスク毎に性能監視情報の取得を行うことができる。
【0130】
また、OSのタスク管理部にフックした性能監視情報取得部によりタスク開始前の前処理と、タスク終了後の前処理を行って、性能監視カウンタから性能監視情報を取得する処理を行うので、TLB無効化に伴う割り込み処理を実行しない場合にもタスク毎に性能監視情報を取得することができる。
【0131】
さらに、タスクを中断して割込みタスクが実行された場合に、中断の直前のタスクの開始もしくは再開時の性能監視カウンタの測定値を分断時測定値として記憶し、中断時にはこの中断時に実行する割込みタスクの開始時測定値を分断時測定値から減算して、タスクの開始もしくは再開から次の中断までの性能監視カウンタの測定値の増分を求めるようにしたので、個々の分割された実行についての性能監視情報を取得することができる。
【0132】
なお、実施の形態2では下階層となるタスクの終了時に上階層の分断タスクの性能情報を取得するようにしているが、下階層となるタスクの開始時に取得するように変更することも可能である。