(57)【要約】  マルチコアプロセッサシステム（１００）は、複数のＣＰＵ＃０〜＃３（１０１）と、複数のＣＰＵ（１０１）によって共有されるメモリ（１０２）と、メモリ（１０２）に格納され、複数のＣＰＵ（１０１）が実行しているプロセスの数を示す稼働プロセス数情報（１３１）と、複数のＣＰＵ（１０１）のそれぞれに割り当てられたプロセスの数を示すＣＰＵ割当プロセス数情報（１３２）とに基づいて、複数のＣＰＵ（１０１）へのスレッドの割り当ての変更を指示する断片化監視部（１０４）とからなり、ＣＰＵ＃０（１０１）が再起動され、ＣＰＵ＃０（１０１）のスレッドが他のＣＰＵ群＃１〜＃３（１０１）に移動した後、他のＣＰＵ群＃１〜＃３（１０１）のスレッドをＣＰＵ＃０（１０１）に戻す。この際、各ＣＰＵ＃０〜＃３（１０１）上のプロセスが揃うように、ＣＰＵ＃０（１０１）にスレッドを戻し、プロセスの断片化を改善する。
2012124077.tif 000002
【特許請求の範囲】
【請求項１】
複数のＣＰＵと、
前記複数のＣＰＵによって共有されるメモリと、
前記メモリに格納され、前記複数のＣＰＵが実行しているプロセスの数を示す第１プロセス数と、前記複数のＣＰＵのそれぞれに割り当てられたプロセスの数を示す第２プロセス数とに基づいて、前記複数のＣＰＵへのスレッドの割り当ての変更を指示する監視ユニットと、
を含むことを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記監視ユニットは、前記第１プロセス数に対する前記第２プロセス数の割合と、所定の閾値とを比較する比較部を含むこと
を特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記監視ユニットは、
前記比較部による比較結果が前記閾値を超えているときに、第１ＣＰＵにスレッドの割り当ての変更を指示すること
を特徴とする請求項２に記載のマルチコアプロセッサシステム。
【請求項４】
前記監視ユニットが前記複数のＣＰＵへのスレッドの割り当て変更を指示するとき、所定の第２プロセス数を有する前記第１ＣＰＵに再起動要求を出力すること
を特徴とする請求項１または２に記載のマルチコアプロセッサシステム。
【請求項５】
前記第１プロセス数および第２プロセス数は前記メモリに格納されること
を特徴とする請求項１〜４のいずれか一つに記載のマルチコアプロセッサシステム。
【請求項６】
前記監視ユニットは、前記閾値を、前記ＣＰＵの数、キャッシュサイズ、コヒーレント操作時間、前記ＣＰＵを停止させてから再起動させるまでの時間、プロセスが揃う確率、のいずれかあるいは組み合わせに基づき設定することを特徴とする請求項１〜５のいずれか一つに記載のマルチコアプロセッサシステム。
【請求項７】
前記ＣＰＵのオペレーティングシステムは、
前記第１ＣＰＵに対する前記監視ユニットからの再起動要求を受けて、複数の前記ＣＰＵのうち、高負荷のＣＰＵから順に高負荷のスレッドを前記第１ＣＰＵに再割り当てをおこなう負荷分散部を含むことを特徴とする請求項１〜６のいずれか一つに記載のマルチコアプロセッサシステム。
【請求項８】
複数のＣＰＵを有するマルチコアプロセッサシステムにおけるスケジューリング方法であって、
同一プロセスに含まれる複数のスレッドが異なる複数のＣＰＵに割り当てられる割合に基づくスレッドの再割り当ての指示に基づき、
第１ＣＰＵへのスレッドの割り当ての禁止を、第１スレッドが割り当てられた第２ＣＰＵ群に指示し、
前記第１ＣＰＵに割り当てられた第２スレッドを前記第２ＣＰＵ群に移行し、
前記第２ＣＰＵ群に移行された前記第１スレッドと前記第２スレッドの前記第１ＣＰＵへの割り当てを許可する
ことを特徴とするスケジューリング方法。
【請求項９】
前記第１スレッドと前記第２スレッドとが第１プロセスに含まれるとき、
前記第１プロセスとは異なる第２プロセスに含まれる第３スレッドを前記第１ＣＰＵに割り当てること
を特徴とする請求項８に記載のスケジューリング方法。
【請求項１０】
前記第１スレッドと前記第２スレッドとが異なるプロセスに含まれるとき、
前記第１スレッド、前記第２スレッド、または第３スレッドのいずれかのスレッドを前記第１ＣＰＵに割り当てること
を特徴とする請求項８または９に記載のスケジューリング方法。
【請求項１１】
前記第１ＣＰＵの負荷と前記第２ＣＰＵ群の負荷との差があらかじめ定めた所定値より大きいとき、前記第２ＣＰＵ群から前記第１ＣＰＵにスレッドを移行すること
を特徴とする請求項８〜１０のいずれか一つに記載のスケジューリング方法。
【請求項１２】
前記第１ＣＰＵと、前記第２ＣＰＵ群と、前記第１ＣＰＵおよび前記第２ＣＰＵ群以外に実行中のＣＰＵがあれば当該他のＣＰＵ群を含む全てのＣＰＵが実行しているプロセスの数と、前記第１ＣＰＵと、前記第２ＣＰＵ群と、前記他のＣＰＵ群のそれぞれに割り当てられたプロセスの数と、に基づいて前記割合を算出すること
を特徴とする請求項８〜１１のいずれか一つに記載のスケジューリング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチコアプロセッサシステムにおけるプロセッサへのスレッド割り当てを変更するマルチコアプロセッサシステムおよびスケジューリング方法に関する。
【背景技術】
【０００２】
マルチコアプロセッサシステムにおけるスケジューリング手法としては、負荷の高いノード（プロセッサ）から負荷の低いノードにスレッドを移動するという手法が知られている（たとえば、下記特許文献１参照。）。【０００３】
同一プロセスに属するスレッド同士は同じデータを共有することが多く、また頻繁に通信をおこなうことが知られている。このため、同一プロセスに属するスレッドを同じプロセッサに割り当てることにより、プロセッサ間通信が削減でき、また、キャッシュの利用を効率化できるようになる。これを考慮したスケジューリング手法としては、プロセス起動時に過去の実行履歴から対象プロセス内の全スレッドを同一のプロセッサに割り当てるか、複数プロセッサに割り当てるかを決定する手法が知られている（たとえば、下記特許文献２参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平８−３０４７２号公報
【特許文献２】特開２００２−２７８７７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
プロセッサに対する負荷分散の点でみれば、スレッドを別々のプロセッサで実行した方が負荷バランスをとりやすい。しかし、上記特許文献２のようにプロセス起動時に同一のプロセッサに割り当てるか否かを決定する構成では、プロセスの起動時にしか決定を行わないためプロセス起動後に他のプロセスが起動もしくは終了を繰り返した場合の負荷バランスの変動には対応出来ないという問題がある。【０００６】
また、特許文献１の技術では、負荷の高いプロセッサのスレッドを負荷の低いプロセッサのスレッドに移動させるだけであり、一つのプロセスを同じプロセッサに割り当てることはできない。仮に、特許文献１と特許文献２の技術を組み合わせ、負荷分散が必要なときに負荷バランスと同一プロセスに属するスレッドの割当先を考慮して、プロセスを複数のプロセッサに分散させるか否かを判断することが考えられるが、単に特許文献１と特許文献２の技術を組み合わせただけでは、負荷分散時に移動対象のスレッドを決定するための判断処理が増加するため、負荷分散のためのオーバーヘッドが増加するという問題が生じる。【０００７】
すなわち、プロセス数が増大したとき、プロセスが断片化して複数のプロセッサに同一プロセスのスレッドが分散して割り当てられると、複数のプロセッサでスレッドを処理する組み合わせが膨大となる。このため、処理するプロセスを限られた時間で負荷バランスをとりつつ、同じプロセスを同じプロセッサに割り当てる組み合わせを見つけることは難しくなり、マルチコアプロセッサにおける多数のプロセスが断片化した際の断片化の改善および処理効率を向上できる手法が望まれていた。【０００８】
開示のマルチコアプロセッサシステムおよびスケジューリング方法は、上述した問題点を解消するものであり、プロセスが断片化しても簡単に複数のプロセッサのプロセスを揃えることができることを目的とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決し、目的を達成するため、開示技術は、複数のＣＰＵと、複数のＣＰＵによって共有されるメモリと、メモリに格納され、複数のＣＰＵへのスレッドの割り当ての変更を指示する断片化監視部とを備え、断片化監視部は、複数のＣＰＵが実行しているプロセスの数を示す第１プロセス数（稼働プロセス数情報）と、複数のＣＰＵのそれぞれに割り当てられたプロセスの数を示す第２プロセス数（ＣＰＵ割当プロセス数情報）とに基づいて、複数のＣＰＵへのスレッドの割り当ての変更を指示する。第１ＣＰＵの再起動により、第１ＣＰＵのスレッドが他のＣＰＵに移動した後、他のＣＰＵのスレッドを再起動された第１ＣＰＵに戻す。この際、各ＣＰＵ上のプロセスが揃うように、第１ＣＰＵにスレッドを戻す。
【発明の効果】
【００１０】
開示のマルチコアプロセッサシステムおよびスケジューリング方法によれば、プロセスが断片化しても簡単に複数のプロセッサのプロセスを揃えることができるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施の形態にかかるマルチコアプロセッサシステムの構成例を示すブロック図である。
【図２】図２は、断片化監視部の内部構成を示すブロック図である。
【図３】図３は、断片化監視部の動作処理例を示すフローチャートである。
【図４】図４は、ＯＳの負荷分散動作処理例を示すフローチャートである。
【図５】図５は、ＯＳの負荷分散部の停止通知時の動作処理例を示すフローチャートである。
【図６】図６は、ＯＳの負荷分散部の起動通知時の動作処理例を示すフローチャートである。
【図７】図７は、ＯＳの負荷分散部がおこなう負荷分散処理例を示すフローチャートである。
【図８】図８は、スレッドの理想的な割り付け状態を示す図である。
【図９】図９は、プロセスの断片化が進んだ状態を示す図である。
【図１０】図１０は、他のプロセッサへのスレッドの移動状態を示す図である。
【図１１】図１１は、再割り当て後プロセスの断片化が改善された状態を示す図である。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、開示技術の好適な実施の形態を詳細に説明する。
【００１３】
（実施の形態）
開示のマルチコアプロセッサシステムでは、通常は、負荷バランスのみを考慮してスレッド単位で負荷分散をおこなう。そして、プロセスが断片化し、プロセスに属するスレッドが複数のプロセッサに散らばって実行されたときには、任意のプロセッサを再起動させることにより、このプロセッサに割り当てられている処理を一旦他のプロセッサに分散させ、再起動させた任意のプロセッサに再度プロセスを移動するように負荷分散をおこなう。再起動するプロセッサは、プロセスの処理を他のプロセッサに一時的に全て移動させた後、再度プロセスの処理を受け入れる構成であれば良く、プロセッサの機能を一時停止させることに相当する。これにより、プロセスの断片化により複数のプロセッサに散らばったスレッドを一つのプロセッサにまとめやすくなり、単純な処理で断片化を軽減しつつプロセッサ間の負荷バランスを均等化できるようになる。
【００１４】
（マルチコアプロセッサシステムの構成例）
図１は、実施の形態にかかるマルチコアプロセッサシステムの構成例を示すブロック図である。図１に記載のように、マルチコアプロセッサシステム１００は、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１と、メモリ１０２とがバス１０３で結合された共有メモリ型のマルチコアプロセッサシステムを含む。
【００１５】
この実施の形態では、マルチコアプロセッサシステム１００は、プロセスの断片化を監視する断片化監視部（監視ユニット）１０４を備え、バス１０３に接続されている。断片化監視部１０４は、断片化監視の機能を持っていれば論理回路等からなるハードウェア、あるいはソフトウェアのいずれでも実現できる。
【００１６】
オペレーティングシステム（ＯＳ）１１０は、複数のプロセッサ１０１がそれぞれ実行するプロセスをプロセッサ１０１毎に管理するプロセス管理部１２１と、プロセス内のスレッドをそれぞれ管理するスレッド管理部１２２を含む。また、複数のプロセッサ１０１の負荷を統合して監視する負荷監視部１２３と、プロセッサ１０１の負荷を他のプロセッサ１０１に割り当てる負荷分散部１２４とを含む。
【００１７】
メモリ１０２には、マルチコアプロセッサシステム１００全体で稼働しているプロセッサ数を記録するための稼働プロセス数（第１プロセス数）を示す稼働プロセス数情報１３１と、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１にそれぞれ割り当てられているプロセス数（第２プロセス数）を示す割当プロセス数情報１３２の記憶領域が設けられている。
【００１８】
起動中のプロセスから新たに別のプロセスを起動する場合は、起動中のプロセスからＯＳ１１０にプロセス生成を依頼する。
【００１９】
ＯＳ１１０は、プロセス管理部１２１が指示したプロセスを生成し、プロセスの生成毎にメモリ１０２の稼働プロセス数情報１３１の値を１増やす。同時に、スレッド管理部１２２に依頼してプロセス内のスレッドを生成する。スレッドが生成されると、負荷分散部１２４が負荷監視部１２３が収集したプロセッサの負荷情報に基づいて、負荷の低いプロセッサに対して、生成したスレッドを割り当てる。
【００２０】
ＯＳ１１０のプロセス管理部１２１は、プロセッサ１０１に割り当てられているプロセス数をそれぞれ管理する。新たにスレッドが割り当てられたプロセッサ１０１は、このプロセッサ１０１に対応するＯＳ１１０のプロセス管理部１２１とスレッド管理部１２２により、新たに割り当てられたスレッドと同じプロセスに属する他のスレッドが割り当てられているかを確認する。確認の結果、同じプロセスに属する他のスレッドが無い場合には、プロセス管理部１２１は、メモリ１０２のプロセッサ１０１に対応する割当プロセス数情報１３２の値を１増加させる。
【００２１】
また、ＯＳ１１０の負荷監視部１２３は、定期的に各プロセッサ１０１の負荷を監視し、負荷分散部１２４は、負荷が最大のプロセッサ１０１と、負荷が最小のプロセッサ１０１との間での負荷の差が一定以上になった場合は、負荷が最大のプロセッサ１０１から負荷が最小のプロセッサ１０１に任意のスレッドを移動させる。このとき、スレッドが移動した側のプロセッサ１０１では、割当プロセス数情報１３２を参照し、移動したスレッドと同じプロセスに属するスレッドが他のプロセッサ１０１にも割り当てられているかを確認する。確認の結果、割り当てられていない場合は、メモリ１０２の自プロセッサ１０１に対応する割当プロセス数情報１３２の値を１減少させる。また、スレッドが移動してきた側のプロセッサ１０１では新規にプロセスが生成されたときと同様に割当プロセス数情報１３２の値を変更する（１増加させる）。
【００２２】
また、稼働中のスレッドが新たにスレッドを生成する場合は、稼働中のスレッドがＯＳ１１０に依頼し、ＯＳ１１０のスレッド管理部１２２がスレッドを生成する。このときに生成されたスレッドは、依頼元のスレッドと同じプロセスに属することになる。スレッドが生成されると、この生成されたスレッドは、新たにプロセスが生成されたときと同様に負荷分散部１２４により負荷の低いプロセッサ１０１に割り当てられて、このプロセッサ１０１に対する割当プロセス数情報１３２の値を変更する（１増加させる）。
【００２３】
稼働中のスレッドが終了した場合は、スレッド管理部１２２がスレッドを削除して、スレッドがプロセッサ１０１から移動して出て行くときと同様に、該当するプロセッサ１０１に同じプロセスに属するスレッドが無ければ割当プロセス数情報１３２の値を１減減少させる。また、マルチコアプロセッサシステム１００全体で同じプロセスに属するスレッドが無ければ、プロセスが終了したとしてプロセス管理部１２１でプロセスを削除して、稼働プロセス数情報１３１の値を１減少させる。
【００２４】
上述した負荷の決定方法には、たとえばプロセッサ１０１の稼働率を利用する方法や、スレッドの待機時間を利用する方法、あらかじめスレッドの処理時間を測定しておき、割り当てられているスレッドの残り処理時間の合計を利用する方法、またこれら複数の指標を組み合わせて負荷を決定する方法などの方法があるが、この実施の形態ではいずれの方法で負荷を決定しても構わない。
【００２５】
図２は、断片化監視部の内部構成を示すブロック図である。断片化監視部１０４は、プロセス数取得部２０１と、断片化率算出部２０２と、再起動判断部２０３と、再起動要求出力部２０４と、バスＩＦ部２１０とを含む。バスＩＦ部２１０は、バス１０３に対し信号を入出力するためのインターフェースである。
【００２６】
プロセス数取得部２０１は、メモリ１０２に記憶された稼働プロセス数情報１３１と、プロセッサ毎の割当プロセス数情報１３２をそれぞれ取得する。断片化率算出部２０２は、プロセス数取得部２０１により取得した稼働プロセス数情報１３１と、割当プロセス数情報１３２に基づき、下記式によりプロセスの断片化率（断片化係数）を算出する。稼働プロセス数は、全てのプロセッサで現在稼働しているプロセス数、割り当てプロセス数の合計とは、各ＣＰＵ１０１に割り当てられたプロセス数の合計である。
断片化率＝割り当てプロセス数の合計／稼働プロセス数
【００２７】
再起動判断部２０３は、断片化率と所定の閾値とを比較する比較部２０３ａを含む。比較部２０３ａの比較により、断片化率が所定の閾値を超えた場合には、断片化が進行したと判断し、割当プロセス数情報１３２を参照し、最も割り当てプロセス数の多いプロセッサ１０１（ＯＳ１１０）にプロセスを再割り当てするための再起動要求を出力する。この再起動要求は、再起動要求出力部２０４を介して断片化が進んだプロセッサ１０１に出力される。
【００２８】
再起動判断部２０３において断片化の判断に用いる閾値は、下記の各条件１〜５のいずれか、もしくは組み合わせに基づき設定する。
１．プロセッサ数
プロセッサ数が多いほど断片化しやすい。したがって、この条件ではプロセッサ数が多いほど閾値を高めに設定する。
２．キャッシュサイズ
キャッシュサイズが大きければ断片化の影響は小さい。したがって、この条件ではキャッシュサイズが大きいほど閾値を低めに設定する。
３．コヒーレント操作時間
コヒーレント操作時間が短ければ断片化の影響は小さい。したがって、この条件ではコヒーレント操作時間が短いほど閾値を低めに設定する。
４．動作時間（プロセッサを停止させてから再起動させるまでの時間）
動作時間が長ければ閾値を高めに設定して再起動の頻度を下げる。
５．開示技術によりプロセスが揃う確率
プロセスが揃う確率が高ければ閾値は低めに設定する。
【００２９】
（プロセスの断片化解消処理動作）
（断片化監視部の動作）
図３は、断片化監視部の動作処理例を示すフローチャートである。断片化監視部１０４では、プロセス数取得部２０１は、定期的にメモリ１０２に記憶された稼働プロセス数情報１３１と、プロセッサ毎の割当プロセス数情報１３２をそれぞれ取得する（ステップＳ３０１）。つぎに、断片化率算出部２０２により、取得した稼働プロセス数情報１３１と、割当プロセス数情報１３２に基づき、断片化率を算出する（ステップＳ３０２）。
【００３０】
そして、再起動判断部２０３は、断片化率算出部２０２により算出された断片化率が所定の閾値を超えたか否かを判断する（ステップＳ３０３）。断片化係数が所定の閾値を超えた場合には（ステップＳ３０３：Ｙｅｓ）、断片化が進行したと判断する。そして、再起動判断部２０３は、最も割り当てプロセス数の多いプロセッサ１０１（ＯＳ１１０）に再起動要求を出力する（ステップＳ３０４）。そして、プロセッサ１０１の再起動によるプロセスの再割り当て終了を待ち、終了する。一方、断片化係数が所定の閾値未満の場合には（ステップＳ３０３：Ｎｏ）、断片化していないと判断する。そして、再起動判断部２０３は、一定時間待機し（ステップＳ３０６）、所定時間後、定期的に再度ステップＳ３０１以下の処理を実行する。
【００３１】
（ＯＳによる負荷分散の処理動作）
図４は、ＯＳの負荷分散動作処理例を示すフローチャートである。図３の処理により、ＯＳ１１０は、断片化監視部１０４からあるプロセッサ１０１に対する再起動要求を受ける（ステップＳ４０１）。これにより、ＯＳ１１０は、負荷分散部１２４に対して停止通知をおこなう（ステップＳ４０２）。そして、負荷分散部１２４によるスレッドの移動終了を確認する（ステップＳ４０３）。ここで、移動中のスレッドの移動終了を待ち（ステップＳ４０４：Ｎｏ）、スレッドの移動終了が確認されれば（ステップＳ４０４：Ｙｅｓ）、再起動要求を受けたプロセッサ１０１を再起動させ（ステップＳ４０５）、負荷分散部１２４に起動通知をおこない（ステップＳ４０６）、終了する。
【００３２】
図５は、ＯＳの負荷分散部の停止通知時の動作処理例を示すフローチャートである。負荷分散部１２４は、停止通知を受けると（ステップＳ５０１）、最も処理の軽い稼働中のプロセッサ１０１を選択する（ステップＳ５０２）。つぎに、再起動要求を受けた停止予定のプロセッサ１０１から任意のスレッドを他のプロセッサ１０１に移動させる（ステップＳ５０３）。これにより、移動先のプロセッサ１０１の負荷情報を更新する（ステップＳ５０４）。
【００３３】
そして、停止予定のプロセッサ１０１の全スレッドを移動させたか判断する（ステップＳ５０５）。全スレッドが移動するまでの間は（ステップＳ５０５：Ｎｏ）、ステップＳ５０２以下の処理を再度実行する。そして、全スレッドが移動し終わると（ステップＳ５０５：Ｙｅｓ）、停止予定のプロセッサ１０１を停止状態として記憶する（ステップＳ５０６）。そして、停止予定のプロセッサ１０１に移動終了を通知し（ステップＳ５０７）、処理を終了する。
【００３４】
図６は、ＯＳの負荷分散部の起動通知時の動作処理例を示すフローチャートである。負荷分散部１２４は、起動通知を受けると（ステップＳ６０１）、起動通知を受けたプロセッサ１０１を起動状態として記録し（ステップＳ６０２）、通常の負荷分散処理をおこない（ステップＳ６０３）、処理を終了する。
【００３５】
図７は、ＯＳの負荷分散部がおこなう負荷分散処理例を示す図である。図６のステップＳ６０３の処理内容を記載してある。ＯＳ１１０の負荷分散部１２４は、負荷監視部１２３により監視した各プロセッサ１０１の負荷に基づき、最も負荷の大きいプロセッサ１０１と、最も負荷の小さいプロセッサ１０１とを選択する（ステップＳ７０１）。そして、負荷分散部１２４は、これら最も負荷の大きいプロセッサ１０１と、最も負荷の小さいプロセッサ１０１との間の負荷の差を所定の閾値と比較する（ステップＳ７０２）。比較の結果、負荷の差が閾値未満であれば（ステップＳ７０２：Ｎｏ）、負荷分散処理は不要であり処理を終了する。
【００３６】
一方、最も負荷の大きいプロセッサ１０１と、最も負荷の小さいプロセッサ１０１の負荷の差が閾値以上であれば（ステップＳ７０２：Ｙｅｓ）、以下の負荷分散処理をおこなう。ここで、負荷分散部１２４は、最も負荷が大きいプロセッサ１０１に割り当てられている全スレッドを他のプロセッサ１０１に割り当て、全プロセッサ１０１の負荷が均一になるように制御する。
【００３７】
はじめに、スレッド管理部１２２は、高負荷のプロセッサ１０１から最も負荷の高いスレッドを選択し（ステップＳ７０３）、プロセス管理部１２１は、選択したスレッドが属するプロセスを取得する（ステップＳ７０４）。各スレッドは、それぞれ処理量（負荷）が異なるため、ここでは、最も処理の高いスレッドから順に選択し、スレッド移動を処理するようにしている。
【００３８】
つぎに、負荷監視部１２３は、ステップＳ７０４で取得したプロセスに属するスレッドの割当先のプロセッサ１０１を取得する（ステップＳ７０５）。そして、負荷監視部１２３は、ステップＳ７０５にて取得したスレッドの割当先のプロセッサ１０１が全て同一プロセッサ１０１であるか否かを判断する（ステップＳ７０６）。この判断の結果、スレッドの割当先のプロセッサ１０１が全て同一プロセッサ１０１であれば（ステップＳ７０６：Ｙｅｓ）、スレッドの移動は不要であるため、ステップＳ７０３に戻り、違うスレッドに対する処理をおこなう。
【００３９】
一方、負荷監視部１２３は、ステップＳ７０６の判断結果、スレッドの割当先のプロセッサ１０１が全て同一のプロセッサ１０１でなければ（ステップＳ７０６：Ｎｏ）、つぎに、選択可能なスレッドがあるか判断する（ステップＳ７０７）。選択可能なスレッドがあれば（ステップＳ７０７：Ｙｅｓ）、負荷分散部１２４は、選択されたスレッドを低負荷のプロセッサ１０１に移動させる（ステップＳ７０８）。この際、複数のプロセッサ１０１でばらばらに実行されているスレッドを優先して再起動させるプロセッサ１０１に割り当てるよう、移動するスレッドを決定する。
【００４０】
一方、選択可能なスレッドが無ければ（ステップＳ７０７：Ｎｏ）、負荷分散部１２４は、任意のスレッドを低負荷のプロセッサ１０１に移動させる（ステップＳ７０９）。ステップＳ７０８、およびステップＳ７０９の処理後、負荷分散部１２４は、負荷情報を更新し（ステップＳ７１０）、ステップＳ７０１に戻り、ステップＳ７０１以下の処理を継続する。
【００４１】
（プロセスの断片化解消の具体的処理例）
つぎに、プロセスの断片化解消の具体的処理例について図８〜図１１を用いて説明する。図８は、スレッドの理想的な割り付け状態を示す図である。単純な例として４つのプロセッサ１０１でそれぞれ４個のスレッドを持つプロセスが４個起動している状態として説明する。各スレッドの負荷量が均一だとすると、図８のように、一つのプロセッサ１０１に一つのプロセスが割り当てられている状態が理想的な状態となる。図中”Ａ−１”とは、プロセスＡに属する１番目のスレッドという意味である。他も同様で、この図ではＡ，Ｂ，Ｃ，Ｄの４つのプロセスがあり、Ａ〜Ｄの４個のプロセスは、それぞれ１〜４までの４個のスレッドを持っているとする。
【００４２】
図９は、プロセスの断片化が進んだ状態を示す図である。プロセスおよびスレッドの起動と終了と負荷分散を繰り返した結果、図９に示すように各プロセスに属するスレッドが異なるプロセッサに分散され実行されているとする。
【００４３】
図９に示す状態のとき、稼働プロセス数は４となり、プロセッサ（ＣＰＵ＃０）１０１の割り当てプロセス数はＡ〜Ｄの４個、プロセッサ（ＣＰＵ＃１）１０１の割り当てプロセス数はプロセスＡ，Ｂの２個、プロセッサ（ＣＰＵ＃２）１０１の割り当てプロセス数はプロセスＡ，Ｃの２個、プロセッサ（ＣＰＵ＃３）１０１の割り当てプロセス数はプロセスＣ，Ｄの２個となっている。この際の断片化率は、割り当てプロセス数の合計＝４＋２＋２＋２＝１０、稼働プロセス数＝４であるため、１０／４＝２．５となる。そして、求めた断片化率が閾値を超えていると、断片化監視部１０４の再起動判断部２０３は、最もプロセス数が多い（割り当てプロセス数が４個）のプロセッサ（ＣＰＵ＃０）１０１に再起動要求を出力する。
【００４４】
図１０は、他のプロセッサへのスレッドの移動状態を示す図である。プロセッサ（第１ＣＰＵ＃０）１０１では、再起動要求を受けると、他のプロセッサ（第２群のＣＰＵ＃１〜＃３）１０１に対してプロセッサ（ＣＰＵ＃０）１０１へのスレッド割り当てを禁止する指示を出す。また、プロセッサ（ＣＰＵ＃０）１０１に割り当てられていたスレッドＡ−１，Ｂ−１，Ｃ−１，Ｄ−４（図中斜線のスレッド）を他のプロセッサ（ＣＰＵ＃１〜＃３）１０１に移動させる。この際の移動は、上述したようにＯＳ１１０の負荷分散部１２４が実行し、移動先の複数のプロセッサ（ＣＰＵ＃１〜＃３）１０１の負荷が均等になるようにおこなう。
【００４５】
このとき、割り当て対象となるプロセッサ１０１の数が減るため、同じプロセスに属するスレッドが同じプロセッサに割り当てられる可能性が高くなる。図１０に示す例では、プロセスＢに属する全てのスレッドＢ１〜Ｂ４がプロセッサ（ＣＰＵ＃１）１０１に割り当てられ、また、プロセスＤに属する全てのスレッドＤ−１〜Ｄ−４がプロセッサ（ＣＰＵ＃３）１０１に割り当てられた状態を示している。
【００４６】
上記説明では、プロセス数がＡ〜Ｄの４個だけとしたが、実際のシステムでは起動直後でも数十〜１００を超えるプロセスが稼働しているため、再起動により一時的にプロセッサ１０１の数が一つ減るだけでも、全スレッドが同一プロセッサに割り当てられることが期待できる。
【００４７】
この後、プロセッサ（ＣＰＵ＃０）１０１は、割り当てられたスレッドを全て他のプロセッサ（ＣＰＵ＃１〜＃３）１０１に移動させると、スレッドが移動完了したことを他のプロセッサ（ＣＰＵ＃１〜＃３）１０１に通知し、再起動する。
【００４８】
プロセッサ（ＣＰＵ＃０）１０１の再起動後において、プロセッサ（ＣＰＵ＃１〜＃３）１０１側ではＯＳ１１０の負荷監視部１２３が、プロセッサ（ＣＰＵ＃０）１０１に割り当てられているスレッドが無く、負荷が極端に低い状態であることを検出する。これにより、負荷分散部１２４は、プロセッサ（ＣＰＵ＃１〜＃３）１０１の中で負荷の高いプロセッサから順に、プロセッサ（ＣＰＵ＃０）１０１に対して全プロセッサの負荷が均一になるまでスレッドを移動させていく。
【００４９】
このようなスレッドの移動について、プロセス内のスレッド数に対して、負荷の高いプロセッサ１０１に割り当てられているスレッド数が少ないスレッドを優先して再起動させたプロセッサ（ＣＰＵ＃０）１０１に移動させる。上記の例では、各スレッドそのものの負荷は一定であるとしている（図中各スレッドの大きさを負荷としてある）。したがって、上記の例では、プロセッサ１０１に対する負荷はスレッドの数となる。
【００５０】
図１０において、スレッド数が最も多く負荷が高いプロセッサ１０１は、プロセッサ（ＣＰＵ＃１）１０１であり、このプロセッサ（ＣＰＵ＃１）１０１からスレッドを一つプロセッサ（ＣＰＵ＃０）１０１に移動させる。プロセッサ（ＣＰＵ＃１）１０１には、プロセスＢに属するスレッドが４つ（Ｂ−１〜Ｂ−４）と、プロセスＡに属するスレッドが２つ（Ａ−１，Ａ−２）割り当てられており、プロセスのスレッドが揃っていないプロセスＡに属するスレッド（Ａ−１またはＡ−２）のうちの任意の一つ（たとえばＡ−２）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。
【００５１】
これにより、全てのプロセッサ（ＣＰＵ＃１〜＃３）１０１の負荷量が均一（スレッド数がいずれも４個）になるため、以降は、任意の順番でプロセッサ（ＣＰＵ＃１〜ＣＰＵ＃３）１０１に割り当てられているスレッドを一つずつプロセッサ（ＣＰＵ＃０）１０１に移動させていく。
【００５２】
この後、プロセッサ（ＣＰＵ＃１）１０１から残ったプロセスＡに属するスレッド（たとえばＡ−１）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。また、プロセッサ（ＣＰＵ＃２）１０１では、プロセスＣに属するスレッドが３つ（Ｃ−１〜Ｃ−３）、プロセスＡに属するスレッドが２つ（Ａ−３，Ａ−４）割り当てられているため、プロセスＡに属するスレッドの任意の一つ（たとえばＡ−３）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。さらに、プロセッサ（ＣＰＵ＃３）１０１では、プロセスＤに属するスレッドが４つ（Ｄ−１〜Ｄ−４）、プロセスＣに属するスレッドが一つ（Ｃ−４）割り当てられているため、プロセスＣに属するスレッド（Ｃ−４）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。これにより、全てのプロセッサ（ＣＰＵ＃０〜＃３）１０１の負荷を均一にすることができ、スレッドの移動処理を終了する。
【００５３】
図１１は、再割り当て後プロセスの断片化が改善された状態を示す図である。プロセッサ（ＣＰＵ＃０）１０１に対する再割り当て終了後においては、図１１の例では、プロセスＢに属する全スレッド（Ｂ−１〜Ｂ−４）が同一のプロセッサ（ＣＰＵ＃１）１０１に割り当てられ、また、プロセスＤに属する全スレッド（Ｄ−１〜Ｄ−４）が同一のプロセッサ（ＣＰＵ＃３）１０１に割り当てられたことになる。また、プロセスＡおよびプロセスＣについても、断片化時（図９の状態）に比して、同じプロセッサ（ＣＰＵ＃０，＃２）１０１に割り当てられているスレッドの数が増加している。
【００５４】
これにより、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１で実行されるスレッドは、同一のプロセスに属するものが多くなり、処理効率を向上できるようになる。キャッシュ利用の効率化や、プロセッサ間通信の削減の観点からすれば、同じプロセスに属するスレッドが全て同じプロセッサ１０１で実行されていなくても、全スレッド中で同じプロセッサ１０１に割り当てられている割合が高ければ、ある程度の効果は期待できる。なお、図１１の状態における断片化率は、（２＋１＋２＋１）／４＝１．５となり、断片化が軽減したことになる。
【００５５】
このように、プロセスの断片化が進行したときに、一つのプロセッサに割り当てられたスレッドを別のプロセッサに分散させ、擬似的に稼働プロセッサ数を減らすことで断片化を軽減することが期待できる。上記の例では、４つのプロセッサに対してプロセス数が４個で、スレッド数も１プロセスに付き均等に４つずつとする簡単な例とした。現実のシステムでは、プロセッサの数に比してプロセス数は遙かに多いため、断片化の解消が期待できる。
【００５６】
ところで、プロセス数が多くなると、プロセッサ間での負荷バランスを保ちつつ、断片化が最小になるようなプロセッサへのスレッドの割り当てを決定するのは非常に困難であったが、開示の技術によれば、通常は負荷バランスのみを考慮した割り当てをおこない、プロセスの断片化が規定以上進行したときのみ、任意のプロセッサを再起動させるだけでプロセスの断片化を解消できるようになる。また、開示技術は、プロセスの断片化を解消する処理について、断片化を最小にすることを主とするものではなく、簡単な処理で断片化を改善させるものである。このため、開示技術によれば、稼働プロセス数が多いほど、断片化を最小にするための手法や、断片化を考慮せずに負荷分散する手法に比べて、簡単な構成で断片化を解消し、同一のプロセッサで一つのプロセスのスレッドをまとめやすくなり、システム全体の処理効率を向上できるようになる。
【００５７】
一般的に、プロセッサ数とプロセス数との関係による全プロセスの組み合わせの探索については、
１．プロセッサ数：少、プロセス数：少の場合、全プロセス（スレッド）の組み合わせの探索が可能。
２．プロセッサ数：少、プロセス数：多の場合、全プロセスの組み合わせが爆発的に増大するので全探索は不可能。
３．プロセッサ数：多の場合、プロセッサ数が多いことだけでプロセスを揃えることが困難。
【００５８】
上記のように、プロセス数とスレッド数が多く、断片化を解消しつつ負荷バランスが均等になる最適なプロセスおよびスレッドのプロセッサへの割り当ての組み合わせを決定するには、非常に時間がかかる。この点、上記の開示技術を、プロセッサ数が少なく（２〜４ＣＰＵ）、プロセス数が多い場合に適用することにより、プロセッサの再起動だけでプロセスを同一のプロセッサに揃えさせることができ、処理効率を向上できるようになる。
【００５９】
以上説明した開示技術では、通常時はプロセッサ間の負荷バランスのみを考慮したスケジューリングをおこなっており、通常時にスケジューリングのオーバーヘッドは増加しない。そして、プロセスの断片化が進んだときには、一時的に稼働プロセッサ数を減らすという簡単な処理で断片化を改善できる。このように、簡単な処理でプロセスの断片化を改善しつつ、プロセッサ間の負荷バランスを均等化できるようになる。
【符号の説明】
【００６０】
１００  マルチコアプロセッサシステム
１０１  プロセッサ（ＣＰＵ＃０〜＃３）
１０２  メモリ
１０３  バス
１０４  断片化監視部（監視ユニット）
１１０  オペレーティングシステム（ＯＳ）
１２１  プロセス管理部
１２２  スレッド管理部
１２３  負荷監視部
１２４  負荷分散部
１３１  稼働プロセス数情報
１３２  割当プロセス数情報
２０１  プロセス数取得部
２０２  断片化率算出部
２０３  再起動判断部
２０３ａ  比較部
２０４  再起動要求出力部
Ａ〜Ｄ  プロセス
【図１】
2012124077.tif 000003
【図２】
2012124077.tif 000004
【図３】
2012124077.tif 000005
【図４】
2012124077.tif 000006
【図５】
2012124077.tif 000007
【図６】
2012124077.tif 000008
【図７】
2012124077.tif 000009
【図８】
2012124077.tif 000010
【図９】
2012124077.tif 000011
【図１０】
2012124077.tif 000012
【図１１】
2012124077.tif 000013
【手続補正書】
【提出日】平成25年9月10日(2013.9.10)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
複数のＣＰＵと、
前記複数のＣＰＵによって共有されるメモリと、
前記メモリに格納され、前記複数のＣＰＵが実行しているプロセスの数を示す第１プロセス数と、前記複数のＣＰＵのそれぞれに割り当てられたプロセスの数を示す第２プロセス数とに基づいて、前記複数のＣＰＵへのスレッドの割り当ての変更を指示する監視ユニットと、
を含むことを特徴とするマルチコアプロセッサシステム。
【請求項２】
前記監視ユニットは、前記第１プロセス数に対する前記第２プロセス数の割合と、所定の閾値とを比較する比較部を含むこと
を特徴とする請求項１に記載のマルチコアプロセッサシステム。
【請求項３】
前記監視ユニットは、
前記比較部による比較結果が前記閾値を超えているときに、第１ＣＰＵにスレッドの割り当ての変更を指示すること
を特徴とする請求項２に記載のマルチコアプロセッサシステム。
【請求項４】
前記監視ユニットが前記複数のＣＰＵへのスレッドの割り当て変更を指示するとき、所定の第２プロセス数を有する第１ＣＰＵに再起動要求を出力すること
を特徴とする請求項１または２に記載のマルチコアプロセッサシステム。
【請求項５】
前記第１プロセス数および第２プロセス数は前記メモリに格納されること
を特徴とする請求項１〜４のいずれか一つに記載のマルチコアプロセッサシステム。
【請求項６】
複数のＣＰＵを有するマルチコアプロセッサシステムにおけるスケジューリング方法であって、
同一プロセスに含まれる複数のスレッドが異なる複数のＣＰＵに割り当てられる割合に基づくスレッドの再割り当ての指示に基づき、
第１ＣＰＵへのスレッドの割り当ての禁止を、第１スレッドが割り当てられた第２ＣＰＵ群に指示し、
前記第１ＣＰＵに割り当てられた第２スレッドを前記第２ＣＰＵ群に移行し、
前記第２ＣＰＵ群に移行された前記第１スレッドと前記第２スレッドの前記第１ＣＰＵへの割り当てを許可する
ことを特徴とするスケジューリング方法。
【請求項７】
前記第１スレッドと前記第２スレッドとが第１プロセスに含まれるとき、
前記第１プロセスとは異なる第２プロセスに含まれる第３スレッドを前記第１ＣＰＵに割り当てること
を特徴とする請求項６に記載のスケジューリング方法。
【請求項８】
前記第１スレッドと前記第２スレッドとが異なるプロセスに含まれるとき、
前記第１スレッド、前記第２スレッド、または第３スレッドのいずれかのスレッドを前記第１ＣＰＵに割り当てること
を特徴とする請求項６または７に記載のスケジューリング方法。
【請求項９】
前記第１ＣＰＵの負荷と前記第２ＣＰＵ群の負荷との差があらかじめ定めた所定値より大きいとき、前記第２ＣＰＵ群から前記第１ＣＰＵにスレッドを移行すること
を特徴とする請求項６〜８のいずれか一つに記載のスケジューリング方法。
【請求項１０】
前記第１ＣＰＵと、前記第２ＣＰＵ群と、前記第１ＣＰＵおよび前記第２ＣＰＵ群以外に実行中のＣＰＵがあれば当該他のＣＰＵ群を含む全てのＣＰＵが実行しているプロセスの数と、前記第１ＣＰＵと、前記第２ＣＰＵ群と、前記他のＣＰＵ群のそれぞれに割り当てられたプロセスの数と、に基づいて前記割合を算出すること
を特徴とする請求項６〜９のいずれか一つに記載のスケジューリング方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチコアプロセッサシステムにおけるプロセッサへのスレッド割り当てを変更するマルチコアプロセッサシステムおよびスケジューリング方法に関する。
【背景技術】
【０００２】
マルチコアプロセッサシステムにおけるスケジューリング手法としては、負荷の高いノード（プロセッサ）から負荷の低いノードにスレッドを移動するという手法が知られている（たとえば、下記特許文献１参照。）。
【０００３】
同一プロセスに属するスレッド同士は同じデータを共有することが多く、また頻繁に通信をおこなうことが知られている。このため、同一プロセスに属するスレッドを同じプロセッサに割り当てることにより、プロセッサ間通信が削減でき、また、キャッシュの利用を効率化できるようになる。これを考慮したスケジューリング手法としては、プロセス起動時に過去の実行履歴から対象プロセス内の全スレッドを同一のプロセッサに割り当てるか、複数プロセッサに割り当てるかを決定する手法が知られている（たとえば、下記特許文献２参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平８−３０４７２号公報
【特許文献２】特開２００２−２７８７７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
プロセッサに対する負荷分散の点でみれば、スレッドを別々のプロセッサで実行した方が負荷バランスをとりやすい。しかし、上記特許文献２のようにプロセス起動時に同一のプロセッサに割り当てるか否かを決定する構成では、プロセスの起動時にしか決定を行わないためプロセス起動後に他のプロセスが起動もしくは終了を繰り返した場合の負荷バランスの変動には対応出来ないという問題がある。
【０００６】
また、特許文献１の技術では、負荷の高いプロセッサのスレッドを負荷の低いプロセッサのスレッドに移動させるだけであり、一つのプロセスを同じプロセッサに割り当てることはできない。仮に、特許文献１と特許文献２の技術を組み合わせ、負荷分散が必要なときに負荷バランスと同一プロセスに属するスレッドの割当先を考慮して、プロセスを複数のプロセッサに分散させるか否かを判断することが考えられるが、単に特許文献１と特許文献２の技術を組み合わせただけでは、負荷分散時に移動対象のスレッドを決定するための判断処理が増加するため、負荷分散のためのオーバーヘッドが増加するという問題が生じる。
【０００７】
すなわち、プロセス数が増大したとき、プロセスが断片化して複数のプロセッサに同一プロセスのスレッドが分散して割り当てられると、複数のプロセッサでスレッドを処理する組み合わせが膨大となる。このため、処理するプロセスを限られた時間で負荷バランスをとりつつ、同じプロセスを同じプロセッサに割り当てる組み合わせを見つけることは難しくなり、マルチコアプロセッサにおける多数のプロセスが断片化した際の断片化の改善および処理効率を向上できる手法が望まれていた。
【０００８】
開示のマルチコアプロセッサシステムおよびスケジューリング方法は、上述した問題点を解消するものであり、プロセスが断片化しても簡単に複数のプロセッサのプロセスを揃えることができることを目的とする。
【課題を解決するための手段】
【０００９】
上述した課題を解決し、目的を達成するため、開示技術は、複数のＣＰＵと、複数のＣＰＵによって共有されるメモリと、メモリに格納され、複数のＣＰＵへのスレッドの割り当ての変更を指示する断片化監視部とを備え、断片化監視部は、複数のＣＰＵが実行しているプロセスの数を示す第１プロセス数（稼働プロセス数情報）と、複数のＣＰＵのそれぞれに割り当てられたプロセスの数を示す第２プロセス数（ＣＰＵ割当プロセス数情報）とに基づいて、複数のＣＰＵへのスレッドの割り当ての変更を指示する。第１ＣＰＵの再起動により、第１ＣＰＵのスレッドが他のＣＰＵに移動した後、他のＣＰＵのスレッドを再起動された第１ＣＰＵに戻す。この際、各ＣＰＵ上のプロセスが揃うように、第１ＣＰＵにスレッドを戻す。
【発明の効果】
【００１０】
開示のマルチコアプロセッサシステムおよびスケジューリング方法によれば、プロセスが断片化しても簡単に複数のプロセッサのプロセスを揃えることができるという効果を奏する。
【図面の簡単な説明】
【００１１】
【図１】図１は、実施の形態にかかるマルチコアプロセッサシステムの構成例を示すブロック図である。
【図２】図２は、断片化監視部の内部構成を示すブロック図である。
【図３】図３は、断片化監視部の動作処理例を示すフローチャートである。
【図４】図４は、ＯＳの負荷分散動作処理例を示すフローチャートである。
【図５】図５は、ＯＳの負荷分散部の停止通知時の動作処理例を示すフローチャートである。
【図６】図６は、ＯＳの負荷分散部の起動通知時の動作処理例を示すフローチャートである。
【図７】図７は、ＯＳの負荷分散部がおこなう負荷分散処理例を示すフローチャートである。
【図８】図８は、スレッドの理想的な割り付け状態を示す図である。
【図９】図９は、プロセスの断片化が進んだ状態を示す図である。
【図１０】図１０は、他のプロセッサへのスレッドの移動状態を示す図である。
【図１１】図１１は、再割り当て後プロセスの断片化が改善された状態を示す図である。
【発明を実施するための形態】
【００１２】
以下に添付図面を参照して、開示技術の好適な実施の形態を詳細に説明する。
【００１３】
（実施の形態）
開示のマルチコアプロセッサシステムでは、通常は、負荷バランスのみを考慮してスレッド単位で負荷分散をおこなう。そして、プロセスが断片化し、プロセスに属するスレッドが複数のプロセッサに散らばって実行されたときには、任意のプロセッサを再起動させることにより、このプロセッサに割り当てられている処理を一旦他のプロセッサに分散させ、再起動させた任意のプロセッサに再度プロセスを移動するように負荷分散をおこなう。再起動するプロセッサは、プロセスの処理を他のプロセッサに一時的に全て移動させた後、再度プロセスの処理を受け入れる構成であれば良く、プロセッサの機能を一時停止させることに相当する。これにより、プロセスの断片化により複数のプロセッサに散らばったスレッドを一つのプロセッサにまとめやすくなり、単純な処理で断片化を軽減しつつプロセッサ間の負荷バランスを均等化できるようになる。
【００１４】
（マルチコアプロセッサシステムの構成例）
図１は、実施の形態にかかるマルチコアプロセッサシステムの構成例を示すブロック図である。図１に記載のように、マルチコアプロセッサシステム１００は、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１と、メモリ１０２とがバス１０３で結合された共有メモリ型のマルチコアプロセッサシステムを含む。
【００１５】
この実施の形態では、マルチコアプロセッサシステム１００は、プロセスの断片化を監視する断片化監視部（監視ユニット）１０４を備え、バス１０３に接続されている。断片化監視部１０４は、断片化監視の機能を持っていれば論理回路等からなるハードウェア、あるいはソフトウェアのいずれでも実現できる。
【００１６】
オペレーティングシステム（ＯＳ）１１０は、複数のプロセッサ１０１がそれぞれ実行するプロセスをプロセッサ１０１毎に管理するプロセス管理部１２１と、プロセス内のスレッドをそれぞれ管理するスレッド管理部１２２を含む。また、複数のプロセッサ１０１の負荷を統合して監視する負荷監視部１２３と、プロセッサ１０１の負荷を他のプロセッサ１０１に割り当てる負荷分散部１２４とを含む。
【００１７】
メモリ１０２には、マルチコアプロセッサシステム１００全体で稼働しているプロセッサ数を記録するための稼働プロセス数（第１プロセス数）を示す稼働プロセス数情報１３１と、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１にそれぞれ割り当てられているプロセス数（第２プロセス数）を示す割当プロセス数情報１３２の記憶領域が設けられている。
【００１８】
起動中のプロセスから新たに別のプロセスを起動する場合は、起動中のプロセスからＯＳ１１０にプロセス生成を依頼する。
【００１９】
ＯＳ１１０は、プロセス管理部１２１が指示したプロセスを生成し、プロセスの生成毎にメモリ１０２の稼働プロセス数情報１３１の値を１増やす。同時に、スレッド管理部１２２に依頼してプロセス内のスレッドを生成する。スレッドが生成されると、負荷分散部１２４が負荷監視部１２３が収集したプロセッサの負荷情報に基づいて、負荷の低いプロセッサに対して、生成したスレッドを割り当てる。
【００２０】
ＯＳ１１０のプロセス管理部１２１は、プロセッサ１０１に割り当てられているプロセス数をそれぞれ管理する。新たにスレッドが割り当てられたプロセッサ１０１は、このプロセッサ１０１に対応するＯＳ１１０のプロセス管理部１２１とスレッド管理部１２２により、新たに割り当てられたスレッドと同じプロセスに属する他のスレッドが割り当てられているかを確認する。確認の結果、同じプロセスに属する他のスレッドが無い場合には、プロセス管理部１２１は、メモリ１０２のプロセッサ１０１に対応する割当プロセス数情報１３２の値を１増加させる。
【００２１】
また、ＯＳ１１０の負荷監視部１２３は、定期的に各プロセッサ１０１の負荷を監視し、負荷分散部１２４は、負荷が最大のプロセッサ１０１と、負荷が最小のプロセッサ１０１との間での負荷の差が一定以上になった場合は、負荷が最大のプロセッサ１０１から負荷が最小のプロセッサ１０１に任意のスレッドを移動させる。このとき、スレッドが移動した側のプロセッサ１０１では、割当プロセス数情報１３２を参照し、移動したスレッドと同じプロセスに属するスレッドが他のプロセッサ１０１にも割り当てられているかを確認する。確認の結果、割り当てられていない場合は、メモリ１０２の自プロセッサ１０１に対応する割当プロセス数情報１３２の値を１減少させる。また、スレッドが移動してきた側のプロセッサ１０１では新規にプロセスが生成されたときと同様に割当プロセス数情報１３２の値を変更する（１増加させる）。
【００２２】
また、稼働中のスレッドが新たにスレッドを生成する場合は、稼働中のスレッドがＯＳ１１０に依頼し、ＯＳ１１０のスレッド管理部１２２がスレッドを生成する。このときに生成されたスレッドは、依頼元のスレッドと同じプロセスに属することになる。スレッドが生成されると、この生成されたスレッドは、新たにプロセスが生成されたときと同様に負荷分散部１２４により負荷の低いプロセッサ１０１に割り当てられて、このプロセッサ１０１に対する割当プロセス数情報１３２の値を変更する（１増加させる）。
【００２３】
稼働中のスレッドが終了した場合は、スレッド管理部１２２がスレッドを削除して、スレッドがプロセッサ１０１から移動して出て行くときと同様に、該当するプロセッサ１０１に同じプロセスに属するスレッドが無ければ割当プロセス数情報１３２の値を１減減少させる。また、マルチコアプロセッサシステム１００全体で同じプロセスに属するスレッドが無ければ、プロセスが終了したとしてプロセス管理部１２１でプロセスを削除して、稼働プロセス数情報１３１の値を１減少させる。
【００２４】
上述した負荷の決定方法には、たとえばプロセッサ１０１の稼働率を利用する方法や、スレッドの待機時間を利用する方法、あらかじめスレッドの処理時間を測定しておき、割り当てられているスレッドの残り処理時間の合計を利用する方法、またこれら複数の指標を組み合わせて負荷を決定する方法などの方法があるが、この実施の形態ではいずれの方法で負荷を決定しても構わない。
【００２５】
図２は、断片化監視部の内部構成を示すブロック図である。断片化監視部１０４は、プロセス数取得部２０１と、断片化率算出部２０２と、再起動判断部２０３と、再起動要求出力部２０４と、バスＩＦ部２１０とを含む。バスＩＦ部２１０は、バス１０３に対し信号を入出力するためのインターフェースである。
【００２６】
プロセス数取得部２０１は、メモリ１０２に記憶された稼働プロセス数情報１３１と、プロセッサ毎の割当プロセス数情報１３２をそれぞれ取得する。断片化率算出部２０２は、プロセス数取得部２０１により取得した稼働プロセス数情報１３１と、割当プロセス数情報１３２に基づき、下記式によりプロセスの断片化率（断片化係数）を算出する。稼働プロセス数は、全てのプロセッサで現在稼働しているプロセス数、割り当てプロセス数の合計とは、各ＣＰＵ１０１に割り当てられたプロセス数の合計である。
断片化率＝割り当てプロセス数の合計／稼働プロセス数
【００２７】
再起動判断部２０３は、断片化率と所定の閾値とを比較する比較部２０３ａを含む。比較部２０３ａの比較により、断片化率が所定の閾値を超えた場合には、断片化が進行したと判断し、割当プロセス数情報１３２を参照し、最も割り当てプロセス数の多いプロセッサ１０１（ＯＳ１１０）にプロセスを再割り当てするための再起動要求を出力する。この再起動要求は、再起動要求出力部２０４を介して断片化が進んだプロセッサ１０１に出力される。
【００２８】
再起動判断部２０３において断片化の判断に用いる閾値は、下記の各条件１〜５のいずれか、もしくは組み合わせに基づき設定する。
１．プロセッサ数
プロセッサ数が多いほど断片化しやすい。したがって、この条件ではプロセッサ数が多いほど閾値を高めに設定する。
２．キャッシュサイズ
キャッシュサイズが大きければ断片化の影響は小さい。したがって、この条件ではキャッシュサイズが大きいほど閾値を低めに設定する。
３．コヒーレント操作時間
コヒーレント操作時間が短ければ断片化の影響は小さい。したがって、この条件ではコヒーレント操作時間が短いほど閾値を低めに設定する。
４．動作時間（プロセッサを停止させてから再起動させるまでの時間）
動作時間が長ければ閾値を高めに設定して再起動の頻度を下げる。
５．開示技術によりプロセスが揃う確率
プロセスが揃う確率が高ければ閾値は低めに設定する。
【００２９】
（プロセスの断片化解消処理動作）
（断片化監視部の動作）
図３は、断片化監視部の動作処理例を示すフローチャートである。断片化監視部１０４では、プロセス数取得部２０１は、定期的にメモリ１０２に記憶された稼働プロセス数情報１３１と、プロセッサ毎の割当プロセス数情報１３２をそれぞれ取得する（ステップＳ３０１）。つぎに、断片化率算出部２０２により、取得した稼働プロセス数情報１３１と、割当プロセス数情報１３２に基づき、断片化率を算出する（ステップＳ３０２）。
【００３０】
そして、再起動判断部２０３は、断片化率算出部２０２により算出された断片化率が所定の閾値を超えたか否かを判断する（ステップＳ３０３）。断片化係数が所定の閾値を超えた場合には（ステップＳ３０３：Ｙｅｓ）、断片化が進行したと判断する。そして、再起動判断部２０３は、最も割り当てプロセス数の多いプロセッサ１０１（ＯＳ１１０）に再起動要求を出力する（ステップＳ３０４）。そして、プロセッサ１０１の再起動によるプロセスの再割り当て終了を待ち、終了する。一方、断片化係数が所定の閾値未満の場合には（ステップＳ３０３：Ｎｏ）、断片化していないと判断する。そして、再起動判断部２０３は、一定時間待機し（ステップＳ３０６）、所定時間後、定期的に再度ステップＳ３０１以下の処理を実行する。
【００３１】
（ＯＳによる負荷分散の処理動作）
図４は、ＯＳの負荷分散動作処理例を示すフローチャートである。図３の処理により、ＯＳ１１０は、断片化監視部１０４からあるプロセッサ１０１に対する再起動要求を受ける（ステップＳ４０１）。これにより、ＯＳ１１０は、負荷分散部１２４に対して停止通知をおこなう（ステップＳ４０２）。そして、負荷分散部１２４によるスレッドの移動終了を確認する（ステップＳ４０３）。ここで、移動中のスレッドの移動終了を待ち（ステップＳ４０４：Ｎｏ）、スレッドの移動終了が確認されれば（ステップＳ４０４：Ｙｅｓ）、再起動要求を受けたプロセッサ１０１を再起動させ（ステップＳ４０５）、負荷分散部１２４に起動通知をおこない（ステップＳ４０６）、終了する。
【００３２】
図５は、ＯＳの負荷分散部の停止通知時の動作処理例を示すフローチャートである。負荷分散部１２４は、停止通知を受けると（ステップＳ５０１）、最も処理の軽い稼働中のプロセッサ１０１を選択する（ステップＳ５０２）。つぎに、再起動要求を受けた停止予定のプロセッサ１０１から任意のスレッドを他のプロセッサ１０１に移動させる（ステップＳ５０３）。これにより、移動先のプロセッサ１０１の負荷情報を更新する（ステップＳ５０４）。
【００３３】
そして、停止予定のプロセッサ１０１の全スレッドを移動させたか判断する（ステップＳ５０５）。全スレッドが移動するまでの間は（ステップＳ５０５：Ｎｏ）、ステップＳ５０２以下の処理を再度実行する。そして、全スレッドが移動し終わると（ステップＳ５０５：Ｙｅｓ）、停止予定のプロセッサ１０１を停止状態として記憶する（ステップＳ５０６）。そして、停止予定のプロセッサ１０１に移動終了を通知し（ステップＳ５０７）、処理を終了する。
【００３４】
図６は、ＯＳの負荷分散部の起動通知時の動作処理例を示すフローチャートである。負荷分散部１２４は、起動通知を受けると（ステップＳ６０１）、起動通知を受けたプロセッサ１０１を起動状態として記録し（ステップＳ６０２）、通常の負荷分散処理をおこない（ステップＳ６０３）、処理を終了する。
【００３５】
図７は、ＯＳの負荷分散部がおこなう負荷分散処理例を示す図である。図６のステップＳ６０３の処理内容を記載してある。ＯＳ１１０の負荷分散部１２４は、負荷監視部１２３により監視した各プロセッサ１０１の負荷に基づき、最も負荷の大きいプロセッサ１０１と、最も負荷の小さいプロセッサ１０１とを選択する（ステップＳ７０１）。そして、負荷分散部１２４は、これら最も負荷の大きいプロセッサ１０１と、最も負荷の小さいプロセッサ１０１との間の負荷の差を所定の閾値と比較する（ステップＳ７０２）。比較の結果、負荷の差が閾値未満であれば（ステップＳ７０２：Ｎｏ）、負荷分散処理は不要であり処理を終了する。
【００３６】
一方、最も負荷の大きいプロセッサ１０１と、最も負荷の小さいプロセッサ１０１の負荷の差が閾値以上であれば（ステップＳ７０２：Ｙｅｓ）、以下の負荷分散処理をおこなう。ここで、負荷分散部１２４は、最も負荷が大きいプロセッサ１０１に割り当てられている全スレッドを他のプロセッサ１０１に割り当て、全プロセッサ１０１の負荷が均一になるように制御する。
【００３７】
はじめに、スレッド管理部１２２は、高負荷のプロセッサ１０１から最も負荷の高いスレッドを選択し（ステップＳ７０３）、プロセス管理部１２１は、選択したスレッドが属するプロセスを取得する（ステップＳ７０４）。各スレッドは、それぞれ処理量（負荷）が異なるため、ここでは、最も処理の高いスレッドから順に選択し、スレッド移動を処理するようにしている。
【００３８】
つぎに、負荷監視部１２３は、ステップＳ７０４で取得したプロセスに属するスレッドの割当先のプロセッサ１０１を取得する（ステップＳ７０５）。そして、負荷監視部１２３は、ステップＳ７０５にて取得したスレッドの割当先のプロセッサ１０１が全て同一プロセッサ１０１であるか否かを判断する（ステップＳ７０６）。この判断の結果、スレッドの割当先のプロセッサ１０１が全て同一プロセッサ１０１であれば（ステップＳ７０６：Ｙｅｓ）、スレッドの移動は不要であるため、ステップＳ７０３に戻り、違うスレッドに対する処理をおこなう。
【００３９】
一方、負荷監視部１２３は、ステップＳ７０６の判断結果、スレッドの割当先のプロセッサ１０１が全て同一のプロセッサ１０１でなければ（ステップＳ７０６：Ｎｏ）、つぎに、選択可能なスレッドがあるか判断する（ステップＳ７０７）。選択可能なスレッドがあれば（ステップＳ７０７：Ｙｅｓ）、負荷分散部１２４は、選択されたスレッドを低負荷のプロセッサ１０１に移動させる（ステップＳ７０８）。この際、複数のプロセッサ１０１でばらばらに実行されているスレッドを優先して再起動させるプロセッサ１０１に割り当てるよう、移動するスレッドを決定する。
【００４０】
一方、選択可能なスレッドが無ければ（ステップＳ７０７：Ｎｏ）、負荷分散部１２４は、任意のスレッドを低負荷のプロセッサ１０１に移動させる（ステップＳ７０９）。ステップＳ７０８、およびステップＳ７０９の処理後、負荷分散部１２４は、負荷情報を更新し（ステップＳ７１０）、ステップＳ７０１に戻り、ステップＳ７０１以下の処理を継続する。
【００４１】
（プロセスの断片化解消の具体的処理例）
つぎに、プロセスの断片化解消の具体的処理例について図８〜図１１を用いて説明する。図８は、スレッドの理想的な割り付け状態を示す図である。単純な例として４つのプロセッサ１０１でそれぞれ４個のスレッドを持つプロセスが４個起動している状態として説明する。各スレッドの負荷量が均一だとすると、図８のように、一つのプロセッサ１０１に一つのプロセスが割り当てられている状態が理想的な状態となる。図中”Ａ−１”とは、プロセスＡに属する１番目のスレッドという意味である。他も同様で、この図ではＡ，Ｂ，Ｃ，Ｄの４つのプロセスがあり、Ａ〜Ｄの４個のプロセスは、それぞれ１〜４までの４個のスレッドを持っているとする。
【００４２】
図９は、プロセスの断片化が進んだ状態を示す図である。プロセスおよびスレッドの起動と終了と負荷分散を繰り返した結果、図９に示すように各プロセスに属するスレッドが異なるプロセッサに分散され実行されているとする。
【００４３】
図９に示す状態のとき、稼働プロセス数は４となり、プロセッサ（ＣＰＵ＃０）１０１の割り当てプロセス数はＡ〜Ｄの４個、プロセッサ（ＣＰＵ＃１）１０１の割り当てプロセス数はプロセスＡ，Ｂの２個、プロセッサ（ＣＰＵ＃２）１０１の割り当てプロセス数はプロセスＡ，Ｃの２個、プロセッサ（ＣＰＵ＃３）１０１の割り当てプロセス数はプロセスＣ，Ｄの２個となっている。この際の断片化率は、割り当てプロセス数の合計＝４＋２＋２＋２＝１０、稼働プロセス数＝４であるため、１０／４＝２．５となる。そして、求めた断片化率が閾値を超えていると、断片化監視部１０４の再起動判断部２０３は、最もプロセス数が多い（割り当てプロセス数が４個）のプロセッサ（ＣＰＵ＃０）１０１に再起動要求を出力する。
【００４４】
図１０は、他のプロセッサへのスレッドの移動状態を示す図である。プロセッサ（第１ＣＰＵ＃０）１０１では、再起動要求を受けると、他のプロセッサ（第２群のＣＰＵ＃１〜＃３）１０１に対してプロセッサ（ＣＰＵ＃０）１０１へのスレッド割り当てを禁止する指示を出す。また、プロセッサ（ＣＰＵ＃０）１０１に割り当てられていたスレッドＡ−１，Ｂ−１，Ｃ−１，Ｄ−４（図中斜線のスレッド）を他のプロセッサ（ＣＰＵ＃１〜＃３）１０１に移動させる。この際の移動は、上述したようにＯＳ１１０の負荷分散部１２４が実行し、移動先の複数のプロセッサ（ＣＰＵ＃１〜＃３）１０１の負荷が均等になるようにおこなう。
【００４５】
このとき、割り当て対象となるプロセッサ１０１の数が減るため、同じプロセスに属するスレッドが同じプロセッサに割り当てられる可能性が高くなる。図１０に示す例では、プロセスＢに属する全てのスレッドＢ１〜Ｂ４がプロセッサ（ＣＰＵ＃１）１０１に割り当てられ、また、プロセスＤに属する全てのスレッドＤ−１〜Ｄ−４がプロセッサ（ＣＰＵ＃３）１０１に割り当てられた状態を示している。
【００４６】
上記説明では、プロセス数がＡ〜Ｄの４個だけとしたが、実際のシステムでは起動直後でも数十〜１００を超えるプロセスが稼働しているため、再起動により一時的にプロセッサ１０１の数が一つ減るだけでも、全スレッドが同一プロセッサに割り当てられることが期待できる。
【００４７】
この後、プロセッサ（ＣＰＵ＃０）１０１は、割り当てられたスレッドを全て他のプロセッサ（ＣＰＵ＃１〜＃３）１０１に移動させると、スレッドが移動完了したことを他のプロセッサ（ＣＰＵ＃１〜＃３）１０１に通知し、再起動する。
【００４８】
プロセッサ（ＣＰＵ＃０）１０１の再起動後において、プロセッサ（ＣＰＵ＃１〜＃３）１０１側ではＯＳ１１０の負荷監視部１２３が、プロセッサ（ＣＰＵ＃０）１０１に割り当てられているスレッドが無く、負荷が極端に低い状態であることを検出する。これにより、負荷分散部１２４は、プロセッサ（ＣＰＵ＃１〜＃３）１０１の中で負荷の高いプロセッサから順に、プロセッサ（ＣＰＵ＃０）１０１に対して全プロセッサの負荷が均一になるまでスレッドを移動させていく。
【００４９】
このようなスレッドの移動について、プロセス内のスレッド数に対して、負荷の高いプロセッサ１０１に割り当てられているスレッド数が少ないスレッドを優先して再起動させたプロセッサ（ＣＰＵ＃０）１０１に移動させる。上記の例では、各スレッドそのものの負荷は一定であるとしている（図中各スレッドの大きさを負荷としてある）。したがって、上記の例では、プロセッサ１０１に対する負荷はスレッドの数となる。
【００５０】
図１０において、スレッド数が最も多く負荷が高いプロセッサ１０１は、プロセッサ（ＣＰＵ＃１）１０１であり、このプロセッサ（ＣＰＵ＃１）１０１からスレッドを一つプロセッサ（ＣＰＵ＃０）１０１に移動させる。プロセッサ（ＣＰＵ＃１）１０１には、プロセスＢに属するスレッドが４つ（Ｂ−１〜Ｂ−４）と、プロセスＡに属するスレッドが２つ（Ａ−１，Ａ−２）割り当てられており、プロセスのスレッドが揃っていないプロセスＡに属するスレッド（Ａ−１またはＡ−２）のうちの任意の一つ（たとえばＡ−２）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。
【００５１】
これにより、全てのプロセッサ（ＣＰＵ＃１〜＃３）１０１の負荷量が均一（スレッド数がいずれも４個）になるため、以降は、任意の順番でプロセッサ（ＣＰＵ＃１〜ＣＰＵ＃３）１０１に割り当てられているスレッドを一つずつプロセッサ（ＣＰＵ＃０）１０１に移動させていく。
【００５２】
この後、プロセッサ（ＣＰＵ＃１）１０１から残ったプロセスＡに属するスレッド（たとえばＡ−１）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。また、プロセッサ（ＣＰＵ＃２）１０１では、プロセスＣに属するスレッドが３つ（Ｃ−１〜Ｃ−３）、プロセスＡに属するスレッドが２つ（Ａ−３，Ａ−４）割り当てられているため、プロセスＡに属するスレッドの任意の一つ（たとえばＡ−３）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。さらに、プロセッサ（ＣＰＵ＃３）１０１では、プロセスＤに属するスレッドが４つ（Ｄ−１〜Ｄ−４）、プロセスＣに属するスレッドが一つ（Ｃ−４）割り当てられているため、プロセスＣに属するスレッド（Ｃ−４）をプロセッサ（ＣＰＵ＃０）１０１に移動させる。これにより、全てのプロセッサ（ＣＰＵ＃０〜＃３）１０１の負荷を均一にすることができ、スレッドの移動処理を終了する。
【００５３】
図１１は、再割り当て後プロセスの断片化が改善された状態を示す図である。プロセッサ（ＣＰＵ＃０）１０１に対する再割り当て終了後においては、図１１の例では、プロセスＢに属する全スレッド（Ｂ−１〜Ｂ−４）が同一のプロセッサ（ＣＰＵ＃１）１０１に割り当てられ、また、プロセスＤに属する全スレッド（Ｄ−１〜Ｄ−４）が同一のプロセッサ（ＣＰＵ＃３）１０１に割り当てられたことになる。また、プロセスＡおよびプロセスＣについても、断片化時（図９の状態）に比して、同じプロセッサ（ＣＰＵ＃０，＃２）１０１に割り当てられているスレッドの数が増加している。
【００５４】
これにより、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１で実行されるスレッドは、同一のプロセスに属するものが多くなり、処理効率を向上できるようになる。キャッシュ利用の効率化や、プロセッサ間通信の削減の観点からすれば、同じプロセスに属するスレッドが全て同じプロセッサ１０１で実行されていなくても、全スレッド中で同じプロセッサ１０１に割り当てられている割合が高ければ、ある程度の効果は期待できる。なお、図１１の状態における断片化率は、（２＋１＋２＋１）／４＝１．５となり、断片化が軽減したことになる。
【００５５】
このように、プロセスの断片化が進行したときに、一つのプロセッサに割り当てられたスレッドを別のプロセッサに分散させ、擬似的に稼働プロセッサ数を減らすことで断片化を軽減することが期待できる。上記の例では、４つのプロセッサに対してプロセス数が４個で、スレッド数も１プロセスに付き均等に４つずつとする簡単な例とした。現実のシステムでは、プロセッサの数に比してプロセス数は遙かに多いため、断片化の解消が期待できる。
【００５６】
ところで、プロセス数が多くなると、プロセッサ間での負荷バランスを保ちつつ、断片化が最小になるようなプロセッサへのスレッドの割り当てを決定するのは非常に困難であったが、開示の技術によれば、通常は負荷バランスのみを考慮した割り当てをおこない、プロセスの断片化が規定以上進行したときのみ、任意のプロセッサを再起動させるだけでプロセスの断片化を解消できるようになる。また、開示技術は、プロセスの断片化を解消する処理について、断片化を最小にすることを主とするものではなく、簡単な処理で断片化を改善させるものである。このため、開示技術によれば、稼働プロセス数が多いほど、断片化を最小にするための手法や、断片化を考慮せずに負荷分散する手法に比べて、簡単な構成で断片化を解消し、同一のプロセッサで一つのプロセスのスレッドをまとめやすくなり、システム全体の処理効率を向上できるようになる。
【００５７】
一般的に、プロセッサ数とプロセス数との関係による全プロセスの組み合わせの探索については、
１．プロセッサ数：少、プロセス数：少の場合、全プロセス（スレッド）の組み合わせの探索が可能。
２．プロセッサ数：少、プロセス数：多の場合、全プロセスの組み合わせが爆発的に増大するので全探索は不可能。
３．プロセッサ数：多の場合、プロセッサ数が多いことだけでプロセスを揃えることが困難。
【００５８】
上記のように、プロセス数とスレッド数が多く、断片化を解消しつつ負荷バランスが均等になる最適なプロセスおよびスレッドのプロセッサへの割り当ての組み合わせを決定するには、非常に時間がかかる。この点、上記の開示技術を、プロセッサ数が少なく（２〜４ＣＰＵ）、プロセス数が多い場合に適用することにより、プロセッサの再起動だけでプロセスを同一のプロセッサに揃えさせることができ、処理効率を向上できるようになる。
【００５９】
以上説明した開示技術では、通常時はプロセッサ間の負荷バランスのみを考慮したスケジューリングをおこなっており、通常時にスケジューリングのオーバーヘッドは増加しない。そして、プロセスの断片化が進んだときには、一時的に稼働プロセッサ数を減らすという簡単な処理で断片化を改善できる。このように、簡単な処理でプロセスの断片化を改善しつつ、プロセッサ間の負荷バランスを均等化できるようになる。
【００６０】
上述した本実施の形態に関し、さらに以下の付記を開示する。
【００６１】
（付記１）複数のＣＰＵと、
前記複数のＣＰＵによって共有されるメモリと、
前記メモリに格納され、前記複数のＣＰＵが実行しているプロセスの数を示す第１プロセス数と、前記複数のＣＰＵのそれぞれに割り当てられたプロセスの数を示す第２プロセス数とに基づいて、前記複数のＣＰＵへのスレッドの割り当ての変更を指示する監視ユニットと、
を含むことを特徴とするマルチコアプロセッサシステム。
【００６２】
（付記２）前記監視ユニットは、前記第１プロセス数に対する前記第２プロセス数の割合と、所定の閾値とを比較する比較部を含むこと
を特徴とする付記１に記載のマルチコアプロセッサシステム。
【００６３】
（付記３）前記監視ユニットは、
前記比較部による比較結果が前記閾値を超えているときに、第１ＣＰＵにスレッドの割り当ての変更を指示すること
を特徴とする付記２に記載のマルチコアプロセッサシステム。
【００６４】
（付記４）前記監視ユニットが前記複数のＣＰＵへのスレッドの割り当て変更を指示するとき、所定の第２プロセス数を有する第１ＣＰＵに再起動要求を出力すること
を特徴とする付記１または２に記載のマルチコアプロセッサシステム。
【００６５】
（付記５）前記第１プロセス数および第２プロセス数は前記メモリに格納されること
を特徴とする付記１〜４のいずれか一つに記載のマルチコアプロセッサシステム。
【００６６】
（付記６）前記監視ユニットは、閾値を、前記ＣＰＵの数、キャッシュサイズ、コヒーレント操作時間、前記ＣＰＵを停止させてから再起動させるまでの時間、プロセスが揃う確率、のいずれかあるいは組み合わせに基づき設定することを特徴とする付記２〜５のいずれか一つに記載のマルチコアプロセッサシステム。
【００６７】
（付記７）前記ＣＰＵのオペレーティングシステムは、
第１ＣＰＵに対する前記監視ユニットからの再起動要求を受けて、複数の前記ＣＰＵのうち、高負荷のＣＰＵから順に高負荷のスレッドを前記第１ＣＰＵに再割り当てをおこなう負荷分散部を含むことを特徴とする付記３〜６のいずれか一つに記載のマルチコアプロセッサシステム。
【００６８】
（付記８）複数のＣＰＵを有するマルチコアプロセッサシステムにおけるスケジューリング方法であって、
同一プロセスに含まれる複数のスレッドが異なる複数のＣＰＵに割り当てられる割合に基づくスレッドの再割り当ての指示に基づき、
第１ＣＰＵへのスレッドの割り当ての禁止を、第１スレッドが割り当てられた第２ＣＰＵ群に指示し、
前記第１ＣＰＵに割り当てられた第２スレッドを前記第２ＣＰＵ群に移行し、
前記第２ＣＰＵ群に移行された前記第１スレッドと前記第２スレッドの前記第１ＣＰＵへの割り当てを許可する
ことを特徴とするスケジューリング方法。
【００６９】
（付記９）前記第１スレッドと前記第２スレッドとが第１プロセスに含まれるとき、
前記第１プロセスとは異なる第２プロセスに含まれる第３スレッドを前記第１ＣＰＵに割り当てること
を特徴とする付記８に記載のスケジューリング方法。
【００７０】
（付記１０）前記第１スレッドと前記第２スレッドとが異なるプロセスに含まれるとき、
前記第１スレッド、前記第２スレッド、または第３スレッドのいずれかのスレッドを前記第１ＣＰＵに割り当てること
を特徴とする付記８または９に記載のスケジューリング方法。
【００７１】
（付記１１）前記第１ＣＰＵの負荷と前記第２ＣＰＵ群の負荷との差があらかじめ定めた所定値より大きいとき、前記第２ＣＰＵ群から前記第１ＣＰＵにスレッドを移行すること
を特徴とする付記８〜１０のいずれか一つに記載のスケジューリング方法。
【００７２】
（付記１２）前記第１ＣＰＵと、前記第２ＣＰＵ群と、前記第１ＣＰＵおよび前記第２ＣＰＵ群以外に実行中のＣＰＵがあれば当該他のＣＰＵ群を含む全てのＣＰＵが実行しているプロセスの数と、前記第１ＣＰＵと、前記第２ＣＰＵ群と、前記他のＣＰＵ群のそれぞれに割り当てられたプロセスの数と、に基づいて前記割合を算出すること
を特徴とする付記８〜１１のいずれか一つに記載のスケジューリング方法。
【符号の説明】
【００７３】
１００  マルチコアプロセッサシステム
１０１  プロセッサ（ＣＰＵ＃０〜＃３）
１０２  メモリ
１０３  バス
１０４  断片化監視部（監視ユニット）
１１０  オペレーティングシステム（ＯＳ）
１２１  プロセス管理部
１２２  スレッド管理部
１２３  負荷監視部
１２４  負荷分散部
１３１  稼働プロセス数情報
１３２  割当プロセス数情報
２０１  プロセス数取得部
２０２  断片化率算出部
２０３  再起動判断部
２０３ａ  比較部
２０４  再起動要求出力部
Ａ〜Ｄ  プロセス
【国際調査報告】
2012124077.tif 000014
2012124077.tif 000015
2012124077.tif 000016
2012124077.tif 000017