(57)【要約】【課題】  効率的に、リソースを共有可能なタスクを検出する最適化情報取得プログラム、最適化情報取得装置、及び、最適化情報取得方法を提供することにある。【解決手段】  コンピュータに、オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を実行させる最適化情報取得プログラムであって、最適化情報取得処理は、ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得処理と、所定時間毎の状態情報に基づいて、同時に起動状態にならない第１の組み合わせタスクを、リソースを共有可能なタスク群として検出する検出処理と、を有する。【選択図】  図３
2014071868.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに、オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を実行させる最適化情報取得プログラムであって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得処理と、
前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出処理と、を有する最適化情報取得プログラム。
【請求項２】
請求項１において、
前記起動状態には、さらに実行可能状態が含まれる最適化情報取得プログラム。
【請求項３】
請求項１または２において、
前記リソースにはスタック領域が含まれ、
前記タスク情報取得処理は、さらに、前記各タスクの前記スタック領域のスタックサイズを取得し、
前記検出処理は、前記第１の組み合わせタスクを、前記スタック領域を共有可能なタスク群として検出すると共に、前記第１の組み合わせタスクにおける各タスク間の最大のスタックサイズを、前記第１の組み合わせタスクの共有スタック領域のスタックサイズとして検出する最適化情報取得プログラム。
【請求項４】
請求項３において、
前記検出処理は、同一のタスクを含む前記第１の組み合わせタスクが複数ある場合、前記第１の組み合わせの各タスクの前記スタックサイズの合計値から前記共有スタック領域のスタックサイズを減算した減算値が最も大きい前記第１の組み合わせタスクを検出する最適化情報取得プログラム。
【請求項５】
請求項１乃至４のいずれかにおいて、
前記リソースには、タスクコントロールブロックが含まれ、
前記検出処理は、前記第１の組み合わせタスクを、前記タスクコントロールブロックを共有可能なタスク群として検出する最適化情報取得プログラム。
【請求項６】
コンピュータに、オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を実行させる最適化情報取得プログラムであって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが、レディキューに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、前記各タスクの優先度とを取得するタスク情報取得処理と、
前記所定時間の全てをとおして、前記起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の前記起動状態の第２のタスクがない場合、前記第１の優先度より上位の優先度であって前記起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、前記第１のタスク群の変更後の優先度として検出する検出処理と、を有する最適化情報取得プログラム。
【請求項７】
請求項６において、
前記起動状態には、さらに実行状態が含まれる最適化情報取得プログラム。
【請求項８】
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得装置であって、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得手段と、
前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出手段と、を有する最適化情報取得装置。
【請求項９】
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得装置であって、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが、レディキューに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、前記各タスクの優先度とを取得するタスク情報取得手段と、
前記所定時間の全てをとおして、前記起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の前記起動状態の第２のタスクがない場合、前記第１の優先度より上位の優先度であって前記起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、前記第１のタスク群の変更後の優先度として検出する検出手段と、を有する最適化情報取得装置。
【請求項１０】
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得方法であって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得工程と、
前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出工程と、を有する最適化情報取得方法。
【請求項１１】
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得方法であって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが、レディキューに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、前記各タスクの優先度とを取得するタスク情報取得工程と、
前記所定時間の全てをとおして、前記起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の前記起動状態の第２のタスクがない場合、前記第１の優先度より上位の優先度であって前記起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、前記第１のタスク群の変更後の優先度として検出する検出工程と、を有する最適化情報取得方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、最適化情報取得プログラム、最適化情報取得装置、及び、最適化情報取得方法に関する。
【背景技術】
【０００２】
組込みオペレーティング・システム（以下、ＯＳ）上で稼動する組込みソフトのアプリケーション開発では、コスト削減のために、メモリサイズを小さく抑えることが求められる。そこで、アプリケーションのソースプログラムにおける使用していない変数の削除や、ＯＳのリソースの最適化によって、メモリサイズの削減が図られる（例えば、特許文献１〜３）。
【０００３】
ＯＳのリソースの最適化のために、例えば、タスク毎に用意されるデータ領域であるスタック領域、及び、ＴＣＢ（Task Control Block）がタスク間で共有される。これにより、メモリサイズが削減される。スタック領域は、タスクが切り替わる度に計算途中のデータを一時保存することに使用されるメモリ領域であって、ＴＣＢは、タスク毎の状態を記録する管理テーブルである。例えば、同時に起動状態とならないタスク同士は、スタック領域、及び、ＴＣＢを共有可能である。
【０００４】
さらに、組込みＯＳにおいて、タスク優先度毎に作られるレディキューについても、サイズを小さくすることによって最適化が図られる。リアルタイムＯＳの多くは、タスクの優先度毎にレディキューを有する。レディキューは、優先度に従ってタスクを実行させるために必要な情報である。例えば、同時に起動状態になり得るタスク間で、優先度レベルが連続しない場合、優先度を連続したレベルに圧縮することで、タスク優先度の最大値を小さくできる。これにより、レディキューのサイズが最適化される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平１０−１０５４１５号公報
【特許文献２】特願平７−２４６１３８公報
【特許文献３】特許第４６１８６４７号
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、スタック領域、ＴＣＢ、レディキューを最適化するためには、ソフトウェアの知識のほかに、ハードウェアの知識やＯＳの知識が必要となる。そこで、熟練した開発者が、スタック領域、ＴＣＢを共有可能なタスクや、優先度を最適化可能なタスクをアプリケーションのソースプログラムを解析することによって検出する。このため、最適化処理に係る属人性が高く、ソフトウェア開発者の負担や工数の増大等の問題があった。
【０００７】
本発明は、効率的に、リソースを共有可能なタスクを検出する最適化情報取得プログラム、最適化情報取得装置、及び、最適化情報取得方法を提供することにある。
【課題を解決するための手段】
【０００８】
第１の側面は、コンピュータに、オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を実行させる最適化情報取得プログラムであって、前記最適化情報取得処理は、前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得処理と、前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出処理と、を有する。
【発明の効果】
【０００９】
第１の側面によれば、効率的に、リソースを共有可能なタスクを検出することができる。
【図面の簡単な説明】
【００１０】
【図１】本実施の形態例における組み込み装置の構成の一例を表す図である。
【図２】図１の組み込み装置で稼動するＯＳにおけるタスク、及び、共有リソースの状態遷移を説明する図である。
【図３】第１の実施の形態例における処理の流れの概要（Ａ）と、タスク間のスタック領域の共有（Ｂ）について説明する図である。
【図４】ディスパッチフックルーチンの処理の詳細について説明する図である。
【図５】第１の実施の形態例において取得されるイベント情報の具体例を表す図である。
【図６】最適化情報取得プログラムが、イベント情報に基づいてスタック領域を共有可能なタスクを検出する処理の流れを説明するフローチャート図である。
【図７】図５のイベント情報に基づいて生成される中間データの具体例を示す図である。
【図８】図７の中間データに基づいて生成される結果データの具体例を表す図である。
【図９】第２の実施の形態例における処理の流れの概要（Ａ）と、タスク間のＴＣＢの共有（Ｂ）について説明する図である。
【図１０】第２の実施の形態例において取得されるイベント情報の具体例を表す図である。
【図１１】最適化情報取得プログラムが、イベント情報に基づいてＴＣＢを共有可能なタスクを検出する処理の流れを説明するフローチャート図である。
【図１２】図１１のイベント情報に基づいて生成される中間データの具体例を示す図である。
【図１３】図１２の中間データに基づいて生成される結果データの具体例を表す図である。
【図１４】タスク間でＴＣＢを共有化する場合のユーザプログラムの修正の例図である。
【図１５】第３の実施の形態例における処理の流れの概要（Ａ）と、優先度の最適化（Ｂ）について説明する図である。
【図１６】第３の実施の形態例において取得されるイベント情報の具体例を表す図である。
【図１７】最適化情報取得プログラムが、イベント情報に基づいて優先度を最適化可能なタスクを検出する処理の流れを説明するフローチャート図である。
【図１８】図１７のイベント情報に基づいて生成される中間データの具体例を示す図である。
【図１９】図１８の中間データに基づいて生成される結果データの具体例を表す図である。
【発明を実施するための形態】
【００１１】
以下、図面にしたがって本発明の実施の形態について説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１２】
［組み込み装置の構成］
図１は、本実施の形態例における組み込み装置１００の構成の一例を表す図である。組み込み装置１００は、例えば、マイクロコンピュータのような情報処理装置を示す。組み込み装置１００は、メモリ、プロセッサ１０、周辺ハードウェアであるモニタ１２や入力手段１１等を有し、バス１５を介して相互に接続される。メモリ１３には、例えば、ユーザプログラムＵＰ、ＯＳのプログラム群ＯＰ及び、共有リソース、本実施の形態例における最適化情報取得プログラムＰＲが記憶される。
【００１３】
ＯＳのプログラム群ＯＰは、プロセッサ１０と協働して、例えば、ユーザプログラムＵＰによって指示される複数のタスクのディスパッチ処理を制御する。ディスパッチ処理とは、タスクに付与された優先度に基づいて、実行するタスクを切り替える処理である。タスクとは、例えば、プロセッサ１０による実行処理の単位である。また、本実施の形態例における最適化情報取得プログラムＰＲは、共有リソースの使用形態を最適化するための情報を検出するプログラムである。最適化情報取得プログラムＰＲの処理の詳細については後述する。
【００１４】
［共有リソース］
図１の組み込み装置１００におけるＯＳの共有リソースには、例えば、スタック領域Ｓｔ、タスクコントロールブロック（以下、ＴＣＢと称す）Ｔｃ、レディキューＲｑがある。スタック領域Ｓｔは、実行中のタスクがディスパッチ処理によって切り替えられる際に、タスクで使用されるレジスタの情報が退避される領域である。このため、各タスクが要するスタック領域Ｓｔのサイズは、タスク毎に異なる。
【００１５】
ＴＣＢＴｃは、それぞれのタスクの情報を管理する制御ブロックである。ＴＣＢＴｃは、複数のブロックによって構成され、各タスクについて１つのブロックが使用される。それぞれのブロックには対応する各タスクの動作に必要な情報が格納され、ＯＳはＴＣＢＴｃを参照することでタスクの状態やタスクのスタック領域Ｓｔのアドレス情報等を検知する。また、ＴＣＢＴｃは、ＯＳの初期化時に、予め想定されるタスク数に基づいた領域が静的に確保される。
【００１６】
また、レディキューＲｑは、実行可能状態のタスクを、タスクに付与された優先度に従って管理する行列である。タスクは実行可能状態になると優先度毎に待ち行列に登録され、優先度に従って順次待ち行列から取り出され、プロセッサ１０に実行される。この待ち行列のことをレディキューＲｑと呼ぶ。レディキューＲｑは、ＯＳの起動時に、予め想定される優先度の最大数に応じた領域が静的に生成される。
【００１７】
このように、一般的に、組み込み装置１００におけるマルチタスクＯＳでは、タスク毎に、スタック領域ＳｔとＴＣＢＴｃとを要する。このため、スタック領域ＳｔとＴＣＢＴｃに要するメモリサイズは、タスクの数に比例して大きくなる。また、レディキューＲｑは、優先度毎に待ち行列を有するため、レディキューＲｑに要するメモリサイズは、優先度の数に比例して大きくなる。
【００１８】
［タスクの状態遷移］
図２は、図１の組み込み装置１００で稼動するＯＳにおけるタスク、及び、共有リソースの状態遷移を説明する図である。本実施の形態例では、タスクの状態は、休止状態（Ｆ２、Ｆ５）、実行可能状態（Ｆ３）、実行状態（Ｆ４）、未登録状態（Ｆ５）がある。実行状態はプロセッサ１０によって実行中の状態を示し、実行可能状態は、レディキューＲｑに登録されたプロセッサ１０による実行待ちの状態を示す。また、休止状態は、タスクが登録されているものの起動されていない状態を示し、未登録状態は、タスク自体が登録されていない状態を示す。
【００１９】
なお、図２に図示していないが、タスクの状態には、他に待機状態がある。待機状態は、実行状態のタスクがイベント待ちのために一時的に停止される状態を示し、実行状態に含まれる。待機状態は、イベントが発生すると、実行状態に復帰する。
【００２０】
図２では、タスクの状態遷移に対応して、各共有リソースの状態について説明する。初めに、ＯＳの初期化時の状態について説明する。状態Ｆ１は、ＯＳ初期化時の状態である。ＯＳの初期化時、ＴＣＢＴｃ、レディキューＲｑの領域が確保される。ＴＣＢＴｃは生成されるタスクの数分、レディキューＲｑの領域は最大優先度分の領域が確保される。なお、このとき、タスクは生成されていないため、スタック領域Ｓｔは生成されない。
【００２１】
状態Ｆ２は、状態Ｆ１にＯＳの初期状態において、タスク１が新たに登録された状態を示す。このとき、タスク１は休止状態を示す。ＴＣＢＴｃにおけるタスク１に対応するタスクＩＤのブロックに、休止状態を示す状態情報を含むタスク１の情報が記憶される。タスク１に対応するタスクＩＤは、ユーザプログラムＵＰ等によって予め指定される。また、このとき、タスク１のスタック領域Ｓｔ１が動的に確保されるが、確保されたスタック領域Ｓｔ１はＴＣＢＴｃにまだ関連付けられない。
【００２２】
状態Ｆ３は、タスク１が起動され、レディキューＲｑに登録された状態を示す。このとき、タスク１は、状態Ｆ２の休止状態から実行可能状態に遷移する。また、ＴＣＢＴｃのタスク１の状態情報に実行可能情報が更新されると共に、状態Ｆ２で確保されたスタック領域Ｓｔ１のサイズやアドレスが、対応するＴＣＢＴｃに記憶され、ＴＣＢＴｃとスタック領域Ｓｔ１が関連付けられる。また、レディキューＲｑのタスク１に対応する優先度の待ち行列に、タスク１が登録される。優先度は、ユーザプログラムＵＰ等によって予め指定されてもよいし、ユーザによって動的に指定されてもよい。この例では、タスク１には優先度１が指定される。
【００２３】
状態Ｆ４は、タスク１がレディキューＲｑに登録された状態Ｆ３の実行可能状態から、プロセッサ１０による実行状態に遷移した状態を示す。このとき、ＴＣＢＴｃのタスク１の状態情報が休止状態に更新されると共に、レディキューＲｑからタスク１が削除される。この例では、状態Ｆ３においてタスク１しか登録されていないが、複数のタスクがレディキューＲｑに登録されている場合、優先度の高いタスクから順次選択され、実行状態に遷移する。
【００２４】
状態Ｆ５は、タスク１の処理が終了し、休止状態に遷移した状態を示す。このとき、ＴＣＢＴｃのタスク１の状態情報が休止状態に更新されると共に、タスク１に対応するスタック領域Ｓｔ１の情報が初期化される。この場合、タスク１に対応するスタック領域Ｓｔ１は、タスク１が再度、起動される場合のために解放されず、確保されたままとなる。そして、タスク１が再び起動されると、タスク１が休止状態から、状態Ｆ３の実行可能状態に遷移する。このとき、初回の起動時に確保されたスタック領域Ｓｔ１が再利用されると共に、既にスタック領域Ｓｔ１の情報が関連付けられたＴＣＢＴｃのタスク１の状態情報が実行可能状態に更新される。
【００２５】
一方、タスク１が再度、起動されることがないような場合、タスク１が共有リソースから削除される。状態Ｆ６は、タスクが削除され未登録状態に遷移した状態を示す。タスクが削除される場合、タスク１に対応するＴＣＢＴｃの情報がクリアされると共に、スタック領域Ｓｔ１が解放される。
【００２６】
このように、本実施の形態例において、スタック領域Ｓｔ、及び、ＴＣＢＴｃは、タスクが実行待ち状態、実行状態を含む起動状態のときに使用される。このため、同時に起動状態にならないタスク間では、同じスタック領域Ｓｔ、及び、ＴＣＢＴｃを共有することが可能である。共有化により、共有リソースに要するメモリサイズが抑えられる。スタック領域Ｓｔの共有については第１の実施の形態例、ＴＣＢＴｃの共有については第２の実施の形態例で詳細に説明する。
【００２７】
また、タスクの優先度についても、タスクがレディキューＲｑに登録されたときに使用される。このため、同時に実行可能状態にならないタスク間では、優先度が保たれていればよい。このため、同時に実行待ち状態とならないタスク間で優先度の順位が連続しない場合、優先度の順位が連続するように優先度を繰り上げることが出来る。これにより、最大優先度が小さくなり、レディキューＲｑに使用するメモリサイズが抑えられる。最大優先度の最適化については第３の実施の形態例において詳細に説明する。
【００２８】
なお、スタック領域Ｓｔ、及び、ＴＣＢＴｃが実行状態のときにのみ使用されるシステムにおいては、同時に実行状態にならないタスク間で、同じスタック領域Ｓｔ、及び、ＴＣＢＴｃを共有することができる。また、実行状態においても優先度が使用されるシステムでは、同時に実行待ち状態、及び、実行状態とならないタスク間で優先度の順位が連続しない場合に、優先度の順位が連続するように優先度が最適化される。
【００２９】
［第１の実施の形態例］
第１の実施の形態例では、最適化情報取得プログラムＰＲがスタック領域Ｓｔを共有可能なタスクを検出する例について説明する。第１の実施の形態例における最適化情報取得プログラムＰＲは、ＯＳのプロセッサ１０が実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、実行状態を含む起動状態であるか否かを示す各タスクの状態情報を取得する。そして、最適化情報取得プログラムＰＲは、所定時間毎の状態情報に基づいて、同時に起動状態にならない第１の組み合わせタスクを、スタック領域Ｓｔを共有可能なタスク群として検出する。なお、システムによっては、起動状態に、さらに実行可能状態が含まれる。
【００３０】
これにより、スタック領域Ｓｔを共有可能なタスクが効率的に検出される。そして、ユーザは、最適化情報取得プログラムＰＲによって検出されたスタック領域Ｓｔを共有可能なタスクの情報に基づいて、ユーザプログラムＵＰを修正する。この結果、組み込み装置１００におけるユーザプログラムＵＰ実行時のメモリ１３の使用量が大幅に削減される。
【００３１】
図３は、第１の実施の形態例における処理の流れの概要（Ａ）と、タスク間のスタック領域Ｓｔの共有（Ｂ）について説明する図である。本実施の形態例における処理の概要について説明する前に、まず、タスクのディスパッチ処理とフックルーチンについて説明する。
【００３２】
［ディスパッチ処理］
タスクのディスパッチ処理は、プロセッサ１０によって実行されるタスクを切り替える処理である。１つのプロセッサ１０が搭載される場合、同時に実行可能なタスクは１つである。そこで、ディスパッチ処理によって、実行状態であったタスクが他の状態に遷移され、実行可能状態であったタスクが実行状態に遷移される。このため、ディスパッチ処理によって、１つまたは２つのタスクの状態情報が遷移する。例えば、ディスパッチ処理によって、実行状態のタスクが休止状態に遷移し、実行可能状態にあるタスクが実行状態に遷移する。また、例えば、ディスパッチ処理によって、単に、実行状態のタスクが待ち状態に遷移する。
【００３３】
［ディスパッチフックルーチン］
ディスパッチフックルーチンは、ディスバッチ処理の前後に呼び出されるルーチンであって、ユーザによる任意の処理の追加が可能なように提供される。本実施の形態例では、ディスパッチフックルーチンに、システム時刻、処理対象のタスクＩＤ、タスクの状態情報、スタック領域Ｓｔの情報の取得処理が記述される。
【００３４】
［タスクの検出処理の概要］
図３の（Ａ）は、スタック領域Ｓｔを共有可能なタスクの検出処理の概要について説明するフローチャート図である。ディスパッチ処理が発生すると（Ｓ１）、つまり、実行中のタスクの入れ替え処理が発生すると、ディスパッチフックルーチンが呼び出される（Ｓ２）。これにより、システム時刻、終了対象のタスクのタスクＩＤ、状態情報、スタック領域Ｓｔの情報がイベント情報Ｅｆ１としてデータベースに記憶される（Ｓ３−１）。工程Ｓ１〜Ｓ３−１の処理は、各機能を動作させることを通じて行われる。この結果、全ての機能を動作させた場合における各タスクの状態情報とスタック領域Ｓｔの情報が取得される。そして、最適化情報取得プログラムＰＲは、データベースに記憶されたイベント情報Ｅｆ１に基づいて、スタック領域Ｓｔを共有可能なタスクを検出する（Ｓ４−１）。
【００３５】
［タスク間におけるスタック領域Ｓｔの共有化］
図３の（Ｂ）は、タスク間のスタック領域Ｓｔの共有について説明する図である。同図の例において、例えば、タスク１とタスク２は、全機能を通して、同時に起動状態にならないタスクである。そこで、タスク１とタスク２とに、同一のスタック領域Ｓｔを関連付けることで、スタック領域Ｓｔが共有化される。このとき、共有されるスタック領域Ｓｔのサイズは、タスク１とタスク２において、よりサイズの大きいスタック領域Ｓｔのサイズである。一方、タスク３は、タスク１、タスク２それぞれと同時に起動状態になることから、スタック領域Ｓｔは共有されない。
【００３６】
［ディスパッチフックルーチンの詳細］
図４は、図３のフローチャート図におけるディスパッチフックルーチンの詳細について説明する図である。前述したとおり、ディスパッチが起動されるタイミングで（Ｓ１１）、ディスパッチフックルーチンが呼び出される（Ｓ１２）。ディスパッチフックルーチン（Ｓ１２）では、ディスパッチ処理（Ｓ１２２）の前に終了フックルーチン（Ｓ１２１）が、ディスパッチ処理（Ｓ１２２）の後に開始フックルーチン（Ｓ１２３）が呼び出される。
【００３７】
例えば、ディスパッチ処理によって、タスク１が終了され、タスク２の実行が開始される場合を例示する。この場合、終了フックルーチンにおいてディスパッチ処理によって終了されるタスク１の情報が取得され、開始フックルーチンにおいてディスパッチ処理によって開始されるタスク２の情報が取得される。前述したとおり、タスクの情報として、例えば、システム時刻、タスクの状態情報、及び、スタック領域Ｓｔのサイズ情報、アドレス情報が取得される。取得された情報は、イベント情報Ｅｆ１としてデータベースに記憶される。
【００３８】
開始フックルーチンが呼び出されると（Ｓ１２３）、ディスパッチ処理が終了する（Ｓ１３）。そして、全ての機能について実行されていない場合（Ｓ１４のＮＯ）、引き続き、タスクのディスパッチ処理が行われる。一方、全ての機能について実行された場合は（Ｓ１４のＹＥＳ）、イベント情報Ｅｆ１の取得処理が完了する。
【００３９】
ここで、第１の実施の形態例で取得されるイベント情報Ｅｆ１の具体例について説明する。
【００４０】
［イベント情報Ｅｆ１の具体例］
図５は、第１の実施の形態例において取得されるイベント情報Ｅｆ１の具体例を表す図である。同図のイベント情報Ｅｆ１は、前述したとおり、システム時刻、タスクの状態情報、及び、スタック領域Ｓｔのサイズ情報、アドレス情報を有する。ここでは、タスクＩＤ１〜ＩＤ３がそれぞれ指定された３つのタスク（タスクＩＤ_１〜タスクＩＤ_３）を例示して説明する。
【００４１】
具体的に、イベント情報Ｅｆ１の１行目は、時刻０〜１０の間、タスクＩＤ_１の状態は動作状態であり、タスクＩＤ_２、ＩＤ_３の状態は休止状態であることを表す。また、タスクＩＤ_１のスタック領域Ｓｔはアドレス０ｘ２０００＿００００〜０ｘ２０００＿０ＦＦＦに確保され、サイズが０ｘ１０００であることを示す。同様にして、タスクＩＤ_２のスタック領域Ｓｔはアドレス０ｘ２０００＿１０００〜０ｘ２０００＿１７ＦＦに確保され、サイズが０ｘ８００であり、タスクＩＤ_３のスタック領域Ｓｔはアドレス０ｘ２０００＿２０００〜０ｘ２０００＿２４ＦＦに確保され、サイズが０ｘ５００であることを示す。
【００４２】
同様にして、イベント情報Ｅｆ１の２行目に、続く時刻１０〜２０における各タスクの状態情報とスタック領域Ｓｔのアドレス、及び、サイズ情報が記憶される。この例では、時刻０〜時刻１７０までの情報が取得されている。
【００４３】
時刻の流れに沿って各タスクの状態遷移を説明すると、時刻０〜１０の間、タスクＩＤ_１は動作状態にあり、タスクＩＤ_２、タスクＩＤ_３は休止状態である。続く時刻１０〜２０において、動作状態であったタスクＩＤ_１が休止状態に、休止状態であったタスクＩＤ_２が動作状態に遷移する。そして、時刻２０〜３０では、タスクＩＤ_２が休止状態に、タスクＩＤ_１が再び動作状態に遷移し、続く時刻３０〜５０において、タスクＩＤ_１は動作状態から待ち状態に、タスクＩＤ_３は動作状態に遷移する。
【００４４】
そして、時刻５０〜１００において、タスクＩＤ_２は休止状態から未登録状態に、タスクＩＤ_３は休止状態に遷移する。このとき、タスクＩＤ_２が未登録状態に遷移したことにより、タスクＩＤ_２のスタック領域Ｓｔが解放される。このため、タスクＩＤ_２のスタック領域Ｓｔのアドレス及びサイズ情報はない。
【００４５】
続いて、時刻１００〜１２０において、未登録状態であったタスクＩＤ_２が休止状態に、タスクＩＤ_１が動作状態に遷移する。タスクＩＤ_２が再び登録され休止状態に遷移したことにより、タスクＩＤ_２のスタック領域Ｓｔが再確保される。ただし、このとき、スタック領域Ｓｔのサイズは前回と異なる０ｘ９００に変化している。このように、同一のタスクであっても、起動されるタイミングによって処理の内容が異なることから、確保されるスタック領域Ｓｔのサイズが異なることがある。
【００４６】
続いて、時刻１２０〜１２５において再び、タスクＩＤ_１が待ち状態に、タスクＩＤ_３は動作状態に遷移する。そして、時刻１２５〜１５０において、待ち状態であったタスクＩＤ_１が動作状態に、タスクＩＤ_３が休止状態に遷移し、時刻１５０〜１７０において、タスクＩＤ_１が休止状態に、タスクＩＤ_２が動作状態に遷移する。
【００４７】
このようにディスパッチ処理では、１つまたは２つのタスクの状態が遷移する。また、スタック領域Ｓｔのサイズは、同一のタスクであっても、確保されるタイミングによって異なることがある。スタック領域Ｓｔのサイズが異なることにより、スタック領域Ｓｔのアドレスも変更される。
【００４８】
続いて、ディスパッチフックルーチンによって取得されたイベント情報Ｅｆ１に基づいて、本実施の形態例における最適化情報取得プログラムＰＲがスタック領域Ｓｔを共有可能なタスクを検出する処理について説明する。
【００４９】
［スタック領域Ｓｔ共有可能タスクの検出処理］
図６は、本実施の形態例における最適化情報取得プログラムＰＲが、図５のイベント情報Ｅｆ１に基づいて、スタック領域Ｓｔを共有可能なタスクを検出する処理の流れを説明するフローチャート図である。前述したとおり、ディスパッチフックルーチンを利用することによって、全ての機能を実行させたときの各タスクの状態情報とスタック領域Ｓｔの情報とが予め取得される（Ｓ２１）。
【００５０】
そして、最適化情報取得プログラムＰＲは、イベント情報Ｅｆ１を参照して、各時間帯について、複数のタスクのうちステータスが休止状態のタスクがあるか否かを判定する（Ｓ２２）。休止状態のタスクがある場合（Ｓ２２のＹＥＳ）、最適化情報取得プログラムＰＲは、休止状態のタスクについて、スタック領域Ｓｔを共有済みであるか否かを判定する（Ｓ２３）。共有済みではない場合（Ｓ２３のＮＯ）、最適化情報取得プログラムＰＲは、対象の時間帯の休止状態のタスクについて、対応する動作状態のタスクを共有可能なタスクの候補として、中間データＭｄ１に上書きする（Ｓ２４）。
【００５１】
一方、休止状態のタスクがない場合（Ｓ２２のＮＯ）、及び、休止状態のタスクがある場合であっても（Ｓ２２のＹＥＳ）、当該タスクについてスタック領域Ｓｔの共有対象として検出済みの場合（Ｓ２３のＹＥＳ）、中間データＭｄ１は上書きされない。
【００５２】
続いて、イベント情報Ｅｆ１の最後の時間まで判定処理が完了したか否かが判定され（Ｓ２６）、判定が完了していない場合（Ｓ２６のＮＯ）、イベント情報Ｅｆ１における次の時間帯を対象として、休止状態のタスクがあるか否かが判定される（Ｓ２２）。一方、判定が完了した場合（Ｓ２６のＹＥＳ）、生成された中間データＭｄ１の情報が取得され（Ｓ２７）、中間データＭｄ１に基づいて工程Ｓ２８〜Ｓ３０の処理が行われる。
【００５３】
ここで、中間データＭｄ１の例を具体例に基づいて説明する。
【００５４】
［中間データＭｄ１の具体例］
図７は、図５のイベント情報Ｅｆ１に基づいて生成される中間データＭｄ１の具体例を示す図である。中間データＭｄ１は、対象のタスクについて、各タスクとスタック領域Ｓｔを共有可能か否かを示す共有可能判定フラグを有する。この例において、共有可能判定フラグ「１」はスタック領域Ｓｔを共有可能であることを、共有可能判定フラグ「０」はスタック領域Ｓｔの共有が不可能であることを示す。
【００５５】
図５のイベント情報Ｅｆ１の時刻０〜１０を参照し、最適化情報取得プログラムＰＲは、タスクＩＤ_１〜タスクＩＤ_３のうち、休止状態のタスクＩＤ_２、タスクＩＤ_３を検知する（Ｓ２２のＹＥＳ）。この場合、タスクＩＤ_２、タスクＩＤ_３についてスタック領域Ｓｔを共有済みではないため（Ｓ２３のＮＯ）、最適化情報取得プログラムＰＲは、タスクＩＤ_２、タスクＩＤ_３について、動作状態であるタスクＩＤ_１を共有可能なタスクとして中間データＭｄ１に上書きする。なお、このとき、休止状態以外の状態、即ち、互いに起動状態であるタスクは、スタック領域Ｓｔを共有できない。このため、互いに起動状態であるタスクは、共有不可であるタスクとして中間データＭｄ１に上書きされる。
【００５６】
具体的に、最適化情報取得プログラムＰＲは、中間データＭｄ１に対して、タスクＩＤ_２とタスクＩＤ_１、タスクＩＤ_３とタスクＩＤ_１との共有可能判定フラグに「１」を指定する（Ｓ２４）。また、同時間帯には、起動状態のタスクが１つしかないため、共有可能判定フラグ「０」は指定されない。
【００５７】
続いて、図５のイベント情報Ｅｆ１の時刻１０〜２０を参照し、最適化情報取得プログラムＰＲは、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_３とタスクＩＤ_２との共有可能判定フラグに「１」を上書きする。この場合も同様にして、共有可能判定フラグ「０」は指定されない。図５のイベント情報Ｅｆ１の時刻２０〜３０は、時刻０〜１０と同様である。
【００５８】
そして、図５のイベント情報Ｅｆ１の時刻３０〜５０を参照して、最適化情報取得プログラムＰＲは、タスクＩＤ_２とタスクＩＤ_１、タスクＩＤ_２とタスクＩＤ_３との共有可能判定フラグに「１」を上書きする。このとき、タスクＩＤ_１とタスクＩＤ_３については、互いに起動状態であり、共有不可能である。このため、最適化情報取得プログラムＰＲは、タスクＩＤ_１とタスクＩＤ_３との共有可能判定フラグを「１」から「０」に上書きする。いずれかの時間帯で共有可能判定フラグに「０」が指定されたタスク間は、他の時間帯で共有可能であっても共有可能判定フラグに「０」が指定される。
【００５９】
他の時間帯についても、同様に判定され、共有可能判定フラグが更新される。これにより、全ての時間帯を通して、即ち、全ての機能を通して、スタック領域Ｓｔを共有可能なタスクが検出される。
【００６０】
このため、図７の中間データＭｄ１によると、タスクＩＤ_１とタスクＩＤ_２（タスクＩＤ_２とタスクＩＤ_１と同じ）の共有可能判定フラグには「１」が指定されるものの、タスクＩＤ_１とタスクＩＤ_３（タスクＩＤ_３とタスクＩＤ_１と同じ）の共有可能判定フラグには「０」が指定される。また、タスクＩＤ_２とタスクＩＤ_３（タスクＩＤ_３とタスクＩＤ_２）の共有可能判定フラグに「１」が指定される。つまり、共有可能なタスクの候補として、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３が検出される。
【００６１】
また、図７の中間データＭｄ１では、各タスクについて、スタック領域Ｓｔの最大サイズが書き込まれる。例えば、タスクＩＤ_１のスタック領域Ｓｔのサイズは全時間帯を通して０ｘ１０００であるため、最大スタックサイズとして０ｘ１０００が書き込まれる。そして、タスクＩＤ_２のスタック領域Ｓｔのサイズは、時刻０〜５０は０ｘ８００、時刻１００〜１７０は０ｘ９００であるため、最大スタックサイズとして０ｘ９００が書き込まれる。タスクＩＤ_３のスタック領域Ｓｔのサイズは全時間帯を通して０ｘ５００であるため、最大スタックサイズとして０ｘ５００が書き込まれる。
【００６２】
このようにして、イベント情報Ｅｆ１における全ての時間帯の情報基づいて、タスク間の共有可能フラグ、スタック領域Ｓｔのサイズ情報を有する中間データＭｄ１が生成される。これにより、全ての機能を通して、スタック領域Ｓｔを共有可能なタスクの候補が検出される。
【００６３】
図６のフローチャート図に戻り、続いて、工程Ｓ２８〜Ｓ３０において、中間データＭｄ１の共有可能なタスクの候補情報に基づいて、スタック領域Ｓｔを共有可能なタスクの検出処理が行われる。具体的に、最適化情報取得プログラムＰＲは、中間データＭｄ１におけるタスク［１〜ｔａｓｋｉｄ＿ｍａｘ（この例では３）］を参照して、スタック領域Ｓｔを共有可能な候補タスクについて、スタック領域Ｓｔのサイズ（以下、スタックサイズ）を比較する（Ｓ２８）。そして、大きいサイズを共有スタック領域Ｓｔのサイズとして結果データＯｐ１に格納する（Ｓ２９）。この処理について、図７の中間データＭｄ１に基づいて具体的に説明する。
【００６４】
［結果データＯｐ１の具体例］
図８は、図７の中間データＭｄ１に基づいて生成される結果データＯｐ１の具体例を表す図である。図７の中間データＭｄ１によると、タスクＩＤ_１の最大スタックサイズは０ｘ１０００、タスクＩＤ_２の最大スタックサイズは０ｘ９００、タスクＩＤ_３の最大スタックサイズは０ｘ５００である。また、図７の中間データＭｄ１によると、共有可能なタスクの候補は、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３である。
【００６５】
このため、図８の結果データＯｐ１は、タスクＩＤ_１とタスクＩＤ_２について、よりサイズの大きいタスクＩＤ_１の最大スタックサイズ０ｘ１０００を、共有スタック領域Ｓｔのサイズ情報として有する。同様にして、結果データＯｐ１は、タスクＩＤ_２とタスクＩＤ_３について、よりサイズの大きいタスクＩＤ_２の最大スタックサイズ０ｘ９００を、共有スタック領域Ｓｔのスタックサイズ情報として有する。
【００６６】
このように、最適化情報取得プログラムＰＲは、ディスパッチフックルーチンによって、タスクの状態情報に加えて、スタック領域Ｓｔのスタックサイズを取得し、スタック領域Ｓｔを共有可能なタスクの組み合わせにおける最大のスタックサイズを、共有スタック領域のスタックサイズとして検出する。これにより、共有可能なタスクの候補について、タスクを共有したときの共有スタック領域Ｓｔのサイズが合わせて検出可能になる。
【００６７】
図６のフローチャート図に戻り、続いて、工程Ｓ３１〜Ｓ３３において、結果データＯｐ１に基づいて、共有可能なタスクの候補から、最終的な共有可能タスクが検出される。具体的に、最適化情報取得プログラムＰＲは、結果データＯｐ１を参照して、共有可能なタスクの組み合わせ間で、重複するタスクが存在するか否かを判定する（Ｓ３１）。重複するタスクが存在する場合（Ｓ３１のＹＥＳ）、最適化情報取得プログラムＰＲは、メモリ削減効果の高い組み合わせの共有可能なタスクを検出し（Ｓ３２）、結果として出力する（Ｓ３３）。
【００６８】
この処理について、図８の結果データＯｐ１に基づいて具体的に説明する。図８の結果データＯｐ１によると、共有可能なタスクの候補は、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３であって、タスクＩＤ_２が重複する（Ｓ３１のＹＥＳ）。つまり、２つの共有可能なタスクの組み合わせ候補間でタスクＩＤ_２が重複することにより、いずれかの組み合わせに限定される必要がある。そこで、最適化情報取得プログラムＰＲは、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３のうち、スタック領域Ｓｔを共有したときのメモリ削減効果の高い組み合わせを、共有可能なタスクとして検出する（Ｓ３２）。
【００６９】
具体的に、タスクＩＤ_１とタスクＩＤ_２の共有スタック領域Ｓｔのサイズは０ｘ１０００である。また、タスクＩＤ_１とタスクＩＤ_２を別のスタック領域Ｓｔとして確保する場合、各タスクのスタック領域Ｓｔの合計サイズは０ｘ１９００である。このため、スタック領域Ｓｔを共有することによって、サイズ０ｘ９００が削減されることがわかる。また、タスクＩＤ_２とタスクＩＤ_３の共有スタック領域Ｓｔのサイズは０ｘ９００である。また、タスクＩＤ_２とタスクＩＤ_３を別のスタック領域Ｓｔとして確保する場合、各タスクのスタック領域Ｓｔの合計サイズは０ｘ１４００である。このため、スタック領域Ｓｔを共有することによって、サイズ０ｘ５００が削減されることがわかる。
【００７０】
このため、スタック領域Ｓｔを共有することによるメモリ１３の削減効果の大きい、タスクＩＤ_１とタスクＩＤ_２の組み合わせが、最終的な共有可能なタスクとして検出される。このように、最適化情報取得プログラムＰＲは、同一のタスクを含むタスクの組み合わせ候補が複数検出された場合、タスクの組み合わせのスタックサイズの合計値から共有スタック領域のスタックサイズの減算値が最も大きいタスクの組み合わせを、スタック領域を共有可能なタスクの組み合わせとして検出する。これにより、複数の組み合わせ候補がある場合、最もメモリ削減効果の高い組み合わせが検出可能になる。
【００７１】
以上のように、本実施の形態例における最適化情報取得プログラムＰＲは、ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得する。また、最適化情報取得プログラムＰＲは、所定時間毎の状態情報に基づいて、同時に起動状態にならない第１の組み合わせタスクを、スタック領域Ｓｔを共有可能なタスク群として検出する。なお、システムによって、スタック領域Ｓｔが実行可能状態でも使用される場合、起動状態には、さらに実行可能状態が含まれる。
【００７２】
このように、本実施の形態例における最適化情報取得プログラムＰＲは、フックルーチンを利用することによって、全ての機能の実行を通して、同時に起動状態とならないタスク情報を容易に抽出できる。即ち、最適化情報取得プログラムＰＲは、全ての機能を実際に実行することによって取得される情報に基づいて、網羅的に、自動的に、高精度に、同時に起動状態とならないタスク情報を抽出できる。これにより、スタック領域Ｓｔを共有可能な複数のタスクが容易に高精度に検出可能となる。
【００７３】
また、本実施の形態例における最適化情報取得プログラムＰＲは、同時に起動状態とならないタスクを、当該タスクの優先度に依存することなく、スタック領域Ｓｔを共有可能なタスク群として検出する。これにより、タスクの優先度に依存しないことから、より多くのタスクを対象として、スタック領域Ｓｔを共有可能にできる。また、本実施の形態例における最適化情報取得プログラムＰＲでは、同時に起動状態とならないタスク情報を抽出するために予め提供されるディスパッチフックルーチンを利用する。これにより、既存のシステムに修正を加えることなく、効率的に、同時に起動状態とならないタスク情報を取得できる。
【００７４】
このようにして、最適化情報取得プログラムＰＲは、スタック領域Ｓｔを共有可能な複数のタスクの検出を、熟練者等による属人化した処理に依存することなく、少ない工数で効率的に実現することができる。この結果、最適化処理のための工数が大幅に削減されると共に、高精度に効率的にメモリサイズが抑えられ、コストが抑えられる。
【００７５】
また、本実施の形態例における最適化情報取得プログラムＰＲは、フックルーチンによって、さらに、各タスクの前記スタック領域Ｓｔのスタックサイズを取得し、第１の組み合わせタスクを、スタック領域Ｓｔを共有可能なタスク群として検出すると共に、第１の組み合わせタスクにおける各タスク間の最大のスタックサイズを、第１の組み合わせタスクの共有スタック領域のスタックサイズとして検出する。これにより、スタック領域Ｓｔを共有可能なタスク情報だけでなく、共有後のスタック領域に要するサイズについても合わせて、網羅的に、自動的に、高精度に検出可能になる。タスクのスタック領域Ｓｔのサイズは、タスクが起動されるタイミングによって異なる。そこで、全ての機能の実行を通して、スタック領域Ｓｔのサイズ情報が取得されることにより、スタック領域Ｓｔの共有に必要なサイズ情報についても高精度に取得される。
【００７６】
また、本実施の形態例における最適化情報取得プログラムＰＲは、同一のタスクを含む第１の組み合わせタスクが複数ある場合、第１の組み合わせの各タスクのスタックサイズの合計値から共有スタック領域のスタックサイズの減算値が最も大きい第１の組み合わせタスクを検出する。これにより、スタック領域Ｓｔを共有可能なタスクの組み合わせが複数あって、タスクの組み合わせのうち、一部のタスクが重複する場合、最もメモリ削減効果の高いタスクの組み合わせが簡易に検出可能になる。
【００７７】
なお、本実施の形態例では、３つのタスクが起動される場合を例示しているが、この例に限定されるものではない。一般的に、タスク数は多量であって、それぞれのスタック領域Ｓｔに要するメモリサイズも小さくはない。このため、本実施の形態例における最適化情報取得プログラムＰＲによると、多数のタスクを対象として、共有可能なタスクの組み合わせが多数、検出されることにより、スタック領域Ｓｔに要するメモリのサイズが大幅に抑えられる。
【００７８】
なお、同一のタスクを含むスタック領域Ｓｔを共有可能なタスクの組み合わせが複数ある場合、より多くのタスクによって共有される場合のメモリ削減効果が高いとは限らない。そこで、前述したとおり、最適化情報取得プログラムＰＲは、組み合わせタスクの各スタックサイズの合計値から共有スタック領域のスタックサイズの減算値が最も大きい組み合わせを検出することによって、メモリ削減のために最適なタスクの組み合わせを検出できる。
【００７９】
なお、本実施の形態例では、スタック領域Ｓｔを共有可能な２つのタスクが検出されるが、この例に限定されるものではない。１つのスタック領域Ｓｔは３つ以上のタスクによって共有されてもよい。この場合、同様にして、最適化情報取得プログラムＰＲは、フックルーチンによって取得された各時間帯のタスクの状態情報に基づいて、同時に起動状態にならない３つ以上のタスクを検出する。
【００８０】
［スタック領域Ｓｔの共有化作業］
なお、ユーザは、検出されたスタック領域Ｓｔを共有可能なタスクの情報に基づいて、ユーザプログラムＵＰを修正する。例えば、タスクに関連付けられるスタック領域Ｓｔは、ユーザプログラムＵＰ上で指定される。このため、例えば、ユーザは、ユーザプログラムＵＰにおけるタスクに対応するスタック領域Ｓｔの指定指示を修正することによって、タスク間のスタック領域Ｓｔの共有化を実現する。
【００８１】
［第２の実施の形態例］
第１の実施の形態例では、最適化情報取得プログラムＰＲがスタック領域Ｓｔを共有可能なタスクを検出する例について説明した。これに対して、第２の実施の形態例では、最適化情報取得プログラムＰＲが、ＴＣＢＴｃの同ブロックを共有可能なタスクを検出する例について説明する。
【００８２】
第２の実施の形態例では、第１の実施の形態例と同様にして、最適化情報取得プログラムＰＲは、ＯＳのプロセッサ１０が実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、実行状態を含む起動状態であるか否かを示す各タスクの状態情報を取得する。そして、最適化情報取得プログラムＰＲは、所定時間毎の状態情報に基づいて、同時に起動状態にならない第１の組み合わせタスクを、ＴＣＢＴｃを共有可能なタスク群として検出する。なお、システムによっては、起動状態に、さらに実行可能状態が含まれる。
【００８３】
これにより、ＴＣＢＴｃを共有可能なタスクが効率的に検出される。そして、ユーザは、最適化情報取得プログラムＰＲによって検出されたＴＣＢＴｃのブロックを共有可能なタスクの情報に基づいて、ユーザプログラムＵＰを修正する。この結果、組み込み装置１００におけるユーザプログラムＵＰ実行時のＴＣＢＴｃに要するメモリ使用量が削減される。
【００８４】
図９は、第２の実施の形態例における処理の流れの概要（Ａ）と、タスク間のＴＣＢＴｃの共有（Ｂ）について説明する図である。
【００８５】
［タスクの検出処理の概要］
図９の（Ａ）は、ＴＣＢＴｃを共有可能なタスクの検出処理の概要について説明するフローチャート図である。工程Ｓ１、Ｓ２については、第１の実施の形態例と同様である。ディスパッチ処理が発生し（Ｓ１）、ディスパッチフックルーチンが呼び出されると（Ｓ２）、第２の実施の形態例では、システム時刻、終了対象のタスクのタスクＩＤ、及び、状態情報がイベント情報Ｅｆ２としてデータベースに記憶される（Ｓ３−２）。工程Ｓ１〜Ｓ３−２の処理が、各機能を動作させることを通じて行われることにより、全ての機能を動作させた場合における各タスクの状態情報が取得される。そして、最適化情報取得プログラムＰＲは、データベースに記憶されたイベント情報Ｅｆ２に基づいて、ＴＣＢＴｃを共有可能なタスクを検出する（Ｓ４−２）。
【００８６】
［タスク間におけるＴＣＢＴｃの共有化］
図９の（Ｂ）は、タスク間のＴＣＢＴｃの共有について説明する図である。ＴＣＢＴｃ−１は共有化前のＴＣＢＴｃを、ＴＣＢＴｃ−２は共有化後のＴＣＢＴｃを示す。同図の例では、例えば、タスク１とタスク２は、全機能を通して同時に起動状態にならない、ＴＣＢＴｃを共有化可能なタスクである。また、各タスクは、タスクＩＤをインデックスとして、ＴＣＢＴｃの各ブロックと関連付けられる。
【００８７】
共有化前のＴＣＢＴｃ−１のように、一般的に、タスク１、タスク２はそれぞれ別のＴＣＢＴｃのブロックと関連付けられる。そこで、ＴＣＢＴｃ−２において、ＴＣＢＴｃを共有可能なタスク１、タスク２に同一のタスクＩＤのＴＣＢＴｃのブロックが関連付けられることによって、ＴＣＢＴｃが共有化される。これにより、ＴＣＢＴｃのブロック総数が減少し、ＯＳの初期化時に確保されるＴＣＢＴｃの総サイズが小さくなる。
【００８８】
第２の実施の形態例では、ディスパッチフックルーチンを使用して、全ての機能を動作させた場合におけるシステム時刻に対応するタスクの状態情報が取得される。
【００８９】
［イベント情報Ｅｆ２の具体例］
図１０は、第２の実施の形態例において取得されるイベント情報Ｅｆ２の具体例を表す図である。この例においても、タスクＩＤ_１〜タスクＩＤ_３を例示して説明する。同図のイベント情報Ｅｆ２のシステム時刻に対応するタスクの状態情報は、第１の実施の形態例における図５のイベント情報Ｅｆ１のシステム時刻に対応するタスクの状態情報と同一である。
【００９０】
このため、時刻０〜１０の間、タスクＩＤ_１は動作状態にあり、タスクＩＤ_２、タスクＩＤ_３は休止状態である。続く時刻１０〜２０において、動作状態であったタスクＩＤ_１が休止状態に、休止状態であったタスクＩＤ_２が動作状態に遷移する。続く時間帯についても、第１の実施の形態例と同様である。このように、第２の実施の形態例では、全機能を動作させた場合における時間帯毎のタスクの状態情報が取得される。
【００９１】
続いて、本実施の形態例における最適化情報取得プログラムＰＲは、ディスパッチフックルーチンによって取得されたイベント情報Ｅｆ２に基づいて、ＴＣＢＴｃを共有可能なタスクを検出する。
【００９２】
［ＴＣＢＴｃ共有可能タスクの検出処理］
図１１は、本実施の形態例における最適化情報取得プログラムＰＲが、図１０のイベント情報Ｅｆ２に基づいて、ＴＣＢＴｃを共有可能なタスクを検出する処理の流れを説明するフローチャート図である。前述したとおり、ディスパッチフックルーチンを利用することによって、全ての機能を実行させたときの各タスクの状態情報が予め取得される（Ｓ４１）。
【００９３】
そして、最適化情報取得プログラムＰＲは、イベント情報Ｅｆ２を参照して、各時間帯について、複数のタスクのうちステータスが休止状態のタスクがあるか否かを判定する（Ｓ４２）。休止状態のタスクがある場合（Ｓ４２のＹＥＳ）、最適化情報取得プログラムＰＲは、対象の時間帯の休止状態のタスクについて、対応する動作状態のタスクを共有可能なタスクの候補として、中間データＭｄ２に上書きする（Ｓ４３）。一方、休止状態のタスクがない場合（Ｓ４２のＮＯ）、中間データＭｄ２は上書きされない。
【００９４】
続いて、イベント情報Ｅｆ２の最後の時間まで判定処理が完了したか否かが判定され（Ｓ４４）、判定が完了していない場合（Ｓ４４のＮＯ）、イベント情報Ｅｆ２における次の時間帯を対象として、休止状態のタスクがあるか否かが判定される（Ｓ４２）。一方、判定が完了した場合（Ｓ４４のＹＥＳ）、生成された中間データＭｄ２の情報が取得され（Ｓ４５）、中間データＭｄ２に基づいて工程Ｓ４６〜Ｓ４８の処理が行われる。
【００９５】
ここで、中間データＭｄ２の例を具体例に基づいて説明する。
【００９６】
［中間データＭｄ２の具体例］
図１２は、図１１のイベント情報Ｅｆ２に基づいて生成される中間データＭｄ２の具体例を示す図である。中間データＭｄ２は、対象のタスクについて、各タスクとＴＣＢＴｃを共有可能か否かを示す共有可能判定フラグを有する。この例において、共有可能判定フラグ「１」はＴＣＢＴｃを共有可能であることを、共有可能判定フラグ「０」はＴＣＢＴｃの共有が不可能であることを示す。
【００９７】
第１の実施の形態例と同様にして、最適化情報取得プログラムＰＲは、図１２のイベント情報Ｅｆ２の時刻０〜１０を参照し、タスクＩＤ_１〜タスクＩＤ_３のうち、休止状態のタスクＩＤ_２、タスクＩＤ_３を検知する（Ｓ４２のＹＥＳ）。そして、最適化情報取得プログラムＰＲは、中間データＭｄ２に対して、タスクＩＤ_２とタスクＩＤ_１、タスクＩＤ_３とタスクＩＤ_１との共有可能判定フラグに「１」を指定する（Ｓ４３）。
【００９８】
続いて、図５のイベント情報Ｅｆ２の時刻１０〜２０を参照し、最適化情報取得プログラムＰＲは、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_３とタスクＩＤ_２との共有可能判定フラグに「１」を上書きする。そして、最適化情報取得プログラムＰＲは、時刻３０〜５０を参照して、タスクＩＤ_２とタスクＩＤ_１、タスクＩＤ_２とタスクＩＤ_３との共有可能判定フラグに「１」を上書きすると共に、タスクＩＤ_１とタスクＩＤ_３との共有可能判定フラグを「１」から「０」に上書きする。他の時間帯についても、同様に判定され、共有可能判定フラグが更新された結果、全ての機能を通して、ＴＣＢＴｃを共有可能なタスクが検出される。
【００９９】
この結果、図１２の中間データＭｄ２は、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３の共有可能判定フラグに値「１」、タスクＩＤ_１とタスクＩＤ_３の共有可能判定フラグに値「０」を有する。これにより、ＴＣＢＴｃを共有可能なタスクの候補として、第１の実施の形態例と同様のタスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３の組み合わせが検出される。
【０１００】
このようにして、イベント情報Ｅｆ２における全ての時間帯の情報に基づいて、タスク間の共有可能フラグを有する中間データＭｄ２が生成される。これにより、全ての機能を通して、ＴＣＢＴｃを共有可能なタスクの候補が検出される。
【０１０１】
図１１のフローチャート図に戻り、続いて、工程Ｓ４６〜Ｓ４８において、中間データＭｄ２の共有可能なタスクの候補情報に基づいて、ＴＣＢＴｃを共有可能なタスクの検出処理が行われる。具体的に、最適化情報取得プログラムＰＲは、中間データＭｄ２におけるタスク［１〜ｔａｓｋｉｄ＿ｍａｘ（この例では３）］を参照して、全ての時間帯を通してＴＣＢＴｃを共有可能なタスクの組み合わせを検出し（Ｓ４６）、結果データＯｐ２に格納する（Ｓ４７）。最適化情報取得プログラムＰＲは、結果データＯｐ２から情報を読み出して、結果として出力する（Ｓ４８）。
【０１０２】
［結果データＯｐ２の具体例］
図１３は、図１２の中間データＭｄ２に基づいて生成される結果データＯｐ２の具体例を表す図である。図１２の中間データＭｄ２によると、共有可能なタスクの候補は、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３である。このため、結果データＯｐ２は、タスクＩＤ_１とタスクＩＤ_２、または、タスクＩＤ_２とタスクＩＤ_３の組み合わせをＴＣＢＴｃを共有可能なタスクの組み合わせ情報として有する。この場合、ユーザは、タスクＩＤ_１とタスクＩＤ_２、タスクＩＤ_２とタスクＩＤ_３の組み合わせのいずれかの組み合わせを選択する。
【０１０３】
以上のように、本実施の形態例における最適化情報取得プログラムＰＲは、ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得する。また、最適化情報取得プログラムＰＲは、所定時間毎の状態情報に基づいて、同時に起動状態にならない第１の組み合わせタスクを、リソースを共有可能なタスク群として検出する。なお、システムによって、ＴＣＢＴｃが実行可能状態でも使用される場合、起動状態には、さらに実行可能状態が含まれる。
【０１０４】
このように、本実施の形態例における最適化情報取得プログラムＰＲは、フックルーチンによって、全ての機能の実行を通して、同時に起動状態とならないタスク情報を容易に抽出できる。即ち、最適化情報取得プログラムＰＲは、全ての機能を実際に実行することによって取得される情報に基づいて、網羅的に、自動的に、高精度に、同時に起動状態とならないタスク情報を抽出できる。これにより、ＴＣＢＴｃを共有可能な複数のタスクが、容易に高精度に検出可能となる。
【０１０５】
また、本実施の形態例における最適化情報取得プログラムＰＲは、同時に起動状態とならないタスクを、当該タスクの優先度に依存することなく、ＴＣＢＴｃを共有可能なタスク群として検出するため、より多くのタスクを対象として、ＴＣＢＴｃを共有可能にできる。また、本実施の形態例における最適化情報取得プログラムＰＲは、予め提供されるディスパッチフックルーチンを利用することで、既存のシステムに修正を加えることなく、同時に起動状態とならないタスク情報を効率的に取得できる。
【０１０６】
このようにして、最適化情報取得プログラムＰＲは、ＴＣＢＴｃを共有可能な複数のタスクの検出を、熟練者等による属人化した処理に依存することなく、少ない工数で効率的に実現することができる。この結果、最適化処理のための工数が大幅に削減されると共に、ＴＣＢＴｃに要するメモリサイズが高精度に効率的に抑えられ、コストが抑えられる。また、ＴＣＢＴｃの総サイズが小さくなることにより、ＴＣＢＴｃにおける検索処理に係る処理が高速化され、システムの処理速度が向上する。
【０１０７】
なお、第１の実施の形態例と第２の実施の形態例は、あわせて行われてもよい。つまり、スタック領域を共有可能なタスクについて、さらに、ＴＣＢＴｃが共有されてもよい。また、１つのＴＣＢＴｃのブロックは３つ以上のタスクによって共有されてもよい。
【０１０８】
［ＴＣＢＴｃの共有化作業］
なお、ユーザは、検出されたＴＣＢＴｃを共有可能なタスクの情報に基づいて、ユーザプログラムＵＰを修正する。ＴＣＢＴｃの共有化は、共有するタスク間で同じタスクＩＤを使用することによって実現される。ここで、ＴＣＢＴｃの共有化のためのユーザプログラムＵＰの修正例について、簡単に説明する。
【０１０９】
図１４は、タスク１、タスク２とでＴＣＢＴｃを共有化する場合のユーザプログラムＵＰの修正例を示す図である。同図の左のユーザプログラムＰ１はＴＣＢＴｃを共有化前のユーザプログラムＵＰ、右のユーザプログラムＰ２はＴＣＢＴｃを共有化後のユーザプログラムＵＰの一例を示す。
【０１１０】
共有化前のユーザプログラムＰ１におけるコードｃ１はタスク１の起動関数を示す。コードｃ１の関数ｔａｓｋ１（）内で呼び出される関数ｓｔａｒｔ＿ｔａｓｋ（ｉｄ１）の第１引数ｉｄ１にはタスクＩＤが指定される。この例では、ｉｄ１はタスクＩＤ＝１を示す。即ち、タスク１にはタスクＩＤ「１」が指定され、タスク１の情報はＴＣＢＴｃ内のタスクＩＤ＝１に対応するブロックに記憶される。一方、共有化前のユーザプログラムＰ１におけるコードｃ２はタスク２の起動関数を示す。コードｃ２の関数ｔａｓｋ２（）内で呼び出される関数ｓｔａｒｔ＿ｔａｓｋ（ｉｄ２）の第１引数ｉｄ２にはタスクＩＤ＝２が指定される。即ち、タスク２にはタスクＩＤ「２」が指定され、タスク２の情報はＴＣＢＴｃ内のタスクＩＤ＝２に対応するブロックに記憶される。
【０１１１】
このように、共有化前のユーザプログラムＰ１では、タスク１、タスク２は、それぞれ別のタスクＩＤが付与され、ＴＣＢＴｃ内の異なるブロックに、それぞれのタスクの情報が記憶される。
【０１１２】
一方、共有化後のユーザプログラムＰ２において、コードｃ３の関数ｓｔａｒｔ＿ｔａｓｋはタスク１の起動処理を、コードｃ４の関数ｓｔａｒｔ＿ｔａｓｋはタスク２の起動処理を示す。この例では、関数ｓｔａｒｔ＿ｔａｓｋの第２引数に起動対象のタスクを指定することで、起動対象のタスクが切り替えられる。そこで、ユーザは、それぞれのタスクを起動する関数ｓｔａｒｔ＿ｔａｓｋの第１引数ｉｄ１に指定するタスクＩＤを同一にすることで、タスク１、２に指定するタスクＩＤを同一にする。
【０１１３】
このように、共有化後のユーザプログラムＰ２では、タスク１、タスク２は、同じタスクＩＤが付与されることにより、ＴＣＢＴｃ内の同一のブロックが制御ブロックとして使用される。これにより、この例では、ＯＳ初期化時に確保するＴＣＢＴｃのブロック数が１つ少なくなり、メモリの使用量が抑えられる。
【０１１４】
［第３の実施の形態例］
第３の実施の形態例では、最適化情報取得プログラムＰＲが優先度を最適化する例について説明する。第３の実施の形態例では、最適化情報取得プログラムＰＲは、ＯＳのプロセッサ１０が実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各タスクが、レディキューＲｑに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、各タスクの優先度とを取得する。そして、最適化情報取得プログラムＰＲは、所定時間の全てをとおして、起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の起動状態の第２のタスクがない場合、第１の優先度より上位の優先度であって起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、第１のタスク群の変更後の優先度として検出する。なお、システムによっては、起動状態に、さらに実行状態が含まれる。
【０１１５】
これにより、優先度の最適化のために、優先度を変更可能なタスクが効率的に検出される。そして、ユーザは、最適化情報取得プログラムＰＲによって検出された優先度を変更可能なタスクの情報、及び、その優先度情報に基づいて、ユーザプログラムＵＰを修正する。この結果、組み込み装置１００におけるユーザプログラムＵＰ実行時のレディキューＲｑに要するメモリ使用量が削減される。
【０１１６】
図１５は、第３の実施の形態例における処理の流れの概要（Ａ）と、優先度の最適化（Ｂ）について説明する図である。
【０１１７】
［タスクの検出処理の概要］
図１５の（Ａ）は、優先度の変更が可能なタスクの検出処理の概要について説明するフローチャート図である。工程Ｓ１、Ｓ２については、第１、２の実施の形態例と同様である。ディスパッチ処理が発生し（Ｓ１）、ディスパッチフックルーチンが呼び出されると（Ｓ２）、第３の実施の形態例では、システム時刻、終了対象のタスクのタスクＩＤ、状態情報、及び、優先度がイベント情報Ｅｆ３としてデータベースに記憶される（Ｓ３−３）。工程Ｓ１〜Ｓ３−３の処理が、各機能を動作させることを通じて行われることにより、全ての機能を動作させた場合における各タスクの状態情報、及び、優先度が取得される。そして、最適化情報取得プログラムＰＲは、データベースに記憶されたイベント情報Ｅｆ３に基づいて、優先度の最適化を目的とする優先度の変更が可能なタスクを検出する（Ｓ４−３）。
【０１１８】
［優先度の最適化処理］
図１５の（Ｂ）は、優先度の最適化処理について説明する図である。同図の例において、最大優先度は３である。また、タスク３には優先度２、タスク４、５には優先度３が付与されている（Ｂ−１）。例えば、タスク３〜５は、同時に起動状態になるタスクである。この例において、タスク３が起動状態になるとき、起動状態になる優先度１のタスクが存在しない。このため、タスク３の優先度を２から１に上げても影響がない（Ｂ−２）。そして、タスク３の優先度が１に上げられた場合、タスク４、５の優先度とタスク３の優先度が非連続になる。優先度は、同時に起動状態になるタスク３〜５間で相対的に維持されればよいため、タスク４、５の優先度を３から２に上げても影響がない（Ｂ−３）。
【０１１９】
このように、タスクの優先度は同時に起動状態になるタスク間で相対的に維持されればよい。このため、同時に起動状態になるタスク間で優先度の順位に空きがある場合、タスク間の優先度が維持されるようにタスクの優先度を変更しても影響はない。そして、図１５の（Ｂ）のように、優先度が変更された結果、最大の優先度が３から２に最適化される。レディキューの領域は、ＯＳの初期化時に最大の優先度のサイズ分確保される。このため、最大優先度が小さくなることにより、レディキューの領域に要するサイズが小さくなる。
【０１２０】
第３の実施の形態例では、ディスパッチフックルーチンを使用して、全ての機能を動作させた場合におけるシステム時刻に対応するタスクの状態情報、及び、優先度が取得される。
【０１２１】
［イベント情報Ｅｆ３の具体例］
図１６は、第３の実施の形態例において取得されるイベント情報Ｅｆ３の具体例を表す図である。この例においても、タスクＩＤ_１〜タスクＩＤ_３を例示して説明する。同図のイベント情報Ｅｆ３のシステム時刻に対応するタスクの状態情報は、第１の実施の形態例における図５のイベント情報Ｅｆ１のシステム時刻に対応するタスクの状態情報と同一である。そして、イベント情報Ｅｆ３は、各タスクの状態情報に加えて、タスクに付与された優先度の情報を有する。
【０１２２】
イベント情報Ｅｆ３において、タスクＩＤ_１の優先度は常に１、タスクＩＤ_２の優先度は常に２、タスクＩＤ_３の優先度は常に３である。ただし、この例に限定されるものではなく、タスクの優先度が途中で動的に変更されてもよい。このように、第３の実施の形態例では、全機能を動作させた場合における時間帯毎のタスクの状態情報、及び、優先度の情報が取得される。
【０１２３】
続いて、本実施の形態例における最適化情報取得プログラムＰＲは、ディスパッチフックルーチンによって取得されたイベント情報Ｅｆ３に基づいて、優先度を最適化可能なタスクを検出する。
【０１２４】
［優先度を最適化可能なタスクの検出処理］
図１７は、本実施の形態例における最適化情報取得プログラムＰＲが、図１６のイベント情報Ｅｆ３に基づいて、優先度を最適化可能なタスクを検出する処理の流れを説明するフローチャート図である。前述したとおり、ディスパッチフックルーチンを利用することによって、全ての機能を実行させたときの各タスクの状態情報、及び、優先度情報が予め取得される（Ｓ５１）。
【０１２５】
そして、最適化情報取得プログラムＰＲは、イベント情報Ｅｆ３を参照して、各時間帯について、複数のタスクのうちステータスが休止状態のタスクがあるか否かを判定する（Ｓ５２）。休止状態のタスクがある場合（Ｓ５２のＹＥＳ）、最適化情報取得プログラムＰＲは、対象の時間帯に休止状態以外である起動状態のタスク間の優先度が連続した値か否かを判定する（Ｓ５３）。対象の時間帯における休止状態以外のタスクの優先度が連続値でない場合（Ｓ５３のＮＯ）、最適化情報取得プログラムＰＲは、休止状態以外のタスクの情報を中間データＭｄ３に上書きする（Ｓ５４）。
【０１２６】
一方、休止状態のタスクがない場合（Ｓ５２のＮＯ）、及び、対象の時間帯における休止状態以外のタスクの優先度が連続値である場合（Ｓ５３のＹＥＳ）、中間データＭｄ３は上書きされない。続いて、イベント情報Ｅｆ３の最後の時間帯まで判定処理が完了したか否かが判定され（Ｓ５６）、判定が完了していない場合（Ｓ５６のＮＯ）、イベント情報Ｅｆ３における次の時間帯を対象として、休止状態のタスクがあるか否かが判定される（Ｓ５２）。一方、判定が完了した場合（Ｓ５６のＹＥＳ）、生成された中間データＭｄ３の情報が取得され（Ｓ５７）、中間データＭｄ３に基づいて工程Ｓ５８〜Ｓ６０の処理が行われる。
【０１２７】
ここで、中間データＭｄ３の例を具体例に基づいて説明する。
【０１２８】
［中間データＭｄ３の具体例］
図１８は、図１７のイベント情報Ｅｆ３に基づいて生成される中間データＭｄ３の具体例を示す図である。中間データＭｄ３は、対象のタスクについて、同時間帯に起動状態となるタスクとその優先度情報を有する。
【０１２９】
図１７のイベント情報Ｅｆ３において、休止状態以外のタスクの優先度が連続した値ではない時間帯は、時刻３０〜５０、時刻１２０〜１２５である（Ｓ５３のＮＯ）。時刻３０〜５０では、タスクＩＤ_１は待ち状態、タスクＩＤ_３は動作状態であって休止状態以外の状態である。また、タスクＩＤ_１の優先度は１、タスクＩＤ_３の優先度は３であるため、タスクＩＤ_１とタスクＩＤ_３の優先度は連続した値ではない。時刻１２０〜１２５についても、同様である。
【０１３０】
この結果、図１８の中間データＭｄ３は、時刻３０〜５０に対応するインデックス４の行において、タスクＩＤ_１、タスクＩＤ_３の情報と対応する優先度の情報を有する。また、中間データＭｄ３は、時刻１２０〜１２５に対応するインデックス７の行において、タスクＩＤ_１、タスクＩＤ_３の情報と対応する優先度の情報を有する。このようにして、イベント情報Ｅｆ３における各時間帯の情報に基づいて、時間帯毎の休止状態以外の状態のタスクと、その優先度情報を有する中間データＭｄ３が生成される。
【０１３１】
図１７のフローチャート図に戻り、続いて、工程Ｓ５８〜Ｓ６０において、中間データＭｄ３の情報に基づいて、優先度を最適化可能なタスクの検出処理が行われる。具体的に、最適化情報取得プログラムＰＲは、中間データＭｄ３を参照して、優先度［２〜ｔａｓｋｐｒｉ＿ｍａｘ（この例では最大優先度３）］を参照して、全ての時間帯を通して、対象優先度が付与された１つまたは複数のタスクの優先度を上げることができるか否かを判定する（Ｓ５８）。優先度を上げることができる場合（Ｓ５８のＹＥＳ）、当該優先度の１つまたは複数のタスクの優先度を１つ上げて（Ｓ５９）、結果データＯｐ３に格納する（Ｓ６０）。最適化情報取得プログラムＰＲは、結果データＯｐ３から情報を読み出して（Ｓ６１）、結果として出力する（Ｓ６２）。
【０１３２】
このように、最適化情報取得プログラムＰＲは、高い優先度から当該優先度のタスク群について優先度を繰り上げることができるか否かを判定する。これにより、高い優先度から順次、優先度が繰り上げられることが可能になり、その後に判定される低い優先度のタスクについて、繰り上げ可能な対象優先度範囲が大きくなる。つまり、例えば、図１５の（Ｂ）の例において、優先度２のタスク３が先に優先度１に繰り上げられることによって、優先度３のタスク４、５の優先度２への繰り上げが可能になる。また、この例では、優先度が１つ繰り上げられているが、優先度は、２つ以上の順位分、繰り上げられてもよい。例えば、図１５の（Ｂ）の例において、タスク４、５が優先度４であった場合、優先度４から２への繰り上げ可能である。
【０１３３】
［結果データＯｐ３の具体例］
図１９は、図１８の中間データＭｄ３に基づいて生成される結果データＯｐ３の具体例を表す図である。図１８の中間データＭｄ３によると、インデックス４、７に対応する時間帯において、同時に起動状態になるタスクＩＤ_１、タスクＩＤ_３の優先度は連続した値ではない。また、他の時間帯において、タスクＩＤ_１、タスクＩＤ_３が同時に起動状態にならない。このため、タスクＩＤ_３の優先度を３から２に上げることが可能になる（Ｓ５８のＹＥＳ）。
【０１３４】
また、図１８の中間データＭｄ３によると、タスクＩＤ_２は、全ての時間帯を通して、他のタスクと同時に起動状態にならない。タスクＩＤ_２の優先度は２であるため、２から１に上げることが可能になる。しかしながら、タスクＩＤ_２の優先度が２から１に上がっても、優先度２のタスクＩＤ_３があるため、全体の最大優先度は小さくならない。このため、タスクＩＤ_２の優先度は変更されてもどちらでもよい。
【０１３５】
これにより、結果データＯｐ３は、タスクＩＤ_３について、変更前の優先度３と、変更後の優先度２の情報を有する。また、結果データＯｐ３は、タスクＩＤ_１、タスクＩＤ_２については、優先度が変更されない旨の情報を有する。これにより、優先度の最大値が３から２に変更され、レディキューＲｑに要するサイズが減少する。
【０１３６】
以上のように、本実施の形態例における最適化情報取得プログラムＰＲは、ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各タスクが、レディキューＲｑに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、各タスクの優先度とを取得する。また、最適化情報取得プログラムＰＲは、所定時間の全てをとおして、起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の起動状態の第２のタスクがない場合、第１の優先度より上位の優先度であって起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、第１のタスクの変更後の優先度として検出する。なお、システムによって、優先度が実行状態でも使用される場合、起動状態には、さらに実行状態が含まれる。
【０１３７】
このように、本実施の形態例における最適化情報取得プログラムＰＲは、フックルーチンを利用することによって、全ての機能の実行を通して、同時に起動状態となるタスク情報、及び、その優先度を容易に抽出できる。即ち、最適化情報取得プログラムＰＲは、全ての機能を実際に実行することによって取得される情報に基づいて、網羅的に、自動的に、高精度に、同時に起動状態となるタスク情報、優先度情報を抽出できる。これにより、優先度の最適化のために、優先度を変更可能なタスクが、容易に高精度に検出可能となる。
【０１３８】
また、本実施の形態例における最適化情報取得プログラムＰＲは、起動状態となるタスク群の対象の優先度の上位の優先度であって、同時に起動状態となるタスクがある優先度に注目して、優先度の順位が連続するように対象の優先度を繰り上げることで優先度を最適化する。これにより、最適化情報取得プログラムＰＲは、優先度を最適化するためのタスク情報とその変更後の優先度情報との検出を、熟練者等による属人化した処理に依存することなく、少ない工数で効率的に実現することができる。この結果、最適化処理のための工数が大幅に削減されると共に、レディキューＲｑに要するメモリサイズが高精度に効率的に抑えられ、コストが抑えられる。また、優先度が最適化されることにより、レディキューＲｑのキューサーチに係る処理が高速化され、システムの処理速度が向上する。
【０１３９】
また、本実施の形態例における最適化情報取得プログラムＰＲは、予め提供されるディスパッチフックルーチンを利用することで、既存のシステムに修正を加えることなく、同時に起動状態となるタスク情報、優先度情報を効率的に取得できる。
【０１４０】
また、本実施の形態例では、最大優先度が３から２に減少する場合を例示しているが、この例に限定されるものではない。一般的に、タスク数は多量であって、優先度の最大値も大きい。このため、本実施の形態例における最適化情報取得プログラムＰＲによると、多様な優先度が指定されたタスクを対象として、最適化可能な優先度、及び、そのタスクを効率的に検出することができる。
【０１４１】
なお、第３の実施の形態例は、第１、２の実施の形態例とあわせて行われてもよい。つまり、スタック領域Ｓｔ、ＴＣＢＴｃを共有可能なタスクが検出されると共に、さらに、優先度の最適化が行われてもよい。これにより、さらに、共有リソースに要するメモリサイズが抑えられる。
【０１４２】
［タスクの優先度の変更］
なお、ユーザは、レディキューＲｑの最適化のために優先度を変更可能なタスクの情報に基づいて、ユーザプログラムＵＰを修正する。例えば、ユーザは、ユーザプログラムＵＰにおいて、タスク毎に付与される優先度を修正することによって、レディキューＲｑの最適化を実現する。
【０１４３】
なお、本実施の形態例における最適化情報取得処理は、コンピュータ読み取り可能な記録媒体にプログラムとして記憶され、当該プログラムをコンピュータが読み出して実行することによって行われてもよい。
【０１４４】
以上の実施の形態をまとめると、次の付記のとおりである。
【０１４５】
（付記１）
コンピュータに、オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を実行させる最適化情報取得プログラムであって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得処理と、
前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出処理と、を有する最適化情報取得プログラム。 
【０１４６】
（付記２）
付記１において、
前記起動状態には、さらに実行可能状態が含まれる最適化情報取得プログラム。 
【０１４７】
（付記３）
付記１または２において、
前記リソースにはスタック領域が含まれ、
前記タスク情報取得処理は、さらに、前記各タスクの前記スタック領域のスタックサイズを取得し、
前記検出処理は、前記第１の組み合わせタスクを、前記スタック領域を共有可能なタスク群として検出すると共に、前記第１の組み合わせタスクにおける各タスク間の最大のスタックサイズを、前記第１の組み合わせタスクの共有スタック領域のスタックサイズとして検出する最適化情報取得プログラム。
【０１４８】
（付記４）
付記３において、
前記検出処理は、同一のタスクを含む前記第１の組み合わせタスクが複数ある場合、前記第１の組み合わせの各タスクの前記スタックサイズの合計値から前記共有スタック領域のスタックサイズを減算した減算値が最も大きい前記第１の組み合わせタスクを検出する最適化情報取得プログラム。
【０１４９】
（付記５）
付記１乃至４のいずれかにおいて、
前記リソースには、タスクコントロールブロックが含まれ、
前記検出処理は、前記第１の組み合わせタスクを、前記タスクコントロールブロックを共有可能なタスク群として検出する最適化情報取得プログラム。
【０１５０】
（付記６）
コンピュータに、オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を実行させる最適化情報取得プログラムであって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが、レディキューに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、前記各タスクの優先度とを取得するタスク情報取得処理と、
前記所定時間の全てをとおして、前記起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の前記起動状態の第２のタスクがない場合、前記第１の優先度より上位の優先度であって前記起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、前記第１のタスク群の変更後の優先度として検出する検出処理と、を有する最適化情報取得プログラム。
【０１５１】
（付記７）
付記６において、
前記起動状態には、さらに実行状態が含まれる最適化情報取得プログラム。
【０１５２】
（付記８）
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得装置であって、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得手段と、
前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出手段と、を有する最適化情報取得装置。
【０１５３】
（付記９）
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得装置であって、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが、レディキューに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、前記各タスクの優先度とを取得するタスク情報取得手段と、
前記所定時間の全てをとおして、前記起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の前記起動状態の第２のタスクがない場合、前記第１の優先度より上位の優先度であって前記起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、前記第１のタスク群の変更後の優先度として検出する検出手段と、を有する最適化情報取得装置。
【０１５４】
（付記１０）
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得方法であって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが実行状態を含む起動状態であるか否かを示す状態情報を取得するタスク情報取得工程と、
前記所定時間毎の状態情報に基づいて、同時に前記起動状態にならない第１の組み合わせタスクを、前記リソースを共有可能なタスク群として検出する検出工程と、を有する最適化情報取得方法。
【０１５５】
（付記１１）
オペレーティング・システム（以下、ＯＳ）のリソースを最適化可能なタスクを検出する最適化情報取得処理を行う最適化情報取得方法であって、
前記最適化情報取得処理は、
前記ＯＳのプロセッサが実行するタスクを切り替えるディスパッチ処理の前後に呼び出されるフックルーチンによって、所定時間毎の、各前記タスクが、レディキューに登録される実行可能状態を含む起動状態であるか否かを示す状態情報と、前記各タスクの優先度とを取得するタスク情報取得工程と、
前記所定時間の全てをとおして、前記起動状態の第１のタスク群の第１の優先度の上位に隣接する第２の優先度の前記起動状態の第２のタスクがない場合、前記第１の優先度より上位の優先度であって前記起動状態の第３のタスクがある第３の優先度の下位に隣接する優先度を、前記第１のタスク群の変更後の優先度として検出する検出工程と、を有する最適化情報取得方法。
【符号の説明】
【０１５６】
１００：組み込み装置、１１：入力手段、１２：モニタ、１３：メモリ、１５：バス、Ｓｔ：スタック領域、Ｔｃ：ＴＣＢ、Ｒｑ：レディキュー、ＰＲ：最適化情報取得プログラム、ＵＰ：ユーザプログラム、ＯＰ：ＯＳのプログラム群
【図１】
2014071868.tif 000003
【図２】
2014071868.tif 000004
【図３】
2014071868.tif 000005
【図４】
2014071868.tif 000006
【図５】
2014071868.tif 000007
【図６】
2014071868.tif 000008
【図７】
2014071868.tif 000009
【図８】
2014071868.tif 000010
【図９】
2014071868.tif 000011
【図１０】
2014071868.tif 000012
【図１１】
2014071868.tif 000013
【図１２】
2014071868.tif 000014
【図１３】
2014071868.tif 000015
【図１４】
2014071868.tif 000016
【図１５】
2014071868.tif 000017
【図１６】
2014071868.tif 000018
【図１７】
2014071868.tif 000019
【図１８】
2014071868.tif 000020
【図１９】
2014071868.tif 000021