(57)【特許請求の範囲】
【請求項１】
複数のプロセッサを有するマルチコアプロセッサシステムの一のプロセッサに、
後続処理群が共通するスケジューリングの未設定処理群を、対象プログラムを構成する処理群の中から検出する第１の検出工程と、
前記第１の検出工程によって検出された未設定処理群の未設定処理ごとに、前記未設定処理に対する先行処理群のうち、前記処理群を同一または関連するアクセス対象データを共有するグループに分類したグループ群の中の前記未設定処理の所属グループに属する先行処理を検出する第２の検出工程と、
前記未設定処理ごとに、前記未設定処理を、マルチコアプロセッサの中の前記第２の検出工程によって検出された先行処理が割り当てられているプロセッサに割り当てる割当工程と、
前記未設定処理ごとに、前記未設定処理に対する先行処理群がすべて終了する実行終了時刻から、前記未設定処理を実行させた場合の前記未設定処理の推定実行時間が経過した経過時刻を算出する算出工程と、
前記割当工程によって割り当てられた未設定処理ごとに、前記未設定処理の割当先のプロセッサでの実行開始時刻を、前記算出工程によって算出された最も遅い経過時刻から前記未設定処理の実行時間分さかのぼった時刻に設定する設定工程と
を実行させるスケジューラプログラム。
【請求項２】
前記設定工程は、
前記未設定処理の先行処理群がすべて終了する実行終了時刻に、前記第２の検出工程によって検出された前記先行処理が終了する場合、前記実行終了時刻を前記後続処理群の実行開始時刻に設定する、請求項１に記載のスケジューラプログラム。
【請求項３】
前記割当工程は、
前記第２の検出工程によって、前記未設定処理の所属グループに属する先行処理が検出されなかった場合、前記先行処理が検出されなかった未設定処理を、前記マルチコアプロセッサの中の前記先行処理が割り当てられていないプロセッサに割り当てる、請求項１に記載のスケジューラプログラム。
【請求項４】
前記割当工程は、
前記第２の検出工程によって、前記未設定処理の所属グループに属する先行処理が検出されず、かつ、前記マルチコアプロセッサのすべてに前記先行処理が割り当てられている場合、前記先行処理が検出されなかった未設定処理を、前記マルチコアプロセッサのうち、割り当て済の前記先行処理の実行時間が最短となるプロセッサに割り当てる、請求項３に記載のスケジューラプログラム。
【請求項５】
前記割当工程は、
前記未設定処理に実行順序に関する優先度が設定されている場合、前記未設定処理のうち、前記優先度が高く設定されている未設定処理を優先的に、マルチコアプロセッサの中の前記第２の検出工程によって検出された先行処理が割り当てられているプロセッサに割り当てる、請求項１に記載のスケジューラプログラム。
【請求項６】
前記割当工程は、
前記対象プログラムおよび前記対象プログラム以外のプログラムによって発生した割り込み処理を、前記第２の検出工程によって前記未設定処理の所属グループに属する先行処理が検出されなかったプロセッサに割り当てる、請求項１に記載のスケジューラプログラム。
【請求項７】
前記割当工程は、
前記マルチコアプロセッサのすべてに前記先行処理が割り当てられている場合、前記割り込み処理を、前記マルチコアプロセッサのうち、割り当て済の前記先行処理の実行時間が最短となるプロセッサに割り当てる、請求項６に記載のスケジューラプログラム。
【請求項８】
前記割当工程は、
対象プロセッサを構成する処理群のうち、前記後続処理群および前記先行処理群を特定する情報が含まれていない処理を、前記第２の検出工程によって前記未設定処理の所属グループに属する先行処理が検出されなかったプロセッサに割り当てる、請求項１に記載のスケジューラプログラム。
【請求項９】
前記割当工程は、
前記マルチコアプロセッサのすべてに前記先行処理が割り当てられている場合、前記後続処理群および前記先行処理群を特定する情報が含まれていない処理を、前記マルチコアプロセッサのうち、割り当て済の前記先行処理の実行時間が最短となるプロセッサに割り当てる、請求項８に記載のスケジューラプログラム。
【請求項１０】
前記設定工程は、
前記第２の検出工程によって検出された前記未設定処理の先行処理の終了時刻から前記設定工程によって設定された前記未設定処理の実行開始時刻までの待機時間が、しきい値以上の場合、前記未設定処理の先行処理の終了時刻を、前記対象プログラム以外の他のプログラムの処理のうち、前記待機時間以下の実行時間の処理の実行開始時刻に設定する、請求項１〜９のいずれか一つに記載のスケジューラプログラム。
【請求項１１】
後続処理群が共通するスケジューリングの未設定処理群を、対象プログラムを構成する処理群の中から検出する第１の検出手段と、
前記第１の検出手段によって検出された未設定処理群の未設定処理ごとに、前記未設定処理に対する先行処理群のうち、前記処理群を同一または関連するアクセス対象データを共有するグループに分類したグループ群の中の前記未設定処理の所属グループに属する先行処理を検出する第２の検出手段と、
前記未設定処理ごとに、前記未設定処理を、マルチコアプロセッサの中の前記第２の検出手段によって検出された先行処理が割り当てられているプロセッサに割り当てる割当手段と、
前記未設定処理ごとに、前記未設定処理に対する先行処理群がすべて終了する実行終了時刻から、前記未設定処理を実行させた場合の前記未設定処理の推定実行時間が経過した経過時刻を算出する算出手段と、
前記割当手段によって割り当てられた未設定処理ごとに、前記未設定処理の割当先のプロセッサでの実行開始時刻を、前記算出手段によって算出された最も遅い経過時刻から前記未設定処理の実行時間分さかのぼった時刻に設定する設定手段と
を備えるマルチコアプロセッサシステム。
【請求項１２】
複数のプロセッサを有するマルチコアプロセッサシステムの一のプロセッサが、
後続処理群が共通するスケジューリングの未設定処理群を、対象プログラムを構成する処理群の中から検出する第１の検出工程と、
前記第１の検出工程によって検出された未設定処理群の未設定処理ごとに、前記未設定処理に対する先行処理群のうち、前記処理群を同一または関連するアクセス対象データを共有するグループに分類したグループ群の中の前記未設定処理の所属グループに属する先行処理を検出する第２の検出工程と、
前記未設定処理ごとに、前記未設定処理を、マルチコアプロセッサの中の前記第２の検出工程によって検出された先行処理が割り当てられているプロセッサに割り当てる割当工程と、
前記未設定処理ごとに、前記未設定処理に対する先行処理群がすべて終了する実行終了時刻から、前記未設定処理を実行させた場合の前記未設定処理の推定実行時間が経過した経過時刻を算出する算出工程と、
前記割当工程によって割り当てられた未設定処理ごとに、前記未設定処理の割当先のプロセッサでの実行開始時刻を、前記算出工程によって算出された最も遅い経過時刻から前記未設定処理の実行時間分さかのぼった時刻に設定する設定工程と
を実行するスケジューリング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、マルチコアプロセッサにおいてアプリケーションを実行させる際のスケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法に関する。
【背景技術】
【０００２】
従来より、プロセッサの処理効率を上げるため、キャッシュを有効利用する技術が多数提供されている。あるプログラムを実行する場合、プロセッサには、タスクやスレッドなどプログラムを構成する所定の単位の処理が割り当てられる。そして、各プロセッサでは、割り当てられた処理が順次実行される。また、各プロセッサに備えられたキャッシュには、プロセッサが割り当てられた処理を実行する際に利用するデータが格納される。したがって、各プロセッサは、関連するデータを利用する処理が連続して割り当てられれば、一旦キャッシュに格納されたデータを連続して利用できる。【０００３】
反対に、利用するデータが異なる処理が連続して割り当てられてしまうと、キャッシュに格納されているデータを連続して利用することができず、いわゆるキャッシュミスが発生してしまうことがあった。キャッシュミスが発生した場合、プロセッサは、処理の実行に必要なデータを外部のメモリから読み出し、必要に応じて新たなデータをキャッシュに格納するため、キャッシュを利用できた場合と比較して多くの処理時間を要してしまう。【０００４】
そこで、あらかじめ、一旦キャッシュに格納したデータを使用する処理を連続して実行させるように、処理の実行順序を調整しておくことによって、キャッシュミスを削減し、プロセッサの処理性能を向上させる技術が開示されている（例えば、下記特許文献１参照。）。【０００５】
さらに、プログラムを解析して、プログラム内部を複数のブロックに分割するとともに、各ブロック間のデータの入出力関係を解析することによって、利用するデータが共通する処理群を集めた処理ブロックを特定する技術も開示されている。例えば、特定された処理ブロックを実行する際に利用するデータは、関連性が高いため、一旦キャッシュに格納したデータを連続実行するようにスケジューリングされることによって、キャッシュミスの削減が期待できる（例えば、下記特許文献２，３参照。）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００６−９９１５６号公報
【特許文献２】特開平１０−１３４０３０号公報
【特許文献３】特開２００４−２５２７２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、従来技術を利用して、キャッシュミスの発生を抑えるには限界があった。例えば、各処理ブロックの入出力関係が、１対１ではなく１つの処理ブロックに複数の処理ブロックのデータを必要とする場合は、同じ複数の処理ブロックを実行させなければならないため、同じ処理ブロックに属する処理だけを連続実行させることはできない。また、依存関係が複雑なプログラムを実行させる場合や、優先度の高い処理や外部処理の割り込みが発生する場合にも、連続実行していた処理とは異なるデータを利用する可能性が高く、キャッシュミスの発生は避けられなかった。【０００８】
図２３は、従来のプロセスの連続実行を示す説明図である。図２３は、従来の技術を利用して各プロセスを連続実行させた場合のＣＰＵの動作の一例を表している。従来の技術を利用して、同じ処理ブロックに属するプロセス４，８，１５，１９，２５，２９が連続実行するように設定されている。【０００９】
ところが、実際には図２３に例示したように、プロセス４の直後に外部割り込みが発生し（ステップＳ２３０１）、さらに、内部的な割込処理も発生してしまっている（ステップＳ２３０２）。したがって、プロセス４を実行するためにキャッシュに格納されたデータは、ステップＳ２３０１，Ｓ２３０２の処理によって汚されてしまい（他のデータが格納された状態）、プロセス８を実行する際にキャッシュを読み込むとキャッシュミスを起こしてしまう。【００１０】
同様に、プロセス８，１５の間には割込処理こそ発生していないが、同期待ちのため待機時間が発生し、待機時間には低優先度のプロセスが実行される（ステップＳ２３０３）。そして、プロセス１５，１９の間には、高優先度の別プロセスが横入りして実行されている（ステップＳ２３０４）。結果としてプログラムを解析して連続実行するように設定しても、実際には連続実行されないことも多く、キャッシュミスは、従来と同様に発生する可能性があった。【００１１】
近年広く普及しているマルチコアプロセッサを利用した場合、図２３のステップＳ２３０１〜Ｓ２３０４のような設定されていないプロセスを特定のプロセッサに実行させることによって、割り込みを防ぐことができる。ところが、マルチコアプロセッサの場合、１つのプログラムを効率的に実行するため、並列実行可能な処理ブロックはそれぞれ実行対象となるプロセッサに割り当てられる。【００１２】
したがって、あるアプリケーションに含まれる処理１がプロセッサ＃０によって実行されており、処理１に先行する他の処理の一つが別のプロセッサ（例えば、プロセッサ＃１）で実行されている場合がある。そして、プロセッサ＃０において、他に実行可能な処理ブロックがない状態になると、プロセッサ＃０は、プロセッサ＃１で実行されている先行する処理が終了するまで待機しなければならない。【００１３】
通常のオペレーティングシステムでは、あるアプリケーションの実行中に実行中のアプリケーションとは無関係な複数のアプリケーションが同時に実行されていることが多い。したがって、オペレーティングシステムでは、上述のプロセッサ＃０のように待機時間が発生するとプロセッサ＃０の機能を有効に利用するため、他のアプリケーションの処理を行う。【００１４】
上述のような場合、アプリケーション単位では、共有するデータを利用する処理が連続して実行されるように見えるが、実際には待機時間の間に別のアプリケーションの処理が実行されており、キャッシュミスが増加するという問題があった。【００１５】
また、待機時間に他のアプリケーションを実行しないように設定することも可能であるが、結果として待機時間の間に無条件にプロセッサの動作を停止させることになり、システム全体の性能を低下させてしまうという問題があった。【００１６】
本開示技術は、上述した従来技術による問題点を解消するため、待機時間の発生を減少させてキャッシュを効率的に利用できるスケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
上述した課題を解決し、目的を達成するため、本開示技術は、マルチコアプロセッサ内の特定のプロセッサが、後続処理群が共通するスケジューリングの未設定処理群を、対象プログラムを構成する処理群の中から検出し、検出された未設定処理群の未設定処理ごとに、前記未設定処理に対する先行処理群のうち、前記処理群を同一または関連するアクセス対象データを共有するグループに分類したグループ群の中の前記未設定処理の所属グループに属する先行処理を検出し、前記未設定処理ごとに、前記未設定処理を、マルチコアプロセッサの中の検出された先行処理が割り当てられているプロセッサに割り当て、前記未設定処理ごとに、前記未設定処理に対する先行処理群がすべて終了する実行終了時刻から、前記未設定処理の実行時間の経過時刻を算出し、割り当てられた未設定処理ごとに、前記未設定処理の割当先のプロセッサでの実行開始時刻を、算出された最も遅い経過時刻から前記未設定処理の実行時間分さかのぼった時刻に設定する。
【発明の効果】
【００１８】
本スケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法によれば、待機時間の発生を減少させてキャッシュを効率的に利用できるという効果を奏する。
【図面の簡単な説明】
【００１９】
【図１】本実施の形態にかかるスケジューリング処理の一例を示す説明図である。
【図２】マルチコアプロセッサシステムのハードウェア構成の一例を示すブロック図である。
【図３】マルチコアプロセッサシステムによるキュー割り付け例を示す説明図である。
【図４】依存情報付きプログラムの一例を示す説明図である。
【図５】スケジューラの機能的構成の一例を示すブロック図である。
【図６】スケジューリング処理の手順を示すフローチャートである。
【図７】スケジューリング処理を利用したスケジューリング例を示す説明図である。
【図８】実施例におけるプロセッサ割当処理の手順を示すフローチャートである。
【図９】実施例におけるスケジューリング処理の手順を示すフローチャートである。
【図１０】実施例におけるグループ決定処理の手順を示すフローチャートである。
【図１１】実施例における遅延時間設定処理の手順を示すフローチャートである。
【図１２】スレッド群その１の構成を示す説明図である。
【図１３】スレッド群その１についてのキュー割り付け例を示す説明図である。
【図１４】スケジューリング処理のルート例を示す説明図である。
【図１５】グループ決定処理のルート例を示す説明図である。
【図１６】遅延時間設定処理のルート例を示す説明図である。
【図１７】スレッド群その１の実行結果（プロセッサ４つ）を示す説明図である。
【図１８】スレッド群その２の構成を示す説明図である。
【図１９】スレッド群その２についてのキュー割り付け例を示す説明図である。
【図２０】スレッド群その２の実行結果（プロセッサ４つ）を示す説明図である。
【図２１】プロセッサ数が少ない場合のスレッド群その１についてのキュー割り付け例を示す説明図である。
【図２２】プロセッサ数の少ないマルチコアプロセッサにおけるスレッド群その１の実行結果（プロセッサ２つ）を示す説明図である。
【図２３】従来のプロセスの連続実行を示す説明図である。
【発明を実施するための形態】
【００２０】
以下に添付図面を参照して、この発明にかかるスケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法の好適な実施の形態を詳細に説明する。
【００２１】
図１は、本実施の形態にかかるスケジューリング処理の一例を示す説明図である。本実施の形態では、従来の連続実行の間に発生していた待機時間の発生回数を削減することによって、キャッシュミスの低減とプロセッサの処理効率の維持とを両立させる。
【００２２】
具体的には、下記の３つの処理によってキャッシュミスの低減とプロセッサの処理効率の維持とを両立させている。
（１）実行タイミングを調整して同一プロセッサにおいて前後の処理を連続実行させる。
（２）連続実行に邪魔な処理を特定のプロセッサにまとめて実行させる。
（３）待機時間が発生しても短い時間であれば他のプロセスを実行対象に入れない。
【００２３】
従来の技術と同様に、本実施の形態は、マルチコアプロセッサによって実行させる対象プログラムに含まれる処理群を、事前に関連するデータを利用する処理ごとのグループに分けている。例えば、処理１〜１０は、実行時に利用するデータが関連する処理ごとにグループ１〜３に分けられている。したがって、図１のように、マルチコアプロセッサシステムを構成するＣＰＵ＃０〜＃３の４つのプロセッサのうち、ＣＰＵ＃１には、グループ１に属する処理が割り当てられ、ＣＰＵ＃２にはグループ２に属する処理が割り当て、ＣＰＵ＃３にはグループ３に属する処理が割り当てられている。
【００２４】
本実施の形態は、さらに、各プロセッサにおいて処理を実行する際のタイミングを、前後の処理同士が連続して実行できるように調整する（上記（１）の処理）。具体的には、本実施の形態では、実行時に利用するデータが共通する処理、すなわち、一旦キャッシュに格納したデータを連続して使用できる処理の実行時間を、設計段階であらかじめ見積もっておく。さらに、本実施の形態では、各処理の実行時間と、各処理ブロックの入出力関係と、データを共有するグループの情報とに基づいて、待機時間の発生回数を極力減らすように処理を実行するタイミングを調整する。
【００２５】
また、本実施の形態では、外部割り込みや内部割り込みなど連続実行に邪魔な処理を特定のプロセッサにまとめることによって、スケジューラがスケジューリングした順序で各処理が実行される（上記（２）の処理）。例えば、図１の場合、ＣＰＵ＃０は、連続実行に邪魔な処理を実行するための専用のプロセッサとして利用される。プロセッサ＃０には、外部および内部の割込処理の他に、いずれのグループにも属していない処理や、グループに関する情報が付与されていない処理が、実行対象の処理として割り当てられる。したがって、プロセッサ＃１〜＃３に割込処理が割り当てられるような事態を防ぎ、プロセッサ＃１〜＃３は、スケジューリング通りのタイミングで指定された処理を実行する。
【００２６】
また、本実施の形態でも、他のプロセッサによって依存関係のある処理が実行されている場合、処理が終了するまでの間、待機時間が発生することもある。しかしながら、本実施の形態の場合、従来のように待機時間に漏れなく他のアプリケーションのプロセスを実行させるのではなく、待機時間の長さが規定値よりも短いか否かを判断して他のアプリケーションの処理を実行するか否かを判断する。具体的には、プロセッサは、待機時間が短い時間であれば、他のアプリケーションのプロセスを実行させない（上記（３）の処理）。したがって、待機時間が発生しても、各プロセッサが、毎回他のプロセスを実行することはない。結果として、他のプロセスの実行によるキャッシュミスの発生回数が削減される。また、待機時間が長ければ待機時間を利用して他のプロセスを実行するため、プロセッサの処理効率を維持することもできる。
【００２７】
以上説明したように、本実施の形態にかかるスケジューリング処理を適用することによって、一旦キャッシュに格納したデータを利用する処理を連続して実行させるため、キャッシュミスの回数が削減される。したがって、キャッシュが有効活用され、プロセッサの処理性能を向上させることができる。以下に、本実施の形態にかかるスケジューリング処理を実現するスケジューラの具体的な構成や処理内容について説明する。
【００２８】
（マルチコアプロセッサシステムのハードウェア構成）
図２は、マルチコアプロセッサシステムのハードウェア構成の一例を示すブロック図である。図２において、マルチコアプロセッサシステム１００は、マルチコア２０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、磁気ディスクドライブ２０４と、磁気ディスク２０５と、光ディスクドライブ２０６と、光ディスク２０７と、ディスプレイ２０８と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０９と、キーボード２１０と、マウス２１１と、スキャナ２１２と、プリンタ２１３と、を備えている。また、各構成部はバス２２０によってそれぞれ接続されている。
【００２９】
ここで、マルチコア２０１は、ｎ個のＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）を備え、マルチコアプロセッサシステム１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムや、スケジューリング処理を実現するためのスケジューラなどの各種のプログラムを記憶している。ＲＡＭ２０３は、ＣＰＵ２０１のワークエリアとして使用される。磁気ディスクドライブ２０４は、ＣＰＵ２０１の制御にしたがって磁気ディスク２０５に対するデータのリード／ライトを制御する。磁気ディスク２０５は、磁気ディスクドライブ２０４の制御で書き込まれたデータを記憶する。
【００３０】
光ディスクドライブ２０６は、ＣＰＵ２０１の制御にしたがって光ディスク２０７に対するデータのリード／ライトを制御する。光ディスク２０７は、光ディスクドライブ２０６の制御で書き込まれたデータを記憶したり、光ディスク２０７に記憶されたデータをコンピュータに読み取らせたりする。
【００３１】
ディスプレイ２０８は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。このディスプレイ２０８は、例えば、ＣＲＴ、ＴＦＴ液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【００３２】
インターフェース（以下、「Ｉ／Ｆ」と略する。）２０９は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１４に接続され、このネットワーク２１４を介して他の装置に接続される。そして、Ｉ／Ｆ２０９は、ネットワーク２１４と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０９には、例えばモデムやＬＡＮアダプタなどを採用することができる。
【００３３】
キーボード２１０は、文字、数字、各種指示などの入力のためのキーを備え、データの入力を行う。また、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス２１１は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。ポインティングデバイスとして同様に機能を備えるものであれば、トラックボールやジョイスティックなどであってもよい。
【００３４】
スキャナ２１２は、画像を光学的に読み取り、マルチコアプロセッサシステム１００内に画像データを取り込む。なお、スキャナ２１２は、ＯＣＲ（Ｏｐｔｉｃａｌ  Ｃｈａｒａｃｔｅｒ  Ｒｅａｄｅｒ）機能を持たせてもよい。また、プリンタ２１３は、画像データや文書データを印刷する。プリンタ２１３には、例えば、レーザプリンタやインクジェットプリンタを採用することができる。
【００３５】
図３は、マルチコアプロセッサシステムによるキュー割り付け例を示す説明図である。図３のようにマルチコアプロセッサシステム１００は、各ＣＰＵにスケジューリング処理用の専用プログラムであるスケジューラ２００を用意している。そして、マルチコアプロセッサシステム１００は、４つのプロセッサの中の特定のプロセッサのスケジューラ２００を利用して、対象プログラムを構成する処理群を、各処理を実行させるプロセッサにそれぞれ割り付ける。
【００３６】
図３では、各ＣＰＵに用意されたスケジューラ２００のうち、ＣＰＵ＃０のスケジューラ０が、対象プログラムを構成する処理群を各プロセッサに割り付けている。なお、スケジューラ０によるスケジューリング結果（どのプロセッサにおいてどのタイミングで実行するか）は、一旦、プロセッサごとのレディーキューに格納される。
【００３７】
図３に例示したマルチコアプロセッサシステム１００の場合、共有メモリ３００に各プロセッサのレディーキューが用意されている。共有メモリ３００は、例えば、図２のＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５や光ディスク２０７などを用いて実現される。また、一旦レディーキューに配置された各処理は、各ＣＰＵのスケジューラ２００によって実行される。
【００３８】
（依存情報付きプログラムのデータ構成）
図４は、依存情報付きプログラムの一例を示す説明図である。本実施の形態では、プログラムを構成する処理群の各処理に依存情報が付与されている。依存情報のデータ構成に特に限定はないが、情報の内容として、各処理が属するグループ、各処理と依存関係にある先行処理、各処理と依存関係にある後続処理、さらに、各処理の実行時間が含まれている。
【００３９】
図４では、処理の単位の一例としてスレッド４００ごとに付与された依存情報であるスレッド情報４０１のデータ構成について説明する。スレッド情報４０１には下記の各情報が含まれている。
【００４０】
スレッドＩＤ：スレッドの識別情報
先行のスレッドＩＤリスト：依存関係のある先行スレッドの識別情報
後続のスレッドＩＤリスト：依存関係のある後続スレッドの識別情報
連続実行グループＩＤ：キャッシュミスなく連続実行できるグループの識別情報
推定実行時間：実行に要する時間の推定値
経過時間：実行時の経過時間（実際の実行状況に応じて変化する）
【００４１】
上述のようなスレッド情報４０１を利用することによって、スケジューラ２００は、スレッドＩＤ０〜ＩＤ７の実行順序と依存関係とを特定することができる。
【００４２】
（スケジューラの機能的構成）
図５は、スケジューラの機能的構成の一例を示すブロック図である。スケジューラ２００は、第１検出部５０１と、第２検出部５０２と、割当部５０３と、算出部５０４と、設定部５０５と、を含む構成である。この制御部となる機能（第１検出部５０１〜設定部５０５）は、具体的には、例えば、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置に記憶されたプログラムをマルチコア２０１の中の特定のＣＰＵに実行させることにより、または、Ｉ／Ｆ２０９により、その機能を実現する。また、メモリ５００は、対象プログラムを格納するため、図２に示したＲＯＭ２０２、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶装置や外部の記憶装置によって実現する。
【００４３】
第１検出部５０１は、対象プログラムを構成する処理群の中から特定の条件を満たす処理群を検出する機能を有する。具体的には、第１検出部５０１は、メモリ５００に格納されている対象プログラムの中から、後続処理群が共通するスケジューリングの未設定処理群を検出する。スケジューリングの未設定処理群とは、対象プログラムを構成する処理群のうち、マルチコアプロセッサシステム１００によって未実行の処理とスケジューリングによって実行タイミングが設定済の処理とを除いた処理である。
【００４４】
例えば、ある未設定処理（処理４，５，６）について、処理４の後続処理として処理１０，１１が設定され、処理５の後続処理として処理１０，１１が設定され、処理６の後続処理として処理９，１２が設定されている場合について説明する。上述のような設定がなされている場合、第１検出部５０１は、未設定処理群として処理４，５を検出する。なお、検出された未設定処理群は、一旦、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００４５】
第２検出部５０２は、第１検出部５０１によって検出された未設定処理群中から特定の条件を満たす処理群を検出する機能を有する。具体的には、第２検出部５０２は、未設定処理ごとに、同じグループに属する先行処理を検出する。
【００４６】
例えば、ある未設定処理（処理５）に着目した場合、依存情報には先行処理として処理１，２，３が設定されている。そして、処理５がグループ１に属している場合、第２検出部５０２は、処理１，２，３のうち、グループ１に属している処理を検出する。
【００４７】
また、未設定処理群を構成する未設定処理の内容によっては、グループ１に属している処理が複数含まれている場合もあるが、そのような場合、第２検出部５０２は、すべての処理を検出する。反対に、未設定処理群にグループ１に属している処理がない場合もある。そのような場合、第２検出部５０２は、先行処理がないという検出結果を得る。なお、検出結果は、一旦、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００４８】
割当部５０３は、未設定処理ごとに、各未設定処理を実行するプロセッサに割り当てる機能を有する。具体的には、割当部５０３は、未設定処理を、マルチコアプロセッサ２０１の中の各プロセッサのうち、第２検出部５０２によって検出された先行処理が割り当てられているプロセッサに割り当てる。
【００４９】
例えば、ある未設定処理（処理５）の先行処理として、第２検出部５０２によって同じグループ１に属する処理１が検出されたとする。すると、割当部５０３は、処理５を処理１と同じプロセッサによって実行させるように割当処理を行う。すなわち、処理１がプロセッサ＃２に割り当てられていた場合、割当部５０３は、処理５をプロセッサ＃２に割り当てる。
【００５０】
また、処理５を対象とした割当処理の際に、既に先行処理となる処理１が終了している可能性もある。したがって、割当部５０３は、過去の割当処理を参照して処理５を実行させるプロセッサを割り当てる。なお、割当結果は、一旦、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００５１】
算出部５０４は、未設定処理ごとに、実際に実行させた場合の処理終了時刻を算出する機能を有する。具体的には、算出部５０４は、未設定処理に対する先行処理群がすべて終了する実行終了時刻から、未設定処理の実行時間の経過時刻を算出する。
【００５２】
例えば、ある未設定処理（処理４，５）について処理終了時刻を算出する場合、各未設定処理の処理開始時刻は、先行処理の終了時刻のうち最も遅い時刻になる。そして、処理４の先行処理の終了時刻のうち最も遅い時刻に処理４を開始させた場合に、処理４の実行時間（例えば、図４のスレッド情報４０１に設定されている推定実行時間）を経過した時刻が、処理４の処理終了時刻となる。同様に、算出部５０４は、処理５についても処理終了時刻を算出する。なお、算出結果は、一旦、ＲＡＭ２０３、磁気ディスク２０５、光ディスク２０７などの記憶領域に記憶される。
【００５３】
設定部５０５は、割当部５０３によっていずれかのプロセッサに割り当てられた未設定処理ごとに、未設定処理の割当先のプロセッサでの実行開始時刻を設定する機能を有する。具体的には、設定部５０５は、算出部５０４によって算出された最も遅い経過時刻から未設定処理の実行時間分さかのぼった時刻を未設定処理の実行開始時刻に設定する。
【００５４】
例えば、算出部５０４によって、処理４の処理終了時刻Ｔ４と処理５の処理終了時刻Ｔ５とが算出されたとする。そしてＴ４＞Ｔ５（Ｔ４の方がより遅い時刻）の場合、処理４，５は共にＴ４で終了するように実行開始時刻を設定する。したがって、設定部５０５は、Ｔ４から処理４の実行時間分さかのぼった時刻を処理４の実行開始時刻に設定する。同様に、設定部５０５は、Ｔ４から処理５の実行時間分さかのぼった時刻を処理５の実行開始時刻とする。
【００５５】
上述の手順によって、Ｔ４の時刻には、処理４，５が同時に終了する。そして、第１検出部５０１の検出の条件に挙げたように、処理４，５は後続処理群が共通している。したがって、後続処理群は、先行処理が同時に終了しているため、Ｔ４の時刻に先行処理（ここでは、処理４，５）と連続して実行することができる。
【００５６】
すなわち、設定部５０５は、未設定処理の先行処理群がすべて終了する実行終了時刻（例えばＴ４）が存在する場合には、実行終了時刻Ｔ４を、未設定処理の実行開始時刻に設定する。
【００５７】
以上説明したように、設定部５０５は、ある未設定処理について、同一のプロセッサで実行される先行処理が終了した後、即座に実行可能となる場合には、未設定処理と先行処理が連続実行されるように上述の未設定処理の実行開始時刻を設定する。反対に、同一のプロセッサで実行される先行処理が終了した後、即座に実行可能ではない場合、設定部５０５は、未設定処理と後続処理とが連続実行されるように上述の未設定処理の実行開始時刻を設定する。
【００５８】
以上説明した設定例は、最も基本的な手順であるが、未設定処理群は、先行処理や後続処理の設定、さらに、所属するグループの設定に応じて様々な動作状況が想定される。したがって、以下には、動作状況の違いに応じた、割当部５０３および設定部５０５の処理の違いについて説明する。
【００５９】
まず、第２検出部５０２が、未設定処理の所属グループに属する先行処理を検出できないような動作状況について説明する。このような動作状況の場合、設定部５０３は、先行処理が検出されなかった未設定処理を、マルチコア２０１の中の先行処理が割り当てられていないプロセッサに割り当てる。すなわち、設定部５０３は、何の処理も割り当てられていない空き状態のプロセッサを割り当てる。
【００６０】
さらに、第２検出部５０２では、上述のように未設定処理の所属グループに属する先行処理が検出されず、空きのプロセッサもないような動作状況も想定される。このような動作状況の場合、設定部５０３は、マルチコア２０１のうち、割り当て済の先行処理の実行時間が最短となるプロセッサに未設定処理を割り当てる。すなわち、設定部５０５は、処理負荷の一番軽いプロセッサに未設定処理を割り当てる。
【００６１】
また、他の例として、未設定処理に実行順序に関する優先度が設定されている場合がある。優先度が設定されている場合、設定部５０３は、未設定処理のうち、優先度が高く設定されている未設定処理を優先的に、第２検出部５０２によって検出された先行処理が割り当てられているプロセッサに割り当てる。
【００６２】
また、他の例として、対象プログラムおよび対象プログラム以外のプログラムによって発生した割込処理が未設定処理となるような動作状況が想定される。このような動作状況の場合、設定部５０３は、第２検出部５０２によって未設定処理の所属グループに属する先行処理が検出されなかったプロセッサに割り当てる。
【００６３】
すなわち、割当部５０３は、割込処理によって発生した未設定処理を、各グループに属する先行処理が割り当てられているプロセッサとは異なるプロセッサに割り当てる。なお、設定部５０３は、すべてのプロセッサに各グループに属する先行処理が割り当てられている場合には、マルチコア２０１のうち、割り当て済の先行処理の実行時間が最短となるプロセッサに、割込処理によって発生した未設定処理を割り当てる。
【００６４】
割当部５０３は、スレッド情報４０１などの後続処理群および先行処理群を特定する情報が含まれていない処理を、第２検出部５０２によって先行処理が検出されなかったプロセッサに割り当てる。すなわち、設定部５０３は、先行処理の割り当てられていない、空き状態のプロセッサに、スレッド情報４０１が付与されていない処理を割り当てる。ここでも、空き状態のプロセッサがない場合、設定部５０３は、マルチコアプロセッサ２０１のうち、割り当て済の先行処理の実行時間が最短となるプロセッサに、スレッド情報４０１が付与されていない処理を割り当てる。
【００６５】
（スケジューリング処理の手順）
図６は、スケジューリング処理の手順を示すフローチャートである。図６のフローチャートは、スケジューラ２００が、実行対象となるアプリケーションに含まれる処理群をマルチコア２０１の各プロセッサに実行させるタイミングを設定するまでの手順を示している。図６の各処理を実行することによって、スケジューラ２００は、実行タイミングが設定されていない未設定処理を依存関係のある先行処理もしくは後続処理と連続して実行できるようなタイミングで各処理を実行させることができる。
【００６６】
図６において、スケジューラ２００は、第１検出部５０１によって、メモリ５００に格納された実行対象となる対象プログラムを構成する処理群の中から、未設定処理群があるか否かを判断する（ステップＳ６０１）。ステップＳ６０１において、未設定処理群があると判断されるまで待機状態とし（ステップＳ６０１：Ｎｏのループ）、未設定処理群があると判断されると（ステップＳ６０１：Ｙｅｓ）、スケジューラ２００は、第１検出部５０１によって未設定処理を検出する（ステップＳ６０２）。
【００６７】
そして、スケジューラ２００は、ステップＳ６０２において検出した未設定処理にプロセッサが割り当てられているか否かを判断する（ステップＳ６０３）。ステップＳ６０３において、未設定処理にプロセッサが割り当てられていないと判断された場合（ステップＳ６０３：Ｎｏ）、スケジューラ２００は、未設定処理を実行させるプロセッサの割手処理を行う。具体的には、スケジューラ２００は、割当部５０３によって実行中のプロセッサに対する第２検出部５０２の検出結果に応じて各処理をプロセッサに割り当てる（ステップＳ６０４）。
【００６８】
ステップＳ６０３において、未設定処理にプロセッサが割り当てられていると判断された場合（ステップＳ６０３：Ｙｅｓ）、割当部６０３における割当処理は必要ないため、スケジューラ２００は、そのままステップＳ６０５の処理に移行する。
【００６９】
次に、スケジューラ２００は、未設定処理の先行処理の終了時刻に基づいて、先行処理の終了後に連続実行できるか否かを判断する（ステップＳ６０５）。連続実行できるとは、同じプロセッサによって実行されている先行処理が終了した後に、待機時間を挟むことなく未設定処理を実行できる状態を意味する。すなわち、対象となるプロセッサでは、他のプロセッサによって実行されている先行処理が終了している状態である。
【００７０】
ステップＳ６０５において、連続実行できないと判断された場合（ステップＳ６０５：Ｎｏ）、スケジューラ２００は、未設定処理が後続処理と連続実行できるようにスケジューリングを行う。したがって、スケジューラ２００は、まず、第１検出部５０１によって検出された後続処理が共通する未設定処理について、算出部５０４によって処理終了時刻を算出する（ステップＳ６０６）。
【００７１】
さらに、スケジューラ２００は、ステップＳ６０６において算出された処理終了時刻のうち最も遅い処理終了時刻を抽出する（ステップＳ６０７）。さらに、スケジューラ２００は、ステップＳ６０７において抽出された処理終了時刻に各未設定処理が終了するような実行開始時刻を算出する（ステップＳ６０８）。
【００７２】
その後、スケジューラ２００は、設定部５０５によって未設定処理に対して、ステップＳ６０８において算出された実行開始時刻に処理を開始するように設定し（ステップＳ６０９）、一連の処理を終了する。
【００７３】
一方、ステップＳ６０５において、連続実行できると判断された場合（ステップＳ６０５：Ｙｅｓ）、スケジューラ２００は、未設定処理が先行処理と連続実行できるようにスケジューリングを行う。したがって、スケジューラ２００は、設定部５０５によって未設定処理に対して、先行処理終了後に待機時間なく連続実行するように設定し（ステップＳ６１０）、一連の処理を終了する。
【００７４】
図７は、スケジューリング処理を利用したスケジューリング例を示す説明図である。図７のスケジューリング例７０１は、従来のスケジューリング処理を実行した場合を表し、スケジューリング例７０２は、スケジューラ２００のスケジューリング処理を実行した場合を表している。なお、スケジューリング例７０１，７０２の場合も、ＣＰＵ＃０ではグループ１に属する処理が実行され、ＣＰＵ＃１ではグループ２に属する処理が実行され、ＣＰＵ＃２ではグループ３に属する処理が実行される。
【００７５】
スケジューリング例７０１が表す従来のスケジューリング処理の場合、他のプロセッサによって実行されている先行処理の終了時刻のうち最も遅い時刻（ｔ１〜ｔ４）に到達するまで、各処理には毎回待機時間が発生していた。
【００７６】
一方、スケジューリング例７０２が表すスケジューラ２００のスケジューリング処理の場合、各処理は、少なくとも、先行処理、もしくは、後続処理のいずれかと連続実行するようにスケジューリングされている。したがって、同じ数の処理を実行する場合であっても、待機時間の発生回数が大幅に削減される。
【００７７】
さらに、待機時間が発生した場合であっても、待機時間が規定値よりも短ければ、待機時間に他のアプリケーションの処理を実行するようなスケジューリングが行われることもない。したがって、各プロセッサは、一旦キャッシュに格納されたデータを長く利用するため、それぞれ処理効率を上げることができる。
【００７８】
（実施例）
次に、スケジューラ２００の具体的な実施例について説明する。本実施例では、処理の単位としてスレッドを実装する。スレッドとはオペレーティングシステムにおける最小の処理の管理単位である。通常、スレッドにはオペレーティングシステムが管理するための管理情報として、スレッドの識別情報や、起動時刻、稼働時間、優先順位といった情報が付与されている。
【００７９】
本実施例では、スレッド情報として、上述のような通常の管理情報に加えて、先行するスレッドとなる先行スレッドについての識別情報のリストと、後続のスレッドとなる後続スレッドについての識別情報のリストと、グループの識別情報と、スレッドの実行時間（例えば、予想処理時間）が付与されている。
【００８０】
ここで、先行スレッドとはスレッド同士の入出力関係で、このスレッドの入力となるデータを生成するスレッドであり、先行するスレッドがすべて終了すると、対象となるスレッドが実行可能になる。後続スレッドは逆にこのスレッドが生成するデータを入力とするスレッドとなる。
【００８１】
また、グループの識別情報は、対象プログラムを解析することによって特定された、関連データを共有するスレッドの集団を示す情報である。グループの識別情報が同じスレッドを同一のプロセッサで連続して実行することで、所定のデータが格納されたキャッシュを利用し続けることができるため、キャッシュミスを起こすことなく、キャッシュの利用効率を上げることができる。
【００８２】
また、スレッドの実行時間については、対象プログラムの解析結果を利用して設定してもよく、事前にスレッドを実行してその時の処理時間とキャッシュのミス率、スケジューラ２００を適用することで期待できるキャッシュのミス率から求めることができる。したがって、以降の本実施例の説明では、スレッドの実行時間を「予想処理時間」と呼ぶ。
【００８３】
そして、本実施例では、マルチコアプロセッサシステム１００によって実行するアプリケーション毎にスケジューラ２００によるスケジューリング処理を適用するが、本手法が適用されていないアプリケーションでは、スレッド情報４０１が付与されていない従来通りのスレッドにより構成されるものとする。
【００８４】
一方で、スケジューラ２００によるスケジューリング処理を適用したアプリケーションは、複数のスレッドで構成されているものとする。さらに、複数のスレッドのうちの幾つか、もしくは、すべてのスレッドは、先行スレッドのリストと後続スレッドのリストのいずれか、もしくは、両方と予想処理時間の情報と、所属するグループの識別情報を持つものとする。
【００８５】
以降、先行のスレッドのリストと後続のスレッドのリストのいずれかもしくは両方と予想処理時間の情報を持つスレッドを「依存情報を持つスレッド」とし、従来のスレッドを「依存情報を持たないスレッド」とする。また、グループの識別情報を持つスレッドをグループに属するスレッド、同一のグループ識別情報を持つスレッドを同一のグループに属するスレッドとする。
【００８６】
通常、マルチコアプロセッサシステム１００を起動させると、オペレーティングシステムが動作してアプリケーションを起動する。さらにオペレーティングシステムは、アプリケーション内でメインとなるスレッドを起動させる。起動の際に、複数スレッドがある場合はメインとなるスレッドからスレッドを起動させる。そして、起動させたメインとなるスレッドからさらに、他のスレッドを起動といった形で順次スレッドが起動される。また、アプリケーション内に依存情報が付与されたスレッドがある場合、依存情報が付与されていないいずれかのスレッドから一括して依存情報を持つスレッドが起動される。
【００８７】
オペレーティングシステムは、新たにスレッドが起動されると、スレッドの割当先プロセッサを決定してそのプロセッサに対応するレディーキューという実行可能なスレッド群を格納する共有メモリ３００内のデータ構造にスレッドを追加する。
【００８８】
依存情報を持つスレッドが新たに起動された場合、スケジューラ２００は、以下の図８に示した割当処理によって同一のグループに属するスレッドを同一のプロセッサに割り当てる。また、割当処理では、同一のグループに属するスレッドを同一のプロセッサに割り当てるのみならず、各プロセッサでの処理量がなるべく均一になるようにスレッドの割当先を決定することができる。
【００８９】
（プロセッサの割当処理）
図８は、実施例におけるプロセッサの割当処理の手順を示すフローチャートである。図８のフローチャートは、スケジューラ２００が、マルチコアプロセッサによってアプリケーションを構成するスレッドを各プロセッサに割り当てるまでの手順を示している。図８の各処理を実行することによって、グループ情報が共通するスレッドを同一のプロセッサによって実行されるように割り当てることができる。
【００９０】
さらに、実施例では、各グループの実行に要する時間を参照して、処理時間の長いグループに含まれるスレッドから順番に割り付けるため、効率的に各スレッドが実行できるような割り当てが可能となる。
【００９１】
図８において、スケジューラ２００は、まず、グループ毎に予想処理時間の合計を算出する（ステップＳ８０１）。続いて、スケジューラ２００は、未割り当てのグループがあるか否かを判断する（ステップＳ８０２）。
【００９２】
ステップＳ８０２において、未割り当てのグループがあると判断された場合（ステップＳ８０２：Ｙｅｓ）、スケジューラ２００は、割り当てられたスレッドの予想処理時間の合計が最小のプロセッサを選択する（ステップＳ８０３）。その後、スケジューラ２００は、予想処理時間の合計が最大のグループの全スレッドをステップＳ８０３において選択したプロセッサに割り当てる（ステップＳ８０４）。
【００９３】
以上説明したステップＳ８０２〜Ｓ８０４では、未割り当てのグループに対して実際の処理を実行させるためのプロセッサを割り当てるための処理を行っている。ステップＳ８０２によって未割り当てのグループがないと判断されると、次に説明するスレッドを対象として、各プロセッサに割り当てを行うための処理に移行する。
【００９４】
ステップＳ８０２において、未割り当てのグループがないと判断された場合（ステップＳ８０２：Ｎｏ）、スケジューラ２００は、未割り当てのスレッドがあるか否かを判断する（ステップＳ８０５）。すなわち、スケジューラ２００は、ステップＳ８０５によって、各プロセッサに割り付けられたグループに属する各スレッドについての実行対象となるプロセッサの割り当てが可能か否かの判断を行っている。
【００９５】
ステップＳ８０５において、未割り当てのスレッドがあると判断されると（ステップＳ８０５：Ｙｅｓ）、スケジューラ２００は、各プロセッサの中から、割り当てられたスレッドの予想処理時間の合計が最小のプロセッサを選択する（ステップＳ８０６）。
【００９６】
さらに、スケジューラ２００は、未割り当てのスレッドの中で予想処理時間が最大のスレッドを、ステップＳ８０６によって選択されたプロセッサに割り当てる（ステップＳ８０７）。その後、スケジューラ２００は、ステップＳ８０５によって未割り当てのスレッドがあると判断されると、ステップＳ８０６，Ｓ８０７の処理を繰り返し、未割り当てのスレッドがないと判断されると（ステップＳ８０５：Ｎｏ）、一連の割当処理を終了する。
【００９７】
以上説明した割当処理の後、スレッドが新たにレディーキューに追加されるか、スレッドの終了などによりスレッドがレディーキューから削除されると、オペレーティングシステムではスケジューラ２００によってスレッドのスケジューリング処理を実行させる。
【００９８】
従来のスケジューリングにおいて、スケジューラ２００は、スレッドの優先順位を見て行うが、本実施例の場合、同一グループに属するスレッドをなるべく連続して実行させるため、後述する図９のスケジューリング処理を行う。なお、各プロセッサにおけるスケジューリング処理はレディーキュー毎に対応するスケジューラ２００によって行われる。
【００９９】
また、各プロセッサには、現在実行しているグループの識別情報を格納するデータ構造（実行グループ情報）と、現在実行中のスレッドが時間調整をしたかを示すフラグ（ｎｏ＿ｗａｉｔフラグ）とがレディーキューに設定されている。
【０１００】
＜スケジューリング処理の手順＞
図９は、実施例におけるスケジューリング処理の手順を示すフローチャートである。図９のフローチャートは、スケジューラ２００による各プロセッサに割り当てられたスレッドの実行タイミングの設定手順を示している。図９の各処理を実行することによって、スレッド間の待機時間の発生を軽減させることができる。
【０１０１】
図９において、スケジューラ２００は、まず、各プロセッサによって実行中のスレッドについてのグループ情報が設定されているか否かを判断する（ステップＳ９０１）。ステップＳ９０１において、グループ情報が設定されていないと判断された場合（ステップＳ９０１：Ｎｏ）、スケジューラ２００は、レディーキューから最高優先度のスレッドを選択する（ステップＳ９０２）。そして、スケジューラ２００は、ステップＳ９０２による選択スレッドに依存情報がなく、グループに属するスレッドよりも優先度が高いか否かを判断する（ステップＳ９０３）。
【０１０２】
ステップＳ９０３において、選択スレッドに依存情報がなく、グループに属するスレッドよりも優先度が高いと判断された場合（ステップＳ９０３：Ｙｅｓ）、スケジューラ２００は、選択スレッドを実行させて（ステップＳ９０４）、スケジューリングを終了する。一方、ステップＳ９０３において、選択スレッドに依存情報がある、または優先度が高くないと判断された場合（ステップＳ９０３：Ｎｏ）、スケジューラ２００は、グループ内に実行可能なスレッドがあるか否かを判断する（ステップＳ９０５）。
【０１０３】
ステップＳ９０５において、グループ内に実行可能なスレッドがあると判断された場合（ステップＳ９０５：Ｙｅｓ）、スケジューラ２００は、実行可能なスレッドにｎｏ＿ｗａｉｔフラグが設定されているか否かを判断する（ステップＳ９０６）。
【０１０４】
ステップＳ９０６において、ｎｏ＿ｗａｉｔフラグが設定されていると判断された場合（ステップＳ９０６：Ｙｅｓ）、スケジューラ２００は、ｎｏ＿ｗａｉｔフラグを解除する（ステップＳ９０７）。そして、スケジューラ２００は、グループ内の実行可能なスレッドのうち、最も予想処理時間の大きなスレッドを選択して実行させ（ステップＳ９０８）、スケジューリングを終了する。
【０１０５】
ステップＳ９０６において、ｎｏ＿ｗａｉｔフラグが設定されていないと判断された場合（ステップＳ９０６：Ｎｏ）、スケジューラ２００は、遅延時間処理を行って（ステップＳ９０９）、遅延起動されるように設定した後、ステップＳ９１５の処理に移行する。
【０１０６】
一方、ステップＳ９０５において、グループ内に実行可能なスレッドがないと判断された場合（ステップＳ９０５：Ｎｏ）、スケジューラ２００は、遅延起動が設定されているスレッドがあるか否かを判断する（ステップＳ９１０）。ステップＳ９１０において、遅延起動が設定されているスレッドがあると判断された場合（ステップＳ９１０：Ｙｅｓ）、スケジューラ２００は、ステップＳ９１５の処理に移行する。
【０１０７】
一方、ステップＳ９１０において、遅延起動が設定されているスレッドがないと判断された場合（ステップＳ９１０：Ｎｏ）、スケジューラ２００は、さらに、スレッドにｎｏ＿ｗａｉｔフラグが設定されているか否かを判断する（ステップＳ９１１）。ステップＳ９１１において、ｎｏ＿ｗａｉｔフラグが設定されていると判断された場合（ステップＳ９１１：Ｙｅｓ）、スケジューラ２００は、Ｉｄｌｅスレッドを実行させ（ステップＳ９１２）、一連の処理を終了する。
【０１０８】
ステップＳ９１１において、ｎｏ＿ｗａｉｔフラグが設定されていないと判断された場合（ステップＳ９１１：Ｎｏ）、スケジューラ２００は、グループ決定処理（ステップＳ９１３）と、遅延時間設定処理を行い（ステップＳ９１４）、ステップＳ９１５の処理に移行する。
【０１０９】
遅延時間設定処理を行った、もしくは、ステップＳ９１０において、遅延起動が設定されているスレッドがあると判断された場合、スケジューラ２００は、遅延起動までの最小の時間が規定値以下か否かを判断する（ステップＳ９１５）。ステップＳ９１５において、スケジューラ２００は、遅延起動までの待機時間に他のアプリケーションを構成するスレッドを実行するか否かを判断している。
【０１１０】
ステップＳ９１５において、最小の時間が規定値以下であると判断された場合（ステップＳ９１５：Ｙｅｓ）、スケジューラ２００は、Ｉｄｌｅスレッドを実行させて（ステップＳ９１６）、一連の処理を終了する。一方、ステップＳ９１５において、最小の時間が規定値以下ではないと判断された場合（ステップＳ９１５：Ｎｏ）、スケジューラ２００は、レディーキューから依存情報のない最高優先度のスレッドを選択して実行させ（ステップＳ９１７）、一連の処理を終了する。
【０１１１】
次に、ステップＳ９１３のグループ決定処理と、ステップＳ９０９およびＳ９１４の遅延時間設定処理との詳細な手順について説明する。
【０１１２】
＜グループ決定処理の手順＞
図１０は、実施例におけるグループ決定処理の手順を示すフローチャートである。図１０のフローチャートは、図９にて説明したスケジューリング処理のステップＳ９１３の詳細な処理内容を示している。図１０の各処理を実行することによって、グループが決定されていない処理のグループを決定することができる。
【０１１３】
図１０において、スケジューラ２００は、まず、レディーキュー内の依存情報付きのスレッドをすべて選択する（ステップＳ１００１）。その後、スケジューラ２００は、ステップＳ１００１においてなんらかのスレッドが選択されたか否かを判断する（ステップＳ１００２）。
【０１１４】
ステップＳ１００２において、スレッドが選択されなかった場合（ステップＳ１００２：Ｎｏ）、スケジューラ２００は、当プロセッサによって実行中のグループ情報を削除する（ステップＳ１００３）。さらに、スケジューラ２００は、レディーキューから優先順位が最も高いスレッドを選択して実行させ（ステップＳ１００４）、一連の処理を終了する。
【０１１５】
一方、ステップＳ１００２において、スレッドが選択された場合（ステップＳ１００２：Ｙｅｓ）、スケジューラ２００は、選択されたスレッドの依存関係を解析して実行可能なスレッドをすべて選択する（ステップＳ１００５）。そして、スケジューラ２００は、ステップＳ１００５において、なんらかのスレッドが選択されたか否かを判断する（ステップＳ１００６）。
【０１１６】
ステップＳ１００６において、スレッドが選択されなかった場合（ステップＳ１００６：Ｎｏ）、スケジューラ２００は、レディーキューから依存情報のない最高優先度のスレッドを選択して実行させ（ステップＳ１００７）、一連の処理を終了する。
【０１１７】
一方、ステップＳ１００６において、スレッドが選択された場合（ステップＳ１００６：Ｙｅｓ）、スケジューラ２００は、さらに、選択されたスレッドの中にグループに属するスレッドがあるか否かを判断する（ステップＳ１００８）。
【０１１８】
ステップＳ１００８において、グループに属するスレッドがあると判断された場合（ステップＳ１００８：Ｙｅｓ）、スケジューラ２００は、ステップＳ１００５において選択されたスレッドから予想処理時間の最も大きなスレッドを選択して実行させ（ステップＳ１００９）、一連の処理を終了する。
【０１１９】
ステップＳ１００８において、グループに属するスレッドがないと判断された場合（ステップＳ１００８：Ｎｏ）、スケジューラ２００は、ステップＳ１００５において選択されたスレッド内のスレッドが属するグループをすべて選択する（ステップＳ１０１０）。さらに、スケジューラ２００は、ステップＳ１０１０において選択されたグループ毎の予想処理時間の合計を計算する（ステップＳ１０１１）。その後、スケジューラ２００は、ステップＳ１０１１において計算された予想処理時間の合計が最大のグループを実行中のグループとして選択して（ステップＳ１０１２）、一連の処理を終了する。
【０１２０】
＜遅延時間設定処理の手順＞
図１１は、実施例における遅延時間設定処理の手順を示すフローチャートである。図１１のフローチャートは、図９のステップＳ９０９，Ｓ９１４の遅延時間設定処理の詳細な手順を示している。図１１の各処理を実行することによって、先行するスレッドの直後に実行可能とならないスレッドに対して、スレッドの終了後に即座に後続のスレッドを実行可能となるように実行開始時刻を調整するための適切な遅延時間を設定することができる。
【０１２１】
図１１において、スケジューラ２００は、現在プロセッサにおいて実行中の処理が属するグループから実行可能なスレッドを選択する（ステップＳ１１０１）。その後、スケジューラ２００は、ステップＳ１１０１において選択したスレッドの同グループの全後続スレッドを対象となるレディーキューから選択する（ステップＳ１１０２）。
【０１２２】
さらに、スケジューラ２００は、ステップＳ１１０２の条件に沿ったスレッドが選択されたか否かを判断する（ステップＳ１１０３）。ステップＳ１１０３において、スレッドが選択されなかった場合（ステップＳ１１０３：Ｎｏ）、スケジューラ２００は、遅延時間を設定する必要はない。したがって、スケジューラ２００は、ステップＳ１１０１において選択された実行可能なスレッドを実行させて（ステップＳ１１０４）、一連の処理を終了する。
【０１２３】
一方、ステップＳ１１０３において、スレッドが選択された場合（ステップＳ１１０３：Ｙｅｓ）、スケジューラ２００は、ステップＳ１１０２において選択されたスレッド群の全先行スレッドを全レディーキューから選択する（ステップＳ１１０５）。さらに、スケジューラ２００は、ステップＳ１１０５において選択されたスレッドの中から未実行のスレッドをすべて選択する（ステップＳ１１０６）。
【０１２４】
その後、スケジューラ２００は、選択スレッド内に実行可能スレッドのみが存在するか否かを判断する（ステップＳ１１０７）。ステップＳ１１０７において、実行可能スレッドのみが存在すると判断された場合（ステップＳ１１０７：Ｙｅｓ）、スケジューラ２００は、ステップＳ１１０５において選択されたスレッドの中から残りの処理時間が最大のスレッドを選択する（ステップＳ１１０８）。
【０１２５】
さらに、スケジューラ２００は、ステップＳ１１０８において選択されたスレッドの処理時間からステップＳ１１０１において選択された実行可能なスレッドの予想処理時間を引いた時間を算出する（ステップＳ１１０９）。そして、スケジューラ２００は、ステップＳ１１０９によって算出された算出時間が０よりも大きい値か否かを判断する（ステップＳ１１１０）。
【０１２６】
ステップＳ１１１０において、算出時間がよりも大きい値と判断された場合（ステップＳ１１１０：Ｙｅｓ）、スケジューラ２００は、待機時間の設定処理に移行する。したがって、スケジューラ２００は、ステップＳ１１０１によって選択された実行可能なスレッドをステップＳ１１０９の算出時間だけスリープするように設定し（ステップＳ１１１１）、一連の処理を終了する。
【０１２７】
一方、ステップＳ１１１０において、算出時間が０よりも大きい値ではないと判断された場合（ステップＳ１１１０：Ｎｏ）、スケジューラ２００は、待機時間を設定する必要がないため、ｎｏ＿ｗａｉｔフラグをｔｒｕｅに設定する（ステップＳ１１１２）。その後、スケジューラ２００は、ステップＳ１１０１において選択された実行可能なスレッドを実行させて（ステップＳ１１１３）、一連の処理を終了する。
【０１２８】
また、ステップＳ１１０７において、実行可能スレッドのみが存在しないと判断された場合（ステップＳ１１０７：Ｎｏ）、スケジューラ２００は、処理対象を他のグループのスレッドに移行する。したがって、スケジューラ２００は、ステップＳ１１０６において選択されたスレッド内に当プロセッサに割り当てられた別グループのスレッドがあるか否かを判断する（ステップＳ１１１４）。
【０１２９】
ステップＳ１１１４において、別グループのスレッドがあると判断された場合（ステップＳ１１１４：Ｙｅｓ）、スケジューラ２００は、ステップＳ１１０１によって選択された実行可能なスレッドを実行させて（ステップＳ１１０４）、一連の処理を終了する。
【０１３０】
一方、ステップＳ１１１４において、別グループのスレッドがないと判断された場合（ステップＳ１１１４：Ｎｏ）、スケジューラ２００は、ステップＳ１１０６において選択されたスレッドの中から、予想処理時間が最大のスレッドを選択する（ステップＳ１１１５）。その後、スケジューラ２００は、ステップＳ１１１５において選択されたスレッド数がステップＳ１１０１において選択された実行可能なスレッド数と等しいか否かを判断する（ステップＳ１１１６）。
【０１３１】
ステップＳ１１１６において各スレッド数が等しいと判断された場合（ステップＳ１１１６：Ｙｅｓ）、スケジューラ２００は、ステップＳ１１０８の処理に移行する。一方、ステップＳ１１１６において、各スレッド数が等しくないと判断された場合（ステップＳ１１１６：Ｎｏ）、スケジューラ２００は、ステップＳ１１１５において選択されたスレッドの実行開始をステップＳ１１０１において選択された実行可能なスレッドの実行可能条件に設定し（ステップＳ１１１７）、一連の処理を終了する。
【０１３２】
本実施例では、上述したようなスケジューリング処理を行うことによって、マルチコアプロセッサシステム１００において、効率的にアプリケーションを実行させることができる。以下には、本実施例にて説明したマルチコアプロセッサシステム１００によって各種アプリケーションを実行させた場合の具体的な動作例について説明する。
【０１３３】
＜実行例１＞
実行例１では、まず、典型的なアプリケーションの例として、依存情報を持った１０個のスレッド群（後述するスレッド群その１）を起動した場合の実行内容について説明する。なお、実行例１を実行するマルチコアプロセッサシステム１００の場合、プロセッサ＃０〜＃３の４つのコアを備えている。そして、マルチコアプロセッサシステム１００に実行させるスレッド群その１は、グループ１〜４の４つのグループに分けられている。したがって、スケジューラ２００は、各プロセッサにそれぞれ異なるグループのスレッドを割り当てることができる。
【０１３４】
図１２は、スレッド群その１の構成を示す説明図である。図１２に例示したように、スレッド群その１は、ＩＤ１〜ＩＤ１０の１０個のスレッドを含んでいる。各スレッドには、スレッドを識別するＩＤの他に、依存情報として下記の情報が付与されている。
【０１３５】
先行：依存関係のある先行スレッドのＩＤを表す情報
後続：依存関係のある後続スレッドのＩＤを表す情報
グループ：スレッド実行時に対象となるデータが共通するグループ同士を表す情報
予想時間：スレッドの実行に要する時間として予想された時間を表す情報
【０１３６】
図１３は、スレッド群その１についてのキュー割り付け例を示す説明図である。スレッド群その１は、図８にて説明した割当処理を行った場合、図１３のように、各プロセッサのレディーキューに配置される。具体的には、プロセッサ＃０には、スレッドＩＤ１，２，６が割り当てられる。また、プロセッサ＃１には、スレッドＩＤ３，７，１０が割り当てられる。さらに、プロセッサ＃２には、スレッドＩＤ４，８が割り当てられる。そして、プロセッサ＃３には、スレッドＩＤ５，９が割り当てられる。
【０１３７】
ここで、図１４は、スケジューリング処理のルート例を示す説明図であり、図１５は、グループ決定処理のルート例を示す説明図であり、図１６は、遅延時間設定処理のルート例を示す説明図である。以下の実行例の説明には、図１４〜１６に示した各処理の実行手順を示すルートを挙げて具体的な実行内容について説明する。
【０１３８】
スレッド群その１が各プロセッサに割り当てられると、各スケジューラ２００は、各スレッドの依存情報を参照して実行タイミングを設定する。スレッド群その１の場合、まず、プロセッサ＃０では、図１４に示したルート１−１と、図１５に示したルート２−１を経ることによって、先行スレッドのないスレッドＩＤ１が実行される。
【０１３９】
スレッドＩＤ１が実行されている間、プロセッサ＃１〜３では依存関係のあるスレッドの中に実行可能なスレッドがないため、スケジューラ２００は、図１４のルート１−１と図１５ルート２−２を経る。したがって、プロセッサ＃１〜３では、各レディーキュー内の別のアプリケーションソフトウェアのスレッドが実行される。
【０１４０】
プロセッサ＃０において、スレッドＩＤ１の実行が終了した後、従来のスケジューラでは、プロセッサ＃０のみでスケジューリングが行われていた。しかしながら、本実行例の場合、スケジューラ２００によって、依存関係の付いたスレッド終了時に後続のスレッドを保持するレディーキューが検索される。さらに、スケジューラ２００は、レディーキューに関連づけられたプロセッサでもスケジューリングを行うようにプロセッサ＃０から他のプロセッサ（プロセッサ＃１〜３）にスケジューリング要求を通知する。
【０１４１】
プロセッサ＃０ではスレッドＩＤ１の終了により、スレッドＩＤ２が実行可能になる。しかしながら、スレッドＩＤ１が終了した時点ではまだ実行中グループが設定されていない。したがって、スケジューラ２００は、図１４のルート１−１と図１５のルート２−３を経て、プロセッサ＃０において、グループ１を実行中グループに決定する。
【０１４２】
さらに、プロセッサ＃０には、スレッドＩＤ２の後続スレッドでかつ同一のグループに属するスレッドＩＤ６が同じプロセッサに割り当てられている。したがって、スケジューラ２００は、図１６のルート３−１を経る。したがって、スレッドＩＤ６の先行スレッドのうち、まだ実行が開始されていないスレッドの実行時間が比較される。
【０１４３】
スレッド群その１を実行した場合、スレッドＩＤ１が終了したことにより、スレッドＩＤ１の後続スレッドとなるスレッドＩＤ２〜５についてのスケジューリングは各プロセッサにおいて、ほぼ同時に実行される。したがって、上述のルート３−１が実行された瞬間は、スレッドＩＤ１が終了したことにより実行可能となるスレッドＩＤ２〜５のいずれも実行が開始されていないとすると、未実行で処理時間が最大のスレッドはスレッドＩＤ３となる。そこで、スケジューラ２００は、図１６のルート３−２を経てスレッドＩＤ３の実行開始をスレッドＩＤ２の実行可能条件に設定する。
【０１４４】
プロセッサ＃１のスケジューラ２００は、図１４のルート１−１と、図１５のルート２−３と、図１６のルート３−１を経る。そして、実行可能なスレッドＩＤ３が、同グループに属する後続のスレッド７の先行スレッドのうち最も予想処理時間が大きい。そこで、スケジューラ２００は、図１６のルート３−３を経て、スレッドＩＤ３が実行されるようにスケジューリングする。
【０１４５】
プロセッサ＃３のスケジューラ２００は、スレッドＩＤ３の開始前であれば、プロセッサ＃０と同様に、スレッドＩＤ３の実行開始を、スレッドＩＤ５の実行可能条件に設定する。一方、プロセッサ＃３のスケジューラ２００は、スレッドＩＤ３の開始後であれば、図１６のルート３−４を経て遅延起動を設定する。
【０１４６】
スケジューラ２００によって起動遅延時間が設定されると、各プロセッサは、従来のスケジューリング技術を利用してスレッドの遅延起動を調整することができる。例えば、既存のオペレーティングシステムが提供しているｕｓｌｅｅｐなどの機能を利用すれば容易に遅延起動を実現することができる。したがって、遅延起動の実現についての具体的な手法の説明については省略するが、遅延起動が設定されたスレッドはスリープ中として一旦レディーキューから外され、遅延時間経過後にレディーキューに戻される。
【０１４７】
プロセッサ＃２のスケジューラ２００は、スケジューリング処理を行うタイミングにより実行内容が異なる。具体的には、スケジューラ２００は、スケジューリング処理時に、スレッドＩＤ３が未実行なら図１６のルート３−２を経てスレッドＩＤ４の実行可能条件にスレッドＩＤ３の実行開始を設定する。また、スケジューラ２００は、スケジューリング処理時に、スレッドＩＤ３が実行中で、スレッドＩＤ５が未実行なら同じく図１６のルート３−２を経ても、スレッドＩＤ５の実行開始をスレッドＩＤ４の実行可能条件とする。
【０１４８】
さらに、スケジューラ２００のスケジューリング処理時に、スレッドＩＤ５がスリープ中の場合、スリープ中のスレッドはレディーキューには存在しない。したがって、スレッドＩＤ４がレディーキュー内の未実行のスレッドのうち予想処理時間が最大となるため、スケジューラ２００は、図１６のルート３−３とルート３−４を経て、遅延時間を設定する。すなわち、スレッドＩＤ４は遅延時間分スリープさせられる。
【０１４９】
その後、スレッドＩＤ３の実行が開始されると、スレッドＩＤ３の開始を実行可能条件に設定されていた各スレッドが再度実行可能になる。したがって、スケジューラ２００は、今度は、既にグループが決まっているため図１４のルート１−２を経て、遅延時間設定処理を行う。遅延時間設定処理において、スケジューラ２００は、図１６のルート３−１〜３−４を経る。また、スケジューラ２００は、未実行のスレッドが減ってきた場合は図１６のルート３−５を経て、対象となるスレッドを実行するか、スリープするか、再度別のスレッドの実行開始を実行可能条件に設定して待つかのいずれかの処理を行う。
【０１５０】
プロセッサ＃０において、スレッドＩＤ２の実行が終了すると、スケジューラ２００は、再度スケジューリングを行う。このとき、対象となるスレッドのｎｏ＿ｗａｉｔフラグがｔｒｕｅであるため、同グループで実行可能なスレッドがあればスケジューラ２００は、図１４のルート１−３を経て、対象となるスレッドを即座に実行させる。また、ｎｏ＿ｗａｉｔフラグがｔｒｕｅでなくても、近いうちに他の先行スレッドが終了するため、スケジューラ２００は、図１４のルート１−４を経てキャッシュを乱さないようにＩｄｌｅスレッドを実行させて、先行スレッドが終了するのを待つ。以上説明した処理は、プロセッサ＃１〜３のスケジューラ２００においても同様に実行される。
【０１５１】
スレッドＩＤ６〜９のスケジューリング処理が終了すると、スケジューラ２００では、最後にスレッドＩＤ１０を対象スレッドとしたスケジューリング処理が開始される。スレッドＩＤ１０は、いずれのグループにも属さないため、先行スレッドがすべて終了すると、スケジューラ２００では、終了タイミングで最早グループに属する未実行のスレッドは存在しないと判断される。そこで、スケジューラ２００は、図１４のルート１−５と図１５のルート２−１を経て、スレッドＩＤ１０を実行させる。
【０１５２】
その後、スレッドＩＤ１０が割り当てられたプロセッサ＃１のスケジューラ２００は、スレッドＩＤ１０が終了すると、他に依存情報が設定されたスレッドが存在しないため、図１４のルート１−５と図１５のルート２−４を経て、実行中のグループ情報を削除する。同様に、他のプロセッサのスケジューラ２００でも、それぞれ、スレッドＩＤ６，８，９が終了すると、図１４のルート１−５と図１５のルート２−４を経て、実行中グループ情報を削除する。
【０１５３】
また、スケジューラ２００は、対象となるスレッドがスリープ中の場合は、依存情報が設定されていないスレッドを実行させる。そして、実行されたスレッドが終了してもまだ対象となるスレッドがスリープ中の場合、スケジューラ２００は、図１４のルート１−６を通って別のスレッドの実行を試みる。また、依存情報の付いたアプリケーションソフトウェア実行中に、割り込みや別のアプリケーションソフトウェアなどにより優先度の高いスレッドが実行されてしまった場合、スケジューラ２００は、図１４のルート１−７を経て、スケジューリングを行う。
【０１５４】
図１７は、スレッド群その１の実行結果（プロセッサ４つ）を示す説明図である。実行例１のように、スレッド群その１を、プロセッサを４つ備えたマルチコアプロセッサシステム１００に実行させると、図１７に例示したような順序のスケジューリングが行われる。
【０１５５】
スレッドＩＤ８の後続スレッドであるスレッドＩＤ１０は、実行可能になった時刻には先行処理であるスレッドＩＤ６〜９が終了している。したがって、スレッドＩＤ１０は、同じプロセッサの先行処理であるスレッドＩＤ８が終了した後、即座に実行される。
【０１５６】
スレッドＩＤ１の後続スレッドであるスレッドＩＤ２〜５は、予即処理時間が最長のスレッドＩＤ３の実行終了時刻を基準にしてスレッドＩＤ２，４，５の実行開始時刻がスケジューリングされる。結果として、スレッドＩＤ２〜５は同時刻に終了するため、各スレッドの後続スレッドであるスレッドＩＤ６〜９は、スケジューラ２００によって、待機時間を挟むことなく、連続して実行するようにスケジューリングされる。
【０１５７】
＜実行例２＞
実行例２では、実行例１において実行したスレッド群その１よりも複雑な構成のスレッド群その２（図１８参照）についての実行例について説明する。実行例２も、実行例１と同様に、プロセッサ＃０〜＃３の４つのコアを備えたマルチコアプロセッサシステム１００を利用するが、実行対象となるスレッド群その２は、依存情報を持った１８個のスレッド群である。
【０１５８】
図１８は、スレッド群その２の構成を示す説明図である。図１８に例示したように、スレッド群その２は、ＩＤ１〜１８の１８個のスレッドを含んでいる。各スレッドには、スレッド群その１と同様に、スレッドを識別するＩＤの他に依存情報が付与されている。
【０１５９】
図１９は、スレッド群その２についてのキュー割り付け例を示す説明図である。スレッド群その２について、図８にて説明した割当処理を行った場合、図１９のように、各プロセッサのレディーキューに配置される。具体的には、プロセッサ＃０には、スレッドＩＤ１，２，６，１０，１４が割り当てられる。また、プロセッサ＃１には、スレッドＩＤ３，７，１１，１５，１８が割り当てられる。さらに、プロセッサ＃２には、スレッドＩＤ４，８，１２，１６が割り当てられる。そして、プロセッサ＃３には、スレッドＩＤ５，９，１３，１７が割り当てられる。
【０１６０】
実行例２についても、図１４〜１６に示した各処理の実行手順を示すルートを挙げて具体的な実行内容について説明する。実行例２の場合もスレッドＩＤ１〜９までは、実行例１と同様の手順を経てスケジューリングされる。したがって、スレッドＩＤ１０以降のスケジューリングについて説明する。
【０１６１】
まず、スレッドＩＤ１０〜１３は、先行するスレッドの中で最も予想処理時間の大きなスレッドＩＤ８が終了したタイミングで実行可能となる。このとき、スレッドＩＤ１０，１１，１３について、スケジューラ２００は、スレッドＩＤ２〜５と同じ手順を経て、実行タイミングを設定する。一方で、スレッドＩＤ１２については、同プロセッサで直前に行っていた同グループの処理の終了により実行可能となる。したがって、スケジューラ２００は、図１４のルート１−７を経ることによって、時間調整することなく、スレッドＩＤ１２を即座に実行させることができる。
【０１６２】
上述のようなスケジューリングの結果、スレッドＩＤ１４，１５，１７は、ｎｏ＿ｗａｉｔフラグが設定されるため、スケジューラ２００によって即座に実行される。スレッドＩＤ１６は、ｎｏ＿ｗａｉｔフラグが設定されないため本来なら時間調整対象だが、スレッド群その２を実行させた場合、後続スレッドに、同グループに属するスレッドがない。したがって、スケジューラ２００は、図１４のルート１−５と図１５のルート２−３と図１６のルート３−６を経て、スレッドＩＤ１６を即座に実行するようにスケジューリングする。
【０１６３】
仮に、スレッドＩＤ１６の後続スレッドとして同じグループに属するスレッドが用意されている場合であれば、スケジューラ２００は、スレッドＩＤ１６を処理時間の大きなスレッドＩＤ１７の終了時刻に合わせて終了するように、実行開始時刻を調整する。今度はスレッドＩＤ１６の後続スレッドのみｎｏ＿ｗａｉｔフラグが設定されるため、スレッドＩＤ１６は、即座に実行されることになる。
【０１６４】
図２０は、スレッド群その２の実行結果（プロセッサ４つ）を示す説明図である。実行例２のように、スレッド群その２を、プロセッサを４つ備えたマルチコアプロセッサシステム１００に実行させると、図２０に例示したような順序のスケジューリングが行われる。
【０１６５】
スレッドＩＤ１〜９は、実行例１と同じタイミングで実行されるようにスケジューリングされる。その他の後続スレッドは、スレッドＩＤ１３の実行終了時刻を基準にしてスレッドＩＤ１０，１１，１３の実行開始時刻がスケジューリングされる。結果として、スレッドＩＤ１０，１１，１３は同時刻に終了するため（スレッドＩＤ１２については既に終了済）、各スレッドの後続スレッドであるスレッドＩＤ１４〜１７は、スケジューラ２００によって、待機時間を挟むことなく、連続して実行するようにスケジューリングされる。
【０１６６】
＜実行例３＞
実行例３では、１つのプロセッサに複数のグループのスレッドが割り当てられる場合の実行例について説明する。実行例１，２では、一つのプロセッサに一つのグループに属するスレッドが割り当てられた場合を説明したが、実行例３では、プロセッサ数がグループ数より少なく、一つのプロセッサに複数のグループが割り当てられた場合について説明する。具体的には、図８のような依存関係を持ったスレッドを二つのプロセッサで実行する場合について説明する。
【０１６７】
図２１は、プロセッサ数が少ない場合のスレッド群その１についてのキュー割り付け例を示す説明図である。実行例３の場合、マルチコアプロセッサシステム２１００が、図８の割当処理を実行することによって、図２１のように、グループ１とグループ３に属する各スレッドがプロセッサ＃０に、グループ２とグループ４に属する各スレッドがプロセッサ＃１に割り当てられる。
【０１６８】
実行例３の場合、スレッドＩＤ１は、実行例１，２と同様に、先行処理としてプロセッサ＃０によって実行されるようにスケジューリングされる。スレッドＩＤ１が終了すると、プロセッサ＃０ではグループ１に属するスレッドＩＤ２とグループ３に属するスレッドＩＤ４の２つのスレッドが実行可能となる。
【０１６９】
したがって、スケジューラ２００は、まずプロセッサ＃０によって実行するグループを選択する。具体的には、スケジューラ２００は、図１４のルート１−１と図１５のルート２−３を経て、総実行時間の大きなグループ３を選択する。そこで、スケジューラ２００は、グループ３内の実行可能なスレッドＩＤ４の遅延時間を設定する。
【０１７０】
しなしながら、スレッドＩＤ４の同グループの後続となるスレッドＩＤ８の先行スレッドのうち、スレッドＩＤ２がスレッドＩＤ４と同じプロセッサに割り当てられている。したがって、スケジューラ２００は、スレッドＩＤ４とスレッドＩＤ８はどうやっても連続に実行することはできない。そこで、スケジューラ２００は、スレッドＩＤ４は図１６のルート３−７を経て、遅延させずに、即座に実行させるように設定する。
【０１７１】
スレッドＩＤ４が終了するとグループ内に実行可能なスレッドが無くなるため、スケジューラ２００は、図１４のルート１−５と図１５のルート２−３とを経て、実行中グループがグループ１に変わった後、スレッドＩＤ２に遅延起動を設定する。なお、スレッドＩＤ２の同グループでの後続スレッドとなるスレッドＩＤ６の先行スレッドのうち、スレッドＩＤ３が未実行のスレッドの中で最大の予想処理時間となる。したがって、スケジューラ２００は、スレッドＩＤ２の実行可能条件をスレッドＩＤ３の実行開始に変更する。
【０１７２】
さらに、スレッドＩＤ３は、スレッドＩＤ５終了時に実行を開始される。したがって、スケジューラ２００は、再度、スレッドＩＤ２が実行可能となるため、スレッドＩＤ３の予想処理時間−スレッドＩＤ２の予想処理時間（減算処理の結果）を遅延時間に設定する。
【０１７３】
また、スレッドＩＤ６，７は、ｎｏ＿ｗａｉｔフラグが設定されている。したがって、スケジューラ２００は、上述の各スレッドを即座に実行させることができる。さらに、スケジューラ２００は、スレッドＩＤ８，９が、後続スレッドとなるスレッドＩＤ１０と同一グループに属さないため、スレッドＩＤ６，７終了後すぐに、スレッドＩＤ８，９をそれぞれ実行させることができる。
【０１７４】
図２２は、プロセッサ数の少ないマルチコアプロセッサにおけるスレッド群その１の実行結果（プロセッサ２つ）を示す説明図である。実行例３のように、スレッド群その１を、プロセッサを２つ備えたマルチコアプロセッサシステム２１００に実行させると、図２２に例示したような順序のスケジューリングが行われる。実行例３のように、１つのプロセッサに複数のグループのスレッドが割り当てられた場合、スケジューラ２００は、可能な限り、同一グループのスレッドを連続して実行させるようなスケジューリングを行う。
【０１７５】
以上説明したように、スケジューラ、マルチコアプロセッサシステムおよびスケジューリング方法によれば、スケジューリングが済んでいない未設定処理に対して、同一のプロセッサで実行される先行処理が終了した後、即座に実行可能ではない場合には、未設定処理と後続処理とが連続実行されるように上述の未設定処理の実行開始時刻を設定することができる。したがって、未設定処理と後続処理との間の待機時間の発生するような事態が回避されるため、プロセッサの処理効率を上げることができる。
【０１７６】
また、上記技術によれば、さらに、スケジューリングが済んでいない未設定処理に対して、同一のプロセッサで実行される先行処理が終了した後、即座に実行可能となる場合には、未設定処理と先行処理が連続実行されるように上述の未設定処理の実行開始時刻を設定することができる。したがって、未設定処理と先行処理との間の待機時間の発生するような事態が回避されるため、プロセッサの処理効率を上げることができる。
【０１７７】
また、上記技術によれば、さらに、同一のグループに属する先行処理がない場合には、処理を実行していない空き状態のプロセッサに未設定処理を割り当てることができる。さらに、空き状態のプロセッサがない場合には、各プロセッサに割り当てられている処理の実行時間を考慮して最も負荷の軽いプロセッサに未設定処理を割り当てることができる。したがって、各プロセッサへの負荷が分散されるため、効率的な処理を実現することができる。
【０１７８】
また、上記技術によれば、さらに、優先度順位の高い処理や、割込処理、また、先行処理や後続処理を表す依存情報が付与されていない処理などを、優先的に設定されたプロセッサに割り当てることができる。したがって、優先度が高い処理は特定のプロセッサによって実行されるため、連続実行の間の割込処理の発生を防ぎ、キャッシュミスを抑えることができる。
【０１７９】
また、上記技術によれば、さらに、スケジューリングによって待機時間が発生した場合であっても、待機時間が規定値（任意のしきい値を設定できる）よりも短い場合には、従来のように他のプログラムの処理を実行させないように設定することもできる。したがって、待機時間の発生によってキャッシュに格納されているデータが変更になるような事態を防ぐことができる。また、待機時間が短い場合に限定することによって、プロセッサの処理効率が必要以上に低下しないように調整することができる。
【０１８０】
なお、本実施の形態で説明したスケジューリング方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーションなどのコンピュータで実行することにより実現することができる。本スケジューラは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スケジューラは、インターネットなどのネットワークを介して配布してもよい。
【符号の説明】
【０１８１】
１００  マルチコアプロセッサシステム
２００  スケジューラ
３００  共有メモリ
５００  メモリ
５０１  第１検出部
５０２  第２検出部
５０３  割当部
５０４  算出部
５０５  設定部
【図１】
0005408356.tif 000002
【図２】
0005408356.tif 000003
【図３】
0005408356.tif 000004
【図４】
0005408356.tif 000005
【図５】
0005408356.tif 000006
【図６】
0005408356.tif 000007
【図７】
0005408356.tif 000008
【図８】
0005408356.tif 000009
【図９】
0005408356.tif 000010
【図１０】
0005408356.tif 000011
【図１１】
0005408356.tif 000012
【図１２】
0005408356.tif 000013
【図１３】
0005408356.tif 000014
【図１４】
0005408356.tif 000015
【図１５】
0005408356.tif 000016
【図１６】
0005408356.tif 000017
【図１７】
0005408356.tif 000018
【図１８】
0005408356.tif 000019
【図１９】
0005408356.tif 000020
【図２０】
0005408356.tif 000021
【図２１】
0005408356.tif 000022
【図２２】
0005408356.tif 000023
【図２３】
0005408356.tif 000024