(57)【要約】  本発明に係る情報処理装置は、それぞれがイベントの取得に対応して処理を行う複数のスレッドを切り換えながらプロセッサにより実行するものであり、実行状態である第１のスレッドに代えて、前記複数のスレッドの中の、非実行状態である第２のスレッドを実行状態に遷移させる際に、第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出し、第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出し、これらの検出結果に応じて、第２のスレッドの実行用のコンテキストを、プロセッサに設定するか否かを切り替えて動作する。
2009157127.tif 000002
【特許請求の範囲】
【請求項１】
それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置であって、
実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリング手段と、
非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出手段と、
実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出手段と、
前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定手段とを備える
ことを特徴とする情報処理装置。
【請求項２】
前記情報処理装置は、更に、
スレッドに対応付けてコンテキストを記憶するためのコンテキスト記憶手段と、
前記第１検出手段が検出しなかった場合に、前記プロセッサに設定されているコンテキストを、前記第１のスレッドと対応付けられたコンテキストとして前記コンテキスト記憶手段に記憶させるコンテキスト対応付け手段を備え、
前記設定手段は、前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定せず、前記第２検出手段が検出しなかった場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定する
ことを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記コンテキスト対応付け手段は、更に
前記第１検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第１のスレッドと対応付けられたコンテキストと当該第１のスレッドとの対応付けを削除する
ことを特徴とする請求項２記載の情報処理装置。
【請求項４】
前記情報処理装置は、
前記コンテキスト記憶手段においてコンテキストが対応付けられていないスレッド用の前記既定の処理部分を処理の開始位置とするための初期コンテキストを記憶する初期コンテキスト記憶手段を備え、
前記第２検出手段は、前記コンテキスト記憶手段において、前記第２のスレッドとコンテキストとが対応付けられていない場合に、当該第２のスレッドにおける処理の開始位置が、前記既定の処理部分であると検出し、
前記コンテキスト対応付け手段は、更に
前記第２検出手段が検出した場合において、前記第１検出手段が検出したときは、前記第１のスレッドに対応付けられたコンテキストの対応付け先を、前記第２のスレッドに変更し、前記第１検出手段が検出しなかったときは、前記初期コンテキストを前記第２のスレッドと対応付けられたコンテキストとして、前記コンテキスト記憶手段に記憶させ、
前記設定手段は、前記第１検出手段が検出せず、かつ前記第２検出手段が検出した場合に、前記コンテキスト対応付け手段により前記第２のスレッドと対応付けて前記コンテキスト記憶手段に記憶されている初期コンテキストを前記プロセッサに設定する
ことを特徴とする請求項３記載の情報処理装置。
【請求項５】
前記情報処理装置は、更に
前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第２のスレッドと対応付けられているコンテキストの対応付け先を前記第１のスレッドに、前記第１のスレッドと対応付けられているコンテキストの対応付け先を前記第２のスレッドにそれぞれ変更するコンテキスト対応付け手段を備える
ことを特徴とする請求項２記載の情報処理装置。
【請求項６】
前記イベントは、メッセージであり、
前記非実行状態は、メッセージの受信を待つメッセージ待ち状態を含み、
前記複数のスレッドには、次に実行状態になった際の処理の開始位置が、前記既定の処理部分となる場合には、前記メッセージ待ち状態に遷移することを示すフラグを設定するよう構成されたスレッドを含み、
前記第１検出手段及び前記第２検出手段は、検出対象のスレッドにおいて、前記フラグが設定されていることを検出することにより、当該処理対象のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する
ことを特徴とする請求項５記載の情報処理装置。
【請求項７】
それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置において用いられる情報処理方法であって、
スケジューリング手段が、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるステップと、
第１検出手段が、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出するステップと、
第２検出手段が、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出するステップと、
設定手段が、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作するステップとを備える
ことを特徴とする情報処理方法。
【請求項８】
それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置にスレッドの実行制御処理を実行させるための情報処理プログラムであって、
前記スレッドの実行制御処理は、
実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリングステップと、
非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出ステップと、
実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出ステップと、
前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出ステップ及び前記第２検出ステップの検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定ステップとを備える
ことを特徴とする情報処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッド実行制御技術に関する。
【背景技術】
【０００２】
１つのプロセッサにより複数の処理を切り替えながら、見かけ上並行して実行する、マルチスレッドと呼ばれる実行制御方法が知られている。ここでいうマルチスレッドは、マルチタスク、マルチプロセス等、様々に称されることがある。【０００３】
マルチスレッド制御では、実行するスレッドの切り替え要因が発生した場合に、それまで実行していたスレッドのコンテキスト、つまり、プロセッサ内のレジスタ値をメモリに退避させ、次に実行するスレッドのメモリに退避されていたコンテキストをプロセッサに復元する処理（以下、「コンテキストの退避・設定処理」という）が一般的に行われる。【０００４】
これにより、スレッドの切り替えによって実行が中断されたスレッドについて、後に実行を再開する場合に、中断された時点の処理から再開できるようになる。【０００５】
このように、マルチスレッド制御でのスレッドの切り替えに際しては、このコンテキストの退避・設定処理が一般的に行われることになるが、プロセッサとメモリとの間でコンテキストの書き込みと読み出しとのためのデータ転送が行われることになるため、スレッドの切り替えに時間がかかり、プログラムの処理効率が低下するという問題がある。【０００６】
スレッドの切り替えをより効率的に行う方法には、種々の方法が知られており、例えば特許文献１がある。特許文献１は、扱うレジスタサイズが異なる複数のプログラム（スレッド）を切り替えながら並列して実行する場合に、スレッドが扱うレジスタサイズに応じたサイズ分のデータ（コンテキスト）の退避・設定処理を行うことで、スレッドの切り替えにかかる時間を短縮するものである。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】日本国特許公開２００７-２０７０７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１の方法を用いても、各スレッドの実行に必要のないデータの読み書きにより生じる時間が短縮できるに過ぎず、依然としてスレッドの切り替えに時間がかかるという課題は解決できていない。【０００９】
そこで、本発明は係る問題に鑑みてなされたものであり、従来とは異なる方法で、より高速にスレッドの切り替えを行うことが可能な情報処理装置、情報処理方法及び情報処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、本発明に係る情報処理装置は、それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置であって、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリング手段と、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出手段と、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出手段と、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定手段とを備えることを特徴とする。【００１１】
また、上記課題を解決するために本発明に係る情報処理装置において用いられる情報処理方法は、それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置において用いられる情報処理方法であって、スケジューリング手段が、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるステップと、第１検出手段が、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出するステップと、第２検出手段が、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出するステップと、設定手段が、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作するステップとを備えることを特徴とする。【００１２】
また、上記課題を解決するために本発明に係る情報処理装置に実行させるための情報処理プログラムは、それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置にスレッドの実行制御処理を実行させるための情報処理プログラムであって、前記スレッドの実行制御処理は、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリングステップと、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出ステップと、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出ステップと、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出ステップ及び前記第２検出ステップの検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定ステップとを備えることを特徴とする。
【発明の効果】
【００１３】
上述の構成を備える本発明に係る情報処理装置は、第１のスレッドに代えて、第２のスレッドを実行状態に遷移させる際に、第１検出手段及び第２検出手段の検出結果に応じて、第２のスレッドの実行用のコンテキストをプロセッサに設定するか否かを切り替えるため、必ずコンテキストをプロセッサに設定する従来の場合と比較し、より高速にスレッドの切り替えを行うことができる。【００１４】
また、前記情報処理装置は、更に、スレッドに対応付けてコンテキストを記憶するためのコンテキスト記憶手段と、前記第１検出手段が検出しなかった場合に、前記プロセッサに設定されているコンテキストを、前記第１のスレッドと対応付けられたコンテキストとして前記コンテキスト記憶手段に記憶させるコンテキスト対応付け手段を備え、前記設定手段は、前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定せず、前記第２検出手段が検出しなかった場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定することとしてもよい。【００１５】
ここで、対応付けとは、スレッドと、コンテキスト記憶手段に記憶されているコンテキストとを関係付ける情報をいう。【００１６】
これにより、第１検出手段が検出し、かつ第２検出手段が検出した場合に、設定手段は、第２のスレッドを実行状態に遷移させる際に、第２のスレッドに対応付けられたコンテキストをプロセッサに設定しないので、本発明に係る情報処理装置は、より高速にスレッドの切り替えを行うことができる。【００１７】
第１検出手段が検出し、かつ第２検出手段が検出した場合には、実行状態に遷移させられる第２のスレッドにおける処理の開始位置と、それまで実行状態だった第１のスレッドにおける次に実行状態になった際の処理の開始位置とが共に既定の処理部分となるため、第２のスレッドに対応付けられたコンテキストをプロセッサに設定せずに第２のスレッドを実行させても、正常に動作させることができる。【００１８】
また、前記コンテキスト対応付け手段は、更に前記第１検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第１のスレッドと対応付けられたコンテキストと当該第１のスレッドとの対応付けを削除することとしてもよい。【００１９】
これにより、第１検出手段が検出した場合に、コンテキスト対応付け手段は、第１のスレッドとそのコンテキストとの対応付けを削除するので、管理すべきコンテキストの数を減らし、全体としてコンテキストの記憶に必要なメモリ容量を減らし得る。【００２０】
また、前記情報処理装置は、前記コンテキスト記憶手段においてコンテキストが対応付けられていないスレッド用の前記既定の処理部分を処理の開始位置とするための初期コンテキストを記憶する初期コンテキスト記憶手段を備え、前記第２検出手段は、前記コンテキスト記憶手段において、前記第２のスレッドとコンテキストとが対応付けられていない場合に、当該第２のスレッドにおける処理の開始位置が、前記既定の処理部分であると検出し、前記コンテキスト対応付け手段は、更に前記第２検出手段が検出した場合において、前記第１検出手段が検出したときは、前記第１のスレッドに対応付けられたコンテキストの対応付け先を、前記第２のスレッドに変更し、前記第１検出手段が検出しなかったときは、前記初期コンテキストを前記第２のスレッドと対応付けられたコンテキストとして、前記コンテキスト記憶手段に記憶させ、前記設定手段は、前記第１検出手段が検出せず、かつ前記第２検出手段が検出した場合に、前記コンテキスト対応付け手段により前記第２のスレッドと対応付けて前記コンテキスト記憶手段に記憶されている初期コンテキストを前記プロセッサに設定することとしてもよい。【００２１】
これにより、第２検出手段が検出した場合、つまり、第２のスレッドにコンテキストが対応付けられていない場合において、第１検出手段が検出したときは、第１のスレッドと対応付けられていたコンテキストが、第２のスレッドと対応付けられるので、その第２のスレッドの実行がなされてからまた非実行状態になる際、コンテキストの退避をせざるを得ないときに、そのための領域が既に確保されているようにすることができる。【００２２】
また、第２のスレッドにコンテキストが対応付けられていない場合において、第１検出手段も検出しなかったときは、既定の処理部分を処理の開始位置とするための初期コンテキストが第２のスレッドに対応付けられ、設定手段がその初期コンテキストをプロセッサに設定するので、第２のスレッドを正常に実行させることができる。【００２３】
また、前記情報処理装置は、更に前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第２のスレッドと対応付けられているコンテキストの対応付け先を前記第１のスレッドに、前記第１のスレッドと対応付けられているコンテキストの対応付け先を前記第２のスレッドにそれぞれ変更するコンテキスト対応付け手段を備えることとしてもよい。【００２４】
これにより、第１検出手段が検出し、かつ第２検出手段が検出した場合には、実行状態に遷移させられる第２のスレッドにおける処理の開始位置と、それまで実行状態だった第１のスレッドにおける次に実行状態になった際の処理の開始位置とが共に既定の処理部分となるため、コンテキスト対応付け手段が、第２のスレッドに対応付けられているコンテキストを第１のスレッドに対応付けることにより、プロセッサに設定されているコンテキストを退避させることなく、第１のスレッドのコンテキストを正しく保持できる。【００２５】
また、コンテキスト対応付け手段が、第１のスレッドに対応付けられているコンテキストを第２のスレッドに対応付けるので、その第２のスレッドの実行がなされてからまた非実行状態になる際、コンテキストの退避をせざるを得ないときに、そのための領域が既に確保されているようにすることができる。【００２６】
また後に、第１のスレッドが実行状態になる際に、それに対応付けられたコンテキストをそのままプロセッサに設定し得るようになる。【００２７】
また、前記イベントは、メッセージであり、前記非実行状態は、メッセージの受信を待つメッセージ待ち状態を含み、前記複数のスレッドには、次に実行状態になった際の処理の開始位置が、前記既定の処理部分となる場合には、前記メッセージ待ち状態に遷移することを示すフラグを設定するよう構成されたスレッドを含み、前記第１検出手段及び前記第２検出手段は、検出対象のスレッドにおいて、前記フラグが設定されていることを検出することにより、当該処理対象のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出することとしてもよい。【００２８】
これにより、次に実行状態になった際の処理の開始位置が、前記既定の処理部分となる場合には、前記メッセージ待ち状態に遷移することを示すフラグを設定するよう各スレッドを構成するだけで、本発明に係る情報処理装置は、より高速にスレッドの切り替えを行うという効果が得られるようにできる。
【図面の簡単な説明】
【００２９】
【図１】本発明の実施の形態１に係る情報処理装置１０００の機能ブロック図である。
【図２】記憶部１０１０に記憶されている構造体群を示す図である。
【図３】スケジューラ構造体Ｄ００のデータ構成を示す図である。
【図４】スレッド構造体Ｄ１０Ａのデータ構成を示す図である。
【図５】スレッドの状態遷移を説明するための図である。
【図６】セマフォ構造体Ｄ２０のデータ構成を示す図である。
【図７】コンテキスト構造体Ｄ３０Ａのデータ構成を示す図である。
【図８】各スレッドの処理を示すフローチャート（左側）と、情報処理装置１０００の実行制御部１０５０の動作を示すフローチャート（右側）である。
【図９】情報処理装置１０００のスケジュール部１０２０の動作を示すフローチャートである。
【図１０】情報処理装置１０００の遷移検出部１０３０の動作を示すフローチャートである。
【図１１】情報処理装置１０００の起床検出部１０４０の動作を示すフローチャートである。
【図１２】情報処理装置１０００のコンテキスト対応交換部１０７１の動作を示すフローチャートである。
【図１３】情報処理装置１０００のディスパッチ部１０６０の動作を示すフローチャートである。
【図１４】本発明の実施の形態２に係る情報処理装置２０００の機能ブロック図である。
【図１５】スケジューラ構造体Ｄ４０のデータ構成を示す図である。
【図１６】コンテキスト構造体Ｄ５０Ａのデータ構成を示す図である。
【図１７】情報処理装置２０００の実行制御部２０２０の動作を示すフローチャートである。
【図１８】情報処理装置２０００のコンテキスト未対応検出部２０１０の動作を示すフローチャートである。
【図１９】情報処理装置２０００のコンテキスト対応移動部２０３１の動作を示すフローチャートである。
【図２０】情報処理装置２０００のコンテキスト対応開放・復元部２０３２の動作を示すフローチャートである。
【図２１】情報処理装置２０００のコンテキスト保管・対応割付部２０３３の動作を示すフローチャートである。
【図２２】情報処理装置２０００のコンテキスト保管・対応割付部２０３３の動作を示すフローチャートである。
【発明を実施するための形態】
【００３０】
以下、本発明の実施の形態について、図面を参照しながら説明する。
【００３１】
≪実施の形態１≫
＜概要＞
実施の形態１に係る情報処理装置は、ＣＰＵ（Central Processing Unit）等のプロセッサにプログラムを実行させることにより、マルチスレッドＯＳ（Operating System）としての機能を実現する従来の情報処理装置を改良したものである。
【００３２】
以下では、マルチスレッド制御の対象となる各スレッドには、いわゆるイベントドリブン型の処理プログラムとして動作する複数のスレッドがあり、メッセージによって、各種イベントの発生が伝えられる場合を例に説明する。
【００３３】
このメッセージの例としては、ユーザによりマウスボタンがクリックされたことを示す通知や、スレッド間で連携を取るために使用される通知等が挙げられ、また、各スレッドの切り替え要因には、タイムスライスを使いきった場合、共有資源の割り当てを待つ場合や、上述のメッセージの受信を待つ場合等が挙げられる。なお、以下では、あるスレッドから他のスレッドに切り替えを行う場合に、このあるスレッドのことを「前スレッド」、他のスレッドのことを「現スレッド」と表現する。
【００３４】
イベントドリブン型の各スレッドは、実行状態の間、メッセージループと呼ばれるループ処理を繰り返し実行する。メッセージループは、メッセージキューにメッセージを受信しているか否かの判定処理をプログラムのメインルーチンにおいて含んで形成され、メッセージを受信している場合には、既定のサブルーチンを呼び出してそのメッセージに応じた処理を行った後にこの判定処理を再び行い、メッセージを受信していない場合には、メッセージを待つ状態（以下、「メッセージ待ち状態」という）に遷移する旨のフラグを設定する処理を行って、ＯＳにスレッドの切り替え処理を行わせるものである。
【００３５】
このフラグが設定された状態で、ＯＳによるスレッドの切り替え処理がなされると、そのフラグを設定したスレッド（前スレッド）はメッセージ待ち状態となってメッセージループの実行を中断し、他のスレッド（現スレッド）が実行状態となってこの現スレッドもまたメッセージループを実行する。メッセージ待ち状態となった前スレッドが次に実行状態になったときには、上記判定処理から実行を再開することになる。
【００３６】
なお、上述のサブルーチン処理内でも、スレッドの切り替えは起こり得るが、その場合の前スレッドは、メッセージ待ち状態とは異なる状態（後述する実行可能状態又は一般待ち状態）になる。
【００３７】
このように、イベントドリブン型の各スレッドがそれぞれメッセージループを実行しているので、もし、前スレッドがメッセージ待ち状態になる場合において、現スレッドが前回実行状態から非実行状態になる直前にメッセージを待っていることからメッセージ待ち状態へと遷移していたとすると、前スレッドが次に実行状態になったときの実行の再開位置と、現スレッドがこれから実行を再開する位置とは共に上記判定処理ということになる。
【００３８】
即ち、ＣＰＵのレジスタに設定されている値（前スレッドのコンテキスト）が指し示すデータの内容と、現スレッドのコンテキストが指し示すデータの内容とは一致することになり、コンテキストの退避・設定処理を行うことなく、現スレッドの処理を再開できることになる。
【００３９】
そこで、この情報処理装置は、スレッドを切り替える際に、前スレッドがメッセージ待ち状態に遷移することを検出し、かつ現スレッドが前回実行状態だった際にメッセージ待ち状態に遷移したことを検出した場合に、コンテキストの退避・設定処理を行わないことで、より高速にスレッドの切り替えを行い、効率的な処理を実現する。
【００４０】
＜構成＞
図１は、本発明の実施の形態１に係る情報処理装置１０００の機能ブロック図である。
【００４１】
情報処理装置１０００は、ＣＰＵ及びメモリを含み、機能面において、同図に示すとおり、記憶部１０１０、スケジュール部１０２０、遷移検出部１０３０、起床検出部１０４０、実行制御部１０５０、ディスパッチ部１０６０、対応付け部１０７０を備える。
【００４２】
ここで、記憶部１０１０は、メモリ等の記憶媒体により実現され、オペレーティングシステムを構成するサブルーチン群（以下、「ステップ群」という）及びデータ群（スケジューラ構造体、各スレッド構造体、各コンテキスト構造体等の構造体群）を記憶する機能を有する。このステップ群を上述のＣＰＵが実行することにより、スケジュール部１０２０、遷移検出部１０３０、起床検出部１０４０、実行制御部１０５０、ディスパッチ部１０６０、対応付け部１０７０の各機能が実現される。
【００４３】
ステップ群、構造体群の内容の詳細は後述するが、スケジューラ構造体は、前スレッドと現スレッドを特定するための情報を含み、各スレッド構造体は、それぞれのスレッドの実行制御用の情報であり、そのスレッドの状態、実行の優先度や対応付けられたコンテキストを指すポインタ等を含むものである。また、各コンテキスト構造体は、それぞれのスレッドに対応付けられたコンテキストの内容を示す情報である。
【００４４】
なお、ここでの構造体とは、一定のデータ構造を有するデータそのものを指しており、スケジューラ構造体と、スレッド構造体と、コンテキスト構造体とは、それぞれ異なるデータ構造を有する。また、各スレッド構造体は、同一のデータ構造を有するが、データ自体は異なり、各コンテキスト構造体についても同様である。
【００４５】
スケジュール部１０２０は、実行制御部１０５０の指示に従い、記憶部１０１０に記憶されている各スレッド構造体に含まれる各スレッドの状態と実行の優先度とに基づいて、次に実行するスレッドを決定し、決定したスレッドを実行状態に遷移させる機能を有する。スケジュール部１０２０は、決定したスレッドに関する情報を、記憶部１０１０のスケジューラ構造体に反映させる。
【００４６】
遷移検出部１０３０は、実行制御部１０５０の指示に従い、前スレッドの実行制御用の情報である、記憶部１０１０のスレッド構造体（以下、「前スレッド構造体」という）を参照することにより、そのスレッドがメッセージ待ち状態に遷移することを検出する機能を有する。
【００４７】
起床検出部１０４０は、実行制御部１０５０の指示に従い、現スレッドの実行制御用の情報である、記憶部１０１０のスレッド構造体（以下、「現スレッド構造体」という）を参照することにより、そのスレッドが前回実行状態であった際に、メッセージ待ち状態に遷移していたことを検出する機能を有する。
【００４８】
実行制御部１０５０は、装置全体の制御、および装置内の各ブロックへの指示を行う機能を有する。特に、スケジュール部１０２０による決定がなされると、遷移検出部１０３０と起床検出部１０４０とに検出を指示し、その検出結果に応じて、ディスパッチ部１０６０と対応付け部１０７０とのいずれかにスレッド切り替えのための処理を指示する機能を有する。
【００４９】
ディスパッチ部１０６０は、実行制御部１０５０からの指示に応じて、ＣＰＵのレジスタに設定されている値を、前スレッドのコンテキスト構造体として記憶部１０１０に記憶し、記憶部１０１０に記憶されている現スレッドのコンテキスト構造体の内容をＣＰＵのレジスタに設定する機能を有する。
【００５０】
対応付け部１０７０は、コンテキスト対応交換部１０７１を含み、このコンテキスト対応交換部１０７１は、実行制御部１０５０からの指示に応じて、前スレッドとコンテキストとの対応付けと、現スレッドとコンテキストとの対応付けとを交換する機能を有する。より詳細には、前スレッド構造体に含まれる、そのスレッドと対応付けられたコンテキストを指すポインタと、現スレッド構造体に含まれる、そのスレッドと対応付けられたコンテキストを指すポインタとを交換する。
【００５１】
＜データ＞
情報処理装置１０００がマルチスレッド制御に用いるデータについて説明する。なお、以下では、３つのイベントドリブン型のスレッドの並列実行を想定した場合を例に説明する。また、以下の例では、１つのセマフォを使って待ち合わせ処理を行う場合を想定して説明する。
【００５２】
図２は、記憶部１０１０に記憶されている構造体群を示す図である。
【００５３】
同図に示すように、記憶部１０１０には、スケジューラ構造体Ｄ００、スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃ、セマフォ構造体Ｄ２０、コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃが記憶されている。
【００５４】
＜スレッド構造体＞
まず、スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃについて説明する。
【００５５】
スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃは、それぞれ１つのスレッドの実行制御用の情報であり、スレッド生成時に生成される。スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃは、同一のデータ構成を有するため、以下では、スレッド構造体Ｄ１０Ａを例に説明する。
【００５６】
図４は、スレッド構造体Ｄ１０Ａのデータ構成を示す図である。
【００５７】
同図に示すように、スレッド構造体Ｄ１０Ａは、スレッド状態Ｄ１１、スレッド優先度Ｄ１２、メッセージ待ち状態遷移検出フラグＤ１３、コンテキスト構造体へのポインタＤ１４、メッセージキューＤ１５、メッセージハンドラＤ１６から構成される。
【００５８】
ここで、スレッド状態Ｄ１１は、スレッドの状態を示す情報であり、終了状態Ｔ０、実行状態Ｔ１、実行可能状態Ｔ２、一般待ち状態Ｔ３、メッセージ待ち状態Ｔ４のいずれかを示すものである。スレッドの状態がどのように遷移するかについては後述する。
【００５９】
スレッド優先度Ｄ１２は、スレッドの実行の優先度を示す情報であり、優先度は例えば、スレッド生成時に、生成元のプログラムにより指定を受けて決定される。
【００６０】
メッセージ待ち状態遷移検出フラグＤ１３は、前スレッドがメッセージ待ち状態Ｔ４に遷移するか否か、及び現スレッドがメッセージ待ち状態Ｔ４に遷移していたか否かを示す情報である。スレッドが実行状態Ｔ１からメッセージ待ち状態Ｔ４に遷移する旨を示すためにそのスレッドにより「真」に設定される。スレッドの切り替えが発生する際に、このフラグを用いて、コンテキストの退避・設定処理の要否が判断される。
【００６１】
コンテキスト構造体へのポインタＤ１４は、スレッドに対応付けられたコンテキスト構造体を特定するためのポインタであり、スレッドに対応するコンテキストが生成された際に設定され、後述するように、コンテキストの退避・設定処理を行うことなくスレッドの切り替えがなされた場合に更新される。同図中の「コンテキスト構造体Ｄ３０」の記載は、コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃのいずれかのコンテキスト構造体を指すことを示している。
【００６２】
メッセージキューＤ１５は、スレッドが受信したメッセージの集合である。このメッセージは、ＯＳや他のスレッドにより追加され、このメッセージを処理することにより、即ち、イベント（メッセージ）に対応したサブルーチン(メッセージハンドラ)を実行することにより、メッセージキューＤ１５が空になる場合もある。
【００６３】
メッセージハンドラＤ１６は、メッセージを受信していたときに実行するサブルーチン（メッセージハンドラ）の記憶部１０１０上のアドレスを記憶しておくためのポインタである。
【００６４】
ここで、情報処理装置１０００のマルチスレッド制御によるスレッドの状態遷移について簡単に説明する。
【００６５】
図５は、スレッドの状態遷移を説明するための図である。
【００６６】
同図に示す終了状態Ｔ０とは、スレッドの動作が終了した状態をいい、スレッドが生成された直後もこの状態となる。スレッドが生成された場合に、そのスレッドを開始させる処理を行うことで、スレッドは実行可能状態Ｔ２に遷移する。
【００６７】
実行可能状態Ｔ２とは、ＣＰＵが割り当てられるのを待っている状態であり、そのスレッドにＣＰＵが割り当てられると、スレッドは、実行状態Ｔ１に遷移する。
【００６８】
また、実行状態Ｔ１とは、スレッドにＣＰＵが割り当てられ、実行される状態をいう。実行可能状態Ｔ２にある他のスレッドより実行状態Ｔ１のスレッドの優先度が低くなった場合等に、実行状態Ｔ１のスレッドは、実行可能状態Ｔ２に遷移し、また、他のスレッドの資源開放待ち（セマフォ待ち）等が発生した場合に、一般待ち状態Ｔ３に遷移し、メッセージ待ちが発生した場合に、メッセージ待ち状態Ｔ４に遷移する。
【００６９】
また、一般待ち状態Ｔ３とは、セマフォ待ち等の、メッセージ待ち状態Ｔ４における要因以外の要因による待ちの状態をいい、例えばセマフォ待ちが解除することにより、実行可能状態Ｔ２に遷移する。
【００７０】
また、メッセージ待ち状態Ｔ４とは、上述のメッセージキューＤ１５にメッセージがなく、メッセージの受信を待っている状態をいい、メッセージが送信された（つまり受信した）場合に、実行可能状態Ｔ２に遷移する。
【００７１】
＜スケジューラ構造体＞
次に、スケジューラ構造体Ｄ００について説明する。
【００７２】
図３は、スケジューラ構造体Ｄ００のデータ構成を示す図である。
【００７３】
同図に示すように、スケジューラ構造体Ｄ００は、スレッド構造体の配列Ｄ０１、現スレッド構造体へのポインタＤ０２、前スレッド構造体へのポインタＤ０３から構成される。
【００７４】
ここで、スレッド構造体の配列Ｄ０１は、上述のスレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃを要素とした配列である。
【００７５】
また、現スレッド構造体へのポインタＤ０２は、スケジュール部１０２０により、次に実行すると決定されたスレッド（現スレッド）の制御用情報である現スレッド構造体（以下、スレッドとその制御用情報であるスレッド構造体との関係を表現する場合に、単に、「スレッドに対応するスレッド構造体」、「スレッド構造体に対応するスレッド」と表現する）を特定するためのポインタである。
【００７６】
また、前スレッド構造体へのポインタＤ０３は、スケジュール部１０２０による決定がなされる前に現スレッドだったスレッド（前スレッド）に対応する前スレッド構造体を特定するためのポインタである。
【００７７】
＜セマフォ構造体＞
次に、セマフォ構造体Ｄ２０について説明する。
【００７８】
図６は、セマフォ構造体Ｄ２０のデータ構成を示す図である。
【００７９】
同図に示すように、セマフォ構造体Ｄ２０は、資源数Ｄ２１、一般待ち状態のスレッドキューＤ２２から構成される。
【００８０】
ここで、資源数Ｄ２１は、セマフォが管理している資源数を示す情報であり、一般待ち状態のスレッドキューＤ２２は、他のスレッドの資源開放待ちのために、一般待ち状態Ｔ３に遷移したスレッドの集合である。
【００８１】
＜コンテキスト構造体＞
次に、コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃについて説明する。
【００８２】
コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃは、それぞれのスレッドに対応付けられたコンテキストの内容を示す情報であり、スレッドを開始する際に生成される。コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃは、同一のデータ構成を有するため、以下では、コンテキスト構造体Ｄ３０Ａを例に説明する。
【００８３】
図７は、コンテキスト構造体Ｄ３０Ａのデータ構成を示す図である。
【００８４】
同図に示すように、コンテキスト構造体Ｄ３０Ａは、一般待ち状態コンテキストＤ３３、スタックＤ３４から構成される。
【００８５】
ここで、一般待ち状態コンテキストＤ３３は、スレッドが、実行状態Ｔ１から一般待ち状態Ｔ３に遷移した際の、ＣＰＵから退避したコンテキストを示す情報であり、スタックＤ３４は、コンテキスト毎のスタック情報である。
【００８６】
＜メッセージループステップ＞
図８は、各スレッドの処理を示すフローチャート（左側）と、情報処理装置１０００の実行制御部１０５０の動作を示すフローチャート（右側）である。
【００８７】
以下説明するメッセージループステップＳ１００は、イベントドリブン型の各スレッドが実行するメッセージループの処理内容を示している。即ち、情報処理装置１０００によるマルチスレッド制御の対象となるスレッドは、共通の処理構造を有している。なお、メッセージループステップＳ１００は、記憶部１０１０に記憶されており、情報処理装置１０００が備えるＣＰＵにより実行されることになる。
【００８８】
スレッドは、自スレッドに対応するスレッド構造体（現スレッド構造体）のメッセージキューＤ１５にメッセージが有るか判定し（部分ステップＳ１０１）、有る場合には（部分ステップＳ１０１：ＹＥＳ）、このメッセージキューＤ１５から取り出したメッセージを引数にして、メッセージハンドラＤ１６に設定されているサブルーチン（メッセージハンドラ）を呼び出し（部分ステップＳ１０６）、その処理の後に、部分ステップＳ１０１の処理に戻る。なお、このサブルーチン（メッセージハンドラ）の処理内容については、スレッド毎に異なるものでも同一のものでもよい。
【００８９】
部分ステップＳ１０１において、メッセージキューＤ１５にメッセージがない場合には（部分ステップＳ１０１：ＮＯ）、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３を「真」に、スレッド状態Ｄ１１を「Ｔ４」に更新する（部分ステップＳ１０２、Ｓ１０３）。
【００９０】
続いて、スレッドは、サブルーチンであるスケジュールステップＳ０００と、ディスパッチ要求ステップＳ１１０とを順に呼び出し（部分ステップＳ１０４、Ｓ１０５）、これらの処理の後に、部分ステップＳ１０１の処理に戻る。
【００９１】
スケジュールステップＳ０００及びディスパッチ要求ステップＳ１１０の内容については後述するが、部分ステップＳ１０４、Ｓ１０５の処理を通じて、ＯＳにより、次に実行するスレッドが決定され、スレッドの切り替えが行われる。
【００９２】
このように、スレッドは、メッセージキューＤ１５にメッセージが有る間は（部分ステップＳ１０１：ＹＥＳ）、サブルーチン（メッセージハンドラ）を実行し、メッセージキューＤ１５にメッセージがなくなると（部分ステップＳ１０１：ＮＯ）、メッセージ待ち状態Ｔ４に遷移する旨フラグ(メッセージ待ち状態遷移検出フラグＤ１３)を設定し、ＯＳによって、メッセージ待ち状態Ｔ４に遷移させられ、次にそのスレッドが実行状態Ｔ１になった場合には、部分ステップＳ１０１から処理を再開することになる。
【００９３】
上述したように、各スレッドの処理構造は同一であるため、メッセージ待ち状態Ｔ４になったスレッドとメッセージ待ち状態Ｔ４であったスレッドとの間で切り替えが行われる場合には、両スレッドのコンテキストが指し示すデータの内容が一致することになる。
【００９４】
＜動作＞
次に、上記構成を備える情報処理装置１０００の動作を説明する。
【００９５】
＜スケジュールステップ＞
まず、メッセージループステップの部分ステップＳ１０４で呼び出しているスケジュールステップＳ０００について説明する。
【００９６】
図９は、情報処理装置１０００のスケジュール部１０２０の動作を示すフローチャートである。
【００９７】
スケジュール部１０２０は、スケジューラ構造体Ｄ００における前スレッド構造体へのポインタＤ０３に現スレッド構造体へのポインタＤ０２を代入する（部分ステップＳ００１）。
【００９８】
次に、各スレッド構造体のうち、スレッド状態Ｄ１１が実行状態Ｔ１と実行可能状態Ｔ２であるスレッド構造体の中から、スレッド優先度Ｄ１２が一番高いスレッド構造体を検索する（部分ステップＳ００２）。
【００９９】
次に、検索されたスレッド構造体のスレッド状態Ｄ１１が実行状態Ｔ１か判定し（部分ステップＳ００３）、実行状態Ｔ１でない場合には（部分ステップＳ００３：ＮＯ）、検索されたスレッド（現スレッドとなるスレッド）の状態を遷移させるために、以下の処理を行う。即ち、検索されたスレッドに対応するスレッド構造体のスレッド状態Ｄ１１を実行状態Ｔ１に更新し、現スレッド構造体へのポインタＤ０２に検索されたスレッドに対応するスレッド構造体を設定する（部分ステップＳ００４）。
【０１００】
次に、前スレッド構造体のスレッド状態Ｄ１１が実行状態Ｔ１か判定し（部分ステップＳ００５）、実行状態Ｔ１である場合には（部分ステップＳ００５：ＹＥＳ）、前スレッドの状態を遷移させるために、前スレッド構造体のスレッド状態Ｄ１１を実行可能状態Ｔ２に更新し（部分ステップＳ００６）、スケジュールステップの処理を終了する（部分ステップＳ００７）。また、部分ステップＳ００５において、実行状態Ｔ１でない場合には（部分ステップＳ００５：ＮＯ）、特に処理を行うことなくスケジュールステップの処理を終了し（部分ステップＳ００７）。
【０１０１】
また、部分ステップＳ００３において、実行状態Ｔ１である場合には（部分ステップＳ００３：ＹＥＳ）、検索されたスレッドは元々実行状態Ｔ１であって遷移させる必要はないため、特に処理を行うことなく、スケジュールステップの処理を終了する（部分ステップＳ００７）。
【０１０２】
＜ディスパッチ要求ステップ＞
次に、メッセージループステップの部分ステップＳ１０５で呼び出しているディスパッチ要求ステップＳ１１０について、図８の右側に示すフローチャートに従って説明する。
【０１０３】
まず、実行制御部１０５０は、現スレッド構造体と前スレッド構造体が同一か判定する（部分ステップＳ１１１）。つまり、現スレッド構造体へのポインタＤ０２と前スレッド構造体へのポインタＤ０３とが同一かどうか判定する。
【０１０４】
部分ステップＳ１１１において、同一である場合には（部分ステップＳ１１１：ＹＥＳ）、スレッドの切り替えを行う必要がないので、ディスパッチ要求ステップの処理を終了し（部分ステップＳ１１７）、同一でない場合には（部分ステップＳ１１１：ＮＯ）、スレッドを切り替えるための処理を以下のとおり行う。
【０１０５】
即ち、実行制御部１０５０は、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値が「真」であるか判定する（部分ステップＳ１１２）。メッセージ待ち状態遷移検出ステップＳ０１０の内容については後述するが、前スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値が戻り値となるため、部分ステップＳ１１２は、前スレッド構造体に対応するスレッドがメッセージ待ち状態Ｔ４に遷移するかを判定することに相当する。
【０１０６】
部分ステップＳ１１２において、戻り値が「真」の場合には（部分ステップＳ１１２：ＹＥＳ）、実行制御部１０５０は、メッセージ待ち状態からの起床検出ステップＳ０２０の戻り値が「真」であるか判定する（部分ステップＳ１１３）。メッセージ待ち状態からの起床検出ステップＳ０２０の内容については後述するが、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値が戻り値となるため、部分ステップＳ１１３は、現スレッド構造体に対応するスレッドが、前回実行状態Ｔ１であった際に、メッセージ待ち状態Ｔ４に遷移したかを判定することに相当する。
【０１０７】
部分ステップＳ１１３における戻り値が「真」の場合には（部分ステップＳ１１３：ＹＥＳ）、前スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容と現スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容とが一致することになるため、実行制御部１０５０は、コンテキスト対応付け交換ステップＳ０３０を呼び出し（部分ステップＳ１１４）、その処理の後、ディスパッチ要求ステップの処理を終了する（部分ステップＳ１１７）。コンテキスト対応付け交換ステップＳ０３０の内容については後述するが、前スレッドに対応付けられたコンテキストと現スレッドに対応付けられたコンテキストとの対応付け（ポインタ）を交換する処理を行う。
【０１０８】
また、部分ステップＳ１１３における戻り値が「偽」の場合には（部分ステップＳ１１３：ＮＯ）、前スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容と現スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容とは一致しないため、実行制御部１０５０は、ディスパッチステップＳ０４０を呼び出し（部分ステップＳ１１６）、その処理の後、ディスパッチ要求ステップの処理を終了する（部分ステップＳ１１７）。ディスパッチステップＳ０４０の内容については後述するが、コンテキストの退避・設定処理が行われる。
【０１０９】
また、部分ステップＳ１１２における戻り値が「偽」の場合には（部分ステップＳ１１２：ＮＯ）、実行制御部１０５０は、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３を「偽」に更新し（部分ステップＳ１１５）、部分ステップＳ１１６に進む。
【０１１０】
このように、ディスパッチ要求ステップＳ１１０では、部分ステップＳ１１２、Ｓ１１３の判定処理を行うことで、サブルーチンであるディスパッチステップＳ０４０とコンテキスト対応付け交換ステップＳ０３０とのいずれかに処理を振り分けている。
【０１１１】
上述のように、ディスパッチステップＳ０４０では、コンテキストの退避・設定処理が行われ、コンテキスト対応付け交換ステップＳ０３０では、前スレッドに対応付けられたコンテキストと現スレッドに対応付けられたコンテキストとの対応付け（ポインタ）を交換する処理が行われる。
【０１１２】
コンテキストの退避・設定処理よりも、コンテキストの対応付けの交換処理のほうが一般的には高速に処理できるので、スレッドの切り替えを行う際に、コンテキスト対応付け交換ステップＳ０３０が呼び出される回数が多くなるほど、毎回ディスパッチステップＳ０４０が呼び出される場合と比較し、全体としてのプログラムの処理効率を向上させることができる。
【０１１３】
＜メッセージ待ち状態遷移検出ステップ＞
次に、ディスパッチ要求ステップの部分ステップＳ１１２におけるメッセージ待ち状態遷移検出ステップＳ０１０について説明する。
【０１１４】
図１０は、情報処理装置１０００の遷移検出部１０３０の動作を示すフローチャートである。
【０１１５】
遷移検出部１０３０は、前スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値を返却し（部分ステップＳ０１１）、メッセージ待ち状態遷移検出ステップの処理を終了する（部分ステップＳ０１２）。
【０１１６】
＜メッセージ待ち状態からの起床検出ステップ＞
続いて、ディスパッチ要求ステップの部分ステップＳ１１３におけるメッセージ待ち状態からの起床検出ステップＳ０２０について説明する。
【０１１７】
図１１は、情報処理装置１０００の起床検出部１０４０の動作を示すフローチャートである。
【０１１８】
起床検出部１０４０は、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値を返却し（部分ステップＳ０２１）、そのメッセージ待ち状態遷移検出フラグＤ１３の値を「偽」に設定し（部分ステップＳ０２２）、メッセージ待ち状態からの起床検出ステップの処理を終了する（部分ステップＳ０２３）。
【０１１９】
＜コンテキスト対応付け交換ステップ＞
次に、ディスパッチ要求ステップの部分ステップＳ１１４で呼び出しているコンテキスト対応付け交換ステップＳ０３０について説明する。
【０１２０】
図１２は、情報処理装置１０００のコンテキスト対応交換部１０７１の動作を示すフローチャートである。
【０１２１】
コンテキスト対応交換部１０７１は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４の値と、前スレッド構造体のコンテキスト構造体へのポインタＤ１４の値とを交換し（部分ステップＳ０３１）、コンテキスト対応付け交換ステップの処理を終了する（部分ステップＳ０３２）。
【０１２２】
このように、現スレッド構造体と前スレッド構造体との間で、コンテキスト構造体へのポインタＤ１４を交換することにより、コンテキストの退避処理を行うことなく、前スレッドのコンテキストを正しく保持でき、また、現スレッドにもコンテキストを対応付けた状態を保つことができ、この現スレッドのコンテキストを退避する必要が生じても、従来どおり退避することができる。
【０１２３】
＜ディスパッチステップ＞
次に、ディスパッチ要求ステップの部分ステップＳ１１６で呼び出しているディスパッチステップＳ０４０について説明する。
【０１２４】
図１３は、情報処理装置１０００のディスパッチ部１０６０の動作を示すフローチャートである。
【０１２５】
まず、ディスパッチ部１０６０は、ＣＰＵのレジスタに設定されている値を、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ３０の一般待ち状態コンテキストＤ３３として記憶する。ただし、プログラムカウンタ（以下、「ＰＣ」ともいう）の値はＳ０４３に補正して記憶する（部分ステップＳ０４１）。プログラムカウンタの値の補正は、前スレッド構造体に対応するスレッドが、次に実行状態Ｔ１になった場合に、部分ステップＳ０４３から処理を再開することを示している。
【０１２６】
次に、ディスパッチ部１０６０は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ３０の一般待ち状態コンテキストＤ３３の値をＣＰＵのレジスタに設定し（部分ステップＳ０４２）、ディスパッチステップの処理を終了する（部分ステップＳ０４３）。
【０１２７】
＜具体例＞
スレッド構造体Ｄ１０Ａに対応するスレッドとスレッド構造体Ｄ１０Ｂに対応するスレッドとの間で切り替えが発生する場合を例に、情報処理装置１０００の動作を具体的に説明する。
【０１２８】
以下では、現スレッド構造体へのポインタＤ０２は「Ｄ１０Ａ」であり、スレッド構造体Ｄ１０Ａのスレッド状態Ｄ１１は「Ｔ１」、メッセージキューＤ１５は空、コンテキスト構造体へのポインタＤ１４は「Ｄ３０Ａ」であるものとする。
【０１２９】
また、スレッド構造体Ｄ１０Ｂのスレッド状態Ｄ１１は「Ｔ２」、メッセージ待ち状態遷移検出フラグＤ１３は「真」、コンテキスト構造体へのポインタＤ１４は「Ｄ３０Ｂ」であるものとし、スレッド構造体Ｄ１０Ａに対応するスレッドが図８の左側に示すメッセージループステップＳ１００内の部分ステップＳ１０１の処理をこれから実行するものとして説明する。
【０１３０】
スレッド構造体Ｄ１０Ａに対応するスレッドは、スレッド構造体Ｄ１０ＡのメッセージキューＤ１５にメッセージがないので（同図左側の部分ステップＳ１０１：ＮＯ）、メッセージ待ち状態遷移検出フラグＤ１３を「真」に、スレッド状態Ｄ１１を「Ｔ４」に更新する（部分ステップＳ１０２、Ｓ１０３）。
【０１３１】
続いて、スレッド構造体Ｄ１０Ａに対応するスレッドは、サブルーチンであるスケジュールステップＳ０００を呼び出す（部分ステップＳ１０４）。
【０１３２】
スケジュールステップＳ０００の呼び出しを受けて、情報処理装置１０００の実行制御部１０５０は、スケジュール部１０２０に処理を指示する。
【０１３３】
この指示を受けて、スケジュール部１０２０は、スケジューラ構造体Ｄ００における前スレッド構造体へのポインタＤ０３に現スレッド構造体へのポインタＤ０２（Ｄ１０Ａ）を代入する（図９の部分ステップＳ００１）。
【０１３４】
次に、スケジュール部１０２０は、各スレッド構造体のうち、スレッド状態Ｄ１１が実行状態Ｔ１と実行可能状態Ｔ２であるスレッド構造体の中から、スレッド優先度Ｄ１２が一番高いスレッド構造体（この例では、スレッド構造体Ｄ１０Ｂであるものとする）を検索し（部分ステップＳ００２）、スレッド構造体Ｄ１０Ｂのスレッド状態Ｄ１１（Ｔ２）は実行状態Ｔ１でないので（部分ステップＳ００３：ＮＯ）、このスレッド状態Ｄ１１を「Ｔ１」に更新し、現スレッド構造体へのポインタＤ０２に「Ｄ１０Ｂ」を設定する（部分ステップＳ００４）。
【０１３５】
次に、前スレッド構造体（Ｄ１０Ａ）のスレッド状態Ｄ１１が「Ｔ１」でないので（部分ステップＳ００５：ＮＯ）、スケジュールステップの処理を終了する（部分ステップＳ００７）。
【０１３６】
再び、メッセージループステップの処理に戻り、スレッド構造体Ｄ１０Ａに対応するスレッドは、ディスパッチ要求ステップＳ１１０を呼び出す（部分ステップＳ１０５）。
【０１３７】
ディスパッチ要求ステップＳ１１０の呼び出しを受けて、実行制御部１０５０は、現スレッド構造体へのポインタＤ０２（Ｄ１０Ｂ）と前スレッド構造体へのポインタＤ０３（Ｄ１０Ａ）が同一でなく（図８右側の部分ステップＳ１１１：ＮＯ）、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値は「真」であり（部分ステップＳ１１２：ＹＥＳ）、メッセージ待ち状態からの起床検出ステップＳ０２０の戻り値も「真」であるので（部分ステップＳ１１３：ＹＥＳ）、コンテキスト対応付け交換ステップＳ０３０を呼び出す（部分ステップＳ１１４）。
【０１３８】
実行制御部１０５０からの指示を受けて、コンテキスト対応交換部１０７１は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４の値（Ｄ３０Ｂ）と、前スレッド構造体のコンテキスト構造体へのポインタＤ１４（Ｄ３０Ａ）の値とを交換し（図１２の部分ステップＳ０３１）、コンテキスト対応付け交換ステップの処理を終了する（部分ステップＳ０３２）。
【０１３９】
再びディスパッチ要求ステップの処理に戻り、実行制御部１０５０は、ディスパッチ要求ステップの処理を終了する（図８右側の部分ステップＳ１１７）。
【０１４０】
上述した例では、ディスパッチ要求ステップＳ１１０内で、コンテキスト対応付け交換ステップＳ０３０が呼ばれて、スレッドの切り替えがなされているので、ディスパッチステップＳ０４０が呼ばれる場合と比較し、高速にスレッドの切り替えがなされているといえる。
【０１４１】
≪実施の形態２≫
＜概要＞
実施の形態１に係る情報処理装置１０００では、各スレッドについて、１つのコンテキストが必ず対応付けられていたが、以下説明する実施の形態２に係る情報処理装置は、前スレッドがメッセージ待ち状態Ｔ４に遷移する場合に、前スレッドとコンテキストとの対応付け（ポインタ）を削除する点で、情報処理装置１０００とは異なる。
【０１４２】
本実施の形態に係る情報処理装置は、現スレッドとコンテキストとの対応付けがなされていないことを検出することで、現スレッドが前回実行状態Ｔ１であった際に、メッセージ待ち状態Ｔ４に遷移していたことを検出し、このコンテキストとの対応付けが削除された現スレッドに、メッセージループの判定処理から実行するよう設定されたコンテキストとの対応付けを改めて行う。このようにすることで、メッセージ待ち状態Ｔ４で処理を中断しているスレッドには、コンテキストを対応付けておく必要はないため、このようなスレッドが多くなるほど、全体としてメモリの使用量を減らすことができる。
【０１４３】
なお、上記説明では、コンテキストとの対応付けが削除された現スレッドについて説明したが、生成直後でコンテキストの対応付けがなされていないスレッドが現スレッドとなる場合にも、メッセージループの判定処理から実行することになるため、同様の取り扱いをすることができる。
【０１４４】
以下、情報処理装置１０００と異なる部分を中心に説明する。
【０１４５】
＜構成＞
図１４は、本発明の実施の形態２に係る情報処理装置２０００の機能ブロック図である。
【０１４６】
情報処理装置２０００は、機能面において、同図に示すとおり、記憶部１０１０、スケジュール部１０２０、遷移検出部１０３０、コンテキスト未対応検出部２０１０、実行制御部２０２０、対応付け部２０３０を備える。
【０１４７】
コンテキスト未対応検出部２０１０、実行制御部２０２０、対応付け部２０３０が実施の形態１に係る情報処理装置１０００とは異なるので、以下、これらについて説明する。
【０１４８】
ここで、コンテキスト未対応検出部２０１０は、実行制御部２０２０の指示に従い、記憶部１０１０の現スレッド構造体を参照することにより、そのスレッドにコンテキストが対応付けされていないことを検出する機能を有する。
【０１４９】
実行制御部２０２０は、実行制御部１０５０と同様に、各検出部の検出結果に応じて、ディスパッチ部１０６０と対応付け部２０３０とのいずれかにスレッド切り替えのための処理を指示する機能を有するが、以下の点で、実行制御部１０５０とは異なる。
【０１５０】
即ち、実行制御部１０５０は、各検出部のうち、いずれかの検出部が検出しない場合には、ディスパッチ部１０６０にスレッド切り替えのための処理を指示していたが、実行制御部２０２０は、遷移検出部１０３０とコンテキスト未対応検出部２０１０とのいずれもが検出しない場合にのみ、ディスパッチ部１０６０に処理を指示する点で異なる。
【０１５１】
つまり、実行制御部２０２０は、遷移検出部１０３０とコンテキスト未対応検出部２０１０とのいずれかが検出した場合には、対応付け部２０３０にスレッド切り替えのための処理を指示する。
【０１５２】
対応付け部２０３０は、コンテキスト対応交換部１０７１に代えて、コンテキスト対応移動部２０３１、コンテキスト対応開放・復元部２０３２、コンテキスト保管・対応割付部２０３３を含む点で、対応付け部１０７０とは異なる。
【０１５３】
ここで、コンテキスト対応移動部２０３１は、遷移検出部１０３０とコンテキスト未対応検出部２０１０とのいずれもが検出した場合に、実行制御部２０２０からの指示に応じて、前スレッドに対応付けられていたコンテキストを現スレッドに対応付け、そのコンテキストと前スレッドとの対応付けを削除する機能を有する。
【０１５４】
コンテキスト対応開放・復元部２０３２は、遷移検出部１０３０が検出し、かつコンテキスト未対応検出部２０１０が検出しなかった場合に、実行制御部２０２０からの指示に応じて、前スレッドとそのコンテキストとの対応付けを削除し、現スレッドに対応付けられているコンテキストをＣＰＵのレジスタに設定する機能を有する。
【０１５５】
コンテキスト保管・対応割付部２０３３は、遷移検出部１０３０が検出せず、かつコンテキスト未対応検出部２０１０が検出した場合に、実行制御部２０２０からの指示に応じて、ＣＰＵのレジスタに設定されている値を前スレッドのコンテキスト構造体として記憶部１０１０に記憶し、スレッドとの対応付けがなされていないコンテキスト構造体を現スレッドに対応付け、対応付けたそのコンテキスト構造体の内容をＣＰＵのレジスタに設定する機能を有する。この現スレッドに対応付けられるコンテキスト構造体が示すコンテキストの内容については、後述する。
【０１５６】
＜データ＞
情報処理装置２０００がマルチスレッド制御に用いるデータについて説明する。
【０１５７】
情報処理装置２０００の記憶部１０１０には、実施の形態１のスケジューラ構造体Ｄ００とコンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃとに代えて、スケジューラ構造体Ｄ４０とコンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃが記憶されている。
【０１５８】
以下、スケジューラ構造体Ｄ４０、コンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃについて、スケジューラ構造体Ｄ００とコンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃと異なる点を中心に説明する。なお、以下では、スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃのコンテキスト構造体へのポインタＤ１４は、コンテキスト構造体Ｄ５０（Ｄ５０Ａ〜Ｄ５０Ｃのいずれかのコンテキスト構造体）を指すものとして説明する。
【０１５９】
＜スケジューラ構造体＞
まず、スケジューラ構造体Ｄ４０について説明する。
【０１６０】
図１５は、スケジューラ構造体Ｄ４０のデータ構成を示す図である。
【０１６１】
同図に示すように、スケジューラ構造体Ｄ４０は、コンテキストプールＤ０４を含む点で、スケジューラ構造体Ｄ００とは異なる。
【０１６２】
ここで、コンテキストプールＤ０４は、スレッドへの対応付けがなされていないコンテキスト構造体を特定するための情報であり、上述のコンテキスト対応開放・復元部２０３２により、前スレッドとそのコンテキストとの対応付けが削除された場合にこの情報が記憶され、この情報により特定されるコンテキスト構造体が、コンテキスト保管・対応割付部２０３３により現スレッドに対応付けられると、この情報は削除される。
【０１６３】
＜コンテキスト構造体＞
次に、コンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃについて説明する。
【０１６４】
コンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃは、同一のデータ構成を有するため、以下では、コンテキスト構造体Ｄ５０Ａを例に説明する。
【０１６５】
図１６は、コンテキスト構造体Ｄ５０Ａのデータ構成を示す図である。
【０１６６】
同図に示すように、コンテキスト構造体Ｄ５０Ａは、メッセージ待ち状態コンテキストＤ３１及びメッセージ待ち状態コンテキスト保管フラグＤ３２を含む点で、コンテキスト構造体Ｄ３０Ａとは異なる。
【０１６７】
ここで、メッセージ待ち状態コンテキストＤ３１は、上述のコンテキスト保管・対応割付部２０３３により、現スレッドに対応付けられるコンテキストを示す情報であり、このコンテキストは、前回実行状態Ｔ１であった際に、メッセージ待ち状態Ｔ４に遷移したスレッドが処理を再開できるように設定され、新たに生成されたスレッドが現スレッドとなる場合にも対応付けられる。
【０１６８】
メッセージ待ち状態コンテキスト保管フラグＤ３２は、メッセージ待ち状態コンテキストＤ３１が有効なコンテキストであることを示す情報である。
【０１６９】
また、イベントドリブン型の各スレッドが実行するメッセージループの処理内容は実施の形態１と同様であるが（図８左側に示すメッセージループステップＳ１００）、部分ステップＳ１０５において、呼び出すサブルーチンは、ディスパッチ要求改良ステップＳ１３０であるものとして以下、説明する。
【０１７０】
＜動作＞
次に、上記構成を備える情報処理装置２０００の動作を説明する。
【０１７１】
＜ディスパッチ要求改良ステップ＞
まず、ディスパッチ要求改良ステップＳ１３０について説明する。
【０１７２】
図１７は、情報処理装置２０００の実行制御部２０２０の動作を示すフローチャートである。
【０１７３】
部分ステップＳ１３１、Ｓ１３２はそれぞれ、図８に示すディスパッチ要求ステップＳ１１０の部分ステップＳ１１１、Ｓ１１２と同様に処理する。
【０１７４】
部分ステップＳ１３２において、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値が「真」である場合には（部分ステップＳ１３２：ＹＥＳ）、実行制御部２０２０は、コンテキスト未対応検出ステップＳ０５０の戻り値が「真」であるか判定する（部分ステップＳ１３３）。コンテキスト未対応検出ステップＳ０５０の内容については後述するが、現スレッド構造体のコンテキスト構造体へのポインタＤ１４がＮＵＬＬならば「真」が戻り値となるため、部分ステップＳ１３３は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４がＮＵＬＬであるかを判定することに相当する。
【０１７５】
部分ステップＳ１３３において、戻り値が「真」の場合には（部分ステップＳ１３３：ＹＥＳ）、前スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容と現スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容とが一致することになるため、実行制御部２０２０は、コンテキスト対応移動ステップＳ０６０を呼び出し（部分ステップＳ１３４）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。コンテキスト対応移動ステップＳ０６０の内容については後述するが、前スレッドに対応付けられたコンテキストを現スレッドに対応付け（ポインタの設定）、前スレッドとそのコンテキストとの対応付け（ポインタ）を削除する処理を行う。
【０１７６】
また、部分ステップＳ１３３において、戻り値が「偽」の場合には（部分ステップＳ１３３：ＮＯ）、実行制御部２０２０は、コンテキスト対応開放・復元ステップＳ０７０を呼び出し（部分ステップＳ１３５）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。コンテキスト対応開放・復元ステップＳ０７０の内容については後述するが、コンテキストの設定処理と、前スレッドとそのコンテキストとの対応付け（ポインタ）を削除する処理を行う。
【０１７７】
また、部分ステップＳ１３２において、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値が「偽」である場合には（部分ステップＳ１３２：ＮＯ）、実行制御部２０２０は、部分ステップＳ１３３と同様の処理を行う（部分ステップＳ１３６）。
【０１７８】
部分ステップＳ１３６において、戻り値が「真」の場合には（部分ステップＳ１３６：ＹＥＳ）、実行制御部２０２０は、コンテキスト保管・対応割付ステップＳ０８０を呼び出し（部分ステップＳ１３７）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。コンテキスト保管・対応割付ステップＳ０８０の内容については後述するが、コンテキストの退避処理と、スレッドとの対応付けがなされていないコンテキスト（メッセージ待ち状態コンテキストＤ３１）を現スレッドに対応付けた上で、コンテキストの設定処理を行う。
【０１７９】
部分ステップＳ１３６において、戻り値が「偽」の場合には（部分ステップＳ１３６：ＮＯ）、ディスパッチステップＳ０４０を呼び出し（部分ステップＳ１３８）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。
【０１８０】
上述のように、ディスパッチステップＳ０４０及びコンテキスト保管・対応割付ステップＳ０８０では、コンテキストの退避・設定処理が行われるが、コンテキスト対応移動ステップＳ０６０では、コンテキストの退避・設定処理は行われず、ポインタの設定、削除処理のみが行われ、また、コンテキスト対応開放・復元ステップＳ０７０では、コンテキストの設定処理は行われるものの、コンテキストの退避処理は行われず、ポインタを削除する処理が行われる。
【０１８１】
従って、スレッドの切り替えを行う際に、コンテキスト対応移動ステップＳ０６０とコンテキスト対応開放・復元ステップＳ０７０とが呼び出される回数が多くなるほど、毎回ディスパッチステップＳ０４０が呼び出される場合と比較し、全体としてのプログラムの処理効率を向上させることができる。
【０１８２】
＜コンテキスト未対応検出ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３３、Ｓ１３６におけるコンテキスト未対応検出ステップＳ０５０について説明する。
【０１８３】
図１８は、情報処理装置２０００のコンテキスト未対応検出部２０１０の動作を示すフローチャートである。
【０１８４】
コンテキスト未対応検出部２０１０は、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３に「偽」を設定し（部分ステップＳ０５１）、現スレッド構造体のコンテキスト構造体へのポインタＤ１４がＮＵＬＬなら「真」を、ＮＵＬＬでなければ「偽」を返し（部分ステップＳ０５２）、コンテキスト未対応検出ステップの処理を終了する（部分ステップＳ０５３）。
【０１８５】
＜コンテキスト対応移動ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３４で呼び出しているコンテキスト対応移動ステップＳ０６０について説明する。
【０１８６】
図１９は、情報処理装置２０００のコンテキスト対応移動部２０３１の動作を示すフローチャートである。
【０１８７】
コンテキスト対応移動部２０３１は、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキスト保管フラグＤ３２が「真」であるか判定し（部分ステップＳ０６１）、「偽」の場合には（部分ステップＳ０６１：ＮＯ）、このメッセージ待ち状態コンテキスト保管フラグＤ３２を「真」に設定する（部分ステップＳ０６２）。
【０１８８】
続いて、コンテキスト対応移動部２０３１は、ＣＰＵのレジスタの値を、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキストＤ３１に保存する。この際、ＰＣの値は、「Ｓ０６６」として保存する（部分ステップＳ０６３）。
【０１８９】
部分ステップＳ０６３を処理し、又は部分ステップＳ０６１において、メッセージ待ち状態コンテキスト保管フラグＤ３２が「真」の場合に（部分ステップＳ０６１：ＹＥＳ）、コンテキスト対応移動部２０３１は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４に、前スレッド構造体のコンテキスト構造体へのポインタＤ１４を設定し（部分ステップＳ０６４）、この前スレッド構造体のコンテキスト構造体へのポインタＤ１４に「ＮＵＬＬ」を設定し（部分ステップＳ０６５）、コンテキスト対応移動ステップの処理を終了する（部分ステップＳ０６６）。
【０１９０】
＜コンテキスト対応開放・復元ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３５で呼び出しているコンテキスト対応開放・復元ステップＳ０７０について説明する。
【０１９１】
図２０は、情報処理装置２０００のコンテキスト対応開放・復元部２０３２の動作を示すフローチャートである。
【０１９２】
部分ステップＳ０７１〜Ｓ０７３については、図１９に示すコンテキスト対応移動ステップＳ０６０の部分ステップＳ０６１〜Ｓ０６３と同様に処理する。ただし、部分ステップＳ０７３においては、ＰＣの値は、「Ｓ０７６」として保存する。
【０１９３】
次に、コンテキスト対応開放・復元部２０３２は、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０をコンテキストプールＤ０４にストックし、この前スレッド構造体のコンテキスト構造体へのポインタＤ１４を「ＮＵＬＬ」に初期化する（部分ステップＳ０７４）。
【０１９４】
続いて、コンテキスト対応開放・復元部２０３２は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０の一般待ち状態コンテキストＤ３３の値をＣＰＵのレジスタに設定し（部分ステップＳ０７５）、コンテキスト対応開放・復元ステップの処理を終了する（部分ステップＳ０７６）。
【０１９５】
＜コンテキスト保管・対応割付ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３７で呼び出しているコンテキスト保管・対応割付ステップＳ０８０について説明する。
【０１９６】
図２１及び図２２は、情報処理装置２０００のコンテキスト保管・対応割付部２０３３の動作を示すフローチャートである。
【０１９７】
コンテキスト保管・対応割付部２０３３は、ＣＰＵのレジスタの値を、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０の一般待ち状態コンテキストＤ３３に保存する。この際、ＰＣの値は、「Ｓ０８４」として保存する（部分ステップＳ０８１）。
【０１９８】
続いて、コンテキスト保管・対応割付部２０３３は、コンテキスト対応割付ステップＳ１２０を呼び出す（部分ステップＳ０８２）。コンテキスト対応割付ステップＳ１２０の内容については後述する。
【０１９９】
次に、コンテキスト保管・対応割付部２０３３は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキストＤ３１の値をＣＰＵのレジスタに設定し（部分ステップＳ０８３）、コンテキスト保管・対応割付ステップの処理を終了する（部分ステップＳ０８４）。
【０２００】
＜コンテキスト対応割付ステップ＞
続いて、コンテキスト保管・対応割付ステップの部分ステップＳ０８２で呼び出しているコンテキスト対応割付ステップＳ１２０について、図２２に示すフローチャートに従って説明する。
【０２０１】
コンテキスト保管・対応割付部２０３３は、コンテキストプールＤ０４にコンテキスト構造体Ｄ５０がストックされているか判定し（部分ステップＳ１２１）、ストックされていない場合には（部分ステップＳ１２１：ＮＯ）、コンテキスト構造体Ｄ５０を生成し、メッセージ待ち状態コンテキストＤ３１のＰＣを「Ｓ１００」に、スタックポインタ（以下、「ＳＰ」ともいう）を、生成したコンテキスト構造体Ｄ５０のスタックＤ３４に初期化する（部分ステップＳ１２２）。
【０２０２】
続いて、コンテキスト保管・対応割付部２０３３は、生成したコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキスト保管フラグＤ３２を「偽」に初期化し（部分ステップＳ１２３）、現スレッド構造体のコンテキスト構造体へのポインタＤ１４に生成したコンテキスト構造体のアドレスを設定し（部分ステップＳ１２４）、コンテキスト対応割付ステップの処理を終了する（部分ステップＳ１２６）。
【０２０３】
また、部分ステップＳ１２１において、コンテキストプールＤ０４にコンテキスト構造体Ｄ５０がストックされている場合には（部分ステップＳ１２１：ＹＥＳ）、コンテキストプールＤ０４から取り出したコンテキスト構造体Ｄ５０のアドレスを、現スレッド構造体のコンテキスト構造体へのポインタＤ１４に設定し（部分ステップＳ１２５）、コンテキスト対応割付ステップの処理を終了する（部分ステップＳ１２６）。
【０２０４】
＜具体例＞
スレッド構造体Ｄ１０Ａ、スレッド構造体Ｄ１０Ｂ、スレッド構造体Ｄ１０Ｃに対応するそれぞれのスレッドとの間で切り替えが発生する場合を例に、情報処理装置２０００の動作を具体的に説明する。
【０２０５】
以下では、現スレッド構造体へのポインタＤ０２は「Ｄ１０Ｃ」であり、スレッド構造体Ｄ１０Ａのスレッド状態Ｄ１１は「Ｔ２」、スレッド優先度Ｄ１２は「最低」、メッセージキューＤ１５は「ＭＥＳ」（１つのメッセージがある）、コンテキスト構造体へのポインタＤ１４は「Ｄ５０Ａ」であるものとする。
【０２０６】
また、スレッド構造体Ｄ１０Ｂのスレッド状態Ｄ１１は「Ｔ２」、スレッド優先度Ｄ１２は「中」、メッセージキューＤ１５は「ＭＥＳ」、コンテキスト構造体へのポインタＤ１４は「ＮＵＬＬ」であるものとする。
【０２０７】
また、スレッド構造体Ｄ１０Ｃのスレッド状態Ｄ１１は「Ｔ１」、スレッド優先度Ｄ１２は「高」、メッセージキューＤ１５は空、コンテキスト構造体へのポインタＤ１４は「Ｄ５０Ｂ」であるものとし、コンテキスト構造体Ｄ５０Ｂのメッセージ待ち状態コンテキスト保管フラグＤ３２は「真」であるものとする。
【０２０８】
また、スレッド構造体Ｄ１０Ｃに対応するスレッドが図８の左側に示すメッセージループステップＳ１００内の部分ステップＳ１０１の処理をこれから実行するものとして説明する。
【０２０９】
＜１回目の切り替え＞
スレッド構造体Ｄ１０Ｃに対応するスレッドは、スレッド構造体Ｄ１０ＣのメッセージキューＤ１５にメッセージがないので（同図左側の部分ステップＳ１０１：ＮＯ）、実施の形態１の具体例で説明したのと同様に、部分ステップＳ１０２〜Ｓ１０５を実行する。この例では、部分ステップＳ１０４の処理により、現スレッド構造体へのポインタＤ０２が「Ｄ１０Ｂ」に更新される。
【０２１０】
ディスパッチ要求改良ステップＳ１３０の呼び出しを受けて、実行制御部２０２０は、現スレッド構造体へのポインタＤ０２（Ｄ１０Ｂ）と前スレッド構造体へのポインタＤ０３（Ｄ１０Ａ）が同一でなく（図１７の部分ステップＳ１３１：ＮＯ）、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値は「真」であり（部分ステップＳ１３２：ＹＥＳ）、コンテキスト未対応検出ステップＳ０５０の戻り値が「真」であるので（部分ステップＳ１３３：ＹＥＳ）、実行制御部２０２０は、コンテキスト対応移動ステップＳ０６０を呼び出す（部分ステップＳ１３４）。
【０２１１】
実行制御部２０２０からの指示を受けて、コンテキスト対応移動部２０３１は、前スレッド構造体（Ｄ１０Ｃ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ｂ）のメッセージ待ち状態コンテキスト保管フラグＤ３２が「真」であるので（部分ステップＳ０６１：ＹＥＳ）、現スレッド構造体（Ｄ１０Ｂ）のコンテキスト構造体へのポインタＤ１４を「Ｄ５０Ｂ」に、前スレッド構造体（Ｄ１０Ｃ）のコンテキスト構造体へのポインタＤ１４を「ＮＵＬＬ」に設定し（部分ステップＳ０６４、Ｓ０６５）、コンテキスト対応移動ステップの処理を終了する（部分ステップＳ０６６）。
【０２１２】
再びディスパッチ要求改良ステップの処理に戻り、実行制御部２０２０は、ディスパッチ要求改良ステップの処理を終了する（図１７の部分ステップＳ１３９）。
【０２１３】
＜２回目の切り替え＞
スレッド構造体Ｄ１０Ｂに対応するスレッドは、スレッド構造体Ｄ１０ＢのメッセージキューＤ１５にメッセージがあるので（図８左側の部分ステップＳ１０１：ＹＥＳ）、取り出したメッセージを引数にしてメッセージハンドラの処理を行う（部分ステップＳ１０６）。なお、この例では、メッセージハンドラ内でのスレッドの切り替えはなされなかったものとする。
【０２１４】
再び、部分ステップＳ１０１の処理に戻り、スレッド構造体Ｄ１０Ｂに対応するスレッドは、スレッド構造体Ｄ１０ＢのメッセージキューＤ１５にメッセージがないので（部分ステップＳ１０１：ＮＯ）、上記１回目の切り替えの際と同様に、部分ステップＳ１０２〜Ｓ１０５を実行する。この例では、部分ステップＳ１０４の処理により、現スレッド構造体へのポインタＤ０２が「Ｄ１０Ａ」に更新される。
【０２１５】
ディスパッチ要求改良ステップＳ１３０の呼び出しを受けて、実行制御部２０２０は、現スレッド構造体（Ｄ１０Ａ）と前スレッド構造体（Ｄ１０Ｂ）が同一でなく（図１７の部分ステップＳ１３１：ＮＯ）、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値は「真」であり（部分ステップＳ１３２：ＹＥＳ）、コンテキスト未対応検出ステップＳ０５０の戻り値が「偽」であるので（部分ステップＳ１３３：ＮＯ）、実行制御部２０２０は、コンテキスト対応開放・復元ステップＳ０７０を呼び出す（部分ステップＳ１３５）。
【０２１６】
実行制御部２０２０からの指示を受けて、コンテキスト対応開放・復元部２０３２は、前スレッド構造体（Ｄ１０Ｂ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ｂ）のメッセージ待ち状態コンテキスト保管フラグＤ３２が「真」であるので（部分ステップＳ０７１：ＹＥＳ）、前スレッド構造体（Ｄ１０Ｂ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ｂ）をコンテキストプールＤ０４にストックし、この前スレッド構造体のコンテキスト構造体へのポインタＤ１４を「ＮＵＬＬ」に初期化する（部分ステップＳ０７４）。
【０２１７】
続いて、コンテキスト対応開放・復元部２０３２は、現スレッド構造体（Ｄ１０Ａ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ａ）の一般待ち状態コンテキストＤ３３の値をＣＰＵのレジスタに設定し（部分ステップＳ０７５）、コンテキスト対応開放・復元ステップの処理を終了する（部分ステップＳ０７６）。
【０２１８】
再びディスパッチ要求改良ステップの処理に戻り、実行制御部２０２０は、ディスパッチ要求改良ステップの処理を終了する（図１７の部分ステップＳ１３９）。
【０２１９】
上述した例では、ディスパッチ要求改良ステップＳ１３０内で、コンテキスト対応移動ステップＳ０６０とコンテキスト対応開放・復元ステップＳ０７０とが呼ばれて、スレッドの切り替えがなされているので、ディスパッチステップＳ０４０が呼ばれる場合と比較し、高速にスレッドの切り替えがなされているといえる。
【０２２０】
＜補足＞
以上、本発明に係る情報処理装置について実施の形態に基づいて説明したが、以下のように変形することも可能であり、本発明は上述の実施の形態で示した通りの情報処理装置に限られないことは勿論である。
【０２２１】
（１）各実施の形態では、１つのプロセッサを用いて複数のスレッドを切り替えながら並行して実行させる例を説明したが、複数のプロセッサを用いて複数のスレッドを切り替えながら並列して実行させるようにしてもよい。この場合、各プロセッサに対してスレッドの割り当てる際に、各実施の形態で説明したように割り当てを行えばよい。
【０２２２】
（２）各実施の形態では、メインループステップに対応するプログラミングコードを各スレッドが共用し、それぞれのスレッドがそのコードを実行するものとして説明したが、各スレッド用に同一の処理構造を有するコードを用意し、それぞれが自スレッド用のコードを実行するようにしてもよい。その場合、これから実行しようとしている現スレッドは、自スレッド用のコードが記憶されているメモリ上の位置を本発明に係る情報処理装置に与える必要が有るが、例えば、そのスレッドに対応するスレッド構造体に、自スレッド用のコードが記憶されているメモリ上のベースアドレス値を含ませることにより実現可能である。
【０２２３】
（３）本発明におけるスケジューリング手段は各実施の形態におけるスケジュール部１０２０に相当し、本発明における第１検出手段は各実施の形態における遷移検出部１０３０に相当し、本発明における第２検出手段は実施の形態１における起床検出部１０４０、実施の形態２におけるコンテキスト未対応検出部２０１０に相当し、本発明におけるコンテキスト記憶手段及び初期コンテキスト記憶手段は各実施の形態における記憶部１０１０に相当し、本発明におけるコンテキスト対応付け手段及び設定手段は、各実施の形態における実行制御部と対応付け部とディスパッチ部１０６０とに相当する。
【産業上の利用可能性】
【０２２４】
本発明に係る情報処理装置は、マルチスレッド実行制御に利用される。
【符号の説明】
【０２２５】
１０００、２０００    情報処理装置
１０１０    記憶部
１０２０    スケジュール部
１０３０    遷移検出部
１０４０    起床検出部
１０５０、２０２０    実行制御部
１０６０    ディスパッチ部
１０７０、２０３０    対応付け部
１０７１    コンテキスト対応交換部
２０１０    コンテキスト未対応検出部
２０３１    コンテキスト対応移動部
２０３２    コンテキスト対応開放・復元部
２０３３    コンテキスト保管・対応割付部
【図１】
2009157127.tif 000003
【図２】
2009157127.tif 000004
【図３】
2009157127.tif 000005
【図４】
2009157127.tif 000006
【図５】
2009157127.tif 000007
【図６】
2009157127.tif 000008
【図７】
2009157127.tif 000009
【図８】
2009157127.tif 000010
【図９】
2009157127.tif 000011
【図１０】
2009157127.tif 000012
【図１１】
2009157127.tif 000013
【図１２】
2009157127.tif 000014
【図１３】
2009157127.tif 000015
【図１４】
2009157127.tif 000016
【図１５】
2009157127.tif 000017
【図１６】
2009157127.tif 000018
【図１７】
2009157127.tif 000019
【図１８】
2009157127.tif 000020
【図１９】
2009157127.tif 000021
【図２０】
2009157127.tif 000022
【図２１】
2009157127.tif 000023
【図２２】
2009157127.tif 000024
【手続補正書】
【提出日】平成22年11月16日(2010.11.16)
【手続補正１】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチスレッド実行制御技術に関する。
【背景技術】
【０００２】
１つのプロセッサにより複数の処理を切り替えながら、見かけ上並行して実行する、マルチスレッドと呼ばれる実行制御方法が知られている。ここでいうマルチスレッドは、マルチタスク、マルチプロセス等、様々に称されることがある。
【０００３】
マルチスレッド制御では、実行するスレッドの切り替え要因が発生した場合に、それまで実行していたスレッドのコンテキスト、つまり、プロセッサ内のレジスタ値をメモリに退避させ、次に実行するスレッドのメモリに退避されていたコンテキストをプロセッサに復元する処理（以下、「コンテキストの退避・設定処理」という）が一般的に行われる。
【０００４】
これにより、スレッドの切り替えによって実行が中断されたスレッドについて、後に実行を再開する場合に、中断された時点の処理から再開できるようになる。
【０００５】
このように、マルチスレッド制御でのスレッドの切り替えに際しては、このコンテキストの退避・設定処理が一般的に行われることになるが、プロセッサとメモリとの間でコンテキストの書き込みと読み出しとのためのデータ転送が行われることになるため、スレッドの切り替えに時間がかかり、プログラムの処理効率が低下するという問題がある。
【０００６】
スレッドの切り替えをより効率的に行う方法には、種々の方法が知られており、例えば特許文献１がある。特許文献１は、扱うレジスタサイズが異なる複数のプログラム（スレッド）を切り替えながら並列して実行する場合に、スレッドが扱うレジスタサイズに応じたサイズ分のデータ（コンテキスト）の退避・設定処理を行うことで、スレッドの切り替えにかかる時間を短縮するものである。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】日本国特許公開２００７-２０７０７４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、特許文献１の方法を用いても、各スレッドの実行に必要のないデータの読み書きにより生じる時間が短縮できるに過ぎず、依然としてスレッドの切り替えに時間がかかるという課題は解決できていない。
【０００９】
そこで、本発明は係る問題に鑑みてなされたものであり、従来とは異なる方法で、より高速にスレッドの切り替えを行うことが可能な情報処理装置、情報処理方法及び情報処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、本発明に係る情報処理装置は、それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置であって、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリング手段と、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出手段と、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出手段と、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定手段とを備えることを特徴とする。
【００１１】
また、上記課題を解決するために本発明に係る情報処理装置において用いられる情報処理方法は、それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置において用いられる情報処理方法であって、スケジューリング手段が、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるステップと、第１検出手段が、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出するステップと、第２検出手段が、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出するステップと、設定手段が、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作するステップとを備えることを特徴とする。
【００１２】
また、上記課題を解決するために本発明に係る情報処理装置に実行させるための情報処理プログラムは、それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置にスレッドの実行制御処理を実行させるための情報処理プログラムであって、前記スレッドの実行制御処理は、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリングステップと、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出ステップと、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出ステップと、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出ステップ及び前記第２検出ステップの検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定ステップとを備えることを特徴とする。
【発明の効果】
【００１３】
上述の構成を備える本発明に係る情報処理装置は、第１のスレッドに代えて、第２のスレッドを実行状態に遷移させる際に、第１検出手段及び第２検出手段の検出結果に応じて、第２のスレッドの実行用のコンテキストをプロセッサに設定するか否かを切り替えるため、必ずコンテキストをプロセッサに設定する従来の場合と比較し、より高速にスレッドの切り替えを行うことができる。
【００１４】
また、前記情報処理装置は、更に、スレッドに対応付けてコンテキストを記憶するためのコンテキスト記憶手段と、前記第１検出手段が検出しなかった場合に、前記プロセッサに設定されているコンテキストを、前記第１のスレッドと対応付けられたコンテキストとして前記コンテキスト記憶手段に記憶させるコンテキスト対応付け手段を備え、前記設定手段は、前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定せず、前記第２検出手段が検出しなかった場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定することとしてもよい。
【００１５】
ここで、対応付けとは、スレッドと、コンテキスト記憶手段に記憶されているコンテキストとを関係付ける情報をいう。
【００１６】
これにより、第１検出手段が検出し、かつ第２検出手段が検出した場合に、設定手段は、第２のスレッドを実行状態に遷移させる際に、第２のスレッドに対応付けられたコンテキストをプロセッサに設定しないので、本発明に係る情報処理装置は、より高速にスレッドの切り替えを行うことができる。
【００１７】
第１検出手段が検出し、かつ第２検出手段が検出した場合には、実行状態に遷移させられる第２のスレッドにおける処理の開始位置と、それまで実行状態だった第１のスレッドにおける次に実行状態になった際の処理の開始位置とが共に既定の処理部分となるため、第２のスレッドに対応付けられたコンテキストをプロセッサに設定せずに第２のスレッドを実行させても、正常に動作させることができる。
【００１８】
また、前記コンテキスト対応付け手段は、更に前記第１検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第１のスレッドと対応付けられたコンテキストと当該第１のスレッドとの対応付けを削除することとしてもよい。
【００１９】
これにより、第１検出手段が検出した場合に、コンテキスト対応付け手段は、第１のスレッドとそのコンテキストとの対応付けを削除するので、管理すべきコンテキストの数を減らし、全体としてコンテキストの記憶に必要なメモリ容量を減らし得る。
【００２０】
また、前記情報処理装置は、前記コンテキスト記憶手段においてコンテキストが対応付けられていないスレッド用の前記既定の処理部分を処理の開始位置とするための初期コンテキストを記憶する初期コンテキスト記憶手段を備え、前記第２検出手段は、前記コンテキスト記憶手段において、前記第２のスレッドとコンテキストとが対応付けられていない場合に、当該第２のスレッドにおける処理の開始位置が、前記既定の処理部分であると検出し、前記コンテキスト対応付け手段は、更に前記第２検出手段が検出した場合において、前記第１検出手段が検出したときは、前記第１のスレッドに対応付けられたコンテキストの対応付け先を、前記第２のスレッドに変更し、前記第１検出手段が検出しなかったときは、前記初期コンテキストを前記第２のスレッドと対応付けられたコンテキストとして、前記コンテキスト記憶手段に記憶させ、前記設定手段は、前記第１検出手段が検出せず、かつ前記第２検出手段が検出した場合に、前記コンテキスト対応付け手段により前記第２のスレッドと対応付けて前記コンテキスト記憶手段に記憶されている初期コンテキストを前記プロセッサに設定することとしてもよい。
【００２１】
これにより、第２検出手段が検出した場合、つまり、第２のスレッドにコンテキストが対応付けられていない場合において、第１検出手段が検出したときは、第１のスレッドと対応付けられていたコンテキストが、第２のスレッドと対応付けられるので、その第２のスレッドの実行がなされてからまた非実行状態になる際、コンテキストの退避をせざるを得ないときに、そのための領域が既に確保されているようにすることができる。
【００２２】
また、第２のスレッドにコンテキストが対応付けられていない場合において、第１検出手段も検出しなかったときは、既定の処理部分を処理の開始位置とするための初期コンテキストが第２のスレッドに対応付けられ、設定手段がその初期コンテキストをプロセッサに設定するので、第２のスレッドを正常に実行させることができる。
【００２３】
また、前記情報処理装置は、更に前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第２のスレッドと対応付けられているコンテキストの対応付け先を前記第１のスレッドに、前記第１のスレッドと対応付けられているコンテキストの対応付け先を前記第２のスレッドにそれぞれ変更するコンテキスト対応付け手段を備えることとしてもよい。
【００２４】
これにより、第１検出手段が検出し、かつ第２検出手段が検出した場合には、実行状態に遷移させられる第２のスレッドにおける処理の開始位置と、それまで実行状態だった第１のスレッドにおける次に実行状態になった際の処理の開始位置とが共に既定の処理部分となるため、コンテキスト対応付け手段が、第２のスレッドに対応付けられているコンテキストを第１のスレッドに対応付けることにより、プロセッサに設定されているコンテキストを退避させることなく、第１のスレッドのコンテキストを正しく保持できる。
【００２５】
また、コンテキスト対応付け手段が、第１のスレッドに対応付けられているコンテキストを第２のスレッドに対応付けるので、その第２のスレッドの実行がなされてからまた非実行状態になる際、コンテキストの退避をせざるを得ないときに、そのための領域が既に確保されているようにすることができる。
【００２６】
また後に、第１のスレッドが実行状態になる際に、それに対応付けられたコンテキストをそのままプロセッサに設定し得るようになる。
【００２７】
また、前記イベントは、メッセージであり、前記非実行状態は、メッセージの受信を待つメッセージ待ち状態を含み、前記複数のスレッドには、次に実行状態になった際の処理の開始位置が、前記既定の処理部分となる場合には、前記メッセージ待ち状態に遷移することを示すフラグを設定するよう構成されたスレッドを含み、前記第１検出手段及び前記第２検出手段は、検出対象のスレッドにおいて、前記フラグが設定されていることを検出することにより、当該処理対象のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出することとしてもよい。
【００２８】
これにより、次に実行状態になった際の処理の開始位置が、前記既定の処理部分となる場合には、前記メッセージ待ち状態に遷移することを示すフラグを設定するよう各スレッドを構成するだけで、本発明に係る情報処理装置は、より高速にスレッドの切り替えを行うという効果が得られるようにできる。
【図面の簡単な説明】
【００２９】
【図１】本発明の実施の形態１に係る情報処理装置１０００の機能ブロック図である。
【図２】記憶部１０１０に記憶されている構造体群を示す図である。
【図３】スケジューラ構造体Ｄ００のデータ構成を示す図である。
【図４】スレッド構造体Ｄ１０Ａのデータ構成を示す図である。
【図５】スレッドの状態遷移を説明するための図である。
【図６】セマフォ構造体Ｄ２０のデータ構成を示す図である。
【図７】コンテキスト構造体Ｄ３０Ａのデータ構成を示す図である。
【図８】各スレッドの処理を示すフローチャート（左側）と、情報処理装置１０００の実行制御部１０５０の動作を示すフローチャート（右側）である。
【図９】情報処理装置１０００のスケジュール部１０２０の動作を示すフローチャートである。
【図１０】情報処理装置１０００の遷移検出部１０３０の動作を示すフローチャートである。
【図１１】情報処理装置１０００の起床検出部１０４０の動作を示すフローチャートである。
【図１２】情報処理装置１０００のコンテキスト対応交換部１０７１の動作を示すフローチャートである。
【図１３】情報処理装置１０００のディスパッチ部１０６０の動作を示すフローチャートである。
【図１４】本発明の実施の形態２に係る情報処理装置２０００の機能ブロック図である。
【図１５】スケジューラ構造体Ｄ４０のデータ構成を示す図である。
【図１６】コンテキスト構造体Ｄ５０Ａのデータ構成を示す図である。
【図１７】情報処理装置２０００の実行制御部２０２０の動作を示すフローチャートである。
【図１８】情報処理装置２０００のコンテキスト未対応検出部２０１０の動作を示すフローチャートである。
【図１９】情報処理装置２０００のコンテキスト対応移動部２０３１の動作を示すフローチャートである。
【図２０】情報処理装置２０００のコンテキスト対応開放・復元部２０３２の動作を示すフローチャートである。
【図２１】情報処理装置２０００のコンテキスト保管・対応割付部２０３３の動作を示すフローチャートである。
【図２２】情報処理装置２０００のコンテキスト保管・対応割付部２０３３の動作を示すフローチャートである。
【発明を実施するための形態】
【００３０】
以下、本発明の実施の形態について、図面を参照しながら説明する。
【００３１】
≪実施の形態１≫
＜概要＞
実施の形態１に係る情報処理装置は、ＣＰＵ（Central Processing Unit）等のプロセッサにプログラムを実行させることにより、マルチスレッドＯＳ（OperatingSystem）としての機能を実現する従来の情報処理装置を改良したものである。
【００３２】
以下では、マルチスレッド制御の対象となる各スレッドには、いわゆるイベントドリブン型の処理プログラムとして動作する複数のスレッドがあり、メッセージによって、各種イベントの発生が伝えられる場合を例に説明する。
【００３３】
このメッセージの例としては、ユーザによりマウスボタンがクリックされたことを示す通知や、スレッド間で連携を取るために使用される通知等が挙げられ、また、各スレッドの切り替え要因には、タイムスライスを使いきった場合、共有資源の割り当てを待つ場合や、上述のメッセージの受信を待つ場合等が挙げられる。なお、以下では、あるスレッドから他のスレッドに切り替えを行う場合に、このあるスレッドのことを「前スレッド」、他のスレッドのことを「現スレッド」と表現する。
【００３４】
イベントドリブン型の各スレッドは、実行状態の間、メッセージループと呼ばれるループ処理を繰り返し実行する。メッセージループは、メッセージキューにメッセージを受信しているか否かの判定処理をプログラムのメインルーチンにおいて含んで形成され、メッセージを受信している場合には、既定のサブルーチンを呼び出してそのメッセージに応じた処理を行った後にこの判定処理を再び行い、メッセージを受信していない場合には、メッセージを待つ状態（以下、「メッセージ待ち状態」という）に遷移する旨のフラグを設定する処理を行って、ＯＳにスレッドの切り替え処理を行わせるものである。
【００３５】
このフラグが設定された状態で、ＯＳによるスレッドの切り替え処理がなされると、そのフラグを設定したスレッド（前スレッド）はメッセージ待ち状態となってメッセージループの実行を中断し、他のスレッド（現スレッド）が実行状態となってこの現スレッドもまたメッセージループを実行する。メッセージ待ち状態となった前スレッドが次に実行状態になったときには、上記判定処理から実行を再開することになる。
【００３６】
なお、上述のサブルーチン処理内でも、スレッドの切り替えは起こり得るが、その場合の前スレッドは、メッセージ待ち状態とは異なる状態（後述する実行可能状態又は一般待ち状態）になる。
【００３７】
このように、イベントドリブン型の各スレッドがそれぞれメッセージループを実行しているので、もし、前スレッドがメッセージ待ち状態になる場合において、現スレッドが前回実行状態から非実行状態になる直前にメッセージを待っていることからメッセージ待ち状態へと遷移していたとすると、前スレッドが次に実行状態になったときの実行の再開位置と、現スレッドがこれから実行を再開する位置とは共に上記判定処理ということになる。
【００３８】
即ち、ＣＰＵのレジスタに設定されている値（前スレッドのコンテキスト）が指し示すデータの内容と、現スレッドのコンテキストが指し示すデータの内容とは一致することになり、コンテキストの退避・設定処理を行うことなく、現スレッドの処理を再開できることになる。
【００３９】
そこで、この情報処理装置は、スレッドを切り替える際に、前スレッドがメッセージ待ち状態に遷移することを検出し、かつ現スレッドが前回実行状態だった際にメッセージ待ち状態に遷移したことを検出した場合に、コンテキストの退避・設定処理を行わないことで、より高速にスレッドの切り替えを行い、効率的な処理を実現する。
【００４０】
＜構成＞
図１は、本発明の実施の形態１に係る情報処理装置１０００の機能ブロック図である。
【００４１】
情報処理装置１０００は、ＣＰＵ及びメモリを含み、機能面において、同図に示すとおり、記憶部１０１０、スケジュール部１０２０、遷移検出部１０３０、起床検出部１０４０、実行制御部１０５０、ディスパッチ部１０６０、対応付け部１０７０を備える。
【００４２】
ここで、記憶部１０１０は、メモリ等の記憶媒体により実現され、オペレーティングシステムを構成するサブルーチン群（以下、「ステップ群」という）及びデータ群（スケジューラ構造体、各スレッド構造体、各コンテキスト構造体等の構造体群）を記憶する機能を有する。このステップ群を上述のＣＰＵが実行することにより、スケジュール部１０２０、遷移検出部１０３０、起床検出部１０４０、実行制御部１０５０、ディスパッチ部１０６０、対応付け部１０７０の各機能が実現される。
【００４３】
ステップ群、構造体群の内容の詳細は後述するが、スケジューラ構造体は、前スレッドと現スレッドを特定するための情報を含み、各スレッド構造体は、それぞれのスレッドの実行制御用の情報であり、そのスレッドの状態、実行の優先度や対応付けられたコンテキストを指すポインタ等を含むものである。また、各コンテキスト構造体は、それぞれのスレッドに対応付けられたコンテキストの内容を示す情報である。
【００４４】
なお、ここでの構造体とは、一定のデータ構造を有するデータそのものを指しており、スケジューラ構造体と、スレッド構造体と、コンテキスト構造体とは、それぞれ異なるデータ構造を有する。また、各スレッド構造体は、同一のデータ構造を有するが、データ自体は異なり、各コンテキスト構造体についても同様である。
【００４５】
スケジュール部１０２０は、実行制御部１０５０の指示に従い、記憶部１０１０に記憶されている各スレッド構造体に含まれる各スレッドの状態と実行の優先度とに基づいて、次に実行するスレッドを決定し、決定したスレッドを実行状態に遷移させる機能を有する。スケジュール部１０２０は、決定したスレッドに関する情報を、記憶部１０１０のスケジューラ構造体に反映させる。
【００４６】
遷移検出部１０３０は、実行制御部１０５０の指示に従い、前スレッドの実行制御用の情報である、記憶部１０１０のスレッド構造体（以下、「前スレッド構造体」という）を参照することにより、そのスレッドがメッセージ待ち状態に遷移することを検出する機能を有する。
【００４７】
起床検出部１０４０は、実行制御部１０５０の指示に従い、現スレッドの実行制御用の情報である、記憶部１０１０のスレッド構造体（以下、「現スレッド構造体」という）を参照することにより、そのスレッドが前回実行状態であった際に、メッセージ待ち状態に遷移していたことを検出する機能を有する。
【００４８】
実行制御部１０５０は、装置全体の制御、および装置内の各ブロックへの指示を行う機能を有する。特に、スケジュール部１０２０による決定がなされると、遷移検出部１０３０と起床検出部１０４０とに検出を指示し、その検出結果に応じて、ディスパッチ部１０６０と対応付け部１０７０とのいずれかにスレッド切り替えのための処理を指示する機能を有する。
【００４９】
ディスパッチ部１０６０は、実行制御部１０５０からの指示に応じて、ＣＰＵのレジスタに設定されている値を、前スレッドのコンテキスト構造体として記憶部１０１０に記憶し、記憶部１０１０に記憶されている現スレッドのコンテキスト構造体の内容をＣＰＵのレジスタに設定する機能を有する。
【００５０】
対応付け部１０７０は、コンテキスト対応交換部１０７１を含み、このコンテキスト対応交換部１０７１は、実行制御部１０５０からの指示に応じて、前スレッドとコンテキストとの対応付けと、現スレッドとコンテキストとの対応付けとを交換する機能を有する。より詳細には、前スレッド構造体に含まれる、そのスレッドと対応付けられたコンテキストを指すポインタと、現スレッド構造体に含まれる、そのスレッドと対応付けられたコンテキストを指すポインタとを交換する。
【００５１】
＜データ＞
情報処理装置１０００がマルチスレッド制御に用いるデータについて説明する。なお、以下では、３つのイベントドリブン型のスレッドの並列実行を想定した場合を例に説明する。また、以下の例では、１つのセマフォを使って待ち合わせ処理を行う場合を想定して説明する。
【００５２】
図２は、記憶部１０１０に記憶されている構造体群を示す図である。
【００５３】
同図に示すように、記憶部１０１０には、スケジューラ構造体Ｄ００、スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃ、セマフォ構造体Ｄ２０、コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃが記憶されている。
【００５４】
＜スレッド構造体＞
まず、スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃについて説明する。
【００５５】
スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃは、それぞれ１つのスレッドの実行制御用の情報であり、スレッド生成時に生成される。スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃは、同一のデータ構成を有するため、以下では、スレッド構造体Ｄ１０Ａを例に説明する。
【００５６】
図４は、スレッド構造体Ｄ１０Ａのデータ構成を示す図である。
【００５７】
同図に示すように、スレッド構造体Ｄ１０Ａは、スレッド状態Ｄ１１、スレッド優先度Ｄ１２、メッセージ待ち状態遷移検出フラグＤ１３、コンテキスト構造体へのポインタＤ１４、メッセージキューＤ１５、メッセージハンドラＤ１６から構成される。
【００５８】
ここで、スレッド状態Ｄ１１は、スレッドの状態を示す情報であり、終了状態Ｔ０、実行状態Ｔ１、実行可能状態Ｔ２、一般待ち状態Ｔ３、メッセージ待ち状態Ｔ４のいずれかを示すものである。スレッドの状態がどのように遷移するかについては後述する。
【００５９】
スレッド優先度Ｄ１２は、スレッドの実行の優先度を示す情報であり、優先度は例えば、スレッド生成時に、生成元のプログラムにより指定を受けて決定される。
【００６０】
メッセージ待ち状態遷移検出フラグＤ１３は、前スレッドがメッセージ待ち状態Ｔ４に遷移するか否か、及び現スレッドがメッセージ待ち状態Ｔ４に遷移していたか否かを示す情報である。スレッドが実行状態Ｔ１からメッセージ待ち状態Ｔ４に遷移する旨を示すためにそのスレッドにより「真」に設定される。スレッドの切り替えが発生する際に、このフラグを用いて、コンテキストの退避・設定処理の要否が判断される。
【００６１】
コンテキスト構造体へのポインタＤ１４は、スレッドに対応付けられたコンテキスト構造体を特定するためのポインタであり、スレッドに対応するコンテキストが生成された際に設定され、後述するように、コンテキストの退避・設定処理を行うことなくスレッドの切り替えがなされた場合に更新される。同図中の「コンテキスト構造体Ｄ３０」の記載は、コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃのいずれかのコンテキスト構造体を指すことを示している。
【００６２】
メッセージキューＤ１５は、スレッドが受信したメッセージの集合である。このメッセージは、ＯＳや他のスレッドにより追加され、このメッセージを処理することにより、即ち、イベント（メッセージ）に対応したサブルーチン(メッセージハンドラ)を実行することにより、メッセージキューＤ１５が空になる場合もある。
【００６３】
メッセージハンドラＤ１６は、メッセージを受信していたときに実行するサブルーチン（メッセージハンドラ）の記憶部１０１０上のアドレスを記憶しておくためのポインタである。
【００６４】
ここで、情報処理装置１０００のマルチスレッド制御によるスレッドの状態遷移について簡単に説明する。
【００６５】
図５は、スレッドの状態遷移を説明するための図である。
【００６６】
同図に示す終了状態Ｔ０とは、スレッドの動作が終了した状態をいい、スレッドが生成された直後もこの状態となる。スレッドが生成された場合に、そのスレッドを開始させる処理を行うことで、スレッドは実行可能状態Ｔ２に遷移する。
【００６７】
実行可能状態Ｔ２とは、ＣＰＵが割り当てられるのを待っている状態であり、そのスレッドにＣＰＵが割り当てられると、スレッドは、実行状態Ｔ１に遷移する。
【００６８】
また、実行状態Ｔ１とは、スレッドにＣＰＵが割り当てられ、実行される状態をいう。実行可能状態Ｔ２にある他のスレッドより実行状態Ｔ１のスレッドの優先度が低くなった場合等に、実行状態Ｔ１のスレッドは、実行可能状態Ｔ２に遷移し、また、他のスレッドの資源開放待ち（セマフォ待ち）等が発生した場合に、一般待ち状態Ｔ３に遷移し、メッセージ待ちが発生した場合に、メッセージ待ち状態Ｔ４に遷移する。
【００６９】
また、一般待ち状態Ｔ３とは、セマフォ待ち等の、メッセージ待ち状態Ｔ４における要因以外の要因による待ちの状態をいい、例えばセマフォ待ちが解除することにより、実行可能状態Ｔ２に遷移する。
【００７０】
また、メッセージ待ち状態Ｔ４とは、上述のメッセージキューＤ１５にメッセージがなく、メッセージの受信を待っている状態をいい、メッセージが送信された（つまり受信した）場合に、実行可能状態Ｔ２に遷移する。
【００７１】
＜スケジューラ構造体＞
次に、スケジューラ構造体Ｄ００について説明する。
【００７２】
図３は、スケジューラ構造体Ｄ００のデータ構成を示す図である。
【００７３】
同図に示すように、スケジューラ構造体Ｄ００は、スレッド構造体の配列Ｄ０１、現スレッド構造体へのポインタＤ０２、前スレッド構造体へのポインタＤ０３から構成される。
【００７４】
ここで、スレッド構造体の配列Ｄ０１は、上述のスレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃを要素とした配列である。
【００７５】
また、現スレッド構造体へのポインタＤ０２は、スケジュール部１０２０により、次に実行すると決定されたスレッド（現スレッド）の制御用情報である現スレッド構造体（以下、スレッドとその制御用情報であるスレッド構造体との関係を表現する場合に、単に、「スレッドに対応するスレッド構造体」、「スレッド構造体に対応するスレッド」と表現する）を特定するためのポインタである。
【００７６】
また、前スレッド構造体へのポインタＤ０３は、スケジュール部１０２０による決定がなされる前に現スレッドだったスレッド（前スレッド）に対応する前スレッド構造体を特定するためのポインタである。
【００７７】
＜セマフォ構造体＞
次に、セマフォ構造体Ｄ２０について説明する。
【００７８】
図６は、セマフォ構造体Ｄ２０のデータ構成を示す図である。
【００７９】
同図に示すように、セマフォ構造体Ｄ２０は、資源数Ｄ２１、一般待ち状態のスレッドキューＤ２２から構成される。
【００８０】
ここで、資源数Ｄ２１は、セマフォが管理している資源数を示す情報であり、一般待ち状態のスレッドキューＤ２２は、他のスレッドの資源開放待ちのために、一般待ち状態Ｔ３に遷移したスレッドの集合である。
【００８１】
＜コンテキスト構造体＞
次に、コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃについて説明する。
【００８２】
コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃは、それぞれのスレッドに対応付けられたコンテキストの内容を示す情報であり、スレッドを開始する際に生成される。コンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃは、同一のデータ構成を有するため、以下では、コンテキスト構造体Ｄ３０Ａを例に説明する。
【００８３】
図７は、コンテキスト構造体Ｄ３０Ａのデータ構成を示す図である。
【００８４】
同図に示すように、コンテキスト構造体Ｄ３０Ａは、一般待ち状態コンテキストＤ３３、スタックＤ３４から構成される。
【００８５】
ここで、一般待ち状態コンテキストＤ３３は、スレッドが、実行状態Ｔ１から一般待ち状態Ｔ３に遷移した際の、ＣＰＵから退避したコンテキストを示す情報であり、スタックＤ３４は、コンテキスト毎のスタック情報である。
【００８６】
＜メッセージループステップ＞
図８は、各スレッドの処理を示すフローチャート（左側）と、情報処理装置１０００の実行制御部１０５０の動作を示すフローチャート（右側）である。
【００８７】
以下説明するメッセージループステップＳ１００は、イベントドリブン型の各スレッドが実行するメッセージループの処理内容を示している。即ち、情報処理装置１０００によるマルチスレッド制御の対象となるスレッドは、共通の処理構造を有している。なお、メッセージループステップＳ１００は、記憶部１０１０に記憶されており、情報処理装置１０００が備えるＣＰＵにより実行されることになる。
【００８８】
スレッドは、自スレッドに対応するスレッド構造体（現スレッド構造体）のメッセージキューＤ１５にメッセージが有るか判定し（部分ステップＳ１０１）、有る場合には（部分ステップＳ１０１：ＹＥＳ）、このメッセージキューＤ１５から取り出したメッセージを引数にして、メッセージハンドラＤ１６に設定されているサブルーチン（メッセージハンドラ）を呼び出し（部分ステップＳ１０６）、その処理の後に、部分ステップＳ１０１の処理に戻る。なお、このサブルーチン（メッセージハンドラ）の処理内容については、スレッド毎に異なるものでも同一のものでもよい。
【００８９】
部分ステップＳ１０１において、メッセージキューＤ１５にメッセージがない場合には（部分ステップＳ１０１：ＮＯ）、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３を「真」に、スレッド状態Ｄ１１を「Ｔ４」に更新する（部分ステップＳ１０２、Ｓ１０３）。
【００９０】
続いて、スレッドは、サブルーチンであるスケジュールステップＳ０００と、ディスパッチ要求ステップＳ１１０とを順に呼び出し（部分ステップＳ１０４、Ｓ１０５）、これらの処理の後に、部分ステップＳ１０１の処理に戻る。
【００９１】
スケジュールステップＳ０００及びディスパッチ要求ステップＳ１１０の内容については後述するが、部分ステップＳ１０４、Ｓ１０５の処理を通じて、ＯＳにより、次に実行するスレッドが決定され、スレッドの切り替えが行われる。
【００９２】
このように、スレッドは、メッセージキューＤ１５にメッセージが有る間は（部分ステップＳ１０１：ＹＥＳ）、サブルーチン（メッセージハンドラ）を実行し、メッセージキューＤ１５にメッセージがなくなると（部分ステップＳ１０１：ＮＯ）、メッセージ待ち状態Ｔ４に遷移する旨のフラグ(メッセージ待ち状態遷移検出フラグＤ１３)を設定し、ＯＳによって、メッセージ待ち状態Ｔ４に遷移させられ、次にそのスレッドが実行状態Ｔ１になった場合には、部分ステップＳ１０１から処理を再開することになる。
【００９３】
上述したように、各スレッドの処理構造は同一であるため、メッセージ待ち状態Ｔ４になったスレッドとメッセージ待ち状態Ｔ４であったスレッドとの間で切り替えが行われる場合には、両スレッドのコンテキストが指し示すデータの内容が一致することになる。
【００９４】
＜動作＞
次に、上記構成を備える情報処理装置１０００の動作を説明する。
【００９５】
＜スケジュールステップ＞
まず、メッセージループステップの部分ステップＳ１０４で呼び出しているスケジュールステップＳ０００について説明する。
【００９６】
図９は、情報処理装置１０００のスケジュール部１０２０の動作を示すフローチャートである。
【００９７】
スケジュール部１０２０は、スケジューラ構造体Ｄ００における前スレッド構造体へのポインタＤ０３に現スレッド構造体へのポインタＤ０２を代入する（部分ステップＳ００１）。
【００９８】
次に、各スレッド構造体のうち、スレッド状態Ｄ１１が実行状態Ｔ１と実行可能状態Ｔ２であるスレッド構造体の中から、スレッド優先度Ｄ１２が一番高いスレッド構造体を検索する（部分ステップＳ００２）。
【００９９】
次に、検索されたスレッド構造体のスレッド状態Ｄ１１が実行状態Ｔ１か判定し（部分ステップＳ００３）、実行状態Ｔ１でない場合には（部分ステップＳ００３：ＮＯ）、検索されたスレッド（現スレッドとなるスレッド）の状態を遷移させるために、以下の処理を行う。即ち、検索されたスレッドに対応するスレッド構造体のスレッド状態Ｄ１１を実行状態Ｔ１に更新し、現スレッド構造体へのポインタＤ０２に検索されたスレッドに対応するスレッド構造体を設定する（部分ステップＳ００４）。
【０１００】
次に、前スレッド構造体のスレッド状態Ｄ１１が実行状態Ｔ１か判定し（部分ステップＳ００５）、実行状態Ｔ１である場合には（部分ステップＳ００５：ＹＥＳ）、前スレッドの状態を遷移させるために、前スレッド構造体のスレッド状態Ｄ１１を実行可能状態Ｔ２に更新し（部分ステップＳ００６）、スケジュールステップの処理を終了する（部分ステップＳ００７）。また、部分ステップＳ００５において、実行状態Ｔ１でない場合には（部分ステップＳ００５：ＮＯ）、特に処理を行うことなくスケジュールステップの処理を終了し（部分ステップＳ００７）。
【０１０１】
また、部分ステップＳ００３において、実行状態Ｔ１である場合には（部分ステップＳ００３：ＹＥＳ）、検索されたスレッドは元々実行状態Ｔ１であって遷移させる必要はないため、特に処理を行うことなく、スケジュールステップの処理を終了する（部分ステップＳ００７）。
【０１０２】
＜ディスパッチ要求ステップ＞
次に、メッセージループステップの部分ステップＳ１０５で呼び出しているディスパッチ要求ステップＳ１１０について、図８の右側に示すフローチャートに従って説明する。
【０１０３】
まず、実行制御部１０５０は、現スレッド構造体と前スレッド構造体が同一か判定する（部分ステップＳ１１１）。つまり、現スレッド構造体へのポインタＤ０２と前スレッド構造体へのポインタＤ０３とが同一かどうか判定する。
【０１０４】
部分ステップＳ１１１において、同一である場合には（部分ステップＳ１１１：ＹＥＳ）、スレッドの切り替えを行う必要がないので、ディスパッチ要求ステップの処理を終了し（部分ステップＳ１１７）、同一でない場合には（部分ステップＳ１１１：ＮＯ）、スレッドを切り替えるための処理を以下のとおり行う。
【０１０５】
即ち、実行制御部１０５０は、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値が「真」であるか判定する（部分ステップＳ１１２）。メッセージ待ち状態遷移検出ステップＳ０１０の内容については後述するが、前スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値が戻り値となるため、部分ステップＳ１１２は、前スレッド構造体に対応するスレッドがメッセージ待ち状態Ｔ４に遷移するかを判定することに相当する。
【０１０６】
部分ステップＳ１１２において、戻り値が「真」の場合には（部分ステップＳ１１２：ＹＥＳ）、実行制御部１０５０は、メッセージ待ち状態からの起床検出ステップＳ０２０の戻り値が「真」であるか判定する（部分ステップＳ１１３）。メッセージ待ち状態からの起床検出ステップＳ０２０の内容については後述するが、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値が戻り値となるため、部分ステップＳ１１３は、現スレッド構造体に対応するスレッドが、前回実行状態Ｔ１であった際に、メッセージ待ち状態Ｔ４に遷移したかを判定することに相当する。
【０１０７】
部分ステップＳ１１３における戻り値が「真」の場合には（部分ステップＳ１１３：ＹＥＳ）、前スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容と現スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容とが一致することになるため、実行制御部１０５０は、コンテキスト対応付け交換ステップＳ０３０を呼び出し（部分ステップＳ１１４）、その処理の後、ディスパッチ要求ステップの処理を終了する（部分ステップＳ１１７）。コンテキスト対応付け交換ステップＳ０３０の内容については後述するが、前スレッドに対応付けられたコンテキストと現スレッドに対応付けられたコンテキストとの対応付け（ポインタ）を交換する処理を行う。
【０１０８】
また、部分ステップＳ１１３における戻り値が「偽」の場合には（部分ステップＳ１１３：ＮＯ）、前スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容と現スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容とは一致しないため、実行制御部１０５０は、ディスパッチステップＳ０４０を呼び出し（部分ステップＳ１１６）、その処理の後、ディスパッチ要求ステップの処理を終了する（部分ステップＳ１１７）。ディスパッチステップＳ０４０の内容については後述するが、コンテキストの退避・設定処理が行われる。
【０１０９】
また、部分ステップＳ１１２における戻り値が「偽」の場合には（部分ステップＳ１１２：ＮＯ）、実行制御部１０５０は、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３を「偽」に更新し（部分ステップＳ１１５）、部分ステップＳ１１６に進む。
【０１１０】
このように、ディスパッチ要求ステップＳ１１０では、部分ステップＳ１１２、Ｓ１１３の判定処理を行うことで、サブルーチンであるディスパッチステップＳ０４０とコンテキスト対応付け交換ステップＳ０３０とのいずれかに処理を振り分けている。
【０１１１】
上述のように、ディスパッチステップＳ０４０では、コンテキストの退避・設定処理が行われ、コンテキスト対応付け交換ステップＳ０３０では、前スレッドに対応付けられたコンテキストと現スレッドに対応付けられたコンテキストとの対応付け（ポインタ）を交換する処理が行われる。
【０１１２】
コンテキストの退避・設定処理よりも、コンテキストの対応付けの交換処理のほうが一般的には高速に処理できるので、スレッドの切り替えを行う際に、コンテキスト対応付け交換ステップＳ０３０が呼び出される回数が多くなるほど、毎回ディスパッチステップＳ０４０が呼び出される場合と比較し、全体としてのプログラムの処理効率を向上させることができる。
【０１１３】
＜メッセージ待ち状態遷移検出ステップ＞
次に、ディスパッチ要求ステップの部分ステップＳ１１２におけるメッセージ待ち状態遷移検出ステップＳ０１０について説明する。
【０１１４】
図１０は、情報処理装置１０００の遷移検出部１０３０の動作を示すフローチャートである。
【０１１５】
遷移検出部１０３０は、前スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値を返却し（部分ステップＳ０１１）、メッセージ待ち状態遷移検出ステップの処理を終了する（部分ステップＳ０１２）。
【０１１６】
＜メッセージ待ち状態からの起床検出ステップ＞
続いて、ディスパッチ要求ステップの部分ステップＳ１１３におけるメッセージ待ち状態からの起床検出ステップＳ０２０について説明する。
【０１１７】
図１１は、情報処理装置１０００の起床検出部１０４０の動作を示すフローチャートである。
【０１１８】
起床検出部１０４０は、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３の値を返却し（部分ステップＳ０２１）、そのメッセージ待ち状態遷移検出フラグＤ１３の値を「偽」に設定し（部分ステップＳ０２２）、メッセージ待ち状態からの起床検出ステップの処理を終了する（部分ステップＳ０２３）。
【０１１９】
＜コンテキスト対応付け交換ステップ＞
次に、ディスパッチ要求ステップの部分ステップＳ１１４で呼び出しているコンテキスト対応付け交換ステップＳ０３０について説明する。
【０１２０】
図１２は、情報処理装置１０００のコンテキスト対応交換部１０７１の動作を示すフローチャートである。
【０１２１】
コンテキスト対応交換部１０７１は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４の値と、前スレッド構造体のコンテキスト構造体へのポインタＤ１４の値とを交換し（部分ステップＳ０３１）、コンテキスト対応付け交換ステップの処理を終了する（部分ステップＳ０３２）。
【０１２２】
このように、現スレッド構造体と前スレッド構造体との間で、コンテキスト構造体へのポインタＤ１４を交換することにより、コンテキストの退避処理を行うことなく、前スレッドのコンテキストを正しく保持でき、また、現スレッドにもコンテキストを対応付けた状態を保つことができ、この現スレッドのコンテキストを退避する必要が生じても、従来どおり退避することができる。
【０１２３】
＜ディスパッチステップ＞
次に、ディスパッチ要求ステップの部分ステップＳ１１６で呼び出しているディスパッチステップＳ０４０について説明する。
【０１２４】
図１３は、情報処理装置１０００のディスパッチ部１０６０の動作を示すフローチャートである。
【０１２５】
まず、ディスパッチ部１０６０は、ＣＰＵのレジスタに設定されている値を、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ３０の一般待ち状態コンテキストＤ３３として記憶する。ただし、プログラムカウンタ（以下、「ＰＣ」ともいう）の値はＳ０４３に補正して記憶する（部分ステップＳ０４１）。プログラムカウンタの値の補正は、前スレッド構造体に対応するスレッドが、次に実行状態Ｔ１になった場合に、部分ステップＳ０４３から処理を再開することを示している。
【０１２６】
次に、ディスパッチ部１０６０は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ３０の一般待ち状態コンテキストＤ３３の値をＣＰＵのレジスタに設定し（部分ステップＳ０４２）、ディスパッチステップの処理を終了する（部分ステップＳ０４３）。
【０１２７】
＜具体例＞
スレッド構造体Ｄ１０Ａに対応するスレッドとスレッド構造体Ｄ１０Ｂに対応するスレッドとの間で切り替えが発生する場合を例に、情報処理装置１０００の動作を具体的に説明する。
【０１２８】
以下では、現スレッド構造体へのポインタＤ０２は「Ｄ１０Ａ」であり、スレッド構造体Ｄ１０Ａのスレッド状態Ｄ１１は「Ｔ１」、メッセージキューＤ１５は空、コンテキスト構造体へのポインタＤ１４は「Ｄ３０Ａ」であるものとする。
【０１２９】
また、スレッド構造体Ｄ１０Ｂのスレッド状態Ｄ１１は「Ｔ２」、メッセージ待ち状態遷移検出フラグＤ１３は「真」、コンテキスト構造体へのポインタＤ１４は「Ｄ３０Ｂ」であるものとし、スレッド構造体Ｄ１０Ａに対応するスレッドが図８の左側に示すメッセージループステップＳ１００内の部分ステップＳ１０１の処理をこれから実行するものとして説明する。
【０１３０】
スレッド構造体Ｄ１０Ａに対応するスレッドは、スレッド構造体Ｄ１０ＡのメッセージキューＤ１５にメッセージがないので（同図左側の部分ステップＳ１０１：ＮＯ）、メッセージ待ち状態遷移検出フラグＤ１３を「真」に、スレッド状態Ｄ１１を「Ｔ４」に更新する（部分ステップＳ１０２、Ｓ１０３）。
【０１３１】
続いて、スレッド構造体Ｄ１０Ａに対応するスレッドは、サブルーチンであるスケジュールステップＳ０００を呼び出す（部分ステップＳ１０４）。
【０１３２】
スケジュールステップＳ０００の呼び出しを受けて、情報処理装置１０００の実行制御部１０５０は、スケジュール部１０２０に処理を指示する。
【０１３３】
この指示を受けて、スケジュール部１０２０は、スケジューラ構造体Ｄ００における前スレッド構造体へのポインタＤ０３に現スレッド構造体へのポインタＤ０２（Ｄ１０Ａ）を代入する（図９の部分ステップＳ００１）。
【０１３４】
次に、スケジュール部１０２０は、各スレッド構造体のうち、スレッド状態Ｄ１１が実行状態Ｔ１と実行可能状態Ｔ２であるスレッド構造体の中から、スレッド優先度Ｄ１２が一番高いスレッド構造体（この例では、スレッド構造体Ｄ１０Ｂであるものとする）を検索し（部分ステップＳ００２）、スレッド構造体Ｄ１０Ｂのスレッド状態Ｄ１１（Ｔ２）は実行状態Ｔ１でないので（部分ステップＳ００３：ＮＯ）、このスレッド状態Ｄ１１を「Ｔ１」に更新し、現スレッド構造体へのポインタＤ０２に「Ｄ１０Ｂ」を設定する（部分ステップＳ００４）。
【０１３５】
次に、前スレッド構造体（Ｄ１０Ａ）のスレッド状態Ｄ１１が「Ｔ１」でないので（部分ステップＳ００５：ＮＯ）、スケジュールステップの処理を終了する（部分ステップＳ００７）。
【０１３６】
再び、メッセージループステップの処理に戻り、スレッド構造体Ｄ１０Ａに対応するスレッドは、ディスパッチ要求ステップＳ１１０を呼び出す（部分ステップＳ１０５）。
【０１３７】
ディスパッチ要求ステップＳ１１０の呼び出しを受けて、実行制御部１０５０は、現スレッド構造体へのポインタＤ０２（Ｄ１０Ｂ）と前スレッド構造体へのポインタＤ０３（Ｄ１０Ａ）が同一でなく（図８右側の部分ステップＳ１１１：ＮＯ）、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値は「真」であり（部分ステップＳ１１２：ＹＥＳ）、メッセージ待ち状態からの起床検出ステップＳ０２０の戻り値も「真」であるので（部分ステップＳ１１３：ＹＥＳ）、コンテキスト対応付け交換ステップＳ０３０を呼び出す（部分ステップＳ１１４）。
【０１３８】
実行制御部１０５０からの指示を受けて、コンテキスト対応交換部１０７１は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４の値（Ｄ３０Ｂ）と、前スレッド構造体のコンテキスト構造体へのポインタＤ１４の値（Ｄ３０Ａ）とを交換し（図１２の部分ステップＳ０３１）、コンテキスト対応付け交換ステップの処理を終了する（部分ステップＳ０３２）。
【０１３９】
再びディスパッチ要求ステップの処理に戻り、実行制御部１０５０は、ディスパッチ要求ステップの処理を終了する（図８右側の部分ステップＳ１１７）。
【０１４０】
上述した例では、ディスパッチ要求ステップＳ１１０内で、コンテキスト対応付け交換ステップＳ０３０が呼ばれて、スレッドの切り替えがなされているので、ディスパッチステップＳ０４０が呼ばれる場合と比較し、高速にスレッドの切り替えがなされているといえる。
【０１４１】
≪実施の形態２≫
＜概要＞
実施の形態１に係る情報処理装置１０００では、各スレッドについて、１つのコンテキストが必ず対応付けられていたが、以下説明する実施の形態２に係る情報処理装置は、前スレッドがメッセージ待ち状態Ｔ４に遷移する場合に、前スレッドとコンテキストとの対応付け（ポインタ）を削除する点で、情報処理装置１０００とは異なる。
【０１４２】
本実施の形態に係る情報処理装置は、現スレッドとコンテキストとの対応付けがなされていないことを検出することで、現スレッドが前回実行状態Ｔ１であった際に、メッセージ待ち状態Ｔ４に遷移していたことを検出し、このコンテキストとの対応付けが削除された現スレッドに、メッセージループの判定処理から実行するよう設定されたコンテキストとの対応付けを改めて行う。このようにすることで、メッセージ待ち状態Ｔ４で処理を中断しているスレッドには、コンテキストを対応付けておく必要はないため、このようなスレッドが多くなるほど、全体としてメモリの使用量を減らすことができる。
【０１４３】
なお、上記説明では、コンテキストとの対応付けが削除された現スレッドについて説明したが、生成直後でコンテキストの対応付けがなされていないスレッドが現スレッドとなる場合にも、メッセージループの判定処理から実行することになるため、同様の取り扱いをすることができる。
【０１４４】
以下、情報処理装置１０００と異なる部分を中心に説明する。
【０１４５】
＜構成＞
図１４は、本発明の実施の形態２に係る情報処理装置２０００の機能ブロック図である。
【０１４６】
情報処理装置２０００は、機能面において、同図に示すとおり、記憶部１０１０、スケジュール部１０２０、遷移検出部１０３０、コンテキスト未対応検出部２０１０、実行制御部２０２０、対応付け部２０３０を備える。
【０１４７】
コンテキスト未対応検出部２０１０、実行制御部２０２０、対応付け部２０３０が実施の形態１に係る情報処理装置１０００とは異なるので、以下、これらについて説明する。
【０１４８】
ここで、コンテキスト未対応検出部２０１０は、実行制御部２０２０の指示に従い、記憶部１０１０の現スレッド構造体を参照することにより、そのスレッドにコンテキストが対応付けされていないことを検出する機能を有する。
【０１４９】
実行制御部２０２０は、実行制御部１０５０と同様に、各検出部の検出結果に応じて、ディスパッチ部１０６０と対応付け部２０３０とのいずれかにスレッド切り替えのための処理を指示する機能を有するが、以下の点で、実行制御部１０５０とは異なる。
【０１５０】
即ち、実行制御部１０５０は、各検出部のうち、いずれかの検出部が検出しない場合には、ディスパッチ部１０６０にスレッド切り替えのための処理を指示していたが、実行制御部２０２０は、遷移検出部１０３０とコンテキスト未対応検出部２０１０とのいずれもが検出しない場合にのみ、ディスパッチ部１０６０に処理を指示する点で異なる。
【０１５１】
つまり、実行制御部２０２０は、遷移検出部１０３０とコンテキスト未対応検出部２０１０とのいずれかが検出した場合には、対応付け部２０３０にスレッド切り替えのための処理を指示する。
【０１５２】
対応付け部２０３０は、コンテキスト対応交換部１０７１に代えて、コンテキスト対応移動部２０３１、コンテキスト対応開放・復元部２０３２、コンテキスト保管・対応割付部２０３３を含む点で、対応付け部１０７０とは異なる。
【０１５３】
ここで、コンテキスト対応移動部２０３１は、遷移検出部１０３０とコンテキスト未対応検出部２０１０とのいずれもが検出した場合に、実行制御部２０２０からの指示に応じて、前スレッドに対応付けられていたコンテキストを現スレッドに対応付け、そのコンテキストと前スレッドとの対応付けを削除する機能を有する。
【０１５４】
コンテキスト対応開放・復元部２０３２は、遷移検出部１０３０が検出し、かつコンテキスト未対応検出部２０１０が検出しなかった場合に、実行制御部２０２０からの指示に応じて、前スレッドとそのコンテキストとの対応付けを削除し、現スレッドに対応付けられているコンテキストをＣＰＵのレジスタに設定する機能を有する。
【０１５５】
コンテキスト保管・対応割付部２０３３は、遷移検出部１０３０が検出せず、かつコンテキスト未対応検出部２０１０が検出した場合に、実行制御部２０２０からの指示に応じて、ＣＰＵのレジスタに設定されている値を前スレッドのコンテキスト構造体として記憶部１０１０に記憶し、スレッドとの対応付けがなされていないコンテキスト構造体を現スレッドに対応付け、対応付けたそのコンテキスト構造体の内容をＣＰＵのレジスタに設定する機能を有する。この現スレッドに対応付けられるコンテキスト構造体が示すコンテキストの内容については、後述する。
【０１５６】
＜データ＞
情報処理装置２０００がマルチスレッド制御に用いるデータについて説明する。
【０１５７】
情報処理装置２０００の記憶部１０１０には、実施の形態１のスケジューラ構造体Ｄ００とコンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃとに代えて、スケジューラ構造体Ｄ４０とコンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃが記憶されている。
【０１５８】
以下、スケジューラ構造体Ｄ４０、コンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃについて、スケジューラ構造体Ｄ００とコンテキスト構造体Ｄ３０Ａ〜Ｄ３０Ｃと異なる点を中心に説明する。なお、以下では、スレッド構造体Ｄ１０Ａ〜Ｄ１０Ｃのコンテキスト構造体へのポインタＤ１４は、コンテキスト構造体Ｄ５０（Ｄ５０Ａ〜Ｄ５０Ｃのいずれかのコンテキスト構造体）を指すものとして説明する。
【０１５９】
＜スケジューラ構造体＞
まず、スケジューラ構造体Ｄ４０について説明する。
【０１６０】
図１５は、スケジューラ構造体Ｄ４０のデータ構成を示す図である。
【０１６１】
同図に示すように、スケジューラ構造体Ｄ４０は、コンテキストプールＤ０４を含む点で、スケジューラ構造体Ｄ００とは異なる。
【０１６２】
ここで、コンテキストプールＤ０４は、スレッドへの対応付けがなされていないコンテキスト構造体を特定するための情報であり、上述のコンテキスト対応開放・復元部２０３２により、前スレッドとそのコンテキストとの対応付けが削除された場合にこの情報が記憶され、この情報により特定されるコンテキスト構造体が、コンテキスト保管・対応割付部２０３３により現スレッドに対応付けられると、この情報は削除される。
【０１６３】
＜コンテキスト構造体＞
次に、コンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃについて説明する。
【０１６４】
コンテキスト構造体Ｄ５０Ａ〜Ｄ５０Ｃは、同一のデータ構成を有するため、以下では、コンテキスト構造体Ｄ５０Ａを例に説明する。
【０１６５】
図１６は、コンテキスト構造体Ｄ５０Ａのデータ構成を示す図である。
【０１６６】
同図に示すように、コンテキスト構造体Ｄ５０Ａは、メッセージ待ち状態コンテキストＤ３１及びメッセージ待ち状態コンテキスト保管フラグＤ３２を含む点で、コンテキスト構造体Ｄ３０Ａとは異なる。
【０１６７】
ここで、メッセージ待ち状態コンテキストＤ３１は、上述のコンテキスト保管・対応割付部２０３３により、現スレッドに対応付けられるコンテキストを示す情報であり、このコンテキストは、前回実行状態Ｔ１であった際に、メッセージ待ち状態Ｔ４に遷移したスレッドが処理を再開できるように設定され、新たに生成されたスレッドが現スレッドとなる場合にも対応付けられる。
【０１６８】
メッセージ待ち状態コンテキスト保管フラグＤ３２は、メッセージ待ち状態コンテキストＤ３１が有効なコンテキストであることを示す情報である。
【０１６９】
また、イベントドリブン型の各スレッドが実行するメッセージループの処理内容は実施の形態１と同様であるが（図８左側に示すメッセージループステップＳ１００）、部分ステップＳ１０５において、呼び出すサブルーチンは、ディスパッチ要求改良ステップＳ１３０であるものとして以下、説明する。
【０１７０】
＜動作＞
次に、上記構成を備える情報処理装置２０００の動作を説明する。
【０１７１】
＜ディスパッチ要求改良ステップ＞
まず、ディスパッチ要求改良ステップＳ１３０について説明する。
【０１７２】
図１７は、情報処理装置２０００の実行制御部２０２０の動作を示すフローチャートである。
【０１７３】
部分ステップＳ１３１、Ｓ１３２はそれぞれ、図８に示すディスパッチ要求ステップＳ１１０の部分ステップＳ１１１、Ｓ１１２と同様に処理する。
【０１７４】
部分ステップＳ１３２において、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値が「真」である場合には（部分ステップＳ１３２：ＹＥＳ）、実行制御部２０２０は、コンテキスト未対応検出ステップＳ０５０の戻り値が「真」であるか判定する（部分ステップＳ１３３）。コンテキスト未対応検出ステップＳ０５０の内容については後述するが、現スレッド構造体のコンテキスト構造体へのポインタＤ１４がＮＵＬＬならば「真」が戻り値となるため、部分ステップＳ１３３は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４がＮＵＬＬであるかを判定することに相当する。
【０１７５】
部分ステップＳ１３３において、戻り値が「真」の場合には（部分ステップＳ１３３：ＹＥＳ）、前スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容と現スレッド構造体に対応するスレッドのコンテキストが指し示すデータの内容とが一致することになるため、実行制御部２０２０は、コンテキスト対応移動ステップＳ０６０を呼び出し（部分ステップＳ１３４）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。コンテキスト対応移動ステップＳ０６０の内容については後述するが、前スレッドに対応付けられたコンテキストを現スレッドに対応付け（ポインタの設定）、前スレッドとそのコンテキストとの対応付け（ポインタ）を削除する処理を行う。
【０１７６】
また、部分ステップＳ１３３において、戻り値が「偽」の場合には（部分ステップＳ１３３：ＮＯ）、実行制御部２０２０は、コンテキスト対応開放・復元ステップＳ０７０を呼び出し（部分ステップＳ１３５）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。コンテキスト対応開放・復元ステップＳ０７０の内容については後述するが、コンテキストの設定処理と、前スレッドとそのコンテキストとの対応付け（ポインタ）を削除する処理を行う。
【０１７７】
また、部分ステップＳ１３２において、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値が「偽」である場合には（部分ステップＳ１３２：ＮＯ）、実行制御部２０２０は、部分ステップＳ１３３と同様の処理を行う（部分ステップＳ１３６）。
【０１７８】
部分ステップＳ１３６において、戻り値が「真」の場合には（部分ステップＳ１３６：ＹＥＳ）、実行制御部２０２０は、コンテキスト保管・対応割付ステップＳ０８０を呼び出し（部分ステップＳ１３７）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。コンテキスト保管・対応割付ステップＳ０８０の内容については後述するが、コンテキストの退避処理と、スレッドとの対応付けがなされていないコンテキスト（メッセージ待ち状態コンテキストＤ３１）を現スレッドに対応付けた上で、コンテキストの設定処理を行う。
【０１７９】
部分ステップＳ１３６において、戻り値が「偽」の場合には（部分ステップＳ１３６：ＮＯ）、ディスパッチステップＳ０４０を呼び出し（部分ステップＳ１３８）、その処理の後、ディスパッチ要求改良ステップの処理を終了する（部分ステップＳ１３９）。
【０１８０】
上述のように、ディスパッチステップＳ０４０及びコンテキスト保管・対応割付ステップＳ０８０では、コンテキストの退避・設定処理が行われるが、コンテキスト対応移動ステップＳ０６０では、コンテキストの退避・設定処理は行われず、ポインタの設定、削除処理のみが行われ、また、コンテキスト対応開放・復元ステップＳ０７０では、コンテキストの設定処理は行われるものの、コンテキストの退避処理は行われず、ポインタを削除する処理が行われる。
【０１８１】
従って、スレッドの切り替えを行う際に、コンテキスト対応移動ステップＳ０６０とコンテキスト対応開放・復元ステップＳ０７０とが呼び出される回数が多くなるほど、毎回ディスパッチステップＳ０４０が呼び出される場合と比較し、全体としてのプログラムの処理効率を向上させることができる。
【０１８２】
＜コンテキスト未対応検出ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３３、Ｓ１３６におけるコンテキスト未対応検出ステップＳ０５０について説明する。
【０１８３】
図１８は、情報処理装置２０００のコンテキスト未対応検出部２０１０の動作を示すフローチャートである。
【０１８４】
コンテキスト未対応検出部２０１０は、現スレッド構造体のメッセージ待ち状態遷移検出フラグＤ１３に「偽」を設定し（部分ステップＳ０５１）、現スレッド構造体のコンテキスト構造体へのポインタＤ１４がＮＵＬＬなら「真」を、ＮＵＬＬでなければ「偽」を返し（部分ステップＳ０５２）、コンテキスト未対応検出ステップの処理を終了する（部分ステップＳ０５３）。
【０１８５】
＜コンテキスト対応移動ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３４で呼び出しているコンテキスト対応移動ステップＳ０６０について説明する。
【０１８６】
図１９は、情報処理装置２０００のコンテキスト対応移動部２０３１の動作を示すフローチャートである。
【０１８７】
コンテキスト対応移動部２０３１は、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキスト保管フラグＤ３２が「真」であるか判定し（部分ステップＳ０６１）、「偽」の場合には（部分ステップＳ０６１：ＮＯ）、このメッセージ待ち状態コンテキスト保管フラグＤ３２を「真」に設定する（部分ステップＳ０６２）。
【０１８８】
続いて、コンテキスト対応移動部２０３１は、ＣＰＵのレジスタの値を、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキストＤ３１に保存する。この際、ＰＣの値は、「Ｓ０６６」として保存する（部分ステップＳ０６３）。
【０１８９】
部分ステップＳ０６３を処理し、又は部分ステップＳ０６１において、メッセージ待ち状態コンテキスト保管フラグＤ３２が「真」の場合に（部分ステップＳ０６１：ＹＥＳ）、コンテキスト対応移動部２０３１は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４に、前スレッド構造体のコンテキスト構造体へのポインタＤ１４を設定し（部分ステップＳ０６４）、この前スレッド構造体のコンテキスト構造体へのポインタＤ１４に「ＮＵＬＬ」を設定し（部分ステップＳ０６５）、コンテキスト対応移動ステップの処理を終了する（部分ステップＳ０６６）。
【０１９０】
＜コンテキスト対応開放・復元ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３５で呼び出しているコンテキスト対応開放・復元ステップＳ０７０について説明する。
【０１９１】
図２０は、情報処理装置２０００のコンテキスト対応開放・復元部２０３２の動作を示すフローチャートである。
【０１９２】
部分ステップＳ０７１〜Ｓ０７３については、図１９に示すコンテキスト対応移動ステップＳ０６０の部分ステップＳ０６１〜Ｓ０６３と同様に処理する。ただし、部分ステップＳ０７３においては、ＰＣの値は、「Ｓ０７６」として保存する。
【０１９３】
次に、コンテキスト対応開放・復元部２０３２は、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０をコンテキストプールＤ０４にストックし、この前スレッド構造体のコンテキスト構造体へのポインタＤ１４を「ＮＵＬＬ」に初期化する（部分ステップＳ０７４）。
【０１９４】
続いて、コンテキスト対応開放・復元部２０３２は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０の一般待ち状態コンテキストＤ３３の値をＣＰＵのレジスタに設定し（部分ステップＳ０７５）、コンテキスト対応開放・復元ステップの処理を終了する（部分ステップＳ０７６）。
【０１９５】
＜コンテキスト保管・対応割付ステップ＞
次に、ディスパッチ要求改良ステップの部分ステップＳ１３７で呼び出しているコンテキスト保管・対応割付ステップＳ０８０について説明する。
【０１９６】
図２１及び図２２は、情報処理装置２０００のコンテキスト保管・対応割付部２０３３の動作を示すフローチャートである。
【０１９７】
コンテキスト保管・対応割付部２０３３は、ＣＰＵのレジスタの値を、前スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０の一般待ち状態コンテキストＤ３３に保存する。この際、ＰＣの値は、「Ｓ０８４」として保存する（部分ステップＳ０８１）。
【０１９８】
続いて、コンテキスト保管・対応割付部２０３３は、コンテキスト対応割付ステップＳ１２０を呼び出す（部分ステップＳ０８２）。コンテキスト対応割付ステップＳ１２０の内容については後述する。
【０１９９】
次に、コンテキスト保管・対応割付部２０３３は、現スレッド構造体のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキストＤ３１の値をＣＰＵのレジスタに設定し（部分ステップＳ０８３）、コンテキスト保管・対応割付ステップの処理を終了する（部分ステップＳ０８４）。
【０２００】
＜コンテキスト対応割付ステップ＞
続いて、コンテキスト保管・対応割付ステップの部分ステップＳ０８２で呼び出しているコンテキスト対応割付ステップＳ１２０について、図２２に示すフローチャートに従って説明する。
【０２０１】
コンテキスト保管・対応割付部２０３３は、コンテキストプールＤ０４にコンテキスト構造体Ｄ５０がストックされているか判定し（部分ステップＳ１２１）、ストックされていない場合には（部分ステップＳ１２１：ＮＯ）、コンテキスト構造体Ｄ５０を生成し、メッセージ待ち状態コンテキストＤ３１のＰＣを「Ｓ１００」に、スタックポインタ（以下、「ＳＰ」ともいう）を、生成したコンテキスト構造体Ｄ５０のスタックＤ３４に初期化する（部分ステップＳ１２２）。
【０２０２】
続いて、コンテキスト保管・対応割付部２０３３は、生成したコンテキスト構造体Ｄ５０のメッセージ待ち状態コンテキスト保管フラグＤ３２を「偽」に初期化し（部分ステップＳ１２３）、現スレッド構造体のコンテキスト構造体へのポインタＤ１４に生成したコンテキスト構造体のアドレスを設定し（部分ステップＳ１２４）、コンテキスト対応割付ステップの処理を終了する（部分ステップＳ１２６）。
【０２０３】
また、部分ステップＳ１２１において、コンテキストプールＤ０４にコンテキスト構造体Ｄ５０がストックされている場合には（部分ステップＳ１２１：ＹＥＳ）、コンテキストプールＤ０４から取り出したコンテキスト構造体Ｄ５０のアドレスを、現スレッド構造体のコンテキスト構造体へのポインタＤ１４に設定し（部分ステップＳ１２５）、コンテキスト対応割付ステップの処理を終了する（部分ステップＳ１２６）。
【０２０４】
＜具体例＞
スレッド構造体Ｄ１０Ａ、スレッド構造体Ｄ１０Ｂ、スレッド構造体Ｄ１０Ｃに対応するそれぞれのスレッドとの間で切り替えが発生する場合を例に、情報処理装置２０００の動作を具体的に説明する。
【０２０５】
以下では、現スレッド構造体へのポインタＤ０２は「Ｄ１０Ｃ」であり、スレッド構造体Ｄ１０Ａのスレッド状態Ｄ１１は「Ｔ２」、スレッド優先度Ｄ１２は「最低」、メッセージキューＤ１５は「ＭＥＳ」（１つのメッセージがある）、コンテキスト構造体へのポインタＤ１４は「Ｄ５０Ａ」であるものとする。
【０２０６】
また、スレッド構造体Ｄ１０Ｂのスレッド状態Ｄ１１は「Ｔ２」、スレッド優先度Ｄ１２は「中」、メッセージキューＤ１５は「ＭＥＳ」、コンテキスト構造体へのポインタＤ１４は「ＮＵＬＬ」であるものとする。
【０２０７】
また、スレッド構造体Ｄ１０Ｃのスレッド状態Ｄ１１は「Ｔ１」、スレッド優先度Ｄ１２は「高」、メッセージキューＤ１５は空、コンテキスト構造体へのポインタＤ１４は「Ｄ５０Ｂ」であるものとし、コンテキスト構造体Ｄ５０Ｂのメッセージ待ち状態コンテキスト保管フラグＤ３２は「真」であるものとする。
【０２０８】
また、スレッド構造体Ｄ１０Ｃに対応するスレッドが図８の左側に示すメッセージループステップＳ１００内の部分ステップＳ１０１の処理をこれから実行するものとして説明する。
【０２０９】
＜１回目の切り替え＞
スレッド構造体Ｄ１０Ｃに対応するスレッドは、スレッド構造体Ｄ１０ＣのメッセージキューＤ１５にメッセージがないので（同図左側の部分ステップＳ１０１：ＮＯ）、実施の形態１の具体例で説明したのと同様に、部分ステップＳ１０２〜Ｓ１０５を実行する。この例では、部分ステップＳ１０４の処理により、現スレッド構造体へのポインタＤ０２が「Ｄ１０Ｂ」に更新される。
【０２１０】
ディスパッチ要求改良ステップＳ１３０の呼び出しを受けて、実行制御部２０２０は、現スレッド構造体へのポインタＤ０２（Ｄ１０Ｂ）と前スレッド構造体へのポインタＤ０３（Ｄ１０Ａ）が同一でなく（図１７の部分ステップＳ１３１：ＮＯ）、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値は「真」であり（部分ステップＳ１３２：ＹＥＳ）、コンテキスト未対応検出ステップＳ０５０の戻り値が「真」であるので（部分ステップＳ１３３：ＹＥＳ）、実行制御部２０２０は、コンテキスト対応移動ステップＳ０６０を呼び出す（部分ステップＳ１３４）。
【０２１１】
実行制御部２０２０からの指示を受けて、コンテキスト対応移動部２０３１は、前スレッド構造体（Ｄ１０Ｃ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ｂ）のメッセージ待ち状態コンテキスト保管フラグＤ３２が「真」であるので（部分ステップＳ０６１：ＹＥＳ）、現スレッド構造体（Ｄ１０Ｂ）のコンテキスト構造体へのポインタＤ１４を「Ｄ５０Ｂ」に、前スレッド構造体（Ｄ１０Ｃ）のコンテキスト構造体へのポインタＤ１４を「ＮＵＬＬ」に設定し（部分ステップＳ０６４、Ｓ０６５）、コンテキスト対応移動ステップの処理を終了する（部分ステップＳ０６６）。
【０２１２】
再びディスパッチ要求改良ステップの処理に戻り、実行制御部２０２０は、ディスパッチ要求改良ステップの処理を終了する（図１７の部分ステップＳ１３９）。
【０２１３】
＜２回目の切り替え＞
スレッド構造体Ｄ１０Ｂに対応するスレッドは、スレッド構造体Ｄ１０ＢのメッセージキューＤ１５にメッセージがあるので（図８左側の部分ステップＳ１０１：ＹＥＳ）、取り出したメッセージを引数にしてメッセージハンドラの処理を行う（部分ステップＳ１０６）。なお、この例では、メッセージハンドラ内でのスレッドの切り替えはなされなかったものとする。
【０２１４】
再び、部分ステップＳ１０１の処理に戻り、スレッド構造体Ｄ１０Ｂに対応するスレッドは、スレッド構造体Ｄ１０ＢのメッセージキューＤ１５にメッセージがないので（部分ステップＳ１０１：ＮＯ）、上記１回目の切り替えの際と同様に、部分ステップＳ１０２〜Ｓ１０５を実行する。この例では、部分ステップＳ１０４の処理により、現スレッド構造体へのポインタＤ０２が「Ｄ１０Ａ」に更新される。
【０２１５】
ディスパッチ要求改良ステップＳ１３０の呼び出しを受けて、実行制御部２０２０は、現スレッド構造体（Ｄ１０Ａ）と前スレッド構造体（Ｄ１０Ｂ）が同一でなく（図１７の部分ステップＳ１３１：ＮＯ）、メッセージ待ち状態遷移検出ステップＳ０１０の戻り値は「真」であり（部分ステップＳ１３２：ＹＥＳ）、コンテキスト未対応検出ステップＳ０５０の戻り値が「偽」であるので（部分ステップＳ１３３：ＮＯ）、実行制御部２０２０は、コンテキスト対応開放・復元ステップＳ０７０を呼び出す（部分ステップＳ１３５）。
【０２１６】
実行制御部２０２０からの指示を受けて、コンテキスト対応開放・復元部２０３２は、前スレッド構造体（Ｄ１０Ｂ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ｂ）のメッセージ待ち状態コンテキスト保管フラグＤ３２が「真」であるので（部分ステップＳ０７１：ＹＥＳ）、前スレッド構造体（Ｄ１０Ｂ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ｂ）をコンテキストプールＤ０４にストックし、この前スレッド構造体のコンテキスト構造体へのポインタＤ１４を「ＮＵＬＬ」に初期化する（部分ステップＳ０７４）。
【０２１７】
続いて、コンテキスト対応開放・復元部２０３２は、現スレッド構造体（Ｄ１０Ａ）のコンテキスト構造体へのポインタＤ１４が指すコンテキスト構造体（Ｄ５０Ａ）の一般待ち状態コンテキストＤ３３の値をＣＰＵのレジスタに設定し（部分ステップＳ０７５）、コンテキスト対応開放・復元ステップの処理を終了する（部分ステップＳ０７６）。
【０２１８】
再びディスパッチ要求改良ステップの処理に戻り、実行制御部２０２０は、ディスパッチ要求改良ステップの処理を終了する（図１７の部分ステップＳ１３９）。
【０２１９】
上述した例では、ディスパッチ要求改良ステップＳ１３０内で、コンテキスト対応移動ステップＳ０６０とコンテキスト対応開放・復元ステップＳ０７０とが呼ばれて、スレッドの切り替えがなされているので、ディスパッチステップＳ０４０が呼ばれる場合と比較し、高速にスレッドの切り替えがなされているといえる。
【０２２０】
＜補足＞
以上、本発明に係る情報処理装置について実施の形態に基づいて説明したが、以下のように変形することも可能であり、本発明は上述の実施の形態で示した通りの情報処理装置に限られないことは勿論である。
【０２２１】
（１）各実施の形態では、１つのプロセッサを用いて複数のスレッドを切り替えながら並行して実行させる例を説明したが、複数のプロセッサを用いて複数のスレッドを切り替えながら並列して実行させるようにしてもよい。この場合、各プロセッサに対してスレッドの割り当てる際に、各実施の形態で説明したように割り当てを行えばよい。
【０２２２】
（２）各実施の形態では、メインループステップに対応するプログラミングコードを各スレッドが共用し、それぞれのスレッドがそのコードを実行するものとして説明したが、各スレッド用に同一の処理構造を有するコードを用意し、それぞれが自スレッド用のコードを実行するようにしてもよい。その場合、これから実行しようとしている現スレッドは、自スレッド用のコードが記憶されているメモリ上の位置を本発明に係る情報処理装置に与える必要が有るが、例えば、そのスレッドに対応するスレッド構造体に、自スレッド用のコードが記憶されているメモリ上のベースアドレス値を含ませることにより実現可能である。
【０２２３】
（３）本発明におけるスケジューリング手段は各実施の形態におけるスケジュール部１０２０に相当し、本発明における第１検出手段は各実施の形態における遷移検出部１０３０に相当し、本発明における第２検出手段は実施の形態１における起床検出部１０４０、実施の形態２におけるコンテキスト未対応検出部２０１０に相当し、本発明におけるコンテキスト記憶手段及び初期コンテキスト記憶手段は各実施の形態における記憶部１０１０に相当し、本発明におけるコンテキスト対応付け手段及び設定手段は、各実施の形態における実行制御部と対応付け部とディスパッチ部１０６０とに相当する。
【産業上の利用可能性】
【０２２４】
本発明に係る情報処理装置は、マルチスレッド実行制御に利用される。
【符号の説明】
【０２２５】
１０００、２０００    情報処理装置
１０１０    記憶部
１０２０    スケジュール部
１０３０    遷移検出部
１０４０    起床検出部
１０５０、２０２０    実行制御部
１０６０    ディスパッチ部
１０７０、２０３０    対応付け部
１０７１    コンテキスト対応交換部
２０１０    コンテキスト未対応検出部
２０３１    コンテキスト対応移動部
２０３２    コンテキスト対応開放・復元部
２０３３    コンテキスト保管・対応割付部
【手続補正２】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置であって、
実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリング手段と、
非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出手段と、
実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出手段と、
前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定手段とを備える
ことを特徴とする情報処理装置。
【請求項２】
前記情報処理装置は、更に、
スレッドに対応付けてコンテキストを記憶するためのコンテキスト記憶手段と、
前記第１検出手段が検出しなかった場合に、前記プロセッサに設定されているコンテキストを、前記第１のスレッドと対応付けられたコンテキストとして前記コンテキスト記憶手段に記憶させるコンテキスト対応付け手段を備え、
前記設定手段は、前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定せず、前記第２検出手段が検出しなかった場合に、前記第２のスレッドに対応付けられたコンテキストを、前記プロセッサに設定する
ことを特徴とする請求項１記載の情報処理装置。
【請求項３】
前記コンテキスト対応付け手段は、更に
前記第１検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第１のスレッドと対応付けられたコンテキストと当該第１のスレッドとの対応付けを削除する
ことを特徴とする請求項２記載の情報処理装置。
【請求項４】
前記情報処理装置は、
前記コンテキスト記憶手段においてコンテキストが対応付けられていないスレッド用の前記既定の処理部分を処理の開始位置とするための初期コンテキストを記憶する初期コンテキスト記憶手段を備え、
前記第２検出手段は、前記コンテキスト記憶手段において、前記第２のスレッドとコンテキストとが対応付けられていない場合に、当該第２のスレッドにおける処理の開始位置が、前記既定の処理部分であると検出し、
前記コンテキスト対応付け手段は、更に
前記第２検出手段が検出した場合において、前記第１検出手段が検出したときは、前記第１のスレッドに対応付けられたコンテキストの対応付け先を、前記第２のスレッドに変更し、前記第１検出手段が検出しなかったときは、前記初期コンテキストを前記第２のスレッドと対応付けられたコンテキストとして、前記コンテキスト記憶手段に記憶させ、
前記設定手段は、前記第１検出手段が検出せず、かつ前記第２検出手段が検出した場合に、前記コンテキスト対応付け手段により前記第２のスレッドと対応付けて前記コンテキスト記憶手段に記憶されている初期コンテキストを前記プロセッサに設定する
ことを特徴とする請求項３記載の情報処理装置。
【請求項５】
前記情報処理装置は、更に
前記第１検出手段が検出し、かつ前記第２検出手段が検出した場合に、前記コンテキスト記憶手段に記憶されている、前記第２のスレッドと対応付けられているコンテキストの対応付け先を前記第１のスレッドに、前記第１のスレッドと対応付けられているコンテキストの対応付け先を前記第２のスレッドにそれぞれ変更するコンテキスト対応付け手段を備える
ことを特徴とする請求項２記載の情報処理装置。
【請求項６】
前記イベントは、メッセージであり、
前記非実行状態は、メッセージの受信を待つメッセージ待ち状態を含み、
前記複数のスレッドには、次に実行状態になった際の処理の開始位置が、前記既定の処理部分となる場合には、前記メッセージ待ち状態に遷移することを示すフラグを設定するよう構成されたスレッドを含み、
前記第１検出手段及び前記第２検出手段は、検出対象のスレッドにおいて、前記フラグが設定されていることを検出することにより、当該検出対象のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する
ことを特徴とする請求項５記載の情報処理装置。
【請求項７】
それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置において用いられる情報処理方法であって、
スケジューリング手段が、実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるステップと、
第１検出手段が、非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出するステップと、
第２検出手段が、実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出するステップと、
設定手段が、前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出手段及び前記第２検出手段の検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作するステップとを備える
ことを特徴とする情報処理方法。
【請求項８】
それぞれがイベントの取得に対応して処理を行う複数のスレッドを、切り換えながらプロセッサにより実行する情報処理装置にスレッドの実行制御処理を実行させるための情報処理プログラムであって、
前記スレッドの実行制御処理は、
実行状態である第１のスレッドの状態を非実行状態に遷移させ、前記複数のスレッドの中から次に実行する第２のスレッドを選択して実行状態に遷移させるスケジューリングステップと、
非実行状態に遷移させられる前記第１のスレッドにおける、次に実行状態になった際の処理の開始位置が、イベントの取得に対応した既定の処理部分であることを検出する第１検出ステップと、
実行状態に遷移させられる前記第２のスレッドにおける処理の開始位置が、前記既定の処理部分であることを検出する第２検出ステップと、
前記第２のスレッドが実行状態に遷移させられる際に、前記第１検出ステップ及び前記第２検出ステップの検出結果に応じて、前記第２のスレッドの実行用のコンテキストを、前記プロセッサに設定するか否かを切り替えて動作する設定ステップとを備える
ことを特徴とする情報処理プログラム。
【手続補正３】
【補正対象書類名】図面
【補正対象項目名】全図
【補正方法】変更
【補正の内容】
【図１】
2009157127.tif 000025
【図２】
2009157127.tif 000026
【図３】
2009157127.tif 000027
【図４】
2009157127.tif 000028
【図５】
2009157127.tif 000029
【図６】
2009157127.tif 000030
【図７】
2009157127.tif 000031
【図８】
2009157127.tif 000032
【図９】
2009157127.tif 000033
【図１０】
2009157127.tif 000034
【図１１】
2009157127.tif 000035
【図１２】
2009157127.tif 000036
【図１３】
2009157127.tif 000037
【図１４】
2009157127.tif 000038
【図１５】
2009157127.tif 000039
【図１６】
2009157127.tif 000040
【図１７】
2009157127.tif 000041
【図１８】
2009157127.tif 000042
【図１９】
2009157127.tif 000043
【図２０】
2009157127.tif 000044
【図２１】
2009157127.tif 000045
【図２２】
2009157127.tif 000046
【国際調査報告】
2009157127.tif 000047
2009157127.tif 000048
2009157127.tif 000049
2009157127.tif 000050