"複数のCPUと、前記複数のCPUによって共有されるメモリと、前記メモリに格納され、前記複数のCPUが実行しているプロセスの数を示す第1プロセス数と、前記複数のCPUのそれぞれに割り当てられたプロセスの数を示す第2プロセス数とに基づいて、前記複数のCPUへのスレッドの割り当ての変更を指示する監視ユニットと、を含むことを特徴とするマルチコアプロセッサシステム。前記監視ユニットは、前記第1プロセス数に対する前記第2プロセス数の割合と、所定の閾値とを比較する比較部を含むことを特徴とする請求項1に記載のマルチコアプロセッサシステム。前記監視ユニットは、前記比較部による比較結果が前記閾値を超えているときに、第1CPUにスレッドの割り当ての変更を指示することを特徴とする請求項2に記載のマルチコアプロセッサシステム。前記監視ユニットが前記複数のCPUへのスレッドの割り当て変更を指示するとき、所定の第2プロセス数を有する前記第1CPUに再起動要求を出力することを特徴とする請求項1または2に記載のマルチコアプロセッサシステム。前記第1プロセス数および第2プロセス数は前記メモリに格納されることを特徴とする請求項1~4のいずれか一つに記載のマルチコアプロセッサシステム。前記監視ユニットは、前記閾値を、前記CPUの数、キャッシュサイズ、コヒーレント操作時間、前記CPUを停止させてから再起動させるまでの時間、プロセスが揃う確率、のいずれかあるいは組み合わせに基づき設定することを特徴とする請求項1~5のいずれか一つに記載のマルチコアプロセッサシステム。前記CPUのオペレーティングシステムは、前記第1CPUに対する前記監視ユニットからの再起動要求を受けて、複数の前記CPUのうち、高負荷のCPUから順に高負荷のスレッドを前記第1CPUに再割り当てをおこなう負荷分散部を含むことを特徴とする請求項1~6のいずれか一つに記載のマルチコアプロセッサシステム。複数のCPUを有するマルチコアプロセッサシステムにおけるスケジューリング方法であって、同一プロセスに含まれる複数のスレッドが異なる複数のCPUに割り当てられる割合に基づくスレッドの再割り当ての指示に基づき、第1CPUへのスレッドの割り当ての禁止を、第1スレッドが割り当てられた第2CPU群に指示し、前記第1CPUに割り当てられた第2スレッドを前記第2CPU群に移行し、前記第2CPU群に移行された前記第1スレッドと前記第2スレッドの前記第1CPUへの割り当てを許可することを特徴とするスケジューリング方法。前記第1スレッドと前記第2スレッドとが第1プロセスに含まれるとき、前記第1プロセスとは異なる第2プロセスに含まれる第3スレッドを前記第1CPUに割り当てることを特徴とする請求項8に記載のスケジューリング方法。前記第1スレッドと前記第2スレッドとが異なるプロセスに含まれるとき、前記第1スレッド、前記第2スレッド、または第3スレッドのいずれかのスレッドを前記第1CPUに割り当てることを特徴とする請求項8または9に記載のスケジューリング方法。前記第1CPUの負荷と前記第2CPU群の負荷との差があらかじめ定めた所定値より大きいとき、前記第2CPU群から前記第1CPUにスレッドを移行することを特徴とする請求項8~10のいずれか一つに記載のスケジューリング方法。前記第1CPUと、前記第2CPU群と、前記第1CPUおよび前記第2CPU群以外に実行中のCPUがあれば当該他のCPU群を含む全てのCPUが実行しているプロセスの数と、前記第1CPUと、前記第2CPU群と、前記他のCPU群のそれぞれに割り当てられたプロセスの数と、に基づいて前記割合を算出することを特徴とする請求項8~11のいずれか一つに記載のスケジューリング方法。プロセッサに対する負荷分散の点でみれば、スレッドを別々のプロセッサで実行した方が負荷バランスをとりやすい。しかし、上記特許文献2のようにプロセス起動時に同一のプロセッサに割り当てるか否かを決定する構成では、プロセスの起動時にしか決定を行わないためプロセス起動後に他のプロセスが起動もしくは終了を繰り返した場合の負荷バランスの変動には対応出来ないという問題がある。また、特許文献1の技術では、負荷の高いプロセッサのスレッドを負荷の低いプロセッサのスレッドに移動させるだけであり、一つのプロセスを同じプロセッサに割り当てることはできない。仮に、特許文献1と特許文献2の技術を組み合わせ、負荷分散が必要なときに負荷バランスと同一プロセスに属するスレッドの割当先を考慮して、プロセスを複数のプロセッサに分散させるか否かを判断することが考えられるが、単に特許文献1と特許文献2の技術を組み合わせただけでは、負荷分散時に移動対象のスレッドを決定するための判断処理が増加するため、負荷分散のためのオーバーヘッドが増加するという問題が生じる。すなわち、プロセス数が増大したとき、プロセスが断片化して複数のプロセッサに同一プロセスのスレッドが分散して割り当てられると、複数のプロセッサでスレッドを処理する組み合わせが膨大となる。このため、処理するプロセスを限られた時間で負荷バランスをとりつつ、同じプロセスを同じプロセッサに割り当てる組み合わせを見つけることは難しくなり、マルチコアプロセッサにおける多数のプロセスが断片化した際の断片化の改善および処理効率を向上できる手法が望まれていた。開示のマルチコアプロセッサシステムおよびスケジューリング方法は、上述した問題点を解消するものであり、プロセスが断片化しても簡単に複数のプロセッサのプロセスを揃えることができることを目的とする。上述した課題を解決し、目的を達成するため、開示技術は、複数のCPUと、複数のCPUによって共有されるメモリと、メモリに格納され、複数のCPUへのスレッドの割り当ての変更を指示する断片化監視部とを備え、断片化監視部は、複数のCPUが実行しているプロセスの数を示す第1プロセス数稼働プロセス数情報と、複数のCPUのそれぞれに割り当てられたプロセスの数を示す第2プロセス数CPU割当プロセス数情報とに基づいて、複数のCPUへのスレッドの割り当ての変更を指示する。第1CPUの再起動により、第1CPUのスレッドが他のCPUに移動した後、他のCPUのスレッドを再起動された第1CPUに戻す。この際、各CPU上のプロセスが揃うように、第1CPUにスレッドを戻す。開示のマルチコアプロセッサシステムおよびスケジューリング方法によれば、プロセスが断片化しても簡単に複数のプロセッサのプロセスを揃えることができるという効果を奏する。以下に添付図面を参照して、開示技術の好適な実施の形態を詳細に説明する。実施の形態開示のマルチコアプロセッサシステムでは、通常は、負荷バランスのみを考慮してスレッド単位で負荷分散をおこなう。そして、プロセスが断片化し、プロセスに属するスレッドが複数のプロセッサに散らばって実行されたときには、任意のプロセッサを再起動させることにより、このプロセッサに割り当てられている処理を一旦他のプロセッサに分散させ、再起動させた任意のプロセッサに再度プロセスを移動するように負荷分散をおこなう。再起動するプロセッサは、プロセスの処理を他のプロセッサに一時的に全て移動させた後、再度プロセスの処理を受け入れる構成であれば良く、プロセッサの機能を一時停止させることに相当する。これにより、プロセスの断片化により複数のプロセッサに散らばったスレッドを一つのプロセッサにまとめやすくなり、単純な処理で断片化を軽減しつつプロセッサ間の負荷バランスを均等化できるようになる。マルチコアプロセッサシステムの構成例図1は、実施の形態にかかるマルチコアプロセッサシステムの構成例を示すブロック図である。図1に記載のように、マルチコアプロセッサシステム100は、複数のプロセッサCPU0~3101と、メモリ102とがバス103で結合された共有メモリ型のマルチコアプロセッサシステムを含む。この実施の形態では、マルチコアプロセッサシステム100は、プロセスの断片化を監視する断片化監視部監視ユニット104を備え、バス103に接続されている。断片化監視部104は、断片化監視の機能を持っていれば論理回路等からなるハードウェア、あるいはソフトウェアのいずれでも実現できる。オペレーティングシステムOS110は、複数のプロセッサ101がそれぞれ実行するプロセスをプロセッサ101毎に管理するプロセス管理部121と、プロセス内のスレッドをそれぞれ管理するスレッド管理部122を含む。また、複数のプロセッサ101の負荷を統合して監視する負荷監視部123と、プロセッサ101の負荷を他のプロセッサ101に割り当てる負荷分散部124とを含む。メモリ102には、マルチコアプロセッサシステム100全体で稼働しているプロセッサ数を記録するための稼働プロセス数第1プロセス数を示す稼働プロセス数情報131と、複数のプロセッサCPU0~3101にそれぞれ割り当てられているプロセス数第2プロセス数を示す割当プロセス数情報132の記憶領域が設けられている。起動中のプロセスから新たに別のプロセスを起動する場合は、起動中のプロセスからOS110にプロセス生成を依頼する。OS110は、プロセス管理部121が指示したプロセスを生成し、プロセスの生成毎にメモリ102の稼働プロセス数情報131の値を1増やす。同時に、スレッド管理部122に依頼してプロセス内のスレッドを生成する。スレッドが生成されると、負荷分散部124が負荷監視部123が収集したプロセッサの負荷情報に基づいて、負荷の低いプロセッサに対して、生成したスレッドを割り当てる。OS110のプロセス管理部121は、プロセッサ101に割り当てられているプロセス数をそれぞれ管理する。新たにスレッドが割り当てられたプロセッサ101は、このプロセッサ101に対応するOS110のプロセス管理部121とスレッド管理部122により、新たに割り当てられたスレッドと同じプロセスに属する他のスレッドが割り当てられているかを確認する。確認の結果、同じプロセスに属する他のスレッドが無い場合には、プロセス管理部121は、メモリ102のプロセッサ101に対応する割当プロセス数情報132の値を1増加させる。また、OS110の負荷監視部123は、定期的に各プロセッサ101の負荷を監視し、負荷分散部124は、負荷が最大のプロセッサ101と、負荷が最小のプロセッサ101との間での負荷の差が一定以上になった場合は、負荷が最大のプロセッサ101から負荷が最小のプロセッサ101に任意のスレッドを移動させる。このとき、スレッドが移動した側のプロセッサ101では、割当プロセス数情報132を参照し、移動したスレッドと同じプロセスに属するスレッドが他のプロセッサ101にも割り当てられているかを確認する。確認の結果、割り当てられていない場合は、メモリ102の自プロセッサ101に対応する割当プロセス数情報132の値を1減少させる。また、スレッドが移動してきた側のプロセッサ101では新規にプロセスが生成されたときと同様に割当プロセス数情報132の値を変更する1増加させる。また、稼働中のスレッドが新たにスレッドを生成する場合は、稼働中のスレッドがOS110に依頼し、OS110のスレッド管理部122がスレッドを生成する。このときに生成されたスレッドは、依頼元のスレッドと同じプロセスに属することになる。スレッドが生成されると、この生成されたスレッドは、新たにプロセスが生成されたときと同様に負荷分散部124により負荷の低いプロセッサ101に割り当てられて、このプロセッサ101に対する割当プロセス数情報132の値を変更する1増加させる。稼働中のスレッドが終了した場合は、スレッド管理部122がスレッドを削除して、スレッドがプロセッサ101から移動して出て行くときと同様に、該当するプロセッサ101に同じプロセスに属するスレッドが無ければ割当プロセス数情報132の値を1減減少させる。また、マルチコアプロセッサシステム100全体で同じプロセスに属するスレッドが無ければ、プロセスが終了したとしてプロセス管理部121でプロセスを削除して、稼働プロセス数情報131の値を1減少させる。上述した負荷の決定方法には、たとえばプロセッサ101の稼働率を利用する方法や、スレッドの待機時間を利用する方法、あらかじめスレッドの処理時間を測定しておき、割り当てられているスレッドの残り処理時間の合計を利用する方法、またこれら複数の指標を組み合わせて負荷を決定する方法などの方法があるが、この実施の形態ではいずれの方法で負荷を決定しても構わない。図2は、断片化監視部の内部構成を示すブロック図である。断片化監視部104は、プロセス数取得部201と、断片化率算出部202と、再起動判断部203と、再起動要求出力部204と、バスIF部210とを含む。バスIF部210は、バス103に対し信号を入出力するためのインターフェースである。プロセス数取得部201は、メモリ102に記憶された稼働プロセス数情報131と、プロセッサ毎の割当プロセス数情報132をそれぞれ取得する。断片化率算出部202は、プロセス数取得部201により取得した稼働プロセス数情報131と、割当プロセス数情報132に基づき、下記式によりプロセスの断片化率断片化係数を算出する。稼働プロセス数は、全てのプロセッサで現在稼働しているプロセス数、割り当てプロセス数の合計とは、各CPU101に割り当てられたプロセス数の合計である。断片化率=割り当てプロセス数の合計/稼働プロセス数再起動判断部203は、断片化率と所定の閾値とを比較する比較部203aを含む。比較部203aの比較により、断片化率が所定の閾値を超えた場合には、断片化が進行したと判断し、割当プロセス数情報132を参照し、最も割り当てプロセス数の多いプロセッサ101OS110にプロセスを再割り当てするための再起動要求を出力する。この再起動要求は、再起動要求出力部204を介して断片化が進んだプロセッサ101に出力される。再起動判断部203において断片化の判断に用いる閾値は、下記の各条件1~5のいずれか、もしくは組み合わせに基づき設定する。1.プロセッサ数プロセッサ数が多いほど断片化しやすい。したがって、この条件ではプロセッサ数が多いほど閾値を高めに設定する。2.キャッシュサイズキャッシュサイズが大きければ断片化の影響は小さい。したがって、この条件ではキャッシュサイズが大きいほど閾値を低めに設定する。3.コヒーレント操作時間コヒーレント操作時間が短ければ断片化の影響は小さい。したがって、この条件ではコヒーレント操作時間が短いほど閾値を低めに設定する。4.動作時間プロセッサを停止させてから再起動させるまでの時間動作時間が長ければ閾値を高めに設定して再起動の頻度を下げる。5.開示技術によりプロセスが揃う確率プロセスが揃う確率が高ければ閾値は低めに設定する。プロセスの断片化解消処理動作断片化監視部の動作図3は、断片化監視部の動作処理例を示すフローチャートである。断片化監視部104では、プロセス数取得部201は、定期的にメモリ102に記憶された稼働プロセス数情報131と、プロセッサ毎の割当プロセス数情報132をそれぞれ取得するステップS301。つぎに、断片化率算出部202により、取得した稼働プロセス数情報131と、割当プロセス数情報132に基づき、断片化率を算出するステップS302。そして、再起動判断部203は、断片化率算出部202により算出された断片化率が所定の閾値を超えたか否かを判断するステップS303。断片化係数が所定の閾値を超えた場合にはステップS303:Yes、断片化が進行したと判断する。そして、再起動判断部203は、最も割り当てプロセス数の多いプロセッサ101OS110に再起動要求を出力するステップS304。そして、プロセッサ101の再起動によるプロセスの再割り当て終了を待ち、終了する。一方、断片化係数が所定の閾値未満の場合にはステップS303:No、断片化していないと判断する。そして、再起動判断部203は、一定時間待機しステップS306、所定時間後、定期的に再度ステップS301以下の処理を実行する。OSによる負荷分散の処理動作図4は、OSの負荷分散動作処理例を示すフローチャートである。図3の処理により、OS110は、断片化監視部104からあるプロセッサ101に対する再起動要求を受けるステップS401。これにより、OS110は、負荷分散部124に対して停止通知をおこなうステップS402。そして、負荷分散部124によるスレッドの移動終了を確認するステップS403。ここで、移動中のスレッドの移動終了を待ちステップS404:No、スレッドの移動終了が確認されればステップS404:Yes、再起動要求を受けたプロセッサ101を再起動させステップS405、負荷分散部124に起動通知をおこないステップS406、終了する。図5は、OSの負荷分散部の停止通知時の動作処理例を示すフローチャートである。負荷分散部124は、停止通知を受けるとステップS501、最も処理の軽い稼働中のプロセッサ101を選択するステップS502。つぎに、再起動要求を受けた停止予定のプロセッサ101から任意のスレッドを他のプロセッサ101に移動させるステップS503。これにより、移動先のプロセッサ101の負荷情報を更新するステップS504。そして、停止予定のプロセッサ101の全スレッドを移動させたか判断するステップS505。全スレッドが移動するまでの間はステップS505:No、ステップS502以下の処理を再度実行する。そして、全スレッドが移動し終わるとステップS505:Yes、停止予定のプロセッサ101を停止状態として記憶するステップS506。そして、停止予定のプロセッサ101に移動終了を通知しステップS507、処理を終了する。図6は、OSの負荷分散部の起動通知時の動作処理例を示すフローチャートである。負荷分散部124は、起動通知を受けるとステップS601、起動通知を受けたプロセッサ101を起動状態として記録しステップS602、通常の負荷分散処理をおこないステップS603、処理を終了する。図7は、OSの負荷分散部がおこなう負荷分散処理例を示す図である。図6のステップS603の処理内容を記載してある。OS110の負荷分散部124は、負荷監視部123により監視した各プロセッサ101の負荷に基づき、最も負荷の大きいプロセッサ101と、最も負荷の小さいプロセッサ101とを選択するステップS701。そして、負荷分散部124は、これら最も負荷の大きいプロセッサ101と、最も負荷の小さいプロセッサ101との間の負荷の差を所定の閾値と比較するステップS702。比較の結果、負荷の差が閾値未満であればステップS702:No、負荷分散処理は不要であり処理を終了する。一方、最も負荷の大きいプロセッサ101と、最も負荷の小さいプロセッサ101の負荷の差が閾値以上であればステップS702:Yes、以下の負荷分散処理をおこなう。ここで、負荷分散部124は、最も負荷が大きいプロセッサ101に割り当てられている全スレッドを他のプロセッサ101に割り当て、全プロセッサ101の負荷が均一になるように制御する。はじめに、スレッド管理部122は、高負荷のプロセッサ101から最も負荷の高いスレッドを選択しステップS703、プロセス管理部121は、選択したスレッドが属するプロセスを取得するステップS704。各スレッドは、それぞれ処理量負荷が異なるため、ここでは、最も処理の高いスレッドから順に選択し、スレッド移動を処理するようにしている。つぎに、負荷監視部123は、ステップS704で取得したプロセスに属するスレッドの割当先のプロセッサ101を取得するステップS705。そして、負荷監視部123は、ステップS705にて取得したスレッドの割当先のプロセッサ101が全て同一プロセッサ101であるか否かを判断するステップS706。この判断の結果、スレッドの割当先のプロセッサ101が全て同一プロセッサ101であればステップS706:Yes、スレッドの移動は不要であるため、ステップS703に戻り、違うスレッドに対する処理をおこなう。一方、負荷監視部123は、ステップS706の判断結果、スレッドの割当先のプロセッサ101が全て同一のプロセッサ101でなければステップS706:No、つぎに、選択可能なスレッドがあるか判断するステップS707。選択可能なスレッドがあればステップS707:Yes、負荷分散部124は、選択されたスレッドを低負荷のプロセッサ101に移動させるステップS708。この際、複数のプロセッサ101でばらばらに実行されているスレッドを優先して再起動させるプロセッサ101に割り当てるよう、移動するスレッドを決定する。一方、選択可能なスレッドが無ければステップS707:No、負荷分散部124は、任意のスレッドを低負荷のプロセッサ101に移動させるステップS709。ステップS708、およびステップS709の処理後、負荷分散部124は、負荷情報を更新しステップS710、ステップS701に戻り、ステップS701以下の処理を継続する。プロセスの断片化解消の具体的処理例つぎに、プロセスの断片化解消の具体的処理例について図8~図11を用いて説明する。図8は、スレッドの理想的な割り付け状態を示す図である。単純な例として4つのプロセッサ101でそれぞれ4個のスレッドを持つプロセスが4個起動している状態として説明する。各スレッドの負荷量が均一だとすると、図8のように、一つのプロセッサ101に一つのプロセスが割り当てられている状態が理想的な状態となる。図中A-1とは、プロセスAに属する1番目のスレッドという意味である。他も同様で、この図ではA,B,C,Dの4つのプロセスがあり、A~Dの4個のプロセスは、それぞれ1~4までの4個のスレッドを持っているとする。図9は、プロセスの断片化が進んだ状態を示す図である。プロセスおよびスレッドの起動と終了と負荷分散を繰り返した結果、図9に示すように各プロセスに属するスレッドが異なるプロセッサに分散され実行されているとする。図9に示す状態のとき、稼働プロセス数は4となり、プロセッサCPU0101の割り当てプロセス数はA~Dの4個、プロセッサCPU1101の割り当てプロセス数はプロセスA,Bの2個、プロセッサCPU2101の割り当てプロセス数はプロセスA,Cの2個、プロセッサCPU3101の割り当てプロセス数はプロセスC,Dの2個となっている。この際の断片化率は、割り当てプロセス数の合計=4222=10、稼働プロセス数=4であるため、10/4=2.5となる。そして、求めた断片化率が閾値を超えていると、断片化監視部104の再起動判断部203は、最もプロセス数が多い割り当てプロセス数が4個のプロセッサCPU0101に再起動要求を出力する。図10は、他のプロセッサへのスレッドの移動状態を示す図である。プロセッサ第1CPU0101では、再起動要求を受けると、他のプロセッサ第2群のCPU1~3101に対してプロセッサCPU0101へのスレッド割り当てを禁止する指示を出す。また、プロセッサCPU0101に割り当てられていたスレッドA-1,B-1,C-1,D-4図中斜線のスレッドを他のプロセッサCPU1~3101に移動させる。この際の移動は、上述したようにOS110の負荷分散部124が実行し、移動先の複数のプロセッサCPU1~3101の負荷が均等になるようにおこなう。このとき、割り当て対象となるプロセッサ101の数が減るため、同じプロセスに属するスレッドが同じプロセッサに割り当てられる可能性が高くなる。図10に示す例では、プロセスBに属する全てのスレッドB1~B4がプロセッサCPU1101に割り当てられ、また、プロセスDに属する全てのスレッドD-1~D-4がプロセッサCPU3101に割り当てられた状態を示している。上記説明では、プロセス数がA~Dの4個だけとしたが、実際のシステムでは起動直後でも数十~100を超えるプロセスが稼働しているため、再起動により一時的にプロセッサ101の数が一つ減るだけでも、全スレッドが同一プロセッサに割り当てられることが期待できる。この後、プロセッサCPU0101は、割り当てられたスレッドを全て他のプロセッサCPU1~3101に移動させると、スレッドが移動完了したことを他のプロセッサCPU1~3101に通知し、再起動する。プロセッサCPU0101の再起動後において、プロセッサCPU1~3101側ではOS110の負荷監視部123が、プロセッサCPU0101に割り当てられているスレッドが無く、負荷が極端に低い状態であることを検出する。これにより、負荷分散部124は、プロセッサCPU1~3101の中で負荷の高いプロセッサから順に、プロセッサCPU0101に対して全プロセッサの負荷が均一になるまでスレッドを移動させていく。このようなスレッドの移動について、プロセス内のスレッド数に対して、負荷の高いプロセッサ101に割り当てられているスレッド数が少ないスレッドを優先して再起動させたプロセッサCPU0101に移動させる。上記の例では、各スレッドそのものの負荷は一定であるとしている図中各スレッドの大きさを負荷としてある。したがって、上記の例では、プロセッサ101に対する負荷はスレッドの数となる。図10において、スレッド数が最も多く負荷が高いプロセッサ101は、プロセッサCPU1101であり、このプロセッサCPU1101からスレッドを一つプロセッサCPU0101に移動させる。プロセッサCPU1101には、プロセスBに属するスレッドが4つB-1~B-4と、プロセスAに属するスレッドが2つA-1,A-2割り当てられており、プロセスのスレッドが揃っていないプロセスAに属するスレッドA-1またはA-2のうちの任意の一つたとえばA-2をプロセッサCPU0101に移動させる。これにより、全てのプロセッサCPU1~3101の負荷量が均一スレッド数がいずれも4個になるため、以降は、任意の順番でプロセッサCPU1~CPU3101に割り当てられているスレッドを一つずつプロセッサCPU0101に移動させていく。この後、プロセッサCPU1101から残ったプロセスAに属するスレッドたとえばA-1をプロセッサCPU0101に移動させる。また、プロセッサCPU2101では、プロセスCに属するスレッドが3つC-1~C-3、プロセスAに属するスレッドが2つA-3,A-4割り当てられているため、プロセスAに属するスレッドの任意の一つたとえばA-3をプロセッサCPU0101に移動させる。さらに、プロセッサCPU3101では、プロセスDに属するスレッドが4つD-1~D-4、プロセスCに属するスレッドが一つC-4割り当てられているため、プロセスCに属するスレッドC-4をプロセッサCPU0101に移動させる。これにより、全てのプロセッサCPU0~3101の負荷を均一にすることができ、スレッドの移動処理を終了する。図11は、再割り当て後プロセスの断片化が改善された状態を示す図である。プロセッサCPU0101に対する再割り当て終了後においては、図11の例では、プロセスBに属する全スレッドB-1~B-4が同一のプロセッサCPU1101に割り当てられ、また、プロセスDに属する全スレッドD-1~D-4が同一のプロセッサCPU3101に割り当てられたことになる。また、プロセスAおよびプロセスCについても、断片化時図9の状態に比して、同じプロセッサCPU0,2101に割り当てられているスレッドの数が増加している。これにより、複数のプロセッサCPU0~3101で実行されるスレッドは、同一のプロセスに属するものが多くなり、処理効率を向上できるようになる。キャッシュ利用の効率化や、プロセッサ間通信の削減の観点からすれば、同じプロセスに属するスレッドが全て同じプロセッサ101で実行されていなくても、全スレッド中で同じプロセッサ101に割り当てられている割合が高ければ、ある程度の効果は期待できる。なお、図11の状態における断片化率は、2121/4=1.5となり、断片化が軽減したことになる。このように、プロセスの断片化が進行したときに、一つのプロセッサに割り当てられたスレッドを別のプロセッサに分散させ、擬似的に稼働プロセッサ数を減らすことで断片化を軽減することが期待できる。上記の例では、4つのプロセッサに対してプロセス数が4個で、スレッド数も1プロセスに付き均等に4つずつとする簡単な例とした。現実のシステムでは、プロセッサの数に比してプロセス数は遙かに多いため、断片化の解消が期待できる。ところで、プロセス数が多くなると、プロセッサ間での負荷バランスを保ちつつ、断片化が最小になるようなプロセッサへのスレッドの割り当てを決定するのは非常に困難であったが、開示の技術によれば、通常は負荷バランスのみを考慮した割り当てをおこない、プロセスの断片化が規定以上進行したときのみ、任意のプロセッサを再起動させるだけでプロセスの断片化を解消できるようになる。また、開示技術は、プロセスの断片化を解消する処理について、断片化を最小にすることを主とするものではなく、簡単な処理で断片化を改善させるものである。このため、開示技術によれば、稼働プロセス数が多いほど、断片化を最小にするための手法や、断片化を考慮せずに負荷分散する手法に比べて、簡単な構成で断片化を解消し、同一のプロセッサで一つのプロセスのスレッドをまとめやすくなり、システム全体の処理効率を向上できるようになる。一般的に、プロセッサ数とプロセス数との関係による全プロセスの組み合わせの探索については、1.プロセッサ数:少、プロセス数:少の場合、全プロセススレッドの組み合わせの探索が可能。2.プロセッサ数:少、プロセス数:多の場合、全プロセスの組み合わせが爆発的に増大するので全探索は不可能。3.プロセッサ数:多の場合、プロセッサ数が多いことだけでプロセスを揃えることが困難。上記のように、プロセス数とスレッド数が多く、断片化を解消しつつ負荷バランスが均等になる最適なプロセスおよびスレッドのプロセッサへの割り当ての組み合わせを決定するには、非常に時間がかかる。この点、上記の開示技術を、プロセッサ数が少なく2~4CPU、プロセス数が多い場合に適用することにより、プロセッサの再起動だけでプロセスを同一のプロセッサに揃えさせることができ、処理効率を向上できるようになる。以上説明した開示技術では、通常時はプロセッサ間の負荷バランスのみを考慮したスケジューリングをおこなっており、通常時にスケジューリングのオーバーヘッドは増加しない。そして、プロセスの断片化が進んだときには、一時的に稼働プロセッサ数を減らすという簡単な処理で断片化を改善できる。このように、簡単な処理でプロセスの断片化を改善しつつ、プロセッサ間の負荷バランスを均等化できるようになる。"