(57)【要約】【課題】複数のスレッドの必要性能を満たし、さらに、プログラム設計の柔軟性を確保するプログラム制御装置を提供する。【解決手段】本発明のプログラム制御装置は、タイムスロット毎に実行すべきスレッドを切換えるプログラム制御装置であって、１つのタイムスロットを宛先とする第１割込み信号を発生する第１割込み発生部１３と、前記宛先とされたタイムスロットと現在のタイムスロットとが一致しない場合に当該第１割込み信号を受理せず、一致する場合に当該第１割込み信号を受理する第１割込み受理部２１とを備える。【選択図】図１
2009059310.tif 000002
【特許請求の範囲】
【請求項１】
タイムスロット毎に実行すべきスレッドを切換えるプログラム制御装置であって、
１つのタイムスロットを宛先とする第１割込み信号を発生する発生手段と、
前記宛先とされたタイムスロットと現在のタイムスロットとが一致しない場合に当該第１割込み信号を受理せず、一致する場合に当該第１割込み信号を受理する受理手段と
を備えることを特徴とするプログラム制御装置。
【請求項２】
前記プログラム制御装置は、
スレッドが割り当てられるタイムスロットの識別子を含むスレッド情報と、対応するスレッドを示す情報を含むタイムスロット情報とを記憶する記憶手段と、
前記スレッド情報およびタイムスロット情報に基づいて前記第１割込み信号の宛先となるタイムスロットを判別する判別手段とを備え、
前記発生手段は、前記判別手段の判別結果を宛先とする第１割込み信号を発生する
ことを特徴とする請求項１記載のプログラム制御装置。
【請求項３】
前記プログラム制御装置は、さらに、
現在のタイムスロットで実行中のスレッドからシステムコールを受け付ける受付処理部と、
前記システムコールに基づいてスレッドの状態またはタイムスロットの状態を変更するスケジューリング部とを備え、
前記発生手段は、
前記スケジューリング部によって前記スレッドの状態が変更された場合、関連するスレッドのタイムスロットの指定を含む前記第１割込み信号を発生し、
前記スケジューリング部によって前記タイムスロットの状態が変更された場合、第２割込み信号を発生し、
前記プログラム制御装置は、さらに、前記受理手段によって受理された第１割込み信号に応じてタイムスロット内でスレッドの切換を行なう第１ディスパッチ手段と、
前記受理手段によって受理された第２割込み信号に応じて前記タイムスロット情報を変更する第２ディスパッチ手段とを備える
ことを特徴とする請求項２記載のプログラム制御装置。
【請求項４】
前記プログラム制御装置は、さらに、前記タイムスロットの割り当て時間に従ってタイムスロットを切り換えるタイムスロット切換部を備え、
前記タイムスロット切換部は、タイムスロットの切換期間では割込みを禁止し、タイムスロットの切換完了直後に前記受理手段に割込みの受理を許可する
ことを特徴とする請求項３記載のプログラム制御装置。
【請求項５】
前記プログラム制御装置は、複数のプロセッサを含むマルチプロセッサに備えられ、
前記発生手段は、プロセッサの指定とタイムスロットの指定とを含む前記第１の割込み信号を発生し、
前記受理手段は、プロセッサ毎に前記第１割込み信号を受理し、かつプロセッサの指定と一致しないプロセッサにおいて前記第１の割込みを受理しない
ことを特徴とする請求項１記載のプログラム制御装置。
【請求項６】
前記プログラム制御装置は、さらに
スレッド毎に、スレッドの状態と、スレッドが割り当てられるタイムスロットの識別子とを含む前記スレッド情報を記憶するスレッド記憶手段と、
タイムスロットの割り当て時間と、当該タイムスロットに対応するスレッド情報と、当該タイムスロットが割り当てられるプロセッサの識別子とを含む前記タイムスロット情報をタイムスロット毎に記憶するタイムスロット情報記憶手段と、
プロセッサ毎に設けられ、現在のタイムスロットで実行中のスレッドからシステムコールを受け付ける受付処理部と、
プロセッサ毎に設けられ、受け付けられた前記システムコールに基づいてスレッドを定義するスレッド情報またはタイムスロットを定義するタイムスロット情報を変更するスケジューリング部とを備え、
前記発生手段は、
プロセッサ毎に設けられ、対応するスケジューリング部によって前記スレッド情報が変更された場合に、宛先となるプロセッサの指定と宛先となるタイムスロットの指定とを含む前記第１割込み信号を発生する第１割込み発生部と、
各プロセッサに設けられ、対応するスケジューリング部によって前記タイムスロット情報が変更された場合に宛先となるプロセッサの指定を含む第２割込み信号を発生する第２割込み発生部とを備える
ことを特徴とする請求項５記載のプログラム制御装置。
【請求項７】
前記スケジューリング部は、前記タイムスロット識別子およびプロセッサ識別子に基づいて、変更されたスレッド情報に対応するプロセッサおよびタイムスロットを特定し、
前記第１割込み手段は、前記スケジューリング部による特定されたプロセッサおよびタイムスロットに従って前記第１割込み信号を発生する
ことを特徴とする請求項６記載のプログラム制御装置。
【請求項８】
前記受理手段は、プロセッサの指定と一致しないプロセッサにおいて前記第２割込み信号を受理せず、かつ各プロセッサにおける特定のタイムスロットにおいて第２割込み信号を受理する
ことを特徴とする請求項６記載のプログラム制御装置。
【請求項９】
前記プログラム制御装置は、さらに、
プロセッサ毎に設けられ、前記タイムスロットの割り当て時間に従ってタイムスロットを切り換えるタイムスロット切換部と、
プロセッサ毎に設けられ、前記受理手段によって受理された第１割込み信号に応じてタイムスロット内でスレッドの切換を行なう第１ディスパッチ手段と、
プロセッサ毎に設けられ、前記受理手段によって受理された第２割込み信号に応じて前記タイムスロット情報を変更する第２ディスパッチ手段と
を備えることを特徴とする請求項６記載のプログラム制御装置。
【請求項１０】
前記タイムスロット切換部は、タイムスロットの切換期間では割込みを禁止し、タイムスロットの切換完了直後に前記受理手段に割込みの受理を許可する
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１１】
前記第２ディスパッチ手段は、第２割込み信号に応じてタイムスロット情報の追加または削除を行なう
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１２】
前記第２ディスパッチ手段は、プロセッサ毎にタイムスロットの割り当て時間の総和を算出し、プロセッサ毎の総和に基づいて、新たに追加されるタイムスロット情報に対応するプロセッサを選択する
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１３】
前記第２ディスパッチ手段は、割り当て時間の変更を示す前記システムコールに基づく第２割込み信号に応じて、タイムスロット情報中の割り当て時間を変更する
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１４】
前記スレッド情報はさらにスレッドの優先度を含み、
前記第１ディスパッチ手段は、前記第１割込み信号に応じて、当該タイムスロットに対応する１つまたは複数のスレッドの中から最も優先度の高いスレッドに切り換える
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１５】
前記タイムスロット切換部は、次のタイムスロットに対応するタイムスロット情報が無効である場合に更に次のタイムスロットのタイムスロット情報に従ってタイムスロットを切り換える
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１６】
前記第１ディスパッチ手段は、当該タイムスロットに対応するスレッドの中に実行可能なスレッドが存在しない場合に、実行可能なスレッドが設定されるまで対応するタイムスロット情報を無効にする
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１７】
前記タイムスロット切換部は、対応するプロセッサの全てのタイムスロット情報が無効である場合に当該プロセッサを省電力モードに変更する
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１８】
前記プログラム制御装置は、さらに
スレッド間通信に用いられるオブジェクト毎に、当該オブジェクトが第１の状態か第２の状態かを示すオブジェクト情報を記憶するオブジェクト記憶手段を備え、
前記受付処理部は、前記システムコールに応じて、前記オブジェクト情報を第１の状態から第２の状態にまたは第２の状態から第１の状態に変更し、
前記スケジューリング部は、
実行中のスレッドが前記第１の状態のオブジェクトをアクセスしようとしたときに、当該スレッドを実行可能状態から待ち状態に変更し、当該オブジェクトが前記第２の状態に変更されたときに、待ち状態のスレッドを１つまたは複数選択して実行可能状態に変更し、
前記スレッド切換手段は、待ち状態にあるスレッドを切換先の対象から除外する
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項１９】
前記オブジェクトは、１つの資源に対応し、複数のスレッドからの当該資源へのアクセスの競合を調停するためのオブジェクトであり、
前記受付処理部は、システムコールに従って前記資源の使用権の獲得をした場合に対応するオブジェクト情報を第１の状態に変更し、システムコールに従って資源の使用権を解放した場合に対応するオブジェクト情報を第２の状態に変更し、
前記受付処理部に対応する第１割込み発生部は、前記オブジェクト情報の状態が変更された場合に前記オブジェクト情報をパラメータとする前記第１割込み信号を発生し、
前記第１ディスパッチ手段は、さらに、前記オブジェクト情報をパラメータとする前記第１割込み信号に応じてスレッドの切換を行なう
ことを特徴とする請求項１８記載のプログラム制御装置。
【請求項２０】
前記オブジェクトは、１つの資源に対応し、１つの資源の状態を変更した際に他のスレッドに対して通知を行うためのオブジェクトであり、
前記受付処理部は、前記システムコールに従って前記資源の変更を待つ指示をした場合に対応するオブジェクト情報を第１の状態に変更し、システムコールに従って前記スレッドによって資源の変更を知らせる指示をした場合に対応するオブジェクト情報を第２の状態に変更する
ことを特徴とする請求項１８記載のプログラム制御装置。
【請求項２１】
前記オブジェクトは、２つのスレッドの同期を取るために、同期のための条件と状態を管理するオブジェクトであり、
前記受付処理部は、前記システムコールに従って変数の条件が成立するまで待つ指示をした場合に対応するオブジェクト情報を第１の状態に変更し、システムコールに従って変数の条件が成立したことを示す指示をした場合に対応するオブジェクト情報を第２の状態に変更する
ことを特徴とする請求項１８記載のプログラム制御装置。
【請求項２２】
前記オブジェクトは、２つ以上のスレッドが１つ以上の資源を競合してアクセスする場合に調停を行うオブジェクトであり、
前記オブジェクトに対応するオブジェクト情報は、いずれかのスレッドよりアクセス可能な資源についての資源数を含み、
前記受付処理部は、前記システムコールによって資源の獲得が指示された場合に前記資源数を減算し、資源数が所定値に到達したとき、対応するオブジェクト情報を第１の状態に変更し、システムコールに従って資源の解放が指示された場合に資源数を加算し、前記情報を第２の状態に変更する
ことを特徴とする請求項１８記載のプログラム制御装置。
【請求項２３】
前記スケジューリング部は、
第１のスレッドの終了指示を含むシステムコールに従って前記第１のスレッドの状態を終了状態に変更し、
前記第１のスレッドの状態が終了状態に変更されたときに、待ち状態のスレッドを１つまたは複数選択して実行可能状態に変更し、
第２のスレッドの終了待ち指示を含むシステムコールに従って前記第２のスレッドの状態を待ち状態に変更し、
前記第１ディスパッチ手段は、待ち状態にあるスレッドを切換先の対象から除外する
ことを特徴とする請求項９記載のプログラム制御装置。
【請求項２４】
タイムスロット毎に実行すべきスレッドを切換えるオペレーティングシステムであって、
１つのタイムスロットを宛先とする第１割込み信号を発生する発生手段と、
前記宛先とされたタイムスロットと現在のタイムスロットとが一致しない場合に当該第１割込み信号を受理せず、一致する場合に当該第１割込み信号を受理する受理手段と
を備えることを特徴とするオペレーティングシステム。
【請求項２５】
タイムスロット毎に実行すべきスレッドを切換えるプログラム制御方法であって、
１つのタイムスロットを宛先とする第１割込み信号を発生し、
前記宛先とされたタイムスロットと現在のタイムスロットとが一致するか否かを判定し、
一致しないと判定された場合に当該第１割込み信号を受理せず、一致すると判定された場合に当該第１割込み信号を受理する
ことを特徴とするプログラム制御方法。
【請求項２６】
タイムスロット毎に実行すべきスレッドを切換えるプログラムを記録するコンピュータ読み取り可能な記録媒体であって、
１つのタイムスロットを宛先とする第１割込み信号を発生する発生手段と、
前記宛先とされたタイムスロットと現在のタイムスロットとが一致しない場合に当該第１割込み信号を受理せず、一致する場合に当該第１割込み信号を受理する受理手段と
をコンピュータに発揮させる前記プログラムを記録する記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、タイムスロット毎に実行すべきスレッドを切換えるプログラム制御装置すなわちＯＳ(Operating System)に関する。
【背景技術】
【０００２】
ＯＳの主な機能は、ハードウェア管理、スレッド管理、データ管理及び入出力管理である。中でもスレッド管理はスレッドの実行順序を管理するものであり、ＣＰＵやメモリ、入出力装置等を効率良く動作させるための重要な機能である。
【０００３】
ここで「スレッド」とは、プログラムの起動とその実行、終了などの流れを一括管理する制御単位のことである。
【０００４】
オペレーティングシステムの管理下で動作するプログラムはスレッドとして扱われ、プログラムの実行に関するＯＳの操作はすべてスレッドを単位として行われる。
【０００５】
スレッドの実行順序を決定するアルゴリズムの一つとして、ラウンドロビンスケジューリングがある。ラウンドロビンスケジューリングは、制御単位であるスレッドにある実行時間を割り当て、割り当てられた時間の間はプロセッサの実行権がスレッドに与えられ、割り当てられた時間が過ぎると別のスレッドに実行権を移す方法である。これによりすべてのスレッドに平等かつ決められた時間で実行権が割り当てられる。
【０００６】
メディア処理をプロセッサで実施するリアルタイムシステムでは、複数の符号化、復号化、多重化処理などを同時に実施する必要があり、実行権を平等に割り当てるために、メディア処理を実現する各機能をスレッドに分割し、機能毎に実行時間を割り当てることで、ラウンドロビンスケジューリングが適用できる。
【０００７】
しかし、ラウンドロビンスケジューリングは、一旦スレッドが実行権を失うと次に実行権が割り当てられるのは１周期経過後であり、リアルタイムシステムにおいては応答性に問題がある。周期を短く設定することで応答性は改善されるが、周期が短くなるほど実行権を切り換える処理にかかるオーバーヘッドが顕在化する。実行権を切り換える処理にかかるオーバーヘッドを解消するため、実行権を切り換える際に、コンテキストの退避復帰をハードウェアで行うプロセッサが開示されている（特許文献１）。
【０００８】
さらに、マルチプロセッサ構成で上記従来技術を実現する場合、スレッドをどのプロセッサに割り当てるかが問題となる。
【０００９】
対称型マルチプロセッサ構成では、システム負荷を複数のプロセッサに分散するように、スケジュール時に動的にスレッドをプロセッサに割り当てるため、スレッド毎に実行時間を割り当てるのは困難である。
【００１０】
よって、スレッド毎にプロセッサを割り当てる場合、プロセッサも固定的に決定する必要がある。非特許文献１には、スレッド毎に割り当てるプロセッサを決定し、プロセッサごとに優先度スケジューリングを行うリアルタイムＯＳが開示されている
【特許文献１】特許第３８１３９３０号公報
【非特許文献１】情報処理学会誌,“機能分散マルチプロセッサ向けのリアルタイムＯＳ”, Vol.47, No.1, 2006.
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、上記従来技術によれば、スレッド数が増加するに伴って、全タイムスロットの合計時間である一周期で切り換える回数が増えるとともに、コンテキストを管理する領域も増加するため、スレッド毎に必要性能を確保することが困難である。
【００１２】
またマルチプロセッサ構成では、各スレッドに直接何れかのプロセッサを割り当てることは、スレッドがプロセッサに依存した記述になるため、マルチプロセッサの構成が変更された場合のスレッドの記述も変更しなければならないため、スレッド設計の柔軟性が乏しいという問題がある。
【００１３】
本発明では、上記問題を解決するために、複数のスレッドの必要性能を満たすプログラム制御装置を提供することを第１の目的とする。さらに、プログラム設計の柔軟性を確保するプログラム制御装置を提供することを第２の目的とする。
【課題を解決するための手段】
【００１４】
上記目的を達成するために、本発明のプログラム制御装置は、タイムスロット毎に実行すべきスレッドを切換えるプログラム制御装置であって、１つのタイムスロットを宛先とする第１割込み信号を発生する発生手段と、前記宛先とされたタイムスロットと現在のタイムスロットとが一致しない場合に当該第１割込み信号を受理せず、一致する場合に当該第１割込み信号を受理する受理手段とを備える。
【００１５】
この構成によれば、宛先でないタイムスロットにおいて無用な割込み処理（割込みハンドラ）を起動させることを防止することができる。言い換えれば、スレッドが実行されるタイムスロットは１つの仮想プロセッサと考えられるので上記構成によれば、宛先でない仮想プロセッサでは第１割込み信号が受理されないので、第１割込み信号によって宛先でない仮想プロセッサの性能を劣化させることを防止することとなる。これにより、各スレッドの必要性能を確保することができる。
【００１６】
ここで、前記プログラム制御装置は、スレッドが割り当てられるタイムスロットの識別子を含むスレッド情報と、対応するスレッドを示す情報を含むタイムスロット情報とを記憶する記憶手段と、前記スレッド情報およびタイムスロット情報に基づいて前記第１割込み信号の宛先となるタイムスロットを判別する判別手段とを備え、前記発生手段は、前記判別手段の判別結果を宛先とする第１割込み信号を発生するようにしてもよい。
【００１７】
この構成によれば、第１割り込み信号の宛先がスレッド情報及びタイムスロット情報に基づいて決定されるので、各スレッドのプログラム設計においてスレッドを実行するプロセッサの記述、およびスレッド間通信における通信先スレッドの記述を不要にすることができ、プログラム設計の柔軟性を確保することができる。
【００１８】
ここで、前記プログラム制御装置は、さらに、現在のタイムスロットで実行中のスレッドからシステムコールを受け付ける受付処理部と、前記システムコールに基づいてスレッドの状態またはタイムスロットの状態を変更するスケジューリング部とを備え、前記発生手段は、前記スケジューリング部によって前記スレッドの状態が変更された場合、関連するスレッドのタイムスロットの指定を含む前記第１割込み信号を発生し、前記スケジューリング部によって前記タイムスロットの状態が変更された場合、第２割込み信号を発生し、前記プログラム制御装置は、さらに、前記受理手段によって受理された第１割込み信号に応じてタイムスロット内でスレッドの切換を行なう第１ディスパッチ手段と、前記受理手段によって受理された第２割込み信号に応じて前記タイムスロット情報を変更する第２ディスパッチ手段とを備えるようにしてもよい。
【００１９】
この構成によれば、各スレッドからのシステムコールに基づいて、例えば、通信先のスレッドが属しているタイムスロットのプロセッサを知ることができ、通信先スレッドに該当するタイムスロットに対して第１割込み信号用いて第１ディスパッチ手段を駆動する。これにより、スレッド間通信による性能劣化を押さえることができる。
【００２０】
ここで、前記プログラム制御装置は、さらに、前記タイムスロットの割り当て時間に従ってタイムスロットを切り換えるタイムスロット切換部を備え、前記タイムスロット切換部は、タイムスロットの切換期間では割込みを禁止し、タイムスロットの切換完了直後に前記受理手段に割込みの受理を許可するようにしてもよい。
【００２１】
この構成によれば、タイムスロットの切換は、第１割込み信号よりも優先、つまりタイムスロット内の実行に優先して行われるため、タイムスロットに割り当てた時間が損なわれることはない。
【００２２】
ここで、前記プログラム制御装置は、複数のプロセッサを含むマルチプロセッサに備えられ、前記発生手段は、プロセッサの指定とタイムスロットの指定とを含む前記第１の割込み信号を発生し、前記受理手段は、プロセッサ毎に前記第１割込み信号を受理し、かつプロセッサの指定と一致しないプロセッサにおいて前記第１の割込みを受理しないようにしてもよい。
【００２３】
この構成によれば、第１割込み信号の宛先でないプロセッサにおいて無用な割込み処理（割込みハンドラ）を起動させることを防止し、宛先でないプロセッサのおけるタイムスロット毎のスレッドの処理性能を確保することができる。
【００２４】
ここで、前記プログラム制御装置は、さらに、スレッド毎に、スレッドの状態と、スレッドが割り当てられるタイムスロットの識別子とを含む前記スレッド情報を記憶するスレッド記憶手段と、タイムスロットの割り当て時間と、当該タイムスロットに対応するスレッド情報と、当該タイムスロットが割り当てられるプロセッサの識別子とを含む前記タイムスロット情報をタイムスロット毎に記憶するタイムスロット情報記憶手段と、プロセッサ毎に設けられ、現在のタイムスロットで実行中のスレッドからシステムコールを受け付ける受付処理部と、プロセッサ毎に設けられ、受け付けられた前記システムコールに基づいてスレッドを定義するスレッド情報またはタイムスロットを定義するタイムスロット情報を変更するスケジューリング部とを備え、前記発生手段は、プロセッサ毎に設けられ、対応するスケジューリング部によって前記スレッド情報が変更された場合に、宛先となるプロセッサの指定と宛先となるタイムスロットの指定とを含む前記第１割込み信号を発生する第１割込み発生部と、各プロセッサに設けられ、対応するスケジューリング部によって前記タイムスロット情報が変更された場合に宛先となるプロセッサの指定を含む第２割込み信号を発生する第２割込み発生部とを備えるようにしてもよい。
【００２５】
この構成によれば、スレッド情報およびタイムスロット情報は、スレッドに割り当てられたタイムスロットおよびプロセッサの対応関係を含むので、プログラム制御装置において、スレッドを任意のタイムスロットおよび任意のプロセッサに動的に割り当てることを可能にする。これにより、各スレッドのプログラム設計においてスレッドを実行するプロセッサを記述する必要がなく、プログラム設計の柔軟性を確保することができる。
【００２６】
ここで、前記スケジューリング部は、前記タイムスロット識別子およびプロセッサ識別子に基づいて、変更されたスレッド情報に対応するプロセッサおよびタイムスロットを特定し、前記第１割込み手段は、前記スケジューリング部による特定されたプロセッサおよびタイムスロットに従って前記第１割込み信号を発生するようにしてもよい。
【００２７】
ここで、前記受理手段は、プロセッサの指定と一致しないプロセッサにおいて前記第２割込み信号を受理せず、かつ各プロセッサにおける特定のタイムスロットにおいて第２割込み信号を受理するようにしてもよい。
【００２８】
ここで、前記プログラム制御装置は、さらに、プロセッサ毎に設けられ、前記タイムスロットの割り当て時間に従ってタイムスロットを切り換えるタイムスロット切換部と、プロセッサ毎に設けられ、前記受理手段によって受理された第１割込み信号に応じてタイムスロット内でスレッドの切換を行なう第１ディスパッチ手段と、プロセッサ毎に設けられ、前記受理手段によって受理された第２割込み信号に応じて前記タイムスロット情報を変更する第２ディスパッチ手段とを備えるようにしてもよい。
【００２９】
ここで、前記タイムスロット切換部は、タイムスロットの切換期間では割込みを禁止し、タイムスロットの切換完了直後に前記受理手段に割込みの受理を許可するようにしてもよい。
【００３０】
この構成によれば、第１ディスパッチ手段によるスレッド切換、例えば、タイムスロットに割り当てられた複数のスレッドから実行するスレッドを選択し実行を開始する処理は、タイムスロットに割り当てられた時間内でのみ行われる。また、第２ディスパッチ手段によるタイムスロット情報の変更は、タイムスロット内のスレッド切換に優先して行われるため、タイムスロットに割り当てた時間が損なわれることはない。これにより、タイムスロット内のスレッドの必要性能を確保することができる。
【００３１】
ここで、前記第２ディスパッチ手段は、第２割込み信号に応じてタイムスロット情報の追加または削除を行なうようにしてもよい。
【００３２】
ここで、前記第２ディスパッチ手段は、プロセッサ毎にタイムスロットの割り当て時間の総和を算出し、プロセッサ毎の総和に基づいて、新たに追加されるタイムスロット情報に対応するプロセッサを選択するようにしてもよい。
【００３３】
ここで、前記第２ディスパッチ手段は、割り当て時間の変更を示す前記システムコールに基づく第２割込み信号に応じて、タイムスロット情報中の割り当て時間を変更するようにしてもよい。
【００３４】
この構成によれば、スレッド内のプログラム記述によりプロセッサの指定が不要であるため、新たなタイムスロットを任意のプロセッサに割り当てることができ、個々のプロセッサの処理性能を柔軟に動的に分配でき、マルチプロセッサ全体の処理性能を柔軟に設定することができる。
【００３５】
ここで、前記スレッド情報はさらにスレッドの優先度を含み、前記第１ディスパッチ手段は、前記第１割込み信号に応じて、当該タイムスロットに対応する１つまたは複数のスレッドの中から最も優先度の高いスレッドに切り換えるようにしてもよい。
【００３６】
タイムスロット情報およびスレッド情報には、タイムスロットがどのプロセッサに割り当てられているかが動的に記録されているため、スレッド間の同期や資源の排他制御などのためにスレッド間通信を行う場合に、スケジュール部は、通信先のスレッドが属しているタイムスロットおよびプロセッサを特定することができる。このことから、スレッド上でのスレッド間通信に必要な情報は、通信先スレッドを示す指定子とスレッド間通信オブジェクトを示す指定子だけあればよい。よって、各スレッドがどのプロセッサに属し、どのタイムスロットに属しているかを知る必要がなく、プロセッサやタイムスロットの構成が変更された場合でもスレッド上のプログラムは変更する必要がない。これにより、システムの構成をプログラムに影響することなく柔軟に変更することができる。
【００３７】
なお、本発明は、このような特徴的な手段を備えるプログラム制御装置として実現できるだけでなく、プログラム制御装置に含まれる特徴的な手段をステップとするプログラム制御方法として実現したり、プログラム制御装置に含まれる特徴的な手段としてコンピュータを機能させるＯＳとして実現したりすることもできる。そして、そのようなＯＳは、ＣＤ−ＲＯＭ（Compact Disc-Read Only Memory）等の記憶媒体やインターネット等の通信媒体を介して流通させることができるのは言うまでもない。
【発明の効果】
【００３８】
本発明によると、スレッド毎に一定の処理性能を保証しつつ、システムの構成変更に伴うプログラム変更の負担を軽減することができる。
【発明を実施するための最良の形態】
【００３９】
［全体構成］
図１は本発明の実施の形態における、タイムスロット毎に実行すべきスレッドを切り換えるプログラム制御装置の主要部の構成を示すブロック図である。同図は、プロセッサにおいてＯＳの一部の機能としてスレッド切換を行うソフトウェアを実行することにより実現される機能を模式的に表している。
【００４０】
プロセッサのハードウェア構成は、シングルプロセッサの場合は一般的なものでよい。マルチプロセッサの場合は、一般的な対称型マルチプロセッサ構成とし、各プロセッサコアからアクセス可能なメモリが接続され、それぞれのプロセッサコアから別のプロセッサコアに対して割込みを掛けて割込みハンドラを起動することが可能なものとする。
【００４１】
このプログラム制御装置は、各々が割り当て時間の指定を有する複数のスレッド群を１つないしは複数のプロセッサ内で扱い、各スレッド群の必要な性能を確保しながら実行するように構成されている。
【００４２】
このプログラム制御装置において、各プロセッサは、１つのタイムスロットを宛先とする第１割込み信号を全プロセッサに対して発生し、前記宛先とされたタイムスロットと現在のタイムスロットとが一致しない場合に当該第１割込み信号を受理せず、一致する場合に当該第１割込み信号を受理するように構成されている。
【００４３】
これにより、宛先でないタイムスロットにおいて無用な割込み処理（割込みハンドラ等）を起動させることを防止することができる。言い換えれば、スレッドが実行されるタイムスロットは１つの仮想プロセッサと考えられるので上記構成によれば、宛先でない仮想プロセッサでは第１割込み信号が受理されないので、第１割込み信号によって宛先でない仮想プロセッサの性能を劣化させることを防止することとなる。これにより、各スレッドの必要性能を確保することができる。
【００４４】
さらに、プログラム制御装置は、スレッドが割り当てられるタイムスロットの識別子を含むスレッド情報と、対応するスレッドを示す情報を含むタイムスロット情報とを記憶する記憶部を備え、前記スレッド情報およびタイムスロット情報に基づいて前記第１割込み信号の宛先となるタイムスロットを決定し、上記の発生手段が決定されたタイムスロットを宛先とする第１割込み信号を発生するように構成されている。
【００４５】
これにより、第１割り込み信号の宛先がスレッド情報及びタイムスロット情報に基づいて決定されるので、各スレッドのプログラム設計においてスレッドを実行するプロセッサの記述、およびスレッド間通信における通信先スレッドの記述を不要にすることができ、プログラム設計の柔軟性を確保することができる。
【００４６】
同図のようにプログラム制御装置は、プロセッサ１００、１１０、…１２０のそれぞれに存在する、ディスパッチ発行部１０、ディスパッチ処理部２０、タイマ制御部３０、実行制御部４０、タイムスロット記憶部５０及びコンテキスト保持部８０と、全てのプロセッサに共有される、スレッド記憶部６０及びオブジェクト記憶部７０より構成される。
【００４７】
ディスパッチ発行部１０は、スレッド上のプログラムから呼び出されるＡＰＩの処理を行い、必要に応じてディスパッチ処理部２０に対して割込みを出力する。
【００４８】
ディスパッチ処理部２０は、ディスパッチ発行部１０からの割込みを受理し、タイムスロット及びスレッドの情報を変更する。また、予め定められた周期内において、タイムスロットを少なくとも１回選択するラウンドロビンスケジューリングを行う。
【００４９】
タイマ制御部３０は、ディスパッチ処理部２０から割当時間を設定される毎に、時間のカウントを開始し、当該割当時間に達したときにタイムアウト信号を出力する。このタイムアウト信号は、タイムスロットの切換タイミングを知らせるために、ディスパッチ処理部２０に通知される。
【００５０】
実行制御部４０は、ディスパッチ処理部２０により選択されたスレッドを実行する。実行制御部４０は、スレッドを実行するＣＰＵ等のハードウェアに相当する。
【００５１】
タイムスロット記憶部５０は、タイムスロットに関する情報を記憶する。
スレッド記憶部６０は、スレッドに関する情報を記憶する。
【００５２】
オブジェクト記憶部７０は、スレッドが他のスレッドとの通信を行う際に用いるオブジェクトに関する情報を記憶する。
【００５３】
コンテキスト保持部８０は、実行しているスレッドを中断し別のスレッドの実行を再開する際に、中断するスレッドのコンテキストを退避し、再開するスレッドのコンテキストを復帰するために、コンテキストを保持する。コンテキストにはプロセッサのレジスタ情報やキャッシュ情報などが含まれる。
【００５４】
［ディスパッチ発行部１０の構成］
ディスパッチ発行部１０は、ＡＰＩ処理部１１、スケジューリング部１２、第１割込み発生部１３、第２割込み発生部１４及びＡＰＩ終了処理部１５から構成される。
【００５５】
＜ＡＰＩ処理部１１＞
ＡＰＩ処理部１１は、スレッドが実行するプログラムより発行されたＡＰＩコールを受理し、ＡＰＩに従って処理を行う。ＡＰＩはオブジェクトとともに与えられ、対応するオブジェクト情報記憶部７０の操作を行う。操作の結果、スケジューリングが必要と判断された場合は、スケジューリング部１２に対して通知を行う。
【００５６】
＜スケジューリング部１２＞
スケジューリング部１２は、ＡＰＩ処理部１１より通知を受け、タイムスロット記憶部５０、スレッド記憶部６０、オブジェクト記憶部７０の情報を更新する。更新した結果、あるタイムスロットに割り当てられたスレッドの情報を更新した場合は第１割込み発生部１３に、タイムスロットの情報を更新した場合は第２割込み発生部１４にそれぞれ通知を行う。
【００５７】
＜第１割込み発生部１３＞
第１割込み発生部１３は、スケジューリング部１２より通知を受け、情報を更新したスレッドが割り当てられているタイムスロットのプロセッサに対して割込みを掛ける。割込みは当該プロセッサのディスパッチ処理部２０の第１割込み受理部２１により受理される。
【００５８】
＜第２割込み発生部１４＞
第２割込み発生部１４は、スケジューリング部１２より通知を受け、情報を更新したタイムスロットのプロセッサに対して割込みを掛ける。割込みは当該プロセッサのディスパッチ処理部２０の第２割込み受理部２３により受理される。
【００５９】
＜ＡＰＩ終了処理部１５＞
ＡＰＩ終了処理部１５は、第１割込み発生部１３または第２割込み発生部１４により割込みを掛けた後、ＡＰＩコールの後処理を行う。具体的には、ＡＰＩコールに対する戻り値をプログラムに返す処理を行う。
【００６０】
［ディスパッチ処理部２０の構成］
ディスパッチ処理部２０は、第１割込み受理部２１、タイムスロット内ディスパッチ部２２、第２割込み受理部２３、タイムスロット状態変更部２４及びタイムスロット切換部２５から構成される。タイムスロット内ディスパッチ部２２は特許請求の範囲における第１ディスパッチ手段に相当し、タイムスロット状態変更部２４は特許請求の範囲における第２ディスパッチ手段に相当する。
【００６１】
＜第１割込み受理部２１＞
第１割込み受理部２１は、プロセッサ１００〜プロセッサ１２０のいずれかのプロセッサに属するディスパッチ発行部１０の第１割込み発生部１３により発生した割込みを受理する。割込みを受理すると、タイムスロット内ディスパッチ部２２に通知する。
【００６２】
＜タイムスロット内ディスパッチ部２２＞
タイムスロット内ディスパッチ部２２は、第１割込み受理部２１から通知を受け、タイムスロット記憶部５０より次に実行するスレッドを判別し、タイムスロット内の実行中のスレッドを当該スレッドに切り換える処理を行う。この時、当該スレッドについてスレッド記憶部６０の更新を行う。スレッドが切り換えることができなかった場合、タイムスロット状態変更部２４に通知し、タイムスロットの状態を変更する。また、スレッドを切り換える際に、コンテキスト保持部８０よりスレッドのコンテキストの退避及び復帰を行う。
【００６３】
＜第２割込み受理部２３＞
第２割込み受理部は、プロセッサ１００〜プロセッサ１２０のいずれかのプロセッサに属するディスパッチ発行部１０の第２割込み発生部１４により発生した割込みを受理する。割込みを受理すると、タイムスロット状態変更部２４に通知する。
【００６４】
＜タイムスロット状態変更部２４＞
タイムスロット状態変更部２４は、第１割込み受理部２１から通知を受け、スケジューリング部１２で設定された情報を元に、タイムスロット記憶部５０に対してタイムスロット情報の設定を行う。タイムスロット状態変更部２４の処理を行う際には、情報の矛盾が起こらないようにするため、全ての割込み要求やタイマによる切り換え要求を禁止する。
【００６５】
＜タイムスロット切換部２５＞
タイムスロット切換部２５は、現在のタイムスロットにおいてスレッドの実行時間が割当時間に達したときに、タイムスロットの切換を行う。割当時間に達したかどうかはタイマ制御部３０によるタイムアウト信号によって通知される。通知を受けたタイムスロット切換部２５は、次のタイムスロット情報を選択する。このとき、選択したタイムスロット情報から割当時間を取得してタイマ制御部３０に設定する。これにより、次のタイムスロットの割当時間のカウントが開始される。また、タイムスロットに属するスレッドを再開する前に、コンテキスト保持部８０よりコンテキストの退避及び復帰を行う。また、タイムスロット内ディスパッチ部２２が処理を行う際にタイムスロットの切換が発生する場合は、切換を優先して実施し、タイムスロット状態変更部２４が処理を行う際には、タイムスロットの切換を中断して処理を実施する。
【００６６】
［タイムスロット記憶部５０の構成］
タイムスロット記憶部５０は、割当時間による時間の割り当てを有するスレッド群に対して、切換の基準となるタイムスロットを生成するためのタイムスロット情報を記憶する。
【００６７】
図２はタイムスロット記憶部５０とスレッド記憶部６０内のスレッド情報との具体例を示す図である。同図のように、タイムスロット記憶部５０は、複数のタイムスロット情報５１、５２、…５３を記憶する。
【００６８】
タイムスロット情報５１は、１つのタイムスロットに対応し、タイムスロット状態５１ａ、動作プロセッサ５１ｂ、割当時間５１ｃ、次実行スレッド５１ｄ及びレディキュー５１ｅからなる。他のタイムスロット情報も同様である。タイムスロット情報５１、５２、…５３はプロセッサごとに配列を構成し、その順序はタイムスロットの生成順を表すものとする。
【００６９】
タイムスロット状態５１ａは、当該タイムスロットがどのような状態であるかを示す。状態は、有効、無効、休止の３つの状態を示す。有効状態は、タイムスロット切換部２５の切換対象となる状態である。タイムスロット情報の生成時には有効と設定される。無効状態は、タイムスロット切換部２５の切換対象とならない状態である。休止状態は、タイムスロットに対して第１割込みが入るのを待っている状態で、第１割込みが入ると有効状態に遷移する。
【００７０】
動作プロセッサ５１ｂは、当該タイムスロットがどのプロセッサに属しているかを示す。割り当てられたプロセッサがタイムスロット情報の生成と同時に設定される。
【００７１】
割当時間５１ｃは、当該タイムスロットに含まれるスレッドが実行することができる時間を示す。当該タイムスロットに含まれるスレッドが実際に実行された時間が割当時間に達すると、次のタイムスロットに切り換えられる。割当時間はタイムスロット情報の生成と同時に設定される。
【００７２】
次実行スレッド５１ｄは、タイムスロット内ディスパッチ部２２によりスレッドを切り換える際に参照され、当該タイムスロット内で次に実行するスレッドの情報を保持する。
【００７３】
レディキュー５１ｅは、当該タイムスロットに属するスレッドに対応するスレッド情報へのポインタを示している。レディキュー５１ｅは、タイムスロット内で実行可能状態である複数のスレッド情報が接続されており、スケジューリング部１２により次に実行スレッド５４の設定候補をレディキューから選択する。
【００７４】
［スレッド記憶部６０の構成］
スレッド記憶部６０は、タイムスロットに割り当てられたスレッドに対応するスレッド情報６１、６２、…を記憶する。スレッド情報６１、６２、…はそれぞれ１つのスレッドに対応し、当該スレッドを管理するための情報である。
【００７５】
スレッド情報６１は、スレッド状態６１ａ、待ちキュー６１ｂ、実行タイムスロット６１ｃ、スタックポインタ値６１ｄ、優先度６１ｅ及びリンクアドレス６１ｆからなる。
【００７６】
スレッド状態６１ａは、当該スレッドがどのような状態であるかを示す。状態は、実行中状態、実行可能状態、待ち状態、終了状態の４つの状態を示す。
【００７７】
実行中状態は、タイムスロットの実行時間内に当該スレッドが実行している状態を示している。実行可能状態は、タイムスロット内で当該スレッドより優先度の高いスレッドが存在しているため、それらのスレッドが実行しなくなったときに実行中状態として選択される状態を示している。待ち状態は、当該スレッドがオブジェクトの要因を待っている状態で、実行中状態として選択されず、要因が解消されたときに実行可能状態に遷移する。終了状態は、スレッドの終了を発行した状態で再開することはなく、スレッド記憶部６０にスレッド情報が残っている状態を示している。
【００７８】
待ちキュー６１ｂは、当該スレッドが終了状態に遷移することを要因として待ち状態になっている複数のスレッド情報が接続されている。スケジューリング部１２により当該スレッドが実行中状態から終了状態に遷移する際に、実行可能状態に遷移させるスレッドの設定候補を待ちキューから選択する。
【００７９】
実行タイムスロット６１ｃは、当該スレッドが属するタイムスロットに対応するタイムスロット情報へのポインタとして保持する。
【００８０】
スタックポインタ値６１ｄは、当該スレッドが切り換えられる時のスタックポインタを保持する。タイムスロット内ディスパッチ部２２によりスレッドを切り換える時は、当該時点でのスタックポインタの値を示す。
【００８１】
優先度６１ｅは、当該スレッドのタイムスロット内での実行順を決定する指標となる優先度を示す。スケジューリング部１２では、当該スレッドが接続しているレディキュー５１ｅの中から実行権を与えるスレッドの選択を行う際に、当該優先度６１ｅを選択の指標として用いる。
【００８２】
リンクアドレス６１ｆは、当該スレッドが要素としてレディキュー又は待ちキューに接続された場合に、レディキュー又は待ちキューにおける次の要素であるスレッド情報へのポインタを保持する。
【００８３】
具体的には、リンクアドレス６１ｆは、当該スレッドが実行中状態及び実行可能状態である場合は、レディキューを形成する次の要素を指すポインタであり、当該スレッドが待ち状態である場合は待ちキューを形成する次の要素を指すポインタである。
【００８４】
［オブジェクト記憶部７０の構成］
図３はオブジェクト記憶部７０に記憶されるオブジェクト情報７１、７２、…と、スレッド記憶部６０に記憶される待ちキューとを示す図である。
【００８５】
オブジェクト情報７１は、オブジェクト状態７１ａ、待ちキュー７１ｂ、オブジェクト固有情報７１ｃからなる。
【００８６】
オブジェクト状態７１ａは、当該オブジェクトがどのような状態であるかを示す。状態は、無効または有効の２つの状態を示す。
【００８７】
待ちキュー７１ｂは、当該オブジェクトを要因として待ち状態になっているスレッドを示す待ちキューの先頭のスレッド情報を指す。待ちキューに接続されたスレッド情報６１’、６２’、…はそれぞれリンクアドレス６１ｆ’、６２ｆ’…によって順に接続された待ちキューを形成する。当該オブジェクトの固有情報が更新される際に、スケジューリング部１２により実行可能となるスレッドの設定候補を待ちキューから選択する。
【００８８】
オブジェクト固有情報７１ｃは、オブジェクトが必要な情報が記憶されており、オブジェクトの種別によって記憶されている情報が異なる。具体的な情報はオブジェクトの種別ごとの詳細にて説明する。
【００８９】
［処理の詳細］
以下、本発明のプログラム制御装置における処理の詳細として、スレッド待ちスケジューリング処理、スレッド待ち解除スケジューリング処理、スレッド生成処理、スレッド終了処理、スレッド終了待ち処理、タイムスロット生成・削除処理について詳細に説明する。さらに、オブジェクトに対する具体的な適用例として、ｍｕｔｅｘ、ｃｏｎｄ、フラグ、セマフォについて説明する。
【００９０】
＜スレッド待ちスケジューリング処理＞
図４は、ＡＰＩ呼び出しによりスレッドを待ち状態に遷移するスケジューリング処理の詳細を示すフローチャートである。
【００９１】
まず、ＡＰＩ処理部１１は、ＡＰＩに対応する処理を行い（Ｓ００１）、待ち処理Ｗａｉｔを呼び出す（Ｓ００２）。このときＡＰＩ処理部１１は、待ち処理Ｗａｉｔの引数として、実行中のスレッドＴｈの識別子とＡＰＩで指定されたオブジェクトＯｂｊの識別子とをスケジューリング部１２に渡す。ＡＰＩで指定されたオブジェクトＯｂｊの識別子は、ＡＰＩの対象となるオブジェクトを指す。ここで指定されるオブジェクトは、具体的には、ｍｕｔｅｘ、ｃｏｎｄ、フラグ、セマフォ等があり、あるいは他のスレッドである場合もある。
【００９２】
次に、スケジューリング部１２は、渡されたスレッドＴｈの属するタイムスロットのレディキュー５１ｅからスレッドＴｈのスレッド情報を外し（Ｓ０１１）、当該スレッド情報のスレッド状態を待ち状態に変更した上で（Ｓ０１２）、当該スレッド情報をオブジェクトＯｂｊのオブジェクト情報の待ちキューに登録し（Ｓ０１３）、スレッドＴｈのスレッド情報に含まれる「実行タイムスロット６１ｃ」を読み出す。さらに、読み出した実行タイムスロット６１ｃ（タイムスロットＴＳとする）を引数としてディスパッチ要求を出す（Ｓ０１４）。
【００９３】
ディスパッチ要求処理として、与えられたタイムスロットのレディキューを起点として、実行可能状態であるスレッドが見つかるまでスレッド情報のリンクアドレスをたどる（Ｓ０２１）。見つかったスレッドをＴとする。タイムスロット情報の次実行スレッドにスレッドＴを登録する（Ｓ０２２）。スレッドＴが見つからなければＮＵＬＬ（無効）を登録する。さらに、タイムスロットＴＳのタイムスロット情報から「動作プロセッサ５１ｂ」を読み出す。この「動作プロセッサ５１ｂ」はタイムスロットＴＳが割り当てられたプロセッサを示し、第1割込みの割込み先の指定に用いられる。最後に、第１割込み発生部１３は、当該タイムスロットＴＳが割り当てられたプロセッサに対して第１割込みを発生させる（Ｓ０２３）。この第１割込みは、割込み先のプロセッサの指定とタイムスロットＴＳの指定とを含む。
【００９４】
第１割込み発生部１３により発生した第１割込みは、指定されたプロセッサ以外のプロセッサでは受理されず、かつ指定されたタイムスロット以外のタイムスロットでは受理されない（Ｓ３０ａ、Ｓ３０ｂ）。つまり、第１割込みは、指定されたプロセッサの現在のタイムスロットと、指定されたタイムスロットとが一致する場合に第１割込み受理部２１により受理され、タイムスロット内ディスパッチ部２２に通知される。タイムスロット内ディスパッチ部２２が実際に実行されるのは、指定されたタイムスロットが時間を割り当てられているときである。指定されたプロセッサにおける第１割込み発生部１３によって指定されたタイムスロットで受理されると、第１割込み発生部１３は、当該プロセッサ内でタイムスロット内ディスパッチ部２２にローカル割込みを通知する。
【００９５】
タイムスロット内ディスパッチ部２２は、レジスタを一旦スタックに退避し（Ｓ０３１）、スタックポインタを実行中のスレッドに対応するスレッド情報のスタックポインタ値６１ｄに保存する（Ｓ０３２）。
【００９６】
次に、当該タイムスロットの次実行スレッドにスレッドが登録されているかどうかを検査する（Ｓ０３３）。スレッドが登録されていれば、当該スレッドに対応するスレッド情報のスタックポインタ値６１ｄを取り出し、スタックポインタに設定する（Ｓ０３４）。さらに、当該スレッドの状態を実行中状態に設定し（Ｓ０３５）、レジスタをスタックから復帰する（Ｓ０３６）。これにより、スケジューリング処理終了後は当該スレッドに実行が移っている。
【００９７】
次実行スレッドにスレッドが登録されていない、つまりＮＵＬＬ（無効）であれば、タイムスロット内に実行を移すスレッドが存在しないため、タイムスロット状態変更部２４に対して通知し、タイムスロット状態変更部２４にて当該タイムスロットを「休止」状態に設定する（Ｓ０３７）。これにより、当該タイムスロットはタイムスロット切換部２５の実行対象から除外される。
【００９８】
なお、タイムスロット状態変更部２４にて、タイムスロットが全て待ち状態に設定されたときは、プロセッサを省電力モード移行してもよい。このとき、当該モードはプロセッサに含まれるタイムスロットが１つでも有効状態になると、当該モードを解除し、当該タイムスロットの実行をＳ０３３から再開する。
【００９９】
＜スレッド待ち解除処理＞
図５は、ＡＰＩ呼び出しによりスレッドの待ち状態を解除するスケジューリング処理の詳細を示すフローチャートである。
【０１００】
まず、ＡＰＩ処理部１１は、ＡＰＩに対応する処理を行い（Ｓ０４１）、待ち解除処理Ｗａｋｅｕｐを呼び出す（Ｓ０４２）。待ち処理ＷａｉｔへはＡＰＩで指定されたオブジェクトをスケジューリング部１２に渡す。
【０１０１】
次に、スケジューリング部１２は、渡されたオブジェクトの待ちキューからスレッドを１つ取り出し（Ｓ０５１）。当該スレッド情報のスレッド状態を実行可能状態に変更した上で（Ｓ０５２）、当該スレッド情報が属するタイムスロット情報のレディキューに登録する（Ｓ０５３）。さらに、当該スレッド情報が属するタイムスロットを引数としてディスパッチ要求を出す（Ｓ０５４）。
【０１０２】
ディスパッチ要求処理はスレッド待ちスケジューリング処理と同じであるので説明を省略する。
【０１０３】
＜スレッド生成処理＞
図６は、ＡＰＩ呼び出しによりタイムスロットに対してスレッドを生成するスケジューリング処理の詳細を示すフローチャートである。
【０１０４】
まず、ＡＰＩに対応する処理としてスレッド情報をスレッド記憶部に確保し、ＡＰＩから与えられた情報に基づいて初期化を行う（Ｓ６０１）。次にスレッドの使用するスタックにスレッドプログラムの起動情報を設定し（Ｓ６０２）、スレッド状態を実行可能状態に設定した後（Ｓ６０３）、スレッドが属するタイムスロットに対してスケジューリング部１２のディスパッチ要求処理を呼び出す（Ｓ６０４）。これにより、ディスパッチ処理のレジスタ復帰にてスレッドのプログラムが実行を開始する。
【０１０５】
ディスパッチ要求処理はスレッド待ちスケジューリング処理と同じであるので説明を省略する。
【０１０６】
＜スレッド終了処理およびスレッド終了待ち処理＞
図７（ａ）、図７（ｂ）は、スレッド終了処理ｅｘｉｔおよびスレッド終了待ち処理ｊｏｉｎの使用例を示す説明図である。同図（ａ）（ｂ）は、スレッドＡ（親スレッド）とスレッドＢ（子スレッド）の処理の流れを示す。実線は実行状態または実行可能状態を示し、破線は待ち状態ｗａｉｔまたは終了状態を示す。
【０１０７】
また、ｃｒｅａｔｅは、スレッドＡ（親スレッド）がスレッドＢ（子スレッド）を生成する処理（図６のスレッド生成処理）を示す。ｅｘｉｔは、スレッド自身が実行状態（または実行可能状態）から終了状態に遷移するスレッド終了処理を示す。スレッド終了待ち処理ｊｏｉｎは、他のスレッドが終了状態になるのを待つために、スレッド自身が実行状態から待ち状態に遷移する処理である。
【０１０８】
同図（ａ）においてスレッドＡは、ｃｒｅａｔｅによりスレッドＢを生成し、所定の処理を実行した後にスレッドＢと同期をとるために、ｊｏｉｎにより実行状態から待ち状態Ｗａｉｔに遷移する。さらに、スレッドＢがｅｘｉｔにより終了状態に遷移した時点で、スレッドＡは待ち状態ｗａｉｔから実行状態に遷移し、スレッドＢは終了する。
【０１０９】
同図（ｂ）においてスレッドＡは、ｃｒｅａｔｅによりスレッドＢを生成し、所定の処理を実行した後にスレッドＢと同期をとるために、ｊｏｉｎをＡＰＩ呼び出しする。一方スレッドＡによるｊｏｉｎの呼び出しの前に、スレッドＢはｅｘｉｔにより終了状態に遷移している。この場合、スレッドＡによるｊｏｉｎの呼び出しにより、スレッドＡは実行状態を維持し、スレッドＢは終了する。
【０１１０】
図８Ａは、ＡＰＩ呼び出しによりタイムスロットに対してスレッドを終了するスケジューリング処理（スレッド終了処理ｅｘｉｔ）の詳細を示すフローチャートである。同図では、図７（ａ）、図７（ｂ）のスレッドＢがｅｘｉｔをＡＰＩ呼び出ししたものとする。
【０１１１】
まず、スケジューリング部１２は、実行中のスレッドＢを終了状態に設定する（Ｓ６１２）。当該スレッドのスレッド状態の待ちキューに他のスレッド（ここではスレッドＡ）が登録されているかどうかを検査し（Ｓ６１４）、スレッドＡが登録されているときのみ待ち解除処理Ｗａｋｅｕｐを呼び出す（Ｓ６１５）。この待ち状態解除処理Ｗａｋｅｕｐにより、図７（ａ）のように、スレッドＡが待ち状態から実行状態に変更される。さらに、スレッドＢが属するタイムスロットに対してスケジューリング部１２のディスパッチ要求処理を呼び出す（Ｓ６１６）。このディスパッチ要求処理によりスレッド記憶部６０からスレッドＢのスレッド情報が削除される。
【０１１２】
ディスパッチ要求処理はスレッド待ちスケジューリング処理と同じであるので説明を省略する。
【０１１３】
＜スレッド終了待ち処理＞
図８Ｂは、ＡＰＩ呼び出しによりタイムスロットに対してスレッドの終了を待つスケジューリング処理（スレッド終了待ち処理ｊｏｉｎ）の詳細を示すフローチャートである。同図では、図７（ａ）、図７（ｂ）のスレッドＡが、ｊｏｉｎをＡＰＩ呼び出ししたものとする。また、パラメータＴｈは、スレッドＡの子スレッドであるスレッドＢが指定されているものとする。
【０１１４】
まず、スケジューリング部１２は、ＡＰＩで与えられたスレッドＢが終了状態かどうかを検査する（Ｓ６２１）。当該スレッドＢが終了状態でなければ、待ち処理Ｗａｉｔを呼び出しスレッドＢが終了するまで待つ（Ｓ６２２）。スレッドＢが終了状態であれば、スレッドＢのスレッド情報をスレッド記憶部から削除する（Ｓ６２３）。待ち処理Ｗａｉｔはスレッド待ちスケジューリング処理と同じであるので説明を省略する。
【０１１５】
＜タイムスロット生成・削除・割当時間更新処理＞
図９及び図１０Ａは、ＡＰＩ呼び出しによりタイムスロットの生成・削除及び割当時間の更新を行うスケジューリング処理の詳細を示すフローチャートである。
【０１１６】
まず、ＡＰＩ処理部１１は、ＡＰＩに対応する処理として、ＡＰＩから与えられたタイムスロットの生成・削除及び割当時間の更新のいずれかの情報をコマンドに変換し（Ｓ０５１）、制御要求処理へはＡＰＩで指定されたコマンドをスケジューリング部１２に渡す（Ｓ０５２）。
【０１１７】
次に、スケジューリング部１２は、コマンドをコマンドキューに設定し（Ｓ０６１）、当該タイムスロットが実行中のプロセッサで実行されているかどうかを検査する（Ｓ０６２）。実行中のプロセッサであれば、制御処理を直接呼び出す（Ｓ０６３）。別のプロセッサであれば、第２割込み発生部１４にて割込みを発生し、当該プロセッサに割込みが通知される（Ｓ０６４）。
【０１１８】
当該プロセッサでは第２割込み受理部２３により割込みを受理し、タイムスロット状態変更部２４に制御を移す。
【０１１９】
タイムスロット状態変更部２４は、タイムスロット情報の矛盾を避けるため、タイムスロット切換部２５に対して、処理中に切換を行わないように指示する。これは、割込みの発生をタイムスロットの切換より優先して行うようにプロセッサに指示することで実現できる。さらに、レジスタを一旦スタックに退避し（Ｓ０７１）、コマンドキューよりコマンドを取り出し（Ｓ０７２）、取り出したコマンドを元に制御処理を呼び出すことで、コマンドの内容を元にタイムスロット記憶部５０のタイムスロット情報の内容を書き換える（Ｓ０７３）。
【０１２０】
具体的には、与えられたコマンドを判別し（Ｓ０８１）、その種別に従ってタイムスロットの状態変更（生成、削除）、割当時間の設定を行う（Ｓ０８２，Ｓ０８３，Ｓ０８４）。
【０１２１】
制御処理が完了すると、退避したレジスタスタックから復帰し（Ｓ０７４）、処理を完了する。
【０１２２】
図１０Ｂは、図１０Ｂは、図１０Ａ中のステップＳ０８２におけるタイムスロット生成処理の一例を示すフローチャートである。同図において、タイムスロット状態変更部２４は、プロセッサ毎に、割り当てられている有効な全タイムスロットの割り当て時間の総和を算出し（Ｓ０８２ａ）、総和が最小のプロセッサを選択し（Ｓ０８２ｂ）、当該プロセッサに対して新たなタイムスロットを生成する（Ｓ０８２ｃ）。本実施形態におけるプログラム制御装置では、各スレッドの記述がプロセッサに依存することなく、任意のプロセッサの任意のタイムスロットに割り当てることができるので、図１０Ｂのように、複数のプロセッサの負荷を均等化することができる。
【０１２３】
なお、タイムスロットの生成を行う際に、タイムスロット状態変更部２４にて、生成を行うプロセッサに設定されているタイムスロットの設定時間の総和を算出しておき、次のタイムスロットの生成を行う場合に、スケジューリング部１２にて、各プロセッサのタイムスロット設定時間の総和を比較した上で、タイムスロットの生成を行うプロセッサを決定してもよい。例えば、図１０Ｂのように負荷を分散することができる。逆に、全体の処理負荷が小さい場合には、１つ以外のプロセッサに負荷を偏らせて当該１つのプロセッサのタイムスロット情報を全部無効にして省電力モードにするようにしてもよい。
【０１２４】
なお、第２割込みが発生した際に、新たに専用のタイムスロットを有効にしてもよい。切換が起こらないタイムスロットとしてタイムスロット状態変更部２４の処理を行うことで、他のタイムスロットの処理の影響を受けることなく処理を行うことができる。
【０１２５】
＜タイムスロット切換処理＞
図１１は、タイマ制御部３０のタイムアウト通知により開始されるタイムスロット切換を行うスケジューリング処理の詳細を示すフローチャートである。
【０１２６】
タイマ制御部３０よりタイムアウト通知がタイムスロット切換部２５に行われる。タイムスロット切換部２５は、現在のタイムスロットのコンテキストをコンテキスト保持部８０に退避し（Ｓ０９１）、タイムスロット記憶部のタイムスロット情報配列順に従って次のタイムスロットを選択する（Ｓ０９２）。さらに、当該タイムスロットの割当情報をタイムスロット情報から取り出し、タイマ制御部３０に設定を行う（Ｓ０９３）。最後に、コンテキスト保持部８０よりコンテキストを復帰し、割込みを許可する（Ｓ０９４）。
【０１２７】
割込みの許可により第１割込み受理部２１は、自身のプロセッサを指定しかつ現在のタイムスロットを指定する第１割込みが発生しているか否かを判定し（Ｓ０９５）、発生している場合には当該第１割込みを受理する（Ｓ０９６）。これにより、他のタイムスロット宛の第１割込みを受理しないで、当該タイムスロットを宛先とする第１割込みを受理することができる。第１割込み発生部１３は、第１割込みを受理した場合、当該プロセッサ内のタイムスロット内ディスパッチ部２２にローカル割込みを通知する。
【０１２８】
なお、ステップＳ０９５、Ｓ０９６は、図４のステップＳ３０ａ〜Ｓ３０ｃと同じ処理を示している。
【０１２９】
また、ステップＳ０８４により割込み許可される時点まで、第１および第２の割込みが発生していても受理されないので、タイムスロット切換処理をタイムスロット内ディスパッチ部２２よりも優先することができる。
【０１３０】
＜ｍｕｔｅｘ処理＞
ｍｕｔｅｘは、２つ以上のスレッドが１つの資源（変数やデバイスなど）を競合してアクセスする場合に調停を行う機構であり、資源の「ロック中」状態及び「ロック解除」状態を管理する情報を含む。ｍｕｔｅｘの操作はロック要求操作とロック解放操作がある。この機構は、２つ以上のスレッドからのアクセスが競合する可能性のある資源毎に設けられる。あるスレッドがｍｕｔｅｘのロック操作に成功すると、ｍｕｔｅｘは「ロック中」状態になり、他のスレッドがロック操作を行っても「ロック解除」状態になるまで待たされる。これによりロック操作に成功したスレッドは、対応する資源を占有することができる。ロック操作を行ったスレッドがロック解除操作を行うと、他のスレッドがロック操作を行うことができるようになる。実行中のスレッドが資源をアクセスする場合、必ず当該資源に対応するｍｕｔｅｘのロック操作を行い、成功した場合のみ資源のアクセスが可能となる。失敗した場合、つまり既に当該ｍｕｔｅｘが「ロック中」状態になっている場合には、「ロック解除」状態になるまで待たされることになる。
【０１３１】
図１２は、オブジェクト情報７１、７２、…の  ｍｕｔｅｘにおける構成である。
ｍｕｔｅｘ情報２００は、ｍｕｔｅｘ状態２０１、待ちキュー２０２、ロック状態２０３からなる。ｍｕｔｅｘ状態２０１及び待ちキュー２０２はオブジェクト情報と同じであり、ロック状態２０３はｍｕｔｅｘにおけるオブジェクト固有情報７３である。
【０１３２】
図１３及び図１４は、ＡＰＩ呼び出しによりｍｕｔｅｘのロック及びロック解除処理の詳細を示すフローチャートである。
【０１３３】
ロック処理  ＭｕｔｅｘＬｏｃｋは、ＡＰＩより与えられたｍｕｔｅｘのロック状態を「ロック中」状態に更新し、更新前が「ロック中」状態かどうかを検査する（Ｓ２０１，Ｓ２０２）。これらの処理は不可分で行われなければならない。「ロック中」状態であれば、オブジェクトｍｕｔｅｘを元に待ち処理Ｗａｉｔを呼び出す。「ロック解除」状態であれば、すでにｍｕｔｅｘのロックを確保したことになる。
【０１３４】
ロック解除処理  ＭｕｔｅｘＵｎｌｏｃｋは、ＡＰＩより与えられたｍｕｔｅｘの待ちキューにスレッドが登録されているかどうかを検査する（Ｓ２１１）。スレッドが登録されていれば、オブジェクトｍｕｔｅｘを元に待ち解除Ｗａｋｅｕｐを呼び出す（Ｓ２１２）。このとき、ロックの所有スレッドが変更されるだけなので、「ロック中」状態は変更しない。スレッドが登録されていなければ、当該ｍｕｔｅｘのロック状態を「ロック解除」状態に更新し、ロックを解除する（Ｓ２１３）。
【０１３５】
＜ｃｏｎｄ処理＞
ｃｏｎｄはｍｕｔｅｘとともに用いる機構で、１つの資源の状態を変更した際に、他の１つ以上のスレッドに対して通知を行う。資源の競合を避けるためにｍｕｔｅｘを対として用いる必要がある。この機構は、変更を通知する資源毎に設けられる。ｃｏｎｄの操作は待ち操作と通知操作がある。
【０１３６】
図１５Ａは、オブジェクト情報７１、７２、…のｃｏｎｄにおける構成である。
ｃｏｎｄ情報２００は、ｃｏｎｄ状態２０１、待ちキュー２０２からなる。ｃｏｎｄ状態２０１及び待ちキュー２０２はオブジェクト情報と同じであり、ｃｏｎｄはオブジェクト固有情報７３を持たない。
【０１３７】
図１５Ｂは、ｃｏｎｄの動作説明図である。同図左側は１つの資源を他のスレッドが更新するまで待つｃｏｎｄ待ち処理を表し、右側は資源を変更したことを通知するｃｏｎｄ通知処理を表している。ｃｏｎｄ通知されたスレッドは待ち状態を解除し、次の処理に進む。
【０１３８】
図１６及び図１７は、ＡＰＩ呼び出しによりｃｏｎｄの待ち及び待ち解除処理の詳細を示すフローチャートである。
【０１３９】
ｃｏｎｄ待ち処理ＣｏｎｄＷａｉｔは、まず、ＡＰＩにより与えられたｍｕｔｅｘのロック解除を行い（Ｓ３０１）、オブジェクトｃｏｎｄを元に待ち処理Ｗａｉｔを呼び出す（Ｓ３０２）。待ち状態から復帰すると、再びｍｕｔｅｘのロックを行う（Ｓ３０３）。
【０１４０】
ｃｏｎｄ通知処理ＣｏｎｄＳｉｇｎａｌは、ＡＰＩより与えられたｃｏｎｄの待ちキューにスレッドが登録されているかどうかを検査する（Ｓ３１１）。スレッドが登録されているときのみ、オブジェクトｃｏｎｄを元に待ち解除Ｗａｋｅｕｐを呼び出す（Ｓ３１２）。
【０１４１】
＜フラグ処理＞
フラグは、２つのスレッドが同期を取るための機構であり、同期のための条件と状態を管理する情報を含む。フラグの操作はフラグ待ち操作とフラグセット及びクリア操作がある。
【０１４２】
図１８は、オブジェクト情報７１、７２、…のフラグにおける構成である。
フラグ情報４００は、フラグ状態４０１、待ちキュー４０２、待ち解除パターン４０３、待ち解除条件４０４及びフラグパターン４０５からなる。フラグ状態４０１及び待ちキュー４０２はオブジェクト情報と同じであり、待ち解除パターン４０３、待ち解除条件４０４及びフラグパターン４０５はフラグにおけるオブジェクト固有情報７３である。
【０１４３】
図１９、図２０及び図２１は、ＡＰＩ呼び出しによりフラグ待ち、セット及びクリア処理の詳細を示すフローチャートである。
【０１４４】
フラグ待ち処理ＦｌａｇＷａｉｔは、ＡＰＩより与えられたフラグの解除パターンを設定し（Ｓ４０１）、フラグを元に待ち処理Ｗａｉｔを呼び出す（Ｓ４０２）。
【０１４５】
フラグセット処理ＦｌａｇＳｅｔは、ＡＰＩより与えられたフラグが保持するパターンに対して、ＡＰＩより与えられたパターンとの論理和を算出し、フラグパターンに保存する（Ｓ４１１）。解除条件を検査し（Ｓ４１２）、解除条件が「ＯＲ」か「ＡＮＤ」かによって次の処理が異なる。「ＡＮＤ」ならば、フラグパターンと解除パターンが一致した場合のみ、次のステップへ進む（Ｓ４１３）。「ＯＲ」ならば、フラグパターンと解除パターンとの論理和が０でない場合のみ、次のステップへ進む（Ｓ４１４）。次に、フラグの待ちキューにスレッドが登録されているかどうかを検査する（Ｓ４１５）。スレッドが登録されるときのみ、フラグを元に待ち解除Ｗａｋｅｕｐを呼び出す（Ｓ４１６）。
【０１４６】
フラグクリア処理ＦｌａｇＣｌｅａｒは、ＡＰＩより与えられたフラグが保持するパターンに対して、ＡＰＩより与えられたパターンとの否定論理積を算出し、フラグパターンに保存する（Ｓ４２１）。
【０１４７】
＜セマフォ処理＞
セマフォは、２つ以上のスレッドが１つ以上の資源（変数やデバイスなど）を競合してアクセスする場合に調停を行う機構であり、資源の数を管理する情報を含む。セマフォの操作は獲得操作と解放操作がある。
【０１４８】
図２２は、オブジェクト情報７１、７２、…のセマフォにおける構成である。
セマフォ情報５００は、セマフォ状態５０１及びセマフォ数５０２からなる。セマフォ状態５０１及び待ちキュー５０２はオブジェクト情報と同じであり、セマフォ数５０２はセマフォにおけるオブジェクト固有情報７３である。
【０１４９】
図２３及び図２４は、ＡＰＩ呼び出しによりセマフォの資源要求及び解放処理の詳細を示すフローチャートである。
【０１５０】
セマフォ獲得処理ＳｅｍＧｅｔは、ＡＰＩより与えられたセマフォの数を１つ減らし、セマフォの数が−１かどうかを検査する（Ｓ５０１，Ｓ５０２）。これらの処理は不可分で行われなければならない。−１であれば、セマフォを元に待ち処理Ｗａｉｔを呼び出す（Ｓ５０３）。−１でなければ、すでにセマフォから資源を１つ確保したことになる。
【０１５１】
セマフォ解放処理ＳｅｍＲｅｌｅａｓｅは、ＡＰＩより与えられたセマフォの数を１つ加算し（Ｓ５１１）、セマフォの待ちキューにスレッドが登録されているかどうかを検査する（Ｓ５１２）。スレッドが登録されるときのみ、セマフォを元に待ち解除Ｗａｋｅｕｐを呼び出す（Ｓ５１３）。
【０１５２】
また、これらオブジェクトの実現例を元に、２つ以上のスレッドに対する通信・同期オブジェクトを新たに実現することができる。
【産業上の利用可能性】
【０１５３】
本発明にかかるプログラム制御装置は、複数のスレッドの必要性能を満たすとともに、スレッド上のプログラムはプロセッサ構成によらない記述が可能となる。
【０１５４】
このことから、処理性能を機能ごとに割り当て、機能を複数スレッドで実現することで、処理性能を確保するためのプログラム設計を容易にすることができ、プログラム設計の柔軟性をもたらす。
【０１５５】
これらは、複数の音声映像処理を同時並行的にリアルタイムに行う機器や、当該機器の開発環境等として適用可能である。
【図面の簡単な説明】
【０１５６】
【図１】本発明の実施の形態におけるプログラム制御装置の主要部の構成を示すブロック図である。
【図２】タイムスロット記憶部内のタイムスロット情報と、スレッド記憶部内のスレッド情報との具体例を示す図である。
【図３】オブジェクト記憶部内のオブジェクト情報と、スレッド記憶部に記憶されている待ちキューとを示す図である。
【図４】スレッド待ち処理の詳細を示すフローチャートである。
【図５】スレッド待ち解除処理の詳細を示すフローチャートである。
【図６】スレッド生成処理（ＴｈｒｅａｄＣｒｅａｔｅ）の詳細を示すフローチャートである。
【図７】（ａ）（ｂ）スレッド終了処理とスレッド終了待ち処理の説明図である。
【図８Ａ】スレッド終了処理（ＴｈｒｅａｄＥｘｉｔ）の詳細を示すフローチャートである。
【図８Ｂ】スレッド終了待ち処理（ＴｈｒｅａｄＪｏｉｎ）の詳細を示すフローチャートである。
【図９】タイムスロット制御処理の詳細を示すフローチャートである。
【図１０Ａ】タイムスロット制御処理内のコマンド処理の詳細を示すフローチャートである。
【図１０Ｂ】タイムスロット生成処理の一例を示すフローチャートである。
【図１１】タイムスロット切換処理の詳細を示すフローチャートである。
【図１２】オブジェクト記憶部内のｍｕｔｅｘ情報の具体例を示す図である。
【図１３】ｍｕｔｅｘロック処理（ＭｕｔｅｘＬｏｃｋ）の詳細を示すフローチャートである。
【図１４】ｍｕｔｅｘロック解除処理（ＭｕｔｅｘＵｎｌｏｃｋ）の詳細を示すフローチャートである。
【図１５Ａ】オブジェクト記憶部内のｃｏｎｄ情報の具体例を示す図である。
【図１５Ｂ】ｃｏｎｄの動作説明図である。
【図１６】ｃｏｎｄ待ち処理（ＣｏｎｄＷａｉｔ）の詳細を示すフローチャートである。
【図１７】ｃｏｎｄ通知処理（ＣｏｎｄＳｉｇｎａｌ）の詳細を示すフローチャートである。
【図１８】オブジェクト記憶部内のフラグ情報の具体例を示す図である。
【図１９】フラグ待ち処理（ＦｌａｇＷａｉｔ）の詳細を示すフローチャートである。
【図２０】フラグセット処理（ＦｌａｇＳｅｔ）の詳細を示すフローチャートである。
【図２１】フラグクリア処理（ＦｌａｇＣｌｅａｒ）の詳細を示すフローチャートである。
【図２２】オブジェクト記憶部内のセマフォ情報の具体例を示す図である。
【図２３】セマフォ獲得処理（ＳｅｍＧｅｔ）の詳細を示すフローチャートである。
【図２４】セマフォ解放処理（ＳｅｍＲｅｌｅａｓｅ）の詳細を示すフローチャートである。
【符号の説明】
【０１５７】
１０  ディスパッチ発行部
１１  ＡＰＩ処理部
１２  スケジューリング部
１３  第１割込み発生部
１４  第２割込み発生部
１５  ＡＰＩ終了処理部
２０  ディスパッチ処理部
２１  第１割込み受理部
２２  タイムスロット内ディスパッチ部
２３  第２割込み受理部
２４  タイムスロット状態変更部
２５  タイムスロット切換部
３０  タイマ制御部
４０  実行制御部
５０  タイムスロット記憶部
５１，５２，５３  タイムスロット情報
６０  スレッド記憶部
６１，６２，６３，６４，６５  スレッド情報
７０  オブジェクト記憶部
７１，７２  オブジェクト情報
８０  コンテキスト保持部
１００，１１０，１２０  プロセッサ
２００  ｍｕｔｅｘ情報
３００  ｃｏｎｄ情報
４００  フラグ情報
５００  セマフォ情報
【図１】
2009059310.tif 000003
【図２】
2009059310.tif 000004
【図３】
2009059310.tif 000005
【図４】
2009059310.tif 000006
【図５】
2009059310.tif 000007
【図６】
2009059310.tif 000008
【図７】
2009059310.tif 000009
【図８Ａ】
2009059310.tif 000010
【図８Ｂ】
2009059310.tif 000011
【図９】
2009059310.tif 000012
【図１０Ａ】
2009059310.tif 000013
【図１０Ｂ】
2009059310.tif 000014
【図１１】
2009059310.tif 000015
【図１２】
2009059310.tif 000016
【図１３】
2009059310.tif 000017
【図１４】
2009059310.tif 000018
【図１５Ａ】
2009059310.tif 000019
【図１５Ｂ】
2009059310.tif 000020
【図１６】
2009059310.tif 000021
【図１７】
2009059310.tif 000022
【図１８】
2009059310.tif 000023
【図１９】
2009059310.tif 000024
【図２０】
2009059310.tif 000025
【図２１】
2009059310.tif 000026
【図２２】
2009059310.tif 000027
【図２３】
2009059310.tif 000028
【図２４】
2009059310.tif 000029