(57)【要約】【課題】複数の処理部の間での負荷分散の精度を向上させる。【解決手段】情報処理装置１は、処理部２ａ〜２ｃを有する。この情報処理装置１では、処理部２ａ〜２ｃの処理能力を収集し、所定数のタスクを、収集された処理能力の比率に応じた分配確率で処理部２ａ〜２ｃに分配するタスク分配処理を、処理部２ａ〜２ｃのそれぞれが独立して実行する。これにより、処理能力の収集頻度が高まり、高頻度で収集された処理能力の比率に応じた分配確率でタスクが分配される。その結果、処理部２ａ〜２ｃの間の負荷バランスの変動に対して高速に追随しながらタスクの分配先が適正化されていき、負荷分散の精度が向上する。【選択図】図１
2020144737.tif 000002
【特許請求の範囲】
【請求項１】
複数の処理部を有する情報処理装置であって、
前記複数の処理部の処理能力を収集し、所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
情報処理装置。
【請求項２】
前記情報処理装置は、前記所定数の要素をそれぞれ有する複数の乱数列を記憶する記憶部をさらに有し、
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第１の数値をランダムに生成し、前記複数の乱数列から前記第１の数値が示す乱数列を選択する処理を含み、
前記分配では、前記選択された乱数列を用いて前記所定数のタスクを分配する、
請求項１記載の情報処理装置。
【請求項３】
前記タスク分配処理は、さらに、前記所定数の要素を有する数列であって、前記複数の処理部のそれぞれを示す識別番号を前記比率に応じた数だけ含む前記数列を生成する処理を含み、
前記分配では、前記所定数のタスクのそれぞれが発生するたびに、前記選択された乱数列から１つずつ数値を選択し、前記数列に含まれる前記識別番号のうち、前記選択された数値が示す要素として含まれる前記識別番号を読み出し、前記複数の処理部のうち、読み出された前記識別番号に対応する処理部に対して発生したタスクを分配する、
請求項２記載の情報処理装置。
【請求項４】
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第２の数値をランダムに生成する処理を含み、
前記選択された乱数列からの数値の選択では、前記第２の数値に基づいて決定される要素を先頭にして、前記選択された乱数列から数値を巡回的に選択する、
請求項３記載の情報処理装置。
【請求項５】
前記情報処理装置は、それぞれ個別のタスク種別に関連付けられた前記複数の処理部を複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、発生したタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定される、
請求項１乃至４のいずれか１項に記載の情報処理装置。
【請求項６】
前記情報処理装置は、それぞれ個別のタスク種別に関連付けられ、かつ、第１グループと第２グループのいずれかに分類される前記複数の処理部を、複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記第１グループに含まれる前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、前記第１グループに含まれる前記複数の処理部に対応するタスク種別のタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定され、前記第２グループに含まれる前記複数の処理部に対応するタスク種別のタスクが、判別されたタスク種別に対応する前記複数の処理部に対してランダムに分配される、
請求項１乃至４のいずれか１項に記載の情報処理装置。
【請求項７】
コンピュータに、
前記コンピュータが備える複数の処理部の処理能力を収集し、所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
処理を実行させるタスク管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置およびタスク管理プログラムに関する。
【背景技術】
【０００２】
マルチプロセッサシステムやマルチコアシステムのように複数の処理部を備えるシステムの処理性能を高めるためには、各処理部の間で負荷が分散するようにタスクの実行を制御することが重要である。このような負荷分散の方法としては、各処理部に対してタスクを均等に分配する方法があるが、この方法ではタスクの内容によっては処理部間での負荷バランスの偏りが大きくなる場合がある。そこで、他の方法として、各処理部での処理負荷の割合に応じた確率で、各処理部に対してタスクを分配するように制御する方法がある。
【０００３】
また、負荷分散に関しては次のような提案がある。例えば、トランザクションの分配先登録表を用いて複数のサーバにトランザクションを分配する情報処理装置が提案されている。この情報処理装置は、各サーバの処理能力の相対比に基づいてトランザクションの分配比率を算出し、分配比率と、乱数を基に生成されたインデックス表とを用いて上記の分配先登録表を生成する。また、他の例として、複数のＣＰＵの稼働率に基づいて負荷分散マトリックスを生成し、負荷分散マトリックスを用いてトランザクションを実行させるＣＰＵを決定するゲートウェイプロセッサが提案されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平９−２８２２８７号公報
【特許文献２】特開平９−２５９０９３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、ある時点での複数の処理部それぞれの負荷の割合に応じた確率で、一定数のタスクの分配先を決定する方法では、次のような問題がある。この方法では、一定数のタスクが分配される期間では、あくまでその期間の開始時点での負荷の割合に応じた確率で、タスクが分配される。このため、その期間内で処理部間の負荷バランスが変動すると、分配されたタスクを各処理部が処理したときの負荷分散の精度が低下する。
【０００６】
１つの側面では、本発明は、複数の処理部の間での負荷分散の精度を向上させることが可能な情報処理装置およびタスク管理プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
１つの案では、複数の処理部を有する次のような情報処理装置が提供される。この情報処理装置では、複数の処理部の処理能力を収集し、所定数のタスクを、収集された処理能力の比率に応じた分配確率で複数の処理部に分配するタスク分配処理を、複数の処理部のそれぞれが独立して実行する。
【０００８】
また、１つの案では、上記の情報処理装置と同様の処理をコンピュータに実行させるタスク管理プログラムが提供される。
【発明の効果】
【０００９】
１つの側面では、複数の処理部の間での負荷分散の精度を向上させることができる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施の形態に係る情報処理装置の構成例および処理例を示す図である。
【図２】第２の実施の形態に係るストレージシステムの構成例を示す図である。
【図３】ストレージ制御装置のハードウェア構成例を示す図である。
【図４】ストレージ制御装置が備える処理機能の構成例を示すブロック図である。
【図５】コアの処理能力の比率に応じたタスク分配制御について説明するための図である。
【図６】タスクの分配制御で利用される情報の例を示す図である。
【図７】配列の生成処理について説明するための図である。
【図８】乱数テーブルの生成処理を示すフローチャートの例である。
【図９】タスク実行制御処理を示すフローチャートの例である。
【図１０】タスク分配制御処理を示すフローチャートの例（その１）である。
【図１１】タスク分配制御処理を示すフローチャートの例（その２）である。
【図１２】ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］の生成処理を示すフローチャートの例を示す。
【図１３】各コアでタスク分配制御が実行される様子を模式的に示した図である。
【図１４】変形例１におけるタスク分配制御処理を示すフローチャートの例である。
【図１５】変形例２におけるタスク分配制御処理を示すフローチャートの例である。
【図１６】機能別コアおよび使用される行列の構成例を示す図である。
【図１７】変形例３におけるタスク分配制御処理を示すフローチャートの例である。
【図１８】変形例４における機能別コアおよび使用される配列の構成例を示す図である。
【図１９】均等分配用のコア選択配列の例を示す図である。
【図２０】変形例４におけるタスク分配制御処理の一部を示すフローチャートの例である。
【図２１】変形例５におけるタスク分配制御処理の一部を示すフローチャートの例である。
【発明を実施するための形態】
【００１１】
以下、本発明の実施の形態について図面を参照して説明する。
〔第１の実施の形態〕
図１は、第１の実施の形態に係る情報処理装置の構成例および処理例を示す図である。図１に示す情報処理装置１は、処理部２ａ〜２ｃを有する。処理部２ａ〜２ｃは、例えば、マルチプロセッサシステムに含まれるプロセッサ、あるいはマルチコアプロセッサに含まれるプロセッサコアである。
【００１２】
処理部２ａ〜２ｃは、所定数のタスクを単位とした次のようなタスク分配処理を、それぞれ独立して実行する。例えば、処理部２ａは、処理部２ａ〜２ｃのそれぞれの処理能力を収集し、収集された処理能力の比率に応じた分配確率で、処理部２ａで発生した所定数のタスクを処理部２ａ〜２ｃに分配する。処理部２ｂ，２ｃでも、処理部２ｂ，２ｃでそれぞれ発生した所定数のタスクについて同様の処理が実行される。なお、収集される処理能力は、処理部での処理の余力であり、例えば、プロセッサやプロセッサコアの使用率（ビジー率）を１００％から減算した値として算出される。
【００１３】
このようなタスク分配処理では、タスク分配処理の開始時における処理部２ａ〜２ｃの処理能力の比率に基づいて、処理部２ａ〜２ｃでの処理負荷が平準化されるように所定数のタスクを分配することができる。ただし、個々の処理部によるタスク分配処理では、所定個数のタスクが発生する期間において、その期間の先頭で算出された１つの分配確率を用いて所定数のタスクが分配される。このため、ある処理部において所定数のタスクが発生する期間内で処理部２ａ〜２ｃの間の負荷バランスが変動したとしても、その期間が終了するまで新たな分配確率は計算されない。したがって、１つの処理部のみが上記手順のタスク分配処理を実行した場合、所定数のタスクが発生する期間内で処理部２ａ〜２ｃの間の負荷バランスが変動すると、負荷バランスの平準化精度が低下してしまう。
【００１４】
これに対して、本実施の形態では、図１に示すように、上記のような所定数のタスクについてのタスク分配処理が、処理部２ａ〜２ｃのそれぞれによって独立して実行される。また、処理部２ａ〜２ｃの間では、所定数のタスクごとのタスク分配処理の進行状況が異なる可能性が高い。例えば、ある処理部では、タスクを実行したとき、そのタスクの実行に伴って、分配の対象となる新たなタスクが生成される。この場合、実行されるタスクの処理内容によっては、タスクの実行に伴って所定数のタスクが生成され、それらが分配されるのに要する時間が変化する。このような時間の違いから、処理部２ａ〜２ｃの間において、所定数のタスクごとのタスク分配処理の進行状況が変わってくる。
【００１５】
その結果、ある処理部が分配確率を算出して所定数のタスクを分配する期間の途中で、別の処理部が分配確率を算出し直し、その分配確率に基づいて別の所定数のタスクを分配する、という状況が発生する。これにより、情報処理装置１の全体としては、分配確率が算出される頻度が高くなり、なおかつ、分配確率の算出タイミングが分散する。
【００１６】
図１の例では、処理部２ａは、所定数のタスクの分配処理（ステップＳ１）を実行し、その後、別の所定数のタスクの分配処理（ステップＳ２）を実行する。また、処理部２ｂは、処理部２ａによるステップＳ１のタスク分配処理が開始された後、別の所定数のタスクの分配処理（ステップＳ３）を実行し、その後、別の所定数のタスクの分配処理（ステップＳ４）を実行する。さらに、処理部２ｃは、処理部２ａによるステップＳ１のタスク分配処理が開始された後、別の所定数のタスクの分配処理（ステップＳ５）を実行し、その後、別の所定数のタスクの分配処理（ステップＳ６）を実行する。
【００１７】
この例では、処理部２ａが所定数のタスクの分配処理（ステップＳ１）を実行している期間において、処理部２ｃがステップＳ５の処理により処理部２ａ〜２ｃの処理能力を収集して分配確率を算出し直し、その分配確率に基づいて別の所定数のタスクを分配する。また、同期間においてステップＳ５の処理が開始された後、さらに処理部２ｂがステップＳ３の処理により処理部２ａ〜２ｃの処理能力を収集して分配確率を算出し直し、その分配確率に基づいて別の所定数のタスクを分配する。
【００１８】
その結果、処理部２ａが所定数のタスクの分配処理（ステップＳ１）を実行している期間において、他の処理部２ｂ，２ｃによってさらに複数回、処理部２ａ〜２ｃの処理能力が収集されて分配確率が再計算される。そして、それらの分配確率に基づいてタスク分配処理が実行される。したがって、処理部２ａ〜２ｃの処理能力の収集結果に基づく分配確率の算出頻度が高くなる。そして、このように高頻度で算出された分配確率に基づいてタスクの分配制御が実行されることで、処理部２ａ〜２ｃの間の負荷バランスの変動に対して高速に追随しながらタスクの分配先が適正化されていく。これにより、処理部２ａ〜２ｃの間での負荷分散の精度を向上させることができる。
【００１９】
〔第２の実施の形態〕
次に、図１に示した情報処理装置１の例としてストレージ制御装置が適用されたストレージシステムについて説明する。
【００２０】
図２は、第２の実施の形態に係るストレージシステムの構成例を示す図である。図２に示すように、第２の実施の形態に係るストレージシステムは、ホストサーバ５０と、ストレージ制御装置１００，２００と、ストレージ３００とを有する。なお、ストレージ制御装置１００，２００は、図１に示した情報処理装置１の一例である。
【００２１】
ホストサーバ５０は、例えば、業務処理などの各種の処理を実行するサーバコンピュータである。ストレージ制御装置１００，２００は、ホストサーバ５０から受け付けたＩ／Ｏ（Input／Output）要求を処理する。例えば、ホストサーバ５０からのアクセス対象となる１以上の論理ボリュームが、ストレージ３００の記憶領域を用いて作成される。ストレージ制御装置１００，２００は、ホストサーバ５０から論理ボリュームに対するＩ／Ｏ要求を受け付け、論理ボリュームに対するＩ／Ｏ処理を制御する。ストレージ制御装置１００，２００は、例えば、汎用のサーバコンピュータとして実現される。この場合、ストレージ制御装置１００，２００は、ストレージ制御用のアプリケーションプログラムを実行することで、ストレージ制御を実行する。ストレージ３００には、１台以上の不揮発性記憶装置が搭載されている。例えば、ストレージ３００には、不揮発性記憶装置としてＳＳＤ（Solid State Drive）が搭載されている。
【００２２】
なお、ホストサーバ５０とストレージ制御装置１００，２００とは、例えば、ＦＣ（Fibre Channel）やｉＳＣＳＩ（Internet Small Computer System Interface）などを利用して接続される。ストレージ制御装置１００，２００は、例えば、ＦＣ、ｉＳＣＳＩ、ＬＡＮ（Local Area Network）などを利用して接続される。ストレージ制御装置１００，２００が互いに接続されていることで、例えば、データの分散配置や、データの二重化（一方から他方へのデータコピー）などが実現可能になる。ストレージ制御装置１００，２００とストレージ３００とは、例えば、ＦＣ、ｉＳＣＳＩ、ＳＡＴＡ（Serial Advanced Technology Attachment）などを利用してそれぞれ接続される。
【００２３】
図３は、ストレージ制御装置のハードウェア構成例を示す図である。なお、図３ではストレージ制御装置１００のハードウェア構成について例示するが、ストレージ制御装置２００についてもストレージ制御装置１００と同様のハードウェア構成によって実現される。
【００２４】
ストレージ制御装置１００は、ＣＰＵ（Central Processing Unit）１０１、ＲＡＭ（Random Access Memory）１０２、ＳＳＤ１０３、読み取り装置１０４、ホストインタフェース（Ｉ／Ｆ）１０５、ドライブインタフェース（Ｉ／Ｆ）１０６および通信インタフェース（Ｉ／Ｆ）１０７を備える。
【００２５】
ＣＰＵ１０１は、ＲＡＭ１０２からプログラムを読み出して処理する処理装置である。ＣＰＵ１０１は、複数のコア（プロセッサコア）を備えるマルチコアＣＰＵである。
ＲＡＭ１０２は、ストレージ制御装置１００の主記憶装置として使用される。ＲＡＭ１０２には、ＣＰＵ１０１に実行させるＯＳ（Operating System）プログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、ＲＡＭ１０２には、ＣＰＵ１０１による処理に必要な各種データが格納される。
【００２６】
ＳＳＤ１０３は、ストレージ制御装置１００の補助記憶装置として使用される。ＳＳＤ１０３には、ＯＳプログラム、アプリケーションプログラムおよび各種データが格納される。なお、補助記憶装置としては、ＨＤＤ（Hard Disk Drive）などの他の種類の不揮発性記憶装置を使用することもできる。
【００２７】
読み取り装置１０４には、可搬型記録媒体１０４ａが脱着される。読み取り装置１０４は、可搬型記録媒体１０４ａに記録されたデータを読み取ってＣＰＵ１０１に送信する。可搬型記録媒体１０４ａとしては、光ディスク、光磁気ディスク、半導体メモリなどがある。
【００２８】
ホストインタフェース１０５は、ホストサーバ５０と通信するためのインタフェース装置である。ドライブインタフェース１０６は、ストレージ３００に含まれる不揮発性記憶装置と通信するためのインタフェース装置である。通信インタフェース１０７は、他方のストレージ制御装置２００と通信するためのインタフェース装置である。
【００２９】
図４は、ストレージ制御装置が備える処理機能の構成例を示すブロック図である。なお、図４ではストレージ制御装置１００の構成について例示するが、ストレージ制御装置２００もストレージ制御装置１００と同様の処理機能を備えている。
【００３０】
ストレージ制御装置１００は、Ｉ／Ｏ制御部１１０、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・および記憶部１３０を備える。Ｉ／Ｏ制御部１１０およびスケジューラ１２０＿１，１２０＿２，１２０＿３，・・・の処理は、例えば、ＣＰＵ１０１が所定のプログラムを実行することで実現される。記憶部１３０は、例えば、ＲＡＭ１０２の記憶領域によって実現される。
【００３１】
Ｉ／Ｏ制御部１１０は、ホストサーバ５０からのＩ／Ｏ要求に応じた論理ボリュームに対するＩ／Ｏ処理を制御する。Ｉ／Ｏ制御部１１０は、例えば、上位接続部１１１、キャッシュ管理部１１２、重複排除部１１３およびＩ／Ｏ処理部１１４を備える。
【００３２】
上位接続部１１１は、ホストサーバ５０からＩ／Ｏ要求（書き込み要求または読み出し要求）を受け付ける。キャッシュ管理部１１２は、上位接続部１１１が受け付けたＩ／Ｏ要求に応じたＩ／Ｏ処理を、ＲＡＭ１０２に確保されたキャッシュ領域を用いて制御する。重複排除部１１３は、Ｉ／Ｏ要求に応じてストレージ３００に格納されるデータの重複を排除するための制御を行う。Ｉ／Ｏ処理部１１４は、重複が排除されたデータをストレージ３００に書き込む。このとき、例えば、ＲＡＩＤ（Redundant Arrays of Inexpensive Disks）によって書き込みが制御される。また、Ｉ／Ｏ処理部１１４は、ストレージ３００からデータを読み出す。
【００３３】
スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・は、Ｉ／Ｏ制御部１１０の各部で発生するタスクの実行を制御する。Ｉ／Ｏ制御部１１０のタスクは、実体的にはスケジューラ１２０＿１，１２０＿２，１２０＿３，・・・によって実行される。スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・の処理は、それぞれＣＰＵ１０１が備える個別のコアによって実行される。また、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・は、タスクの実行によって新たなタスクが発生すると、ＣＰＵ１０１の各コアの間で処理負荷が分散されるように、新たなタスクをいずれかのコアに分配して実行させる。
【００３４】
記憶部１３０は、例えば、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・が各コアに対するタスクの分配制御を実行するために利用する各種のデータを記憶する。
次に、コアに対するタスク分配制御について説明する。なお、これ以後、例としてストレージ制御装置１００の処理について説明するが、ストレージ制御装置２００でも同様の処理が実行される。
【００３５】
マルチコアシステムの処理性能を高めるためには、コア間で処理負荷を分散させて、全コアの使用率（ＣＰＵビジー率）が一様に高まるようにすることが重要である。ストレージ制御装置１００は、Ｉ／Ｏ制御部１１０のＩ／Ｏ処理を細分化してタスクという単位に分解し、各コアがまんべんなくタスクを実行するようにタスクを分配することで、各コアの使用率を平準化する。これによって、Ｉ／Ｏ処理性能を向上させる。このようなコア間の負荷分散の方法としては、動的負荷分散と静的負荷分散とがある。ストレージ制御では、Ｉ／Ｏ要求を発するホストサーバ５０の処理状況を把握できないので、静的負荷分散を利用することは困難であり、動的負荷分散が利用される。
【００３６】
図５は、コアの処理能力の比率に応じたタスク分配制御について説明するための図である。本実施の形態では、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・のそれぞれが、各コアの処理能力を収集し、それらの処理能力の比率に応じた確率で各コアに対してタスクを分配する。ここでいう処理能力とは、コアの余力を示すものであり、例えば、コアの使用率（ビジー率）を１００％から減算して得られる。
【００３７】
例として、ストレージ制御装置１００のＣＰＵ１０１が５つのコアを備えるものとする。以下、コア番号Ｘのコアを「コア＃Ｘ」と記載する場合がある。図５の表６１に示すように、コア＃１，＃２，＃３，＃４，＃５の処理能力がそれぞれ８０％，４０％，４０％，２０％，２０％であったとする。このとき、合計が１になるように処理能力を正規化すると、正規化されたコア＃１，＃２，＃３，＃４，＃５の処理能力はそれぞれ０．４，０．２，０．２，０．１，０．１となる。負荷バランスを平準化するには処理能力（余力）が大きいコアほど多くのタスクを分配すればよいので、正規化されたこれらの値は、各コアに対するタスクの分配確率を示すことになる。
【００３８】
ここで、Ｋ個のタスクを分配する場合について考える。なお、Ｋは１以上の任意の整数である。表６２に示す出現回数は、Ｋ＝１０個のタスクの分配先として各コアがいくつ出現するかを示す数である。コアが出現する出現確率は、上記のタスクの分配確率と一致する。すなわち、１０個のタスクのうち、コア＃１，＃２，＃３，＃４，＃５が分配先となるタスクの数は、それぞれ４個、２個、２個、１個、１個となる。
【００３９】
図５に示す１０桁のコア番号列６３は、各コアのコア番号が表６２の出現回数分だけ含まれ、かつ、その順番がランダムシャッフルされた数列である。このコア番号列６３にしたがってタスクの分配先のコアが決定されることで、コア間の処理能力の比率に応じた確率で各コアに対してタスクが分配される。すなわち、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・のそれぞれは、各コアから収集した処理能力に基づいてコア番号列６３が示すようなコアの分配順を決定することで、コア間の負荷バランスをその変動に応じて最適化することができる。
【００４０】
各コア、すなわちスケジューラ１２０＿１，１２０＿２，１２０＿３，・・・のそれぞれは、自コアでのタスクの実行によって新たに生成されたＮ個のタスクを単位として、各コアの処理能力を収集し、処理能力に応じて各コアへの分配確率を更新する。そして、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・のそれぞれは、更新された分配確率に基づいてＮ個のタスクの分配先を決定する。
【００４１】
図６は、タスクの分配制御で利用される情報の例を示す図である。以下の説明では、ストレージ制御装置１００はＮ個のコア１０８＿１〜１０８＿Ｎを備えるものとする。コア１０８＿１〜１０８＿Ｎは、図１に示した処理部２ａ〜２ｃの一例である。また、以下の説明において、コア１０８＿１，１０８＿２，・・・，１０８＿Ｎは、それぞれコア＃１，＃２，・・・，＃Ｎと記載される場合もある。なお、Ｎは２以上の任意の整数である。
【００４２】
また、記憶部１３０には、コア１０８＿１〜１０８＿Ｎのそれぞれによって利用されるタスクプール、Ｎ桁（１行Ｎ列）の処理能力配列、Ｋ桁（１行Ｋ列）のコア選択配列が記憶される。例えば、タスクプール１３１＿１、処理能力配列１３２＿１およびコア選択配列１３３＿１は、コア１０８＿１によって利用される。タスクプール１３１＿２、処理能力配列１３２＿２およびコア選択配列１３３＿２は、コア１０８＿２によって利用される。タスクプール１３１＿Ｎ、処理能力配列１３２＿Ｎおよびコア選択配列１３３＿Ｎは、Ｎ番目のコア１０８＿Ｎによって利用される。
【００４３】
タスクプール１３１＿１〜１３１＿Ｎは、対応するコアに分配されたタスクが記憶されるＦＩＦＯ（First In／First Out）方式のキューである。コア（コアによって動作するスケジューラ）は、タスクプールから順にタスクを取得し、取得したタスクを実行する。
【００４４】
処理能力配列１３２＿１〜１３２＿Ｎのそれぞれは、コア１０８＿１〜１０８＿Ｎのそれぞれに対応する要素を備える数値列である。処理能力配列１３２＿１〜１３２＿Ｎのそれぞれに含まれる各要素には、対応するコアから収集された処理能力を示す数値が格納される。
【００４５】
コア選択配列１３３＿１〜１３３＿Ｎのそれぞれは、Ｋ個のタスクのそれぞれに対応する要素を備える数値列である。コア選択配列１３３＿１〜１３３＿Ｎのそれぞれに含まれる各要素には、対応するタスクの分配先のコアを示すコア番号が格納される。
【００４６】
なお、図６に示す行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａは、処理能力配列１３２＿１〜１３２＿Ｎのそれぞれを行として含むＮ行Ｎ列の行列である。以下の説明では、Ｎ行Ｎ列の行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａをＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［Ｎ，Ｎ］と記載する場合がある。
【００４７】
また、図６に示す行列ＰｅｅｒＳｅｌｅｃｔｏｒは、コア選択配列１３３＿１〜１３３＿Ｎのそれぞれを行として含むＮ行Ｋ列の行列である。以下の説明では、Ｎ行Ｋ列の行列ＰｅｅｒＳｅｌｅｃｔｏｒをＰｅｅｒＳｅｌｅｃｔｏｒ［Ｎ，Ｋ］と記載する場合がある。
【００４８】
記憶部１３０にはさらに、乱数テーブル１３４が記憶される。乱数テーブル１３４は、Ｍ行Ｋ列の行列Ｒａｎｄとして実現され、各行がＫ以下の乱数を含む。以下の説明では、Ｍ行Ｋ列の行列ＲａｎｄをＲａｎｄ［Ｍ，Ｋ］と記載する場合がある。乱数テーブル１３４（行列Ｒａｎｄ）は、コア１０８＿１，１０８＿２，・・・，１０８＿Ｎ（すなわち、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・）によって共用される。
【００４９】
以下、上記の各配列および乱数テーブル１３４を用いたタスクの分配制御について説明する。以下の図７〜図１２の説明では、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・のうち、ｉ番目のコア１０８＿ｉ（コア＃ｉ）において動作するスケジューラの処理について説明する。
【００５０】
図７は、配列の生成処理について説明するための図である。
スケジューラは、Ｎ個のタスクの分配が完了した後、次の新たなタスクが発生したタイミングで、コア＃１〜＃Ｎ（コア１０８＿１〜１０８＿Ｎ）のそれぞれから現時点での処理能力を収集する。スケジューラは、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］の各要素に対して、対応するコアから収集された処理能力の数値を格納する。ここで、角括弧内の＊は、数値を特定しないことを示す。ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］は、行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａにおけるｉ番目の行を示し、これはコア＃ｉがタスク分配制御のために利用する処理能力配列に相当する。
【００５１】
次に、スケジューラは、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］に基づいて、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］を生成する。なお、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］は、行列ＰｅｅｒＳｅｌｅｃｔｏｒにおけるｉ番目の行を示し、これはコア＃ｉがタスク分配制御のために利用するコア選択配列に相当する。
【００５２】
ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］には、コア＃１〜＃Ｎのそれぞれを示すコア番号が、処理能力の比率に基づく数だけ格納される。すなわち、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］に格納されるコア番号の個数は、Ｋ個のタスクのうち、そのコア番号が示すコアに対して分配されるタスクの数（Ｋ個のタスク当たりのタスク分配数）を示す。
【００５３】
スケジューラは、まず、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］の各要素の合計値νを、次の式（１）によって算出する。
【００５４】
【数１】
2020144737.tif 000003
【００５５】
次に、スケジューラは、図７に示すように、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］に格納する、ｊ番目のコア＃ｊのコア番号の個数（コア＃ｊに対するタスク分配数）を、Ｋ＊ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，ｌ］／νによって決定する。例えば、コア＃１に対するタスク分配数は、Ｋ＊ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，１］／νによって決定される。ただし、この式によればタスク分配数の計算結果に小数点以下の値が生じる場合がある。そこで、より具体的には、タスク分配数の個数は次のように決定される。
【００５６】
まず、次の式（２）によってｐjが算出される。
ｐj＝ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，ｊ］／ν      ・・・（２）
次に、式（２）に基づいて、コア＃１、＃２、＃３に対するタスク分配数Ｓ1，Ｓ2，Ｓ3が、それぞれ次の式（３−１），（３−２），（３−３）によって算出される。
Ｓ1＝Ｒｏｕｎｄ（Ｋ×ｐ1）      ・・・（３−１）
Ｓ2＝Ｒｏｕｎｄ（Ｋ×（ｐ1＋ｐ2））−Ｓ1      ・・・（３−２）
Ｓ3＝Ｒｏｕｎｄ（Ｋ×（ｐ1＋ｐ2＋ｐ3））−（Ｓ1＋Ｓ2）      ・・・（３−３）
式（２），（３−１），（３−２），（３−３）をまとめると、コア＃ｊに対するタスク分配数Ｓjは、次の式（４）によって算出される。なお、ＲＯＵＮＤ（Ｘ）は、Ｘの小数点以下を切り捨てた値を示す。
【００５７】
【数２】
2020144737.tif 000004
【００５８】
上記の式（４）によれば、コア番号の先頭から末尾まで１回ずつ計算するだけで、各コアに対するタスク分配数が決定される。また、式（２）に基づくタスク分配数と式（４）に基づくタスク分配数との間で小数点以下の切り捨てによる計算誤差が生じても、式（４）によるタスク分配数の総和がＫになることが保証される。
【００５９】
スケジューラは、以上の手順によってＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］が生成されると、次に、Ｋ個のタスクのそれぞれについてＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］における列番号をランダムに選択し、選択された列番号の要素として格納されたコア番号が示すコアを、タスクの分配先に決定する。このように、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］（コア選択配列）からコア番号をランダムに取得することで、図５に示したコア番号列６３に相当する数列が得られることになる。すなわち、Ｋ個のタスクの分配先が、各コアの処理能力の比率に応じた分配確率で決定される。
【００６０】
ここで、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］からの要素選択のランダム性が、タスク分配のランダム性に影響を与え、その結果としてコア間の負荷の平準化精度に影響を与える。ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］からの要素のランダムな選択方法としては、例えば、Ｋ以下の乱数を計算によって得る方法がある。すなわち、算出された乱数列に含まれる数値のそれぞれが、選択する要素を示す列番号として用いられる。しかし、この方法では、乱数の計算処理の負荷が問題となる。
【００６１】
タスクの分配制御のための処理負荷は、システムの処理性能、特にＩ／Ｏ処理性能に悪影響を与えてしまうため、軽量であることが望ましい。タスクの分配制御に含まれる処理のうち、上記のような乱数の算出処理は比較的高負荷の処理である。乱数の算出処理の実行頻度の増大は、Ｉ／Ｏ処理性能に与える影響が大きい。そのため、乱数の算出処理の実行頻度を低くすることが望ましいが、その一方で、生成される乱数には高いランダム性が要求される。
【００６２】
他の乱数生成方法としては、計算によらず、あらかじめ記憶された乱数テーブルを用いる方法が考えられる。この方法では、乱数生成のための計算負荷はかからないものの、ランダム性を高めるための工夫が必要になる。例えば、Ｋ個の要素（１行Ｋ列）の乱数列を複数用意し、Ｋ個のタスクごとに異なる乱数列を用いて乱数を取得する方法がある。しかし、この方法では、ランダム性を高めるためには乱数列の数を多くする必要があり、乱数列を保存するための記憶領域のサイズが大きくなる。また、乱数列を順番に選択するなど、一定の規則にしたがって乱数列を選択した場合、全体として乱数に規則性が生じ、ランダム性の観点では問題となる。
【００６３】
そこで、本実施の形態は、乱数計算と、複数（Ｍ行）の乱数列を有する乱数テーブル１３４（Ｒａｎｄ［Ｍ，Ｋ］）とを併用することで、計算負荷や乱数テーブル１３４の記憶領域の大きさを抑制しつつ、得られる乱数のランダム性を向上させる。具体的には、Ｋ個のタスクの分配制御を開始する際に、乱数計算によってＫ以下の値を有する数値がランダムに取得され、その数値によって乱数テーブル１３４から行が選択される。そして、選択された行の乱数列から数値が１つずつ選択されることで、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］における列番号が１つずつ選択されて、Ｋ個のタスクの分配先が決定される。
【００６４】
この方法によれば、Ｋ個のタスクを分配するために、乱数計算によってＫ以下の値を有する数値が１つだけ算出される。換言すると、Ｋ＊Ｋ個のタスクを分配するために、１行Ｋ列の乱数列の計算が１回だけ実行される。したがって、算出された乱数列に含まれる数値のそれぞれを、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］から選択する要素を示す列番号として用いる場合と比較して、乱数列の計算回数を減らすことができ、その結果、タスクの分配制御のための処理負荷を軽減できる。また、算出された乱数列を用いて、Ｍ行の乱数列の中から利用する乱数列が選択される。これにより、Ｍ行の乱数列の中から利用する乱数列を一定の規則にしたがって選択する場合と比較して、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］からの要素選択のランダム性を向上させることができる。
【００６５】
次に、ストレージ制御装置１００におけるタスク分配制御に関する処理を、フローチャートを用いて説明する。まず、乱数テーブル１３４（Ｒａｎｄ［Ｍ，Ｋ］）を事前に生成するための処理について、図８を用いて説明する。
【００６６】
図８は、乱数テーブルの生成処理を示すフローチャートの例である。図８の処理は、タスクの分配制御が開始される前に実行される。例えば、ストレージ制御装置１００が起動したとき、あるいはＩ／Ｏ制御部１１０が起動したときに、図８の処理が実行される。図８の処理が実行されることで、乱数テーブル１３４（Ｒａｎｄ［Ｍ，Ｋ］）が生成される。
【００６７】
なお、図８の処理は、スケジューラ１２０＿１，１２０＿２，１２０＿３，・・・のいずれかによって実行されればよい。ここでは例として、スケジューラ１２０＿１が図８の処理を実行するものとする。
【００６８】
［ステップＳ１１］スケジューラ１２０＿１は、変数ｉの値を１からＭまで１ずつ増加させながら、ステップＳ１６までの処理を繰り返し実行する。なお、変数ｉは、Ｒａｎｄ［Ｍ，Ｋ］における行番号を示す。
【００６９】
［ステップＳ１２］スケジューラ１２０＿１は、変数ｊの値を１からＫまで１ずつ増加させながら、ステップＳ１４までの処理を繰り返し実行する。なお、変数ｊは、Ｒａｎｄ［Ｍ，Ｋ］における列番号を示す。
【００７０】
［ステップＳ１３］スケジューラ１２０＿１は、Ｒａｎｄ［ｉ，ｊ］（乱数テーブル１３４におけるｉ行ｊ列の要素）にｊの値を設定する。
［ステップＳ１４］変数ｊがＫに達した場合、処理はステップＳ１５に進められる。この状態では、Ｒａｎｄ［ｉ，＊］（乱数テーブル１３４におけるｉ番目の行）には、１からＭまでの整数が順番に配列されている。
【００７１】
［ステップＳ１５］スケジューラ１２０＿１は、Ｒａｎｄ［ｉ，＊］の配列内の数値をランダムに並び替える。この並び替えは、例えば、Ｆｉｓｈｅｒ−Ｙａｔｅｓシャッフルアルゴリズムを用いて実行される。
【００７２】
［ステップＳ１６］変数ｉがＭに達した場合、処理が終了される。
図９は、タスク実行制御処理を示すフローチャートの例である。この図９の処理は、コア＃１〜＃Ｎ（コア１０８＿１〜１０８＿Ｎ）にそれぞれ対応するスケジューラ１２０＿１，１２０＿２，１２０＿３，・・・が、それぞれ独立して実行する。ここでは例として、ｉ番目のコア＃ｉ（コア１０８＿ｉ）に対応するスケジューラ１２０＿ｉの処理について説明する。
【００７３】
［ステップＳ２１］スケジューラ１２０＿ｉは、タスクプール１３１＿ｉにタスクが登録されているかを判定する。スケジューラ１２０＿ｉは、タスクが登録されている場合にはステップＳ２２の処理を実行し、タスクが登録されていない場合には一定時間後のステップＳ２１の処理を再度実行する。
【００７４】
［ステップＳ２２］スケジューラ１２０＿ｉは、タスクプール１３１＿ｉの先頭からタスクを１つ取り出す。
［ステップＳ２３］スケジューラ１２０＿ｉは、取り出したタスクを実行する。これにより、Ｉ／Ｏ制御部１１０の断片的な処理がコア＃ｉによって実行される。
【００７５】
［ステップＳ２４］スケジューラ１２０＿ｉは、ステップＳ２３でのタスクの実行により新たなタスクが発生した場合には、タスク分配制御を実行して、新たなタスクをコア＃１〜コア＃Ｎのいずれかに分配する。そして、タスク分配制御が完了すると、スケジューラ１２０＿ｉはステップＳ２１の処理を実行する。一方、新たなタスクが発生していない場合、スケジューラ１２０＿ｉはそのままステップＳ２１の処理を実行する。
【００７６】
図１０、図１１は、タスク分配制御処理を示すフローチャートの例である。この図１０の処理は、図９のステップＳ２４において新たなタスクが発生した場合、そのタスクを処理対象として実行される。
【００７７】
［ステップＳ３１］スケジューラ１２０＿ｉは、変数ｈがＫより大きいかを判定する。スケジューラ１２０＿ｉは、変数ｈがＫより大きい場合にはステップＳ３２の処理を実行し、変数ｈがＫ以下の場合には図１１のステップＳ４１の処理を実行する。なお、変数ｈの初期値はＫより大きい任意の整数である。
【００７８】
［ステップＳ３２］スケジューラ１２０＿ｉは、変数ｈを１に設定する。
［ステップＳ３３］スケジューラ１２０＿ｉは、変数ｊの値を１からＮまで１ずつ増加させながら、ステップＳ３６までの処理を繰り返し実行する。なお、変数ｊは、Ｒａｎｄ［Ｍ，Ｋ］における列番号を示す。
【００７９】
［ステップＳ３４］スケジューラ１２０＿ｉは、ｊ番目のコア＃ｊについての現在の処理能力を取得する。
［ステップＳ３５］スケジューラ１２０＿ｉは、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，ｊ］（行例ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａにおけるｉ行ｊ列の要素）に、ステップＳ３４で取得した処理能力の値を設定する。
【００８０】
［ステップＳ３６］変数ｊがＮに達した場合、処理はステップＳ３７に進められる。この場合、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］（行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａにおけるｉ番目の行）が更新された状態となる。
【００８１】
［ステップＳ３７］スケジューラ１２０＿ｉは、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］（行列ＰｅｅｒＳｅｌｅｃｔｏｒにおけるｉ番目の行）の生成処理を実行する。
［ステップＳ３８］スケジューラ１２０＿ｉは、乱数計算によりＭ以下の整数を算出し、この値を変数ｍに決定する。
【００８２】
以下、図１１を用いて説明を続ける。
［ステップＳ４１］スケジューラ１２０＿ｉは、Ｒａｎｄ［ｍ，ｈ］（乱数テーブル１３４におけるｍ行ｈ列の数値）を読み出し、変数ｃに読み出した値を設定する。
【００８３】
［ステップＳ４２］スケジューラ１２０＿ｉは、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，ｃ］（行列ＰｅｅｒＳｅｌｅｃｔｏｒにおけるｉ行ｃ列の数値）を読み出し、変数ｒに読み出した値を設定する。
【００８４】
［ステップＳ４３］スケジューラ１２０＿ｉは、ｒ番目のコア＃ｒに対応するタスクプール１３１＿ｒに、タスクを追加する。
［ステップＳ４４］スケジューラ１２０＿ｉは、変数ｈを１だけ増加させる。
【００８５】
図１２は、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］の生成処理を示すフローチャートの例を示す。この図１２の処理は、図１０のステップＳ３７で実行される処理である。
［ステップＳ５１］スケジューラ１２０＿ｉは、図１０のステップＳ３４にてコア＃１〜コア＃Ｎから取得した処理能力の合計値ν（ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］の各要素の合計値）を、前述の式（１）によって算出する。
【００８６】
［ステップＳ５２］スケジューラ１２０＿ｉは、変数ｓ＿ｓｕｍ，ｐ＿ｓｕｍをともに０にリセットする。
［ステップＳ５３］スケジューラ１２０＿ｉは、変数ｊの値を１からＮまで１ずつ増加させながら、ステップＳ６０までの処理を繰り返し実行する。なお、変数ｊは、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，＊］における列番号を示す。
【００８７】
［ステップＳ５４］スケジューラ１２０＿ｉは、変数ｐ＿ｓｕｍに、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ［ｉ，ｊ］（行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａのｉ行ｊ列の値）の値を加算して、変数ｐ＿ｓｕｍを更新する。
【００８８】
［ステップＳ５５］スケジューラ１２０＿ｉは、変数ｘを次の式（５）によって算出する。この変数ｘは、ｊ番目のコア＃ｊに対するタスク分配数を示す。
ｘ＝ＲＯＵＮＤ（ｐ＿ｓｕｍ＊Ｋ／ν）−ｓ＿ｓｕｍ      ・・・（５）
［ステップＳ５６］スケジューラ１２０＿ｉは、変数ｙの値を１からｘまで１ずつ増加させながら、ステップＳ５９までの処理を繰り返し実行する。なお、変数ｙは、ループの実行回数を制御するために用いられる。
【００８９】
［ステップＳ５７］スケジューラ１２０＿ｉは、変数ｓ＿ｓｕｍに１を加算して、変数ｓ＿ｓｕｍを更新する。
［ステップＳ５８］スケジューラ１２０＿ｉは、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，ｓ＿ｓｕｍ］（行列ＰｅｅｒＳｅｌｅｃｔｏｒにおけるｉ行ｓ＿ｓｕｍ列の要素）に、変数ｊを設定する。
【００９０】
［ステップＳ５９］変数ｙがｘに達した場合、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］に対してコア番号ｊをｘ個設定する処理が完了し、処理がステップＳ６０に進められる。
［ステップＳ６０］変数ｊがＮに達した場合、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］の全要素に対するコア番号の設定処理が完了し、図１２の処理が終了される。
【００９１】
以上の図８〜図１２の処理によれば、Ｋ個のタスクのうち先頭のタスクが発生したとき、その時点でのコア＃１〜コア＃Ｎの処理能力が収集される。そして、タスクの分配先となるコア＃１〜＃Ｎの各コア番号が、収集された処理能力の比率に基づく個数だけＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］に設定される。さらに、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］に設定されたコア番号がランダムに選択されることで、選択されたコア番号が示すコアがタスクの分配先に決定される。このような処理により、Ｋ個のタスクをコア＃１〜＃Ｎの処理能力の比率に応じた分配確率でコア＃１〜コア＃Ｎに対して分配できる。
【００９２】
また、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］に設定されたコア番号をランダムに選択する際に、乱数計算と乱数テーブル１３４とを併用して選択処理が行われる。この処理では、Ｋ個のタスクを分配するために、乱数計算によって乱数テーブル１３４の行数（Ｍ）以下のランダムな数値の計算が１回行われ、乱数テーブル１３４の中から算出された数値の行の乱数列が選択され、選択された乱数列を用いてコア番号がランダムに選択される。これにより、乱数計算の処理負荷を軽減して、その処理負荷がＩ／Ｏ制御部１１０によるストレージ制御性能に与える影響を軽減でき、その結果として、Ｉ／Ｏ制御部１１０によるストレージ制御性能を向上させることができる。さらに、このように乱数計算の処理負荷を軽減しつつ、コア番号の選択のランダム性を向上させることができるので、コア＃１〜＃Ｎにおける負荷分散の精度を高めることができる。
【００９３】
また、以上のようなＫ個のタスクごとの分配制御が、コア＃１〜コア＃Ｎのそれぞれにおいて独立して実行される。その結果、次の図１３に示すように、コア＃１〜コア＃Ｎにおける負荷バランスが変動した場合でも、高精度の負荷分散を実現できる。
【００９４】
図１３は、各コアでタスク分配制御が実行される様子を模式的に示した図である。上記のように、コア＃１〜コア＃Ｎのそれぞれにおいて実行されるＫ個のタスクの分配制御は、コア＃１〜コア＃Ｎの処理能力を収集してＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］を生成する処理と、ＰｅｅｒＳｅｌｅｃｔｏｒ［ｉ，＊］を用いてＫ個のタスクを分配する処理とを含む。これらのうち前者の処理は、収集された処理能力に基づいてコア＃１〜＃Ｎのそれぞれに対するタスクの分配確率を計算することに相当する。
【００９５】
このように、Ｋ個のタスクの分配制御は、Ｋ個のタスクが発生する期間の先頭において収集された処理能力に基づく分配確率で実行される。すなわち、Ｋ個のタスクが発生する期間では、その期間の先頭で算出された１つの分配確率を用いて分配制御が行われる。このため、Ｋ個のタスクが発生する期間内でコア間の負荷バランスが変動したとしても、その期間が終了するまで新たな分配確率の計算は行われない。したがって、例えばコア＃１〜＃Ｎのうちの１つだけが上記手順でコア間の負荷バランスを平準化する場合、Ｋ個のタスクが発生する期間内でコア間の負荷バランスが変動すると、負荷バランスの平準化精度が低下してしまう。
【００９６】
これに対して、本実施の形態では、図１３に示すように、上記のようなＫ個のタスクの分配制御が、コア＃１〜コア＃Ｎのそれぞれにおいて独立して実行される。ここで、Ｋ個のタスクのうち２番目以降のタスクは、コアプールから取得されたタスクの実行に伴って新たに生成されるので、Ｋ個のタスクの分配制御にかかる時間は、コアプールから取得されたタスクの処理内容によって異なる。このため、Ｋ個のタスクの分配制御の進行状況は、コア＃１〜＃Ｎのそれぞれにおいて異なる。その結果、コア＃１〜＃Ｎのそれぞれがコア＃１〜＃Ｎから処理能力を収集して分配確率を算出するタイミングが分散する。
【００９７】
結果的に、あるコアが分配確率を算出してＫ個のタスクを分配する期間の途中で、別のコアが分配確率を算出し直し、その分配確率に基づいて別のＫ個のタスクを分配する。例えば図１３において、コア＃１がＫ個のタスクの分配制御Ｐ１１を開始した後、この分配制御Ｐ１１の実行期間において、コア＃３がＫ個のタスクの分配制御Ｐ１２を開始し、さらにコア＃２がＫ個のタスクの分配制御Ｐ１３を開始している。そのため、分配制御Ｐ１１の開始時において分配確率の計算処理Ｐ１１ａが実行された後、分配制御Ｐ１１の実行期間においてさらに、分配確率の計算処理Ｐ１２ａ，Ｐ１３ａが実行される。
【００９８】
このように、Ｋ個のタスクの分配制御がコア＃１〜コア＃Ｎのそれぞれにおいて独立して実行されることで、処理能力の収集結果に基づく分配確率の算出頻度が高まる。そして、このように高頻度で算出された分配確率に基づいてタスクの分配制御が実行されることで、コア間の負荷バランスの変動に対して高速に追随しながらタスクの分配先が適正化されていく。したがって、負荷分散の精度を向上させることができる。
【００９９】
次に、第２の実施の形態における処理の一部を変形した変形例について説明する。最初に、乱数テーブル１３４を用いたＭ以下のランダムな数値の生成方法に関する変形例１，２について説明する。
【０１００】
＜変形例１＞
第２の実施の形態では、図１０のステップＳ３８において乱数計算によってＭ以下のランダムな変数ｍが生成されていた。そして、図１１のステップＳ４１〜Ｓ４３において、乱数テーブル１３４の中から第ｍ行の乱数列が選択され、選択された乱数列の先頭から１つずつ数値が読み込まれることで、タスクの分配先が決定されていた。これに対して、変形例１では、乱数計算によってＫ以下のランダムな変数ｎがさらに生成される。そして、乱数テーブル１３４の中から第ｍ行の乱数列が選択され、選択された乱数列のうち第ｎ列の数値を先頭として乱数列から数値が巡回的に読み込まれることで、タスクの分配先が決定される。
【０１０１】
図１４は、変形例１におけるタスク分配制御処理を示すフローチャートの例である。この図１４では、図１０、図１１と同じ内容の処理には同じステップ番号を付して示し、その説明を省略する。
【０１０２】
図１４の処理では、図１０のステップＳ３８における変数ｍの決定後に、ステップＳ３８ａの処理が実行される。ステップＳ３８ａにおいて、スケジューラ１２０＿ｉは、乱数計算によりＫ以下の整数を算出し、この値を変数ｎに決定する。なお、ステップＳ３８ａは、ステップＳ３８の前に実行されてもよい。
【０１０３】
さらに、図１１のステップＳ４１，Ｓ４４の代わりにステップＳ４１ａ，Ｓ４４ａがそれぞれ実行される。ステップＳ４１ａにおいて、スケジューラ１２０＿ｉは、Ｒａｎｄ［ｍ，ｎ］（乱数テーブル１３４におけるｍ行ｎ列の数値）を読み出し、変数ｃに読み出した値を設定する。また、ステップＳ４４ａにおいて、スケジューラ１２０＿ｉは、変数ｈを１だけ増加させるとともに、変数ｎも１だけ増加させる。
【０１０４】
このような処理によれば、Ｋ個のタスクの分配制御のために仮に乱数テーブル１３４から同じ乱数列が選択されたとしても、ランダムな変数ｎが用いられることで異なる乱数列が生成される。このため、第２の実施の形態と比較して、タスク分配先のコアを選択する際のランダム性を向上させることができる。また、第２の実施の形態と比較して乱数テーブル１３４の行数Ｍを減らした場合でも、第２の実施の形態と同程度のランダム性を得ることができ、この場合には乱数テーブル１３４の記憶容量を削減できる。
【０１０５】
＜変形例２＞
変形例２では、Ｍ以下のランダムな数値として、１つの変数ｍでなく、２つの変数ｍ１，ｍ２が乱数計算によって生成される。そして、乱数テーブル１３４の中から第ｍ１行の乱数列が選択された後、その乱数列から数値を読み込む際の先頭の列数が、第ｍ２行の乱数列を用いて決定される。
【０１０６】
図１５は、変形例２におけるタスク分配制御処理を示すフローチャートの例である。この図１５では、図１０、図１１と同じ内容の処理には同じステップ番号を付して示し、その説明を省略する。
【０１０７】
図１５の処理では、図１０のステップＳ３８の代わりにステップＳ３８ａ１，Ｓ３８ｂ１が実行される。さらに、図１１のステップＳ４１の代わりにステップＳ４１ａ１が実行される。
【０１０８】
ステップＳ３８ａ１において、スケジューラ１２０＿ｉは、乱数計算によりＭ以下の整数を算出し、この値を変数ｍ１に決定する。ステップＳ３８ａ２において、スケジューラ１２０＿ｉは、乱数計算によりＭ以下の整数を算出し、この値を変数ｍ２に決定する。そして、ステップＳ４１ａ１において、スケジューラ１２０＿ｉは、Ｒａｎｄ［ｍ１，Ｒａｎｄ［ｍ２，ｈ］］を読み出し、変数ｃに読み出した値を設定する。このステップＳ４１ａ１では、乱数テーブル１３４の中から第ｍ１行の乱数列が選択される。また、選択された乱数列における列数として、乱数テーブル１３４におけるｍ２行ｈ列の数値が読み出される。
【０１０９】
このような処理によれば、Ｋ個のタスクの分配制御のために仮に乱数テーブル１３４から同じ乱数列が利用されたとしても、乱数列から巡回的に数値を選択する際の先頭の列数が他の乱数列に基づいて決定される。このため、第２の実施の形態およびその変形例１と比較して、タスク分配先のコアを選択する際のランダム性を向上させることができる。また、第２の実施の形態および変形例１と比較して乱数テーブル１３４の行数Ｍを減らした場合でも、ランダム性を低下させずに乱数テーブル１３４の記憶容量を削減できる。
【０１１０】
なお、第２の実施の形態および変形例１，２は、乱数計算によってＭ以下のランダムな数値が算出され、算出された数値の行の乱数列が乱数テーブル１３４から選択されてタスク分配制御に利用される点では共通している。これらの処理には、Ｋの大きさが変化しても乱数の計算量は変化しないという特徴がある。また、Ｍが大きいほどタスク分配のランダム性は高まるが、乱数テーブル１３４全体の容量を一定とした場合、Ｍが小さいほどＫが大きくなることから、Ｍ，Ｋによらずほぼ一定のランダム性が得られる、という特徴もある。
【０１１１】
さらに、ＭをＫの階乗の値とすることで、列方向の数列と行方向の数列のそれぞれにおけるランダム性が等価になるので、結果的に全体のランダム性を向上させることができる。この場合、変形例１では、乱数テーブル１３４の行数をＫ倍に拡大したことと等価であり、変形例２では、さらに列数をＭ倍に拡大したことと等価である。
【０１１２】
なお、変形例１では、変数ｍを計算せず、変数ｎのみを計算してもよい。この場合、乱数テーブル１３４の行数Ｍを１行のみとすることができる。この場合、１行の乱数列の先頭から１つずつ数値を選択する場合と比較して、選択される数値のランダム性を高めることができる。
【０１１３】
＜変形例３＞
ストレージ制御のための処理（Ｉ／Ｏ制御部１１０の処理）には、例えば、即時の応答性能が求められる処理や、複数のコアを同時に使用した並列処理が必要な処理、無限ループなどの処理の異常の影響を限定したい処理がある。こういった処理は、他の種別の処理とは別の専用のコアを用いて実行されることが望ましい。
【０１１４】
そこで、変形例３では、処理の種別ごとに処理の実行機能を定義する。例えば、特定の種別の処理をそれぞれ実行する専用機能と、これらの特定の種別以外の種別の処理を汎用的に実行する汎用機能とを定義する。そして、ＣＰＵ１０１が備えるコアを、専用機能をそれぞれ実現するための１以上のコア集合と、汎用機能をそれぞれ実現するための１以上のコア集合とに分類する。
【０１１５】
変形例３では、コア集合ごとに上記のようなＫ個のタスクの分配制御が実行される。また、あるコア集合に属するコアにおいて他のコア集合で実行されるタスクが生成された場合、そのタスクは他のコア集合に属するコアに分配される。このとき、他のコア集合においてコア間の負荷が分散されるように、他のコア集合に対する上記のようなＫ個のタスクの分配制御が行われる。
【０１１６】
図１６は、機能別コアおよび使用される行列の構成例を示す図である。図１６では例として、ＣＰＵ１０１に含まれるコアはコア集合＃１，＃２，＃３に分類されている。コア集合＃１は、機能Ｆ１を実現するコアの集合である。コア集合＃２は、機能Ｆ２を実現するコアの集合である。コア集合＃３は、機能Ｆ３を実現するコアの集合である。機能Ｆ２は、特定の第１の種別の処理を実行する専用機能である。機能Ｆ３は、特定の第２の種別の処理を実行する別の専用機能である。機能Ｆ１は、第１、第２の種別以外の他の種別の処理を汎用的に実行する汎用機能である。また、コア集合＃１には、Ｎ１個のコア＃Ｃ１1〜＃Ｃ１N1が含まれる。コア集合＃２には、Ｎ２個のコア＃Ｃ２1〜＃Ｃ２N2が含まれる。コア集合＃３には、Ｎ３個のコア＃Ｃ３1〜＃Ｃ３N3が含まれる。
【０１１７】
コア集合＃１に属するコアは、機能Ｆ１に対応する種別のＫ個のタスクについては、コア集合＃１内のコア＃Ｃ１1〜＃Ｃ１N1の間で負荷バランスが平準化されるように、上記のタスク分配制御を行ってコア＃Ｃ１1〜＃Ｃ１N1にタスクを分配する。その分配制御のために、コア＃Ｃ１1〜＃Ｃ１N1は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［Ｎ１，Ｎ１］とＰｅｅｒＳｅｌｅｃｔｏｒ１１［Ｎ１，Ｋ］を用いる。例えば、コア集合＃１に属するｉ番目のコアは、機能Ｆ１に対応する種別のＫ個のタスクを分配する際、コア＃Ｃ１1〜＃Ｃ１N1から処理性能を収集してＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［ｉ，＊］を生成する。さらに、ｉ番目のコアは、生成されたＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［ｉ，＊］に基づいてＰｅｅｒＳｅｌｅｃｔｏｒ１１［ｉ，＊］を生成し、生成されたＰｅｅｒＳｅｌｅｃｔｏｒ１１［ｉ，＊］を用いてコア＃Ｃ１1〜＃Ｃ１N1にタスクを分配する。
【０１１８】
また、コア集合＃１に属するコアは、機能Ｆ２に対応する種別のＫ個のタスクについては、コア集合＃２内のコア＃Ｃ２1〜＃Ｃ２N2の間で負荷バランスが平準化されるように、上記のタスク分配制御を行ってコア＃Ｃ２1〜＃Ｃ２N2にタスクを分配する。その分配制御のために、コア＃Ｃ１1〜＃Ｃ１N1は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１２［Ｎ２，Ｎ２］とＰｅｅｒＳｅｌｅｃｔｏｒ１２［Ｎ２，Ｋ］を用いる。例えば、コア集合＃１に属するｉ番目のコアは、機能Ｆ２に対応する種別のＫ個のタスクを分配する際、コア＃Ｃ２1〜＃Ｃ２N2から処理性能を収集してＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１２［ｉ，＊］を生成する。さらに、ｉ番目のコアは、生成されたＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１２［ｉ，＊］に基づいてＰｅｅｒＳｅｌｅｃｔｏｒ１２［ｉ，＊］を生成し、生成されたＰｅｅｒＳｅｌｅｃｔｏｒ１２［ｉ，＊］を用いてコア＃Ｃ２1〜＃Ｃ２N2にタスクを分配する。
【０１１９】
さらに、コア集合＃１に属するコアは、機能Ｆ３に対応する種別のＫ個のタスクについては、コア集合＃３内のコア＃Ｃ３1〜＃Ｃ３N3の間で負荷バランスが平準化されるように、上記のタスク分配制御を行ってコア＃Ｃ３1〜＃Ｃ３N3にタスクを分配する。その分配制御のために、コア＃Ｃ１1〜＃Ｃ１N1は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１３［Ｎ３，Ｎ３］とＰｅｅｒＳｅｌｅｃｔｏｒ１３［Ｎ３，Ｋ］を用いる。例えば、コア集合＃１に属するｉ番目のコアは、機能Ｆ３に対応する種別のＫ個のタスクを分配する際、コア＃Ｃ３1〜＃Ｃ３N3から処理性能を収集してＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１３［ｉ，＊］を生成する。さらに、ｉ番目のコアは、生成されたＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１３［ｉ，＊］に基づいてＰｅｅｒＳｅｌｅｃｔｏｒ１３［ｉ，＊］を生成し、生成されたＰｅｅｒＳｅｌｅｃｔｏｒ１３［ｉ，＊］を用いてコア＃Ｃ３1〜＃Ｃ３N3にタスクを分配する。
【０１２０】
コア集合＃２，＃３にそれぞれ属するコアにおいても、同様の処理が行われる。例えば、コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ２１［Ｎ１，Ｎ１］とＰｅｅｒＳｅｌｅｃｔｏｒ２１［Ｎ１，Ｋ］を用いて、機能Ｆ１に対応する種別のＫ個のタスクをコア＃Ｃ１1〜＃Ｃ１N1に分配する。コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ２２［Ｎ２，Ｎ２］とＰｅｅｒＳｅｌｅｃｔｏｒ２２［Ｎ２，Ｋ］を用いて、機能Ｆ２に対応する種別のＫ個のタスクをコア＃Ｃ２1〜＃Ｃ２N2に分配する。コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ２３［Ｎ３，Ｎ３］とＰｅｅｒＳｅｌｅｃｔｏｒ２３［Ｎ３，Ｋ］を用いて、機能Ｆ３に対応する種別のＫ個のタスクをコア＃Ｃ３1〜＃Ｃ３N3に分配する。
【０１２１】
また、コア集合＃３に属するコア＃Ｃ３1〜＃Ｃ３N3は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ３１［Ｎ１，Ｎ１］とＰｅｅｒＳｅｌｅｃｔｏｒ３１［Ｎ１，Ｋ］を用いて、機能Ｆ１に対応する種別のＫ個のタスクをコア＃Ｃ１1〜＃Ｃ１N1に分配する。コア集合＃３に属するコア＃Ｃ３1〜＃Ｃ３N3は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ３２［Ｎ２，Ｎ２］とＰｅｅｒＳｅｌｅｃｔｏｒ３２［Ｎ２，Ｋ］を用いて、機能Ｆ２に対応する種別のＫ個のタスクをコア＃Ｃ２1〜＃Ｃ２N2に分配する。コア集合＃３に属するコア＃Ｃ３1〜＃Ｃ３N3は、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ３３［Ｎ３，Ｎ３］とＰｅｅｒＳｅｌｅｃｔｏｒ３３［Ｎ３，Ｋ］を用いて、機能Ｆ３に対応する種別のＫ個のタスクをコア＃Ｃ３1〜＃Ｃ３N3に分配する。
【０１２２】
図１７は、変形例３におけるタスク分配制御処理を示すフローチャートの例である。図１７の処理は、図１０、図１１の処理の代わりに実行される。ここでは例として、コア集合＃１に属するｉ番目のコアに対応するスケジューラの処理について説明する。
【０１２３】
［ステップＳ７１］スケジューラは、新たに発生したタスクの種別を判定する。なお、例えば、発生したタスクの情報には、タスクの種別を示す情報が付加されている。スケジューラは、タスクの種別が機能Ｆ１に対応する場合、ステップＳ７２の処理を実行し、機能Ｆ２に対応する場合、ステップＳ７３の処理を実行し、機能Ｆ３に対応する場合、ステップＳ７４の処理を実行する。
【０１２４】
［ステップＳ７２］スケジューラは、図１０、図１１と同様の手順で、コア集合＃１に属するコア＃Ｃ１1〜＃Ｃ１N1に対するタスクの分配制御を実行する。このとき、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［ｉ，＊］とＰｅｅｒＳｅｌｅｃｔｏｒ１１［ｉ，＊］が用いられる。タスクの分配制御では、スケジューラは、コア＃Ｃ１1〜＃Ｃ１N1から処理性能を収集してＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［ｉ，＊］を生成する。そして、スケジューラは、生成されたＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［ｉ，＊］に基づいてＰｅｅｒＳｅｌｅｃｔｏｒ１１［ｉ，＊］を生成し、生成されたＰｅｅｒＳｅｌｅｃｔｏｒ１１［ｉ，＊］を用いてコア＃Ｃ１1〜＃Ｃ１N1にタスクを分配する。
【０１２５】
［ステップＳ７３］スケジューラは、図１０、図１１と同様の手順で、コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2に対するタスクの分配制御を実行する。このとき、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１２［ｉ，＊］とＰｅｅｒＳｅｌｅｃｔｏｒ１２［ｉ，＊］が用いられる。タスクの分配制御では、スケジューラは、コア＃Ｃ２1〜＃Ｃ２N2から処理性能を収集してＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１２［ｉ，＊］を生成する。そして、スケジューラは、生成されたＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１２［ｉ，＊］に基づいてＰｅｅｒＳｅｌｅｃｔｏｒ１２［ｉ，＊］を生成し、生成されたＰｅｅｒＳｅｌｅｃｔｏｒ１２［ｉ，＊］を用いてコア＃Ｃ２1〜＃Ｃ２N2にタスクを分配する。
【０１２６】
［ステップＳ７４］スケジューラは、図１０、図１１と同様の手順で、コア集合＃３に属するコア＃Ｃ３1〜＃Ｃ３N3に対するタスクの分配制御を実行する。このとき、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１３［ｉ，＊］とＰｅｅｒＳｅｌｅｃｔｏｒ１３［ｉ，＊］が用いられる。タスクの分配制御では、スケジューラは、コア＃Ｃ３1〜＃Ｃ３N3から処理性能を収集してＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１３［ｉ，＊］を生成する。そして、スケジューラは、生成されたＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１３［ｉ，＊］に基づいてＰｅｅｒＳｅｌｅｃｔｏｒ１３［ｉ，＊］を生成し、生成されたＰｅｅｒＳｅｌｅｃｔｏｒ１３［ｉ，＊］を用いてコア＃Ｃ３1〜＃Ｃ３N3にタスクを分配する。
【０１２７】
以上の変形例３によれば、機能別に割り当てられたコア集合を単位として、コア集合内のコア間で高精度に負荷が分散するようにタスクの分配が行うことができる。その結果、各コア集合による処理効率が高まり、その結果としてＩ／Ｏ制御部１１０の処理全体の性能を向上させることができる。
【０１２８】
なお、専用機能に対応するストレージ制御上の処理としては、例えば次のような処理がある。
ストレージ制御装置１００では、Ｉ／Ｏ処理対象のデータが一定長のデータユニットに分割されて取り扱われる。このデータユニットは、重複排除の単位にもなる。Ｉ／Ｏ制御部１１０のＩ／Ｏ処理部１１４は、重複排除されたデータユニットをストレージ３００に書き込む前に、データユニットをストレージ制御装置１００内の一定サイズのバッファに一時的に追記して蓄積する。そして、Ｉ／Ｏ処理部１１４は、バッファに複数のデータユニットが蓄積されてそれ以上データユニットを追記できない状態になると、バッファ内の複数のデータユニットをまとめてストレージ３００に書き込む。このようなログ構造化データを用いて書き込みが制御されることで、ストレージ３００に対する書き込み回数を削減できる。例えば、ストレージ３００の記憶装置としてＳＳＤが用いられた場合、ＳＳＤへの書き込み回数を削減することで、ＳＳＤに含まれるフラッシュメモリの寿命を延ばすことができる。
【０１２９】
また、このような書き込み制御においては、ストレージ３００に格納されたデータのうち無効になったデータについては、ガベージコレクションによって無効化し、それらのデータが格納された領域を再利用できるようにしている。このガベージコレクションの処理では、無効化データの領域の解放を、新たな書き込みデータの発生速度より高速で実行できないと、ある時点でＩ／Ｏ処理の実行を待たせなくてはならなくなったり、Ｉ／Ｏリクエストを拒絶しなければならなくなる。このため、ガベージコレクションに対応するタスクについては実行の優先度を上げることが望ましい。そこで、上記の専用機能に対応する処理としてガベージコレクションの処理を適用することで、ガベージコレクションを、他の機能の処理負荷に影響されずに、専用のコア集合を用いて一定の速度を維持しながら安定的に実行できるようになる。
【０１３０】
＜変形例４＞
上記の変形例３では、専用機能を実現するコア集合と汎用機能を実現するコア集合のどちらにおいても、コア集合に含まれる各コアの処理能力に基づいてコア間の負荷が平準化されるようにコアの分配制御が行われた。しかし、専用機能を実現するコア集合では、単純にコア間でタスクが均等に分配されてもよい。これにより、コア集合におけるタスク分配制御のための処理負荷を軽減し、専用機能のためのタスクの実行性能を高めることができる。また、専用機能のためのタスクは特定の種別に属するため、各タスクの処理内容が近いものが多く、コア間での負荷バランスが均衡しやすい。このため、コア間でタスクを均等に分配しても、コア間の負荷バランスが大きく崩れる可能性は低い。
【０１３１】
図１８は、変形例４における機能別コアおよび使用される配列の構成例を示す図である。図１８の例では、図１６と同様に、ＣＰＵ１０１のコアは、機能Ｆ１に割り当てられたコア集合＃１と、機能Ｆ２に割り当てられたコア集合＃２と、機能Ｆ３に割り当てられたコア集合＃３とに分類されている。
【０１３２】
機能Ｆ１に対応するタスクは、変形例３と同様に、コア集合＃１内のコア＃Ｃ１1〜＃Ｃ１N1の間で負荷バランスが平準化されるように、コア＃Ｃ１1〜＃Ｃ１N1の間で分配される。したがって、コア集合＃１に属するコアは、機能Ｆ１に対応する種別のＫ個のタスクについて、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ１１［Ｎ１，Ｎ１］とＰｅｅｒＳｅｌｅｃｔｏｒ１１［Ｎ１，Ｋ］を用いて、コア＃Ｃ１1〜＃Ｃ１N1にタスクを分配する。また、コア集合＃２に属するコアは、機能Ｆ１に対応する種別のＫ個のタスクについて、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ２１［Ｎ１，Ｎ１］とＰｅｅｒＳｅｌｅｃｔｏｒ２１［Ｎ１，Ｋ］を用いて、コア＃Ｃ１1〜＃Ｃ１N1にタスクを分配する。さらに、コア集合＃３に属するコアは、機能Ｆ１に対応する種別のＫ個のタスクについて、ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａ３１［Ｎ１，Ｎ１］とＰｅｅｒＳｅｌｅｃｔｏｒ３１［Ｎ１，Ｋ］を用いて、コア＃Ｃ１1〜＃Ｃ１N1にタスクを分配する。
【０１３３】
一方、機能Ｆ２に対応するタスクは、コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2に対して均等の確率で分配される。このような分配制御のために、Ｎ２個の要素を有するコア選択配列（１行Ｎ２列の配列）であるＣｏｒｅＳｅｔ１２［Ｎ２］が、コア集合＃１〜＃３の間で共通に使用される。行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａは使用されない。
【０１３４】
また、機能Ｆ３に対応するタスクは、コア集合＃３に属するコア＃Ｃ３1〜＃Ｃ３N3に対して均等の確率で分配される。このような分配制御のために、Ｎ３個の要素を有するコア選択配列（１行Ｎ３列の配列）であるＣｏｒｅＳｅｔ１３［Ｎ３］が、コア集合＃１〜＃３の間で共通に使用される。行列ＰｅｅｒＰｒｏｃｅｓｓｉｎｇＣａｐａは使用されない。
【０１３５】
図１９は、均等分配用のコア選択配列の例を示す図である。機能Ｆ２に対応するタスクを均等分配するために利用されるＣｏｒｅＳｅｔ１２［Ｎ２］には、コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2の各コア番号が順に１つずつ配置される。また、機能Ｆ３に対応するタスクを均等分配するために利用されるＣｏｒｅＳｅｔ１３［Ｎ３］には、コア集合＃３に属するコア＃Ｃ３1〜＃Ｃ３N3の各コア番号が順に１つずつ配置される。これらのＣｏｒｅＳｅｔ１２［Ｎ２］およびＣｏｒｅＳｅｔ１３［Ｎ３］は、あらかじめ生成されて記憶部１３０に格納されていればよい。
【０１３６】
図２０は、変形例４におけるタスク分配制御処理の一部を示すフローチャートの例である。変形例４では、図１７に示したステップＳ７３の代わりに図２０の処理が実行される。
【０１３７】
［ステップＳ８１］スケジューラは、乱数計算によりＮ２以下の整数を算出し、この値を変数ｃ１に決定する。
［ステップＳ８２］スケジューラは、ＣｏｒｅＳｅｔ１２［ｃ１］（ＣｏｒｅＳｅｔ１２における第ｃ１列の数値）を読み出し、変数ｒ１に読み出した値を設定する。
【０１３８】
［ステップＳ８３］スケジューラは、コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2のうちコア番号＃ｒ１のコア＃Ｃ２r1に対応するタスクプールに、タスクを追加する。
なお、変形例４ではさらに、図１８に示したステップＳ４７の代わりに、図２０の処理を機能Ｆ３について適用した処理が実行される。この処理では、ステップＳ８１でＮ３以下の変数ｃ１が決定され、ステップＳ８２でＣｏｒｅＳｅｔ１３［ｃ１］が変数ｒ１に設定され、ステップＳ８３でコア集合＃３に属するコア＃Ｃ３r1に対応するタスクプールにタスクが追加される。
【０１３９】
＜変形例５＞
図２０に示した変形例４の処理では、機能Ｆ２に対応するタスクが発生するたびに乱数計算（変数ｃ１の計算）が行われていた。これに対して、変形例５では、機能Ｆ２（および機能Ｆ３）に対応するタスクの分配先を決定する際にも乱数テーブル１３４を用いることで、乱数計算の実行回数を減少させ、タスク分配制御の処理負荷を軽減する。
【０１４０】
図２１は、変形例５におけるタスク分配制御処理の一部を示すフローチャートの例である。変形例５では、図１７に示したステップＳ７３の代わりに図２１の処理が実行される。また、図２１では、図１７と同様に、例として、コア集合＃１に属するｉ番目のコアに対応するスケジューラの処理について説明する。すなわち、図２１の処理は、当該スケジューラにおいて機能Ｆ２に対応するタスクが発生するたびに、そのタスクを処理対象として実行される。
【０１４１】
［ステップＳ９１］スケジューラは、変数ｈ１がＫより大きいかを判定する。スケジューラは、変数ｈ１がＫより大きい場合にはステップＳ９２の処理を実行し、変数ｈ１がＫ以下の場合にはステップＳ９５の処理を実行する。なお、変数ｈ１の初期値はＫより大きい任意の整数である。また、ここでは例として、Ｋの値は機能Ｆ１に対応するタスクの分配制御で利用されるＫの値と同じであるものとするが、異なる値が利用されてもよい。
【０１４２】
［ステップＳ９２］スケジューラは、変数ｈ１を１に設定する。
［ステップＳ９３］スケジューラは、乱数計算によりＭ以下の整数を算出し、この値を変数ｍ３に決定する。
【０１４３】
［ステップＳ９４］スケジューラは、オフセット値ｏｆｓに１を加算して、オフセット値ｏｆｓを更新する。このオフセット値ｏｆｓは、Ｋを上限とする数値であり、ステップＳ９４の加算によりＫを超えた場合、０にリセットされる。なお、オフセット値ｏｆｓの初期値は、０以上Ｋ以下の任意の整数である。
【０１４４】
［ステップＳ９５］スケジューラは、変数ｃ１を次の式（６）によって算出する。なお、演算子％は剰余の計算を示す。
ｃ１＝１＋（（ｏｆｓ＋Ｒａｎｄ［ｍ３，ｈ１］）％Ｎ２）      ・・・（６）
［ステップＳ９６］スケジューラは、ＣｏｒｅＳｅｔ１２［ｃ１］（ＣｏｒｅＳｅｔ１２における第ｃ１列の数値）を読み出し、変数ｒ１に読み出した値を設定する。
【０１４５】
［ステップＳ９７］スケジューラは、コア集合＃２に属するコア＃Ｃ２1〜＃Ｃ２N2のうちコア番号＃ｒ１のコア＃Ｃ２r1に対応するタスクプールに、タスクを追加する。
［ステップＳ９８］スケジューラは、変数ｈ１を１だけ増加させる。
【０１４６】
以上の図２１の処理によれば、機能Ｆ２に対応するＫ個のタスクを分配する際に、ステップＳ９３で乱数計算によってＭ以下のランダムな数が１回だけ計算される。そして、Ｋ個のタスクそれぞれの分配先は、最終的にステップＳ９５で乱数テーブル１３４を用いて決定される。これにより、乱数計算の処理負荷を軽減して、その処理負荷がＩ／Ｏ制御部１１０によるストレージ制御性能に与える影響を軽減でき、その結果として、Ｉ／Ｏ制御部１１０によるストレージ制御性能を向上させることができる。また、このように乱数計算の処理負荷を軽減しつつ、コア番号の選択のランダム性を向上させることができるので、コア＃Ｃ２1〜＃Ｃ２N2における負荷分散の精度を高めることができる。
【０１４７】
ここで、上記の式（６）は、乱数テーブル１３４におけるｍ３行ｈ１列の値にオフセット値ｏｆｓを加算した加算値を基に、Ｎ２以下のランダムな整数を算出するものである。オフセット値ｏｆｓは、機能Ｆ２に対応するＫ個のタスクが分配されるたびに更新される。このオフセット値ｏｆｓは、Ｋがコア集合＃２に属するコアの数（Ｎ２）より小さい場合に、変数ｃ１のランダム性を確保するための補正値として機能する。したがって、ＫがＮ２以上の場合には変数ｃ１は使用されなくてよい。この場合、ステップＳ９４の実行が不要となる。これとともに、オフセット値ｏｆｃが固定値０に設定されるか、または式（６）からオフセット値ｏｆｓの加算が削除される。
【０１４８】
なお、ステップＳ９４では、乱数計算によってＫ以下のランダムな数値を計算することで、オフセット値ｏｆｓが設定されてもよい。
また、変形例５ではさらに、図１８に示したステップＳ４７の代わりに、図２１の処理を機能Ｆ３について適用した処理が実行される。この処理では、ステップＳ９５でＮ３以下の変数ｃ１が決定され、ステップＳ９６でＣｏｒｅＳｅｔ１３［ｃ１］が変数ｒ１に設定され、ステップＳ９７でコア集合＃３に属するコア＃Ｃ３r1に対応するタスクプールにタスクが追加される。
【０１４９】
ここで、動的負荷分散の一種であるワークスチールと上記処理との比較について説明する。ワークスチールでは、システム全体でタスクの集合が管理されるため、タスクの登録やタスクの取り出しの際に排他制御が必要となり、この排他制御の処理負荷が大きい。上記の第２の実施の形態やその変形例１〜４では、コアごとに個別のタスクプールが設けられ、各コアが独立してタスクプールへのタスクの登録やタスクプールからのタスクの取り出しが行われる。このため、タスクの登録やタスクの取り出しの際に排他制御が必要とならず、ワークスチールと比較してタスク分配制御の処理効率を高めることができる。
【０１５０】
なお、上記の各実施の形態に示した装置（例えば、情報処理装置１、ストレージ制御装置１００，２００）の処理機能は、コンピュータによって実現することができる。その場合、各装置が有すべき機能の処理内容を記述したプログラムが提供され、そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体に記録しておくことができる。コンピュータで読み取り可能な記録媒体としては、磁気記憶装置、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記憶装置には、ハードディスク装置（ＨＤＤ）、磁気テープなどがある。光ディスクには、ＣＤ（Compact Disc）、ＤＶＤ（Digital Versatile Disc）、ブルーレイディスク（Blu-ray Disc：ＢＤ、登録商標）などがある。光磁気記録媒体には、ＭＯ（Magneto-Optical disk）などがある。
【０１５１】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ、ＣＤなどの可搬型記録媒体が販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【０１５２】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムまたはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムにしたがった処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムにしたがった処理を実行することもできる。また、コンピュータは、ネットワークを介して接続されたサーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムにしたがった処理を実行することもできる。
【０１５３】
以上の各実施の形態に関し、さらに以下の付記を開示する。
（付記１）  複数の処理部を有する情報処理装置であって、
前記複数の処理部の処理能力を収集し、所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
情報処理装置。
【０１５４】
（付記２）  前記情報処理装置は、前記所定数の要素をそれぞれ有する複数の乱数列を記憶する記憶部をさらに有し、
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第１の数値をランダムに生成し、前記複数の乱数列から前記第１の数値が示す乱数列を選択する処理を含み、
前記分配では、前記選択された乱数列を用いて前記所定数のタスクを分配する、
付記１記載の情報処理装置。
【０１５５】
（付記３）  前記タスク分配処理は、さらに、前記所定数の要素を有する数列であって、前記複数の処理部のそれぞれを示す識別番号を前記比率に応じた数だけ含む前記数列を生成する処理を含み、
前記分配では、前記所定数のタスクのそれぞれが発生するたびに、前記選択された乱数列から１つずつ数値を選択し、前記数列に含まれる前記識別番号のうち、前記選択された数値が示す要素として含まれる前記識別番号を読み出し、前記複数の処理部のうち、読み出された前記識別番号に対応する処理部に対して発生したタスクを分配する、
付記２記載の情報処理装置。
【０１５６】
（付記４）  前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第２の数値をランダムに生成する処理を含み、
前記選択された乱数列からの数値の選択では、前記第２の数値に基づいて決定される要素を先頭にして、前記選択された乱数列から数値を巡回的に選択する、
付記３記載の情報処理装置。
【０１５７】
（付記５）  前記情報処理装置は、それぞれ個別のタスク種別に関連付けられた前記複数の処理部を複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、発生したタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定される、
付記１乃至４のいずれか１つに記載の情報処理装置。
【０１５８】
（付記６）  前記情報処理装置は、それぞれ個別のタスク種別に関連付けられ、かつ、第１グループと第２グループのいずれかに分類される前記複数の処理部を、複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記第１グループに含まれる前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、前記第１グループに含まれる前記複数の処理部に対応するタスク種別のタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定され、前記第２グループに含まれる前記複数の処理部に対応するタスク種別のタスクが、判別されたタスク種別に対応する前記複数の処理部に対してランダムに分配される、
付記１乃至４のいずれか１つに記載の情報処理装置。
【０１５９】
（付記７）  コンピュータに、
前記コンピュータが備える複数の処理部の処理能力を収集し、所定数のタスクを、収集された前記処理能力の比率に応じた分配確率で前記複数の処理部に分配するタスク分配処理を、前記複数の処理部のそれぞれが独立して実行する、
処理を実行させるタスク管理プログラム。
【０１６０】
（付記８）  前記コンピュータは、前記所定数の要素をそれぞれ有する複数の乱数列を記憶する記憶部をさらに有し、
前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第１の数値をランダムに生成し、前記複数の乱数列から前記第１の数値が示す乱数列を選択する処理を含み、
前記分配では、前記選択された乱数列を用いて前記所定数のタスクを分配する、
付記７記載のタスク管理プログラム。
【０１６１】
（付記９）  前記タスク分配処理は、さらに、前記所定数の要素を有する数列であって、前記複数の処理部のそれぞれを示す識別番号を前記比率に応じた数だけ含む前記数列を生成する処理を含み、
前記分配では、前記所定数のタスクのそれぞれが発生するたびに、前記選択された乱数列から１つずつ数値を選択し、前記数列に含まれる前記識別番号のうち、前記選択された数値が示す要素として含まれる前記識別番号を読み出し、前記複数の処理部のうち、読み出された前記識別番号に対応する処理部に対して発生したタスクを分配する、
付記８記載のタスク管理プログラム。
【０１６２】
（付記１０）  前記タスク分配処理は、さらに、前記複数の乱数列に含まれる乱数列の数以下の値を有する第２の数値をランダムに生成する処理を含み、
前記選択された乱数列からの数値の選択では、前記第２の数値に基づいて決定される要素を先頭にして、前記選択された乱数列から数値を巡回的に選択する、
付記９記載のタスク管理プログラム。
【０１６３】
（付記１１）  前記コンピュータは、それぞれ個別のタスク種別に関連付けられた前記複数の処理部を複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、発生したタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定される、
付記７乃至１０のいずれか１つに記載のタスク管理プログラム。
【０１６４】
（付記１２）  前記コンピュータは、それぞれ個別のタスク種別に関連付けられ、かつ、第１グループと第２グループのいずれかに分類される前記複数の処理部を、複数組有し、
複数組の前記複数の処理部に含まれるそれぞれの処理部において、
前記第１グループに含まれる前記複数の処理部のそれぞれについての前記タスク分配処理が実行され、
タスクが発生するたびに発生したタスクのタスク種別が判別され、前記第１グループに含まれる前記複数の処理部に対応するタスク種別のタスクの分配先が、判別されたタスク種別に対応する前記複数の処理部についての前記タスク分配処理によって決定され、前記第２グループに含まれる前記複数の処理部に対応するタスク種別のタスクが、判別されたタスク種別に対応する前記複数の処理部に対してランダムに分配される、
付記７乃至１０のいずれか１つに記載のタスク管理プログラム。
【符号の説明】
【０１６５】
１  情報処理装置
２ａ〜２ｃ  処理部
Ｓ１〜Ｓ６  ステップ
【図１】
2020144737.tif 000005
【図２】
2020144737.tif 000006
【図３】
2020144737.tif 000007
【図４】
2020144737.tif 000008
【図５】
2020144737.tif 000009
【図６】
2020144737.tif 000010
【図７】
2020144737.tif 000011
【図８】
2020144737.tif 000012
【図９】
2020144737.tif 000013
【図１０】
2020144737.tif 000014
【図１１】
2020144737.tif 000015
【図１２】
2020144737.tif 000016
【図１３】
2020144737.tif 000017
【図１４】
2020144737.tif 000018
【図１５】
2020144737.tif 000019
【図１６】
2020144737.tif 000020
【図１７】
2020144737.tif 000021
【図１８】
2020144737.tif 000022
【図１９】
2020144737.tif 000023
【図２０】
2020144737.tif 000024
【図２１】
2020144737.tif 000025