(57)【要約】  システムは、複数のＣＰＵ（１０１）のそれぞれに対応して設けられる第１メモリ（１０３）と、複数のＣＰＵ（１０１）で共有される第２メモリ（１１０）と、第１スレッドの第１データを第１メモリ（１０３）に転送可能であるか否かを第１メモリ（１０３）の空き領域のサイズに基づいて判断し、転送不可能であると判断したときに第１メモリ（１０３）に格納される第２スレッドの第２データを第２メモリ（１１０）に転送するとともに、前記第１データを前記第１メモリ（１０３）に転送するワークメモリ管理部と、を含む。
2013001614.tif 000002
【特許請求の範囲】
【請求項１】
複数のデータ処理装置のうちの第１データ処理装置が実行する第１スレッドの第１データを第１メモリに転送可能であるか否かを第１メモリの空き領域のサイズに基づいて判断し、
転送不可能であると判断されるときに、前記第１メモリに格納される第２スレッドの第２データを第２メモリに転送し、
前記第１データを前記第１メモリに転送すること
を特徴とするデータ処理方法。
【請求項２】
前記第１メモリは、前記複数のデータ処理装置のうちの何れかのデータ処理装置のワークメモリであること
を特徴とする請求項１に記載のデータ処理方法。
【請求項３】
前記第２メモリは、前記複数のデータ処理装置が共有するメモリであり、
前記第２データはダイナミックメモリアクセス転送で前記第２メモリに転送されること
を特徴とする請求項１または請求項２に記載のデータ処理方法。
【請求項４】
前記第２スレッドは、前記第１スレッドの後に実行が開始されること
を特徴とする請求項１乃至請求項３の何れか一に記載のデータ処理方法。
【請求項５】
前記第１データのサイズが前記第１メモリのサイズよりも大きいとき、前記第１データを前記第２メモリに転送すること
を特徴とする請求項１乃至請求項４の何れか一に記載のデータ処理方法。
【請求項６】
前記第１スレッドの実行が中断されるとき、前記第１メモリに格納される前記第１データを前記第２メモリに転送し、
第３スレッドの第３データを前記第１メモリに転送して前記第３スレッドを実行すること
を特徴とする請求項１乃至請求項５の何れか一に記載のデータ処理方法。
【請求項７】
前記複数のデータ処理装置のなかで負荷の差が所定値以上となる２個のデータ処理装置を選択し、
前記２個のデータ処理装置の一のデータ処理装置で実行される少なくとも一のスレッドを前記２個のデータ処理装置の他のデータ処理装置に移動すること
を特徴とする請求項１乃至請求項６の何れか一に記載のデータ処理方法。
【請求項８】
前記一のデータ処理装置から前記他のデータ処理装置に移動したときに前記他のデータ処理装置で実行の順序が最も遅くなるスレッドを前記少なくとも一のスレッドとすること
を特徴とする請求項７に記載のデータ処理方法。
【請求項９】
前記第２データを前記第２メモリに転送したときに前記第２スレッドのメモリフラグをリセットし、
前記第１データを前記第１メモリに転送したときに前記第１スレッドのメモリフラグをセットすること
を特徴とする請求項１乃至請求項８の何れか一に記載のデータ処理方法。
【請求項１０】
複数のデータ処理装置のそれぞれに対応して設けられる第１メモリと、
前記複数のデータ処理装置で共有される第２メモリと、
第１スレッドの第１データを前記第１メモリに転送可能であるか否かを前記第１メモリの空き領域のサイズに基づいて判断し、転送不可能であると判断したときに前記第１メモリに格納される第２スレッドの第２データを前記第２メモリに転送するとともに、前記第１データを前記第１メモリに転送するメモリ管理ユニットと、
を含むことを特徴とするデータ処理システム。
【請求項１１】
前記複数のデータ処理装置の複数の前記第１メモリ間でデータを転送するための第１バスと、
前記複数のデータ処理装置と前記第２メモリとの間でデータを転送するための第２バスと、
を含むことを特徴とする請求項１０に記載のデータ処理システム。
【請求項１２】
前記第２データを前記第２メモリに転送するダイナミックメモリアクセスコントローラを含むこと
を特徴とする請求項１０または請求項１１に記載のデータ処理システム。
【請求項１３】
前記第２メモリは、第１メモリ領域と第２メモリ領域とを含み、
前記第１データのサイズが前記第１メモリのサイズよりも大きいとき、前記第１データを前記第２メモリの第１メモリ領域に転送すること
を特徴とする請求項１０乃至請求項１２の何れか一に記載のデータ処理システム。
【請求項１４】
前記メモリ管理ユニットは、スレッド毎に前記第１メモリを使用しているか否かを示すフラグと、前記スレッドのデータを前記第１メモリおよび前記第２メモリ間で転送中であるか否かを示すフラグとを管理すること
を特徴とする請求項１０乃至請求項１３の何れか一に記載のデータ処理システム。
【請求項１５】
前記メモリ管理ユニットは、前記第１データ処理装置が前記いずれかのスレッドの実行時に並行して前記第１メモリと前記第２メモリ間のデータを転送することを特徴とする請求項１０乃至請求項１４の何れか一に記載のデータ処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のプロセッサ間でのスレッド移動時に関連するデータ移動を処理するデータ処理方法およびデータ処理システムに関する。
【背景技術】
【０００２】
通常のメモリやキャッシュに加えて高速小容量のワークメモリ（Ｗｏｒｋ  Ｍｅｍｏｒｙ）を利用して、一時利用のデータやストリームデータのようなキャッシュに適さないデータをワークメモリに配置することにより、データアクセスの効率化をおこなう手法が開示されている（たとえば、下記特許文献１〜３参照。）。【０００３】
マルチコアプロセッサでワークメモリを利用する場合、一般的には高速性を維持するためにプロセッサ毎にワークメモリを設けられている。このマルチコアプロセッサでは、プロセッサ間で負荷バランスをとるために、あるプロセッサで動いていたスレッドを別のプロセッサに移動させることがあり、移動対象のスレッドがワークメモリを利用しているままではスレッドを移動できない。このため、別プロセッサのワークメモリを参照できるようにし、スレッドを別プロセッサに移動した場合でも、移動前のプロセッサのワークメモリを直接参照できるようにすることでワークメモリを利用しているスレッドの移動を可能にした技術がある（たとえば、下記特許文献４参照。）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００５−５６４０１号公報
【特許文献２】特開平１１−６５９８９号公報
【特許文献３】特開平７−２７１６５９号公報
【特許文献４】特開２００９−１９９４１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記従来の技術では、別プロセッサのワークメモリは、物理的に離れた場所にあるため、このワークメモリを参照しようとすると、自プロセッサのワークメモリを参照するよりもアクセス時の遅延が増大し、スレッドの処理性能が低下した。また、スレッドの移動にあわせてスレッドが利用しているワークメモリ上のデータも移動させようとすると、データ移動のための処理および時間（コスト）が発生する。加えて、移動先のワークメモリを移動先プロセッサ上の別スレッドが利用していたとすると、ワークメモリの領域管理も必要となり処理が煩雑となる。【０００６】
開示のデータ処理方法およびデータ処理システムは、上述した問題点を解消するものであり、ワークメモリを有する複数のプロセッサ間でのスレッドの移動時に、スレッドのデータを効率的に移動できることを目的とする。
【課題を解決するための手段】
【０００７】
上述した課題を解決し、目的を達成するため、開示技術は、複数のデータ処理装置のうちの第１データ処理装置が実行する第１スレッドの第１データを第１メモリに転送可能であるか否かを第１メモリの空き領域のサイズに基づいて判断し、転送不可能であると判断されるときに、前記第１メモリに格納される第２スレッドの第２データを第２メモリに転送し、前記第１データを前記第１メモリに転送すること、を含む。
【発明の効果】
【０００８】
開示のデータ処理方法およびデータ処理システムによれば、ワークメモリを有する複数のプロセッサ間でのスレッドの移動時に、スレッドのデータを効率的に移動できるという効果を奏する。
【図面の簡単な説明】
【０００９】
【図１】図１は、実施の形態にかかるデータ処理装置の機能を説明する概要図である。
【図２】図２は、実施の形態にかかるデータ処理の一例を示すフローチャートである。
【図３】図３は、実施の形態１にかかるデータ処理装置のハードウェア構成を示すブロック図である。
【図４】図４は、実施の形態１にかかるデータ処理装置のソフトウェア構成を示すブロック図である。
【図５】図５は、実行オブジェクトの情報を示す図表である。
【図６】図６は、論理アドレスと物理アドレスの変換を示す図表である。
【図７】図７は、スレッド毎のスタック領域を示す図表である。
【図８】図８は、スタック領域の配置を示す図表である。
【図９】図９は、ランキューの実装例を示す図である。
【図１０】図１０は、負荷分散処理時のスレッドの移動を示す図である。
【図１１】図１１は、ワークメモリ管理部によるワークメモリの管理を示す図表である。
【図１２】図１２は、ワークメモリ管理情報の例を示す図表である。
【図１３】図１３は、スタック領域確保の処理内容を示すフローチャートである。
【図１４】図１４は、ワークメモリ上の領域の状態遷移を示す遷移図である。
【図１５】図１５は、ワークメモリ領域確保の処理内容を示すフローチャートである。
【図１６】図１６は、ＤＭＡ転送終了後の処理内容を示すフローチャートである。
【図１７】図１７は、実行スレッドの切り替え時の処理内容を示すフローチャートである。
【図１８】図１８は、領域入れ替えの処理内容を示すフローチャートである。
【図１９】図１９は、負荷分散の処理内容を示すフローチャートである。
【図２０】図２０は、ワークメモリデータ移動の処理内容を示すフローチャートである。
【図２１】図２１は、実施の形態１によるシステムの処理タイミングを示すシーケンス図である。
【図２２】図２２は、実施の形態２にかかるデータ領域の配置を示す図表である。
【図２３】図２３は、図３および図４に示したデータ処理装置を用いたシステムの適用例を示す図である。
【発明を実施するための形態】
【００１０】
以下に添付図面を参照して、開示技術の好適な実施の形態を詳細に説明する。図１は、実施の形態にかかるデータ処理装置の機能を説明する概要図である。開示技術は、マルチコアプロセッサのシステムにおいて、複数のプロセッサ１０１はそれぞれワークメモリ（第１メモリ）１０３を有する。また、複数のプロセッサ１０１で共有されるメモリ（第２メモリ）１１０を有する。
【００１１】
オペレーティングシステム（ＯＳ）のワークメモリ管理部（メモリ管理ユニット）は、各スレッドが利用するスレッド固有データをワークメモリ１０３に配置し、ＯＳ２０１のスケジューラ部２１０と連動して、別スレッドの実行中にＤＭＡＣ（ダイナミックメモリアクセスコントローラ）１１１によるＤＭＡ転送を利用してワークメモリ１０３上のデータを自プロセッサ１０１に移動（転送）させる。
【００１２】
図示の例では、負荷の高い第１プロセッサ（ＣＰＵ＃０）１０１から負荷の低い第２プロセッサ（ＣＰＵ＃１）１０１に第１スレッド（Ｔｈｒｅａｄ１）を移動するときには、負荷の高いプロセッサ（ＣＰＵ＃０）１０１に割り当てられているスレッドのなかから負荷の低いプロセッサ（ＣＰＵ＃１）１０１に移動したときに実行順の一番遅いスレッド（Ｔｈｒｅａｄ２）を移動対象のスレッドとして決定する。そして、移動先のプロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３に、移動対象のスレッド（Ｔｈｒｅａｄ２）が利用するワークメモリ領域の移動に必要な空き領域があれば、ＤＭＡＣ１１１を使って移動先のプロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３にスレッド固有データ（第１データ）の移動をおこなう。
【００１３】
また、図１には示していないが、移動先の第２プロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３に必要な空き領域がない場合にも対応する。この場合、移動先の第２プロセッサ（ＣＰＵ＃１）１０１で移動対象のスレッド（Ｔｈｒｅａｄ２）よりも実行順の遅い第３スレッド（Ｔｈｒｅａｄ３）が利用するワークメモリ領域があれば、ＤＭＡＣ１１１により、この実行順の遅い第３スレッド（Ｔｈｒｅａｄ３）のスレッド固有データをメモリ１１０に移動させる（追い出し）。
【００１４】
そして、ワークメモリ１０３で必要な空き領域が確保されれば、移動対象のスレッド（Ｔｈｒｅａｄ２）が利用するスレッド固有データを、ＤＭＡＣ１１１を使って移動先プロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３に移動させる。しかし、必要な空き領域が確保できなければ、移動対象のスレッド（Ｔｈｒｅａｄ２）が利用するワークメモリ１０３上のスレッド固有データを一旦、メモリ１１０に移動させる。この場合は、スケジューラ部２１０が実行するスレッドを切り替えるときに、ワークメモリ１０３上のデータの入れ替えをおこなう。
【００１５】
この開示技術は、主に下記のデータ処理をおこなう。
１．各プロセッサ１０１毎にワークメモリ１０３を有し、全てのワークメモリ１０３とメモリ１１０にＤＭＡアクセス可能なＤＭＡＣ１１１を持つマルチコアプロセッサシステムにおいて、ＯＳ２０１のスケジューラ部２１０と連動して、ＤＭＡでワークメモリ１０３に配置するデータの入れ替えをおこなう。
２．ワークメモリ１０３にはスレッドが単独で利用するデータを配置させ、ＯＳのスケジューラでの実行順が早いスレッドのデータを優先してワークメモリ１０３に配置する。
３．ＯＳのスケジューラにより実行するスレッドが切り替わると、これまで実行していたスレッドが利用するデータをワークメモリ１０３からメモリ１１０に追い出す。
【００１６】
４．負荷分散により高負荷のプロセッサ１０１から低負荷のプロセッサ１０１にスレッドを移動する場合は、低負荷のプロセッサ１０１に移動したときに実行順が最も遅くなるスレッドを移動対象のスレッドとして選択し、このスレッドを移動してからＯＳのスケジューラにより実際に実行されるまでの間に、ＤＭＡでワークメモリ１０３上のデータの移動をおこなう。
５．また、メモリ１１０上の領域を複数スレッドで共有する領域と、単独のスレッドでのみ利用する領域に分割しておき、単独のスレッドでのみ利用する領域に対応する領域をワークメモリ１０３上に確保する。そして、アドレス変換により、ワークメモリ１０３上のデータを利用するようにする。追い出す時は、ＤＭＡによりワークメモリ１０３上のデータを対応するメモリ１１０上の領域にコピーした後に領域を開放する。再度、ワークメモリ１０３上に領域を確保した場合は、ＤＭＡによりメモリ１１０からワークメモリ１０３にデータをコピーする。
【００１７】
図２は、実施の形態にかかるデータ処理の一例を示すフローチャートである。はじめに、設計時には、手作業により、プロセスの各スレッドのデータをスレッド固有データと、スレッド間で共有する共有データに分離しておく（ステップＳ２０１）。この後、データ処理装置１００は、スレッド起動時にスレッド固有データを割当先のプロセッサ１０１のワークメモリ１０３に展開する（ステップＳ２０２）。そして、負荷バランスが悪化した場合は、負荷が高い方のプロセッサ１０１で実行順が最も遅いスレッドを移動対象に決定する（ステップＳ２０３）。そして、他のスレッドが動作中に移動対象スレッド（上記例ではＴｈｒｅａｄ２）のスレッド固有データをＤＭＡＣ１１１を利用して移動させる（ステップＳ２０４）。ステップＳ２０２〜Ｓ２０４の処理は、スレッド実行時にＯＳ２０１がおこなう。
【００１８】
（実施の形態１）
図３は、実施の形態１にかかるデータ処理装置のハードウェア構成を示すブロック図である。システムに含まれる１台のコンピュータからなるデータ処理装置１００は、複数のプロセッサ（ＣＰＵ＃０〜＃３）１０１を含む。この複数のプロセッサ１０１は、それぞれ第一レベルのキャッシュ（Ｌ１キャッシュ）１０２と、ワークメモリ（第１メモリ）１０３を含む。全てのＬ１キャッシュ１０２は、スヌープ（Ｓｎｏｏｐ）ＢＵＳ１０４を介して第二レベルのキャッシュ（Ｌ２キャッシュ）１０５、およびスヌープ機構１０６と接続されている。スヌープ機構１０６により、それぞれのＬ１キャッシュ１０２上の同じ変数が同じ値を示すようにコヒーレント制御される。
【００１９】
Ｌ２キャッシュ１０５は、メインメモリＢＵＳ１０７を介してＲＯＭ１０８に接続され、また、メインメモリＢＵＳ１０７（第２バス）を介してメモリ（第２メモリ）１１０に接続されている。また、メインメモリＢＵＳ１０７には、タイマー１０９が接続されている。また、図１に示す構成では、ＤＭＡＣ１１１は、ワークメモリＢＵＳ（第１バス）１１２と、スヌープＢＵＳ１０４の両方に接続されており、全てのワークメモリ１０３と、Ｌ２キャッシュ１０５を介してメモリ１１０にアクセスすることができる。
【００２０】
また、各プロセッサ１０１は、メモリ管理機構（ＭＭＵ：Ｍｅｍｏｒｙ  Ｍａｎａｇｅｍｅｎｔ  Ｕｎｉｔ）１１３を搭載しており、ソフトウェアが示す論理的なアドレスと、物理アドレスとの変換をおこなう。
【００２１】
図４は、実施の形態１にかかるデータ処理装置のソフトウェア構成を示すブロック図である。データ処理装置１００に設けられるソフトウェアとして、複数のプロセスに跨った形でＳＭＰ（Ｓｙｍｍｅｔｒｉｃ  Ｍｕｌｔｉｐｌｅ  Ｐｒｏｃｅｓｓｏｒ）−ＯＳ２０１が搭載されている。ＯＳ２０１の内部は、複数のプロセッサ１０１で共通処理をおこなう共通処理部２０１ａと、プロセッサ１０１毎に独立した処理をおこなう独立処理部２０１ｂとに分かれている。
【００２２】
共通処理部２０１ａは、プロセスを管理するプロセス管理部２０２、スレッドを管理するスレッド管理部２０３、メモリ１１０を管理するメモリ管理部２０４、負荷分散処理をおこなう負荷分散部２０５、ワークメモリ１０３を管理するワークメモリ管理部（メモリ管理ユニット）２０６、ＤＭＡＣ１１１を制御するＤＭＡ制御部２０７を含む。
【００２３】
プロセス管理部２０２、スレッド管理部２０３、メモリ管理部２０４は、複数のプロセッサ１０１間で共通におこなう必要のある処理を管理する。負荷分散部２０５は、複数のプロセッサ１０１に跨っておこなう負荷分散にかかる処理をプロセッサ１０１同士で互いに通信し合うことで実現する。これにより、このＯＳ２０１上で動くスレッドは、どのプロセッサ１０１でも同じように動作することができる。
【００２４】
一方、プロセッサ１０１毎に独立して処理をおこなう独立処理部２０１ｂとしては、複数のスケジューラ部（＃０〜＃３）２１０を含む。スケジューラ部２１０は、それぞれのプロセッサ１０１毎に割り当てられた実行可能スレッドの時分割実行をおこなう。
【００２５】
メモリ１１０は、ＯＳ２０１のメモリ管理部２０４により、ＯＳ２０１が利用するＯＳ領域１１０ａと、各プロセスが利用するプロセス領域１１０ｂとに分けられている。ＯＳ２０１が利用するＯＳ領域１１０ａには、各種の情報が格納されるが、この実施の形態１では、プロセッサ１０１毎に割り当てられた稼働状態のスレッドが記録されるランキュー（ｒｕｎ  ｑｕｅｕｅ）２２０と、ワークメモリ１０３の管理情報２２１と、プロセスの管理情報２２２と、スレッドの管理情報２２３と、を含む。
【００２６】
（ワークメモリの管理について）
つぎに、実施の形態１におけるスレッドの動作と、ワークメモリ１０３上の領域の管理について、アプリケーション実行時の処理に沿って説明する。はじめに、新たにアプリケーションの起動が指示されると、ＯＳ２０１のプロセス管理部２０２は、ＲＯＭ１０８から指示されたアプリケーションに対応する実行オブジェクトを読み込む。
【００２７】
図５は、実行オブジェクトの情報を示す図表である。実行オブジェクト５００は、アプリケーションのプログラムコード（コード）５０１と、そのコード５０１およびコード５０１が利用するデータをどの論理アドレスに配置するかを指定する配置情報５０２と、を含む。さらに、初期値をもつデータに関してはデータ初期値５０３の情報が含まれる。プロセス管理部２０２では、コード５０１を読み込むと、アプリケーションを実行するためのプロセス情報を生成して、メモリ管理部２０４により、メモリ１１０上に、配置情報５０２に記録されたコードと、データを展開するために必要なプロセス領域１１０ｂを確保する。
【００２８】
図６は、論理アドレスと物理アドレスの変換を示す図表である。メモリ１１０上のアドレス（物理アドレス）は、ＭＭＵ１１３により、論理アドレス空間に変換されるため、確保するアドレスは、配置情報５０２で指定された論理アドレスとは異なっていても問題ない。プロセス領域１１０ｂが確保できたら、実行オブジェクト５００に記録されたコード５０１およびデータを確保したメモリ１１０の領域にコピーする。また、ＭＭＵ１１３の論理アドレスと物理アドレスの変換情報は、プロセス管理情報２２２に記録され、そのプロセスに属するスレッドが実行されるときは、ＭＭＵ１１３に対しプロセス管理情報２２２に記録したアドレスの変換情報を設定する。
【００２９】
その後、スレッド管理部２０３により、プロセスでメインとなるスレッドを作成し、メインスレッドによりコードの先頭部分から処理をおこなわせる。スレッド管理部２０３では、メモリ１１０上のＯＳ領域１１０ａにスレッド管理情報２２３を生成し、さらに、そのスレッドが属するプロセス領域１１０ｂにスレッド用のスタック領域を確保する。スレッド管理情報２２３は、スレッドのアドレス、サイズ、状態などからなる。スタック領域とは、Ｃ言語のプログラムにおける自動変数が配置される領域であり、スタック領域は、その性質上スレッド毎に用意される。
【００３０】
図７は、スレッド毎のスタック領域を示す図表である。プロセス起動直後は、メインスレッドのみだが、プロセスの実行が進んで、たとえば、スレッドＸ，Ｙ，Ｚの３つのスレッドが起動されたとすると、図示のように、それぞれのスレッド毎にスタック領域７０１が用意される。スタック領域７０１の大きさは、スレッド起動時に指定できるが、特に指定がない場合は、システムデフォルトの大きさのスタック領域７０１が作成される。
【００３１】
図８は、スタック領域の配置を示す図表である。上述したように、スタック領域７０１は、各スレッドが独立してもつ領域であるため、このスタック領域７０１をワークメモリ１０３に配置することができる。そこで、このスタック領域７０１をワークメモリ管理部２０６により、ワークメモリ１０３上に用意し、図示のようにＭＭＵ１１３によりアドレス変換をおこなえば、スレッドから利用できるようになる。
【００３２】
ただし、この段階では、まだスレッドの実行先プロセッサ１が確定していないため、メモリ１１０上にスタック領域７０１を確保する。このスタック領域７０１は、後にワークメモリ１０３に確保したスタック領域７０１をメモリ１１０に待避するときに利用される。スレッド管理部２０３ではスレッド管理情報２２３を生成すると、生成したスレッド管理情報２２３を負荷分散部２０５に渡す。
【００３３】
負荷分散部２０５では、各プロセッサ１０１の負荷を算出して、最も負荷の低いプロセッサ１０１のスケジューラ部２１０にスレッド管理情報２２３を渡す。スケジューラ部２１０では、受け取ったスレッド管理情報２２３を自身のランキュー（ｒｕｎ  ｑｕｅｕｅ）２２０に追加するとともに、ワークメモリ管理部２０６により、ワークメモリ１０３上にスタック領域７０１を確保する。スケジューラ部２１０では、ランキュー２２０に登録されたスレッド管理情報２２３に基づいて、順次スレッドを実行していく。
【００３４】
（ランキューの実装例について）
図９は、ランキューの実装例を示す図である。ここで、ランキュー２２０の構成と、スケジューラ部２１０の動作について、一実装例を挙げて詳しく説明しておく。ランキュー２２０は、図示のように、ランキュー（ｒｕｎ  ｑｕｅｕｅ）２２０と、ｅｘｐｉｒｅｄ  ｑｕｅｕｅ２２０ａの二つのキューを用いた実装がある。このように二つのキューを用いた実装では、ｒｕｎ  ｑｕｅｕｅ２２０と、ｅｘｐｉｒｅｄ  ｑｕｅｕｅ２２０ａのそれぞれに、スレッドに設定可能な範囲の優先度（１〜Ｎ）のリストがあり、スレッド管理情報２２３は、その優先度に対応するリストに接続される。
【００３５】
スケジューラ部２１０では、ｒｕｎ  ｑｕｅｕｅ２２０の優先度が高いリストの先頭から一つスレッド管理情報２２３を取り出して実行する。このとき、一度に実行する時間は、数ｍｓ程度の短時間であり、実行時間は優先度を元にして優先度が高いスレッドほど長時間実行されるようにする。所定の時間が経過すると、スレッドの実行を中断して、ｅｘｐｉｒｅｄ  ｑｕｅｕｅ２２０ａの同じ優先度のリストの末尾に実行したスレッド管理情報２２３を追加する。
【００３６】
上記処理を繰り返して、ｒｕｎ  ｑｕｅｕｅ２２０が空になったらｅｘｐｉｒｅｄ  ｑｕｅｕｅ２２０ａと、ｒｕｎ  ｑｕｅｕｅ２２０を入れ替えて再度同じことを繰り返す。これにより、あたかも一つのプロセッサ１０１上で複数のスレッドが同時に動作しているように見せかけている。以下の説明では、特に説明をおこなう場合以外は、ｒｕｎ  ｑｕｅｕｅ２２０と、ｅｘｐｉｒｅｄ  ｑｕｅｕｅ２２０ａとを含めた全体をランキュー（ｒｕｎ  ｑｕｅｕｅ）２２０と呼称する。
【００３７】
以上のように、ランキュー（ｒｕｎ  ｑｕｅｕｅ）２２０の内容により、スレッドの実行順を知ることができる。そこで、ワークメモリ管理部２０６では、ワークメモリ１０３上にスタック領域７０１を確保するときに、ワークメモリ１０３に十分な空き領域がなくスタック領域７０１が確保できない場合は、ランキュー２２０を確認する。そして、ランキュー２２０を見て、対象スレッドよりも実行順序が遅いスレッドのスタック領域７０１がワークメモリ１０３上にあれば、このスタック領域７０１をＤＭＡＣ１１１を使ってメモリ１１０に移動させる。
【００３８】
そして、メモリ１１０の領域が空いたら対象スレッドのスタック領域７０１をワークメモリ１０３に配置する。対象スレッドよりも実行順序が遅いスレッドのスタック領域７０１がワークメモリ１０３上になければ、この段階ではワークメモリ１０３上にスタック領域７０１の確保はおこなわない。
【００３９】
このように、スタック領域７０１がワークメモリ１０３上にないスレッドがある場合は、スケジューラ部２１０で実行するスレッドを切り替えるときに、このスレッドの切り替えにあわせて実行が終了したスレッドのスタック領域７０１をメモリ１１０に移動させる。そして、実行順が近いスレッドのうち、ワークメモリ１０３上にスタック領域７０１がないスレッドのスタック領域７０１を、メモリ１１０からワークメモリ１０３の空いた領域に移動させる。
【００４０】
（負荷分散処理時のスレッドの移動について）
各スレッドは、起動時に負荷分散部２０５により負荷が最も低いプロセッサ１０１に割り当てられるが、長時間スレッドが起動されずに既に起動されている幾つかのスレッドが終了すると、プロセッサ１０１間の負荷が不均衡になる場合がある。そこで、スレッド切り替えや、スレッド終了のタイミングで負荷分散部２０５が呼び出され、負荷が最も高いプロセッサ１０１と、最も低いプロセッサ１０１の負荷の差が規定値を超えると、負荷分散処理をおこなう。
【００４１】
図１０は、負荷分散処理時のスレッドの移動を示す図である。図１０に示す例で説明する。負荷分散処理では、負荷の最も高いプロセッサ（ＣＰＵ＃０）１０１から負荷の最も低いプロセッサ（ＣＰＵ＃１）１０１にスレッドを移動する。従来は、移動対象のスレッドは、負荷の高いプロセッサ１０１から任意に選択している。これに対し、本実施の形態では、負荷監視部２０５ａの負荷監視により、負荷の低いプロセッサ（ＣＰＵ＃１）１０１のランキュー２２０を参照して、負荷の低いプロセッサ（ＣＰＵ＃１）１０１にスレッドを移動したときに、最も実行順が遅くなるスレッド（図示の例ではＴｈｒｅａｄｌ）を移動対象とする。
【００４２】
移動対象のスレッドが決定すると、負荷分散部２０５は、対象のスレッド管理情報２２３を負荷の低いプロセッサ１０１のスケジューラ部２１０に渡し、ランキュー２２０に登録する。また、ワークメモリ管理部２０６で対象スレッドのスタック領域７０１の移動をおこなう。スタック領域７０１の移動では、スレッドを起動したときと同様に、移動先のプロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３に空きがあればそのまま移動し、なければ実行順の遅いスレッドのスタック領域７０１を空けるか、一旦メモリ１１０に移動して、実行順が近づいたらワークメモリ１０３に移動させる。
【００４３】
（ワークメモリ管理情報について）
図１１は、ワークメモリ管理部によるワークメモリの管理を示す図表である。ワークメモリ管理部２０６のワークメモリ管理について説明する。ワークメモリ管理部２０６では、ワークメモリ１０３をデフォルトのスタックサイズ単位に分割して管理する。たとえば、ワークメモリ（＃０）１０３の大きさが６４ＫＢｙｔｅで、デフォルトのスタックサイズが８ＫＢｙｔｅとすると、ワークメモリ（＃０）１０３は、図示のように、８個の領域に分割される。そして、ワークメモリ管理部２０６は、ワークメモリ管理情報２２１をメモリ１１０上に生成する。
【００４４】
ワークメモリ管理情報２２１は、スタック領域７０１の識別情報１１０１毎に、そのスタック領域７０１が利用中か否かを示す利用フラグ１１０２と、転送中か否かを示す転送中フラグ１１０３と、そのスタック領域７０１を利用しているスレッドの識別情報１１０４と、を含む。ワークメモリ１０３の利用フラグ１１０２は初期値がＴｒｕｅ（セット）であり、リセットでＦａｌｓｅとなる。転送中フラグ１１０３は、データ転送中がＴｒｕｅ（転送中）であり、転送中以外がＦａｌｓｅである。
【００４５】
図１２は、ワークメモリ管理情報の例を示す図表である。たとえば、図３に示したように、プロセッサ１０１が４個（ＣＰＵ＃０〜＃３）設けられ、各プロセッサ１０１が同じサイズのワークメモリ１０３を搭載しているとすると、ワークメモリ１０３のワークメモリ管理情報２２１は、図示のように各プロセッサ１０１について複数のスタック領域７０１毎の情報が格納される。
【００４６】
（スタック領域確保の処理内容について）
図１３は、スタック領域確保の処理内容を示すフローチャートである。ワークメモリ管理部２０６では、新たに生成されたスレッドのためにワークメモリ１０３上の領域を確保する。はじめに、ワークメモリ管理部２０６は、スレッド管理情報２２３により、スレッドのスタック領域７０１のサイズを取得し（ステップＳ１３０１）、必要なスタック領域数を算出する（ステップＳ１３０２）。つぎに、必要なスタック領域数と、ワークメモリ１０３の領域数とを比較する（ステップＳ１３０３）。
【００４７】
必要なスタック領域数がワークメモリ１０３の領域数よりも大きい場合は（ステップＳ１３０３：Ｙｅｓ）、スタック領域７０１をワークメモリ１０３に載せることはできないため、スレッド管理情報２２３のワークメモリ１０３の利用フラグ１１０２をＦａｌｓｅに設定し（ステップＳ１３０４）、処理を終了する。この場合、該当するスレッドではワークメモリ１０３を利用せずにメモリ１１０上に確保したスタック領域７０１を利用する。
【００４８】
一方、必要なスタック領域数がワークメモリ１０３の領域数に収まる場合には（ステップＳ１３０３：Ｎｏ）、ワークメモリ１０３上の領域確保の処理を実行し（ステップＳ１３０５）、スタック領域７０１の必要数の領域の確保に成功したか判断する（ステップＳ１３０６）。スタック領域７０１の必要数の領域の確保に成功しなければ（ステップＳ１３０６：Ｎｏ）、処理を終了する。スタック領域７０１の必要数の領域の確保に成功すれば（ステップＳ１３０６：Ｙｅｓ）、ＭＭＵ１１３の設定を変更して（ステップＳ１３０７）、処理を終了する。
【００４９】
これにより、スタック領域７０１の論理アドレスが確保したワークメモリ１０３上の領域に対応する物理アドレスに変換できるようになる。なお、スタック領域７０１は、初期値をもたせる必要がないため、確保したスタック領域７０１には値を設定する必要はない。
【００５０】
（ワークメモリ領域確保の処理内容について）
図１４は、ワークメモリ上の領域の状態遷移を示す遷移図である。ワークメモリ１０３上の領域の状態は、図示のように４種類ある。遷移状態Ｓ１は、スレッドがワークメモリ１０３上にある状態であり、利用フラグ１１０２はＴｒｕｅ、転送中フラグ１１０３はＦａｌｓｅである。ワークメモリ１０３からスレッドが追い出されると遷移状態Ｓ２に遷移する。この遷移状態Ｓ２は、ＤＭＡＣ１１１によりスレッドをメモリ１１０に追い出し中の状態であり、利用フラグ１１０２はＦａｌｓｅ、転送中フラグ１１０３はＴｒｕｅとなる。
【００５１】
つぎに、ワークメモリ１０３からスレッドのＤＭＡ転送が終了すると、ワークメモリ１０３が空き状態となる遷移状態Ｓ３に遷移する。この遷移状態Ｓ３では、利用フラグ１１０２はＦａｌｓｅ、転送中フラグ１１０３もＦａｌｓｅとなる。この後、ワークメモリ１０３の領域確保に成功すると、ワークメモリ１０３に対するスレッドの転送中である遷移状態Ｓ４となる。この遷移状態Ｓ４は、ＤＭＡＣ１１１でメモリ１１０からの転送、あるいは他のワークメモリ１０３からの転送中に相当する。この遷移状態Ｓ４は、利用フラグ１１０２はＴｒｕｅ、転送中フラグ１１０３もＴｒｕｅとなる。
【００５２】
図１５は、ワークメモリ領域確保の処理内容を示すフローチャートである。図１３のステップＳ１３０５に示したワークメモリ管理部２０６がおこなう処理内容について説明する。ワークメモリ１０３の領域確保処理では、はじめに、スレッド管理情報２２３からスタック領域７０１のサイズを取得する（ステップＳ１５０１）。また、必要なスタック領域数を算出する（ステップＳ１５０２）。そして、ワークメモリ管理情報２２１を取得し（ステップＳ１５０３）、ワークメモリ管理情報２２１によって、ワークメモリ１０３の空き領域を取得する。
【００５３】
ワークメモリ１０３上の領域の状態は、図１４に示した状態遷移図のように４種類あり、利用フラグ１１０２と転送中フラグ１１０３の双方がＦａｌｓｅとなる遷移状態Ｓ３における空き領域の領域数を求める（ステップＳ１５０４）。
【００５４】
そして、必要な領域数が求めた領域数以下であるか判断する（ステップＳ１５０５）。必要な領域数が求めた領域数以下であれば（ステップＳ１５０５：Ｙｅｓ）、求めた領域から必要数の領域を任意に選択し（ステップＳ１５０６）、選択した領域の利用フラグ１１０２と利用スレッド１１０４をＴｒｕｅに設定し（ステップＳ１５０７）、ワークメモリ領域確保成功として処理を終了する。
【００５５】
ステップＳ１５０５において、必要な領域数が求めた領域数を超えていれば（ステップＳ１５０５：Ｎｏ）、利用フラグ１１０２がＦａｌｓｅ、かつ転送中フラグ１１０３がＴｒｕｅの領域数（を求める（ステップＳ１５０８）。そして、ステップＳ１５０８の結果、必要な領域数が求めた領域数以下であるか判断する（ステップＳ１５０９）。必要な領域数が求めた領域数以下であれば（ステップＳ１５０９：Ｙｅｓ）、ワークメモリ領域の確保失敗として処理を終了する。
【００５６】
ステップＳ１５０９において、必要な領域数が求めた領域数を超えていれば（ステップＳ１５０９：Ｎｏ）、ランキュー２２０からこのスレッドより実行順の遅いスレッドを取得する（ステップＳ１５１０）。そして、ワークメモリ１０３上に領域をもつスレッドがあるか判断する（ステップＳ１５１１）。ワークメモリ１０３上に領域をもつスレッドがなければ（ステップＳ１５１１：Ｎｏ）、ワークメモリ領域の確保失敗として処理を終了する。ワークメモリ１０３上に領域をもつスレッドがあれば（ステップＳ１５１１：Ｙｅｓ）、ワークメモリ１０３上に領域をもつスレッドのうち最も実行順が遅いスレッドを選択する（ステップＳ１５１２）。
【００５７】
そして、選択したスレッドの領域の利用フラグ１１０２をＦａｌｓｅにし、転送中フラグ１１０３をＴｒｕｅに変更し（ステップＳ１５１３、遷移状態Ｓ２）、ＤＭＡ制御部２０７に選択したスレッドの領域のメモリ１１０への転送を指示し（ステップＳ１５１４）、ワークメモリ領域の確保失敗として処理を終了する。
【００５８】
上記処理により、ＤＭＡＣ１１１を使ってスレッドをメモリ１１０に移動することでワークメモリ１０３の領域を開放する。ＤＭＡＣ１１１での転送は、バックグラウンドでおこなわれるため、ＤＭＡ制御部２０７に転送を指示するだけでよい。ＤＭＡＣ１１１での転送が終了すると、ＤＭＡＣ１１１は、プロセッサ１０１に対して転送終了を割り込み通知する。この通知を受けると、ＤＭＡ制御部２０７は、ワークメモリ管理部２０６にＤＭＡ転送終了を通知する。
【００５９】
図１６は、ＤＭＡ転送終了後の処理内容を示すフローチャートである。ワークメモリ管理部２０６がおこなう処理について説明する。ワークメモリ管理部２０６は、ＤＭＡ制御部２０７からＤＭＡ転送終了の通知を受けると、終了したスレッドの転送の転送元と転送先アドレスを取得する（ステップＳ１６０１）。そして、転送元がワークメモリ１０３であるか判断する（ステップＳ１６０２）。転送元がワークメモリ１０３でなければ（ステップＳ１６０２：Ｎｏ）、ステップＳ１６１３に移行する。
【００６０】
転送元がワークメモリ１０３であれば（ステップＳ１６０２：Ｙｅｓ）、転送元に対応するワークメモリ管理情報２２１の転送中フラグ１１０３をＦａｌｓｅに設定する（ステップＳ１６０３）。そして、ワークメモリ１０３利用フラグ１１０２がＴｒｕｅのスレッドをランキュー２２０から取得する（ステップＳ１６０４）。また、ワークメモリ管理情報２２１を取得して（ステップＳ１６０５）、取得したスレッドがワークメモリ１０３に領域をもっているか確認する（ステップＳ１６０６）。
【００６１】
つぎに、ワークメモリ１０３に領域をもたないスレッドがあるか判断する（ステップＳ１６０７）。領域をもたないスレッドがなければ（ステップＳ１６０７：Ｎｏ）、ステップＳ１６１３に移行する。領域をもたないスレッドがあれば（ステップＳ１６０７：Ｙｅｓ）、領域をもたないスレッドのうち、最も実行順の早いスレッドを取得し（ステップＳ１６０８）、ワークメモリ領域確保処理（図１５参照）を実行する（ステップＳ１６０９）。そして、ワークメモリ１０３上でのワークメモリ領域確保成功かを判断する（ステップＳ１６１０）。
【００６２】
領域確保成功でなければ（ステップＳ１６１０：Ｎｏ）、ステップＳ１６１３に移行し、領域確保成功であれば（ステップＳ１６１０：Ｙｅｓ）、確保した領域をスタック領域７０１として使えるように、ＭＭＵ１１３に対しプロセス管理情報２２２に記録したアドレスの変換情報を設定する（ステップＳ１６１１）。そして、ＤＭＡ制御部２０７にメモリ１１０からワークメモリ領域へ転送指示する（ステップＳ１６１２）。
【００６３】
その後、ステップＳ１６１３では、スレッドの転送先がワークメモリ１０３であるか判断し（ステップＳ１６１３）、転送先がワークメモリ１０３でなければ（ステップＳ１６１３：Ｎｏ）、処理を終了する。転送先がワークメモリ１０３であれば（ステップＳ１６１３：Ｙｅｓ）、転送先に対応するワークメモリ管理情報２２１の転送中フラグ１１０３をＦａｌｓｅに設定し（ステップＳ１６１４）、処理を終了する。
【００６４】
（実行スレッドの切り替え処理内容について）
図１７は、実行スレッドの切り替え時の処理内容を示すフローチャートである。スレッドの切り替えは、タイマー１０９の割込により、スケジューラ部２１０が処理をおこなう。はじめに、スケジューラ部２１０は、これまで実行していたスレッドの実行情報をスレッド管理情報２２３に記録して実行中のスレッドを中断する（ステップＳ１７０１）。そして、中断したスレッドをランキュー２２０の末尾に追加し（ステップＳ１７０２）、ワークメモリ管理部２０６により領域の入れ替え処理をおこなう（ステップＳ１７０３）。
【００６５】
この後、負荷分散部２０５による負荷分散処理をおこなう（ステップＳ１７０４）。そして、ランキュー２２０の先頭から、つぎに実行するスレッドを取得し（ステップＳ１７０５）、ワークメモリ管理情報２２１の利用フラグ１１０２がＴｒｕｅであるか判断する（ステップＳ１７０６）。利用フラグ１１０２がＴｒｕｅでなければ（ステップＳ１７０６：Ｎｏ）、ステップＳ１７０９に移行する。
【００６６】
利用フラグ１１０２がＴｒｕｅであれば（ステップＳ１７０６：Ｙｅｓ）、ワークメモリ１０３上のスタック領域７０１の転送状態をチェックする（ステップＳ１７０７）。転送済みでなければ、ＤＭＡＣ１１１転送完了の処理により転送中フラグがＦａｌｓｅになるのを待つ（ステップＳ１７０８：Ｎｏ）。転送済みとなれば（ステップＳ１７０８：Ｙｅｓ）、そのスレッドが属するプロセス管理情報２２２に記録されたＭＭＵ１１３の設定情報に基づいて、ＭＭＵ１１３を設定し（ステップＳ１７０９）、タイマー１０９を設定し（ステップＳ１７１０）、スレッド管理情報２２３に記録されたスレッドの実行情報を読み込み、スレッドの実行を開始して（ステップＳ１７１１）、処理を終了する。
【００６７】
（領域入れ替え処理内容について）
図１８は、領域入れ替えの処理内容を示すフローチャートである。図１７のステップＳ１７０３に示したワークメモリ管理部２０６がおこなうメモリ１１０およびワークメモリ１０３間での領域入れ替え処理内容について説明する。領域入れ替えの処理では、全てのスレッドのスタック領域７０１がワークメモリ１０３上にあれば入れ替えの必要はないため、ワークメモリ１０３上にスタック領域７０１がないスレッドがあるときだけ、領域入れ替え処理をおこなう。
【００６８】
はじめに、領域入れ替えの該当スレッドのスレッド管理情報２２３を取得する（ステップＳ１８０１）。そしてワークメモリ管理情報２２１の該当スレッドの利用フラグ１１０２がＴｒｕｅであるか判断する（ステップＳ１８０２）。利用フラグ１１０２がＴｒｕｅでなければ（ステップＳ１８０２：Ｎｏ）、処理を終了する。利用フラグ１１０２がＴｒｕｅであれば（ステップＳ１８０２：Ｙｅｓ）、ワークメモリ１０３の利用フラグ１１０２がＴｒｕｅのスレッドをランキュー２２０から取得する（ステップＳ１８０３）。そしてワークメモリ管理情報２２１を取得し（ステップＳ１８０４）、取得したスレッドがワークメモリ１０３に領域をもっているか確認する（ステップＳ１８０５）。
【００６９】
領域をもたないスレッドがなければ（ステップＳ１８０６：Ｎｏ）、処理を終了する。領域をもたないスレッドがあれば（ステップＳ１８０６：Ｙｅｓ）、この領域をもたないスレッドがワークメモリ１０３上にもつ領域を取得し（ステップＳ１８０７）、ＤＭＡ制御部２０７に取得した領域のメモリ１１０への転送を指示し（ステップＳ１８０８）、処理を終了する。このように、ＤＭＡＣ１１１を用いてこれまで実行していたスレッドのスタック領域７０１をワークメモリ１０３からメモリ１１０に転送する。この転送により空いた領域に、別のスレッドのスタック領域７０１を確保することは、ＤＭＡＣ１１１での転送終了後に、ＤＭＡ転送終了処理（図１６参照）でおこなわれる。
【００７０】
（負荷分散処理内容について）
図１９は、負荷分散の処理内容を示すフローチャートである。図１７のステップＳ１７０４に示した負荷分散部２０５がおこなう処理について説明する。はじめに、負荷が最も高いプロセッサ１０１と最も低いプロセッサ１０１を選択し（ステップＳ１９０１）、負荷が最も高いプロセッサ１０１と最も低いプロセッサ１０１の負荷を比較して、負荷の差があらかじめ設定された閾値以上であるか判断する（ステップＳ１９０２）。負荷の差が閾値未満であれば（ステップＳ１９０２：Ｎｏ）、負荷分散をおこなわず処理を終了する。
【００７１】
負荷の差が閾値以上であれば（ステップＳ１９０２：Ｙｅｓ）、両プロセッサ１０１のランキュー２２０を取得し（ステップＳ１９０３）、負荷の高いプロセッサ１０１から負荷の低いプロセッサ１０１にスレッドを移動する。はじめに、負荷の高いプロセッサ１０１から負荷の低いプロセッサ１０１にスレッドを移動したときに最も実行順の遅くなるスレッドを取得する（ステップＳ１９０４）。そして、ステップＳ１９０４で取得したスレッドを高負荷のプロセッサ１０１のランキュー２２０から削除する（ステップＳ１９０５）。また、この取得したスレッドを低負荷のプロセッサ１０１のランキュー２２０に追加する（ステップＳ１９０６）。この後、ワークメモリデータ移動処理をおこない（ステップＳ１９０７）、処理を終了する。
【００７２】
（ワークメモリデータ移動処理内容について）
図１９の処理により、移動対象のスレッドが決定するとワークメモリ管理部２０６は、ワークメモリ１０３上のデータの移動をおこなう。ワークメモリ１０３のデータ移動においては、移動対象のスレッドが移動元のプロセッサ１０１のワークメモリ１０３上にスタック領域７０１をもっているか否か、おおび移動先のプロセッサ１０１のワークメモリ１０３にスタック領域７０１を確保できたか否かに応じて処理内容が異なる。
【００７３】
移動元でワークメモリ１０３上に領域があり、移動先でもワークメモリ１０３上に領域が確保できた場合は、ＤＭＡＣ１１１を使って直接ワークメモリ１０３からワークメモリ１０３にデータを転送する。
【００７４】
移動元ではワークメモリ１０３に領域をもっていたが、移動先では領域を確保できなかった場合には、一旦メモリ１１０上のスタック領域７０１にデータを移動する。これとは逆に、移動元ではワークメモリ１０３上に領域をもたないが、移動先の領域が確保できた場合は、メモリ１１０上のスタック領域７０１からワークメモリ１０３にデータを移動する。移動元でワークメモリ１０３上に領域をもたず、移動先でも領域の確保に失敗した場合は、何も処理しない。このようにしてワークメモリ１０３上のデータの管理を可能とする。
【００７５】
図２０は、ワークメモリデータ移動の処理内容を示すフローチャートである。図１９のステップＳ１９０７に示したワークメモリ管理部２０６がおこなう処理について説明する。はじめにワークメモリ管理部２０６は、該当するスレッドのスレッド管理情報２２３を取得する（ステップＳ２００１）。また、ワークメモリ管理情報２２１の利用フラグ１１０２がＴｒｕｅであるか判断する（ステップＳ２００２）。利用フラグ１１０２がＴｒｕｅでなければ（ステップＳ２００２：Ｎｏ）、処理を終了する。
【００７６】
利用フラグ１１０２がＴｒｕｅであれば（ステップＳ２００２：Ｙｅｓ）、低負荷プロセッサ１０１側のワークメモリ領域確保処理（図１５参照）を実行する（ステップＳ２００３）。その実行結果、ワークメモリ１０３の領域確保が成功すれば（ステップＳ２００４：Ｙｅｓ）、ステップＳ２００５以下の処理を実行し、ワークメモリ１０３の領域確保が成功しなければ（ステップＳ２００４：Ｎｏ）、ステップＳ２０１３以下の処理を実行する。
【００７７】
ステップＳ２００５では、確保したワークメモリ１０３の領域の利用フラグ１１０２と転送中フラグ１１０３をＴｒｕｅに設定し（ステップＳ２００５）、ＭＭＵ１１３の設定を変更し（ステップＳ２００６）、高負荷側プロセッサ１０１のワークメモリ管理情報２２１を取得する（ステップＳ２００７）。そして、利用フラグ１１０２がＴｒｕｅで利用スレッドが対象スレッドのスタック領域７０１を取得し（ステップＳ２００８）、領域の取得に成功したか判断する（ステップＳ２００９）。
【００７８】
領域の取得に成功のときには（ステップＳ２００９：Ｙｅｓ）、取得した領域の利用フラグ１１０２をＦａｌｓｅに設定し、転送中フラグ１１０３をＴｒｕｅに設定し（ステップＳ２０１０）、ＤＭＡ制御部２０７に対し、ワークメモリ１０３から同じワークメモリ１０３内でのデータ転送を指示し（ステップＳ２０１１）、処理を終了する。
【００７９】
領域の取得に成功しなかったときには（ステップＳ２００９：Ｎｏ）、ＤＭＡ制御部２０７に対し、メモリ１１０からワークメモリ１０３へのデータ転送を指示し（ステップＳ２０１２）、処理を終了する。
【００８０】
また、ステップＳ２００４の判断結果、ワークメモリ１０３の領域確保が成功しなければ（ステップＳ２００４：Ｎｏ）、高負荷側プロセッサ１０１のワークメモリ管理情報２２１を取得する（ステップＳ２０１３）。そして、利用フラグ１１０２がＴｒｕｅで利用スレッドが対象スレッドのスタック領域７０１を取得し（ステップＳ２０１４）、領域の取得に成功したか判断する（ステップＳ２０１５）。領域の取得に成功しなかったときには（ステップＳ２０１５：Ｎｏ）、処理を終了する。
【００８１】
領域の取得に成功のときには（ステップＳ２０１５：Ｙｅｓ）、取得した領域の利用フラグ１１０２をＦａｌｓｅに設定し、転送中フラグ１１０３をＴｒｕｅに設定し（ステップＳ２０１６）、ＤＭＡ制御部２０７に対し、ワークメモリ１０３からメモリ１１０へのデータ転送を指示し（ステップＳ２０１７）、処理を終了する。
【００８２】
（スレッドの移動およびＤＭＡを用いたデータ移動の処理タイミングについて）
図２１は、実施の形態１によるシステムの処理タイミングを示すシーケンス図である。スレッドの移動およびＤＭＡＣ１１１を用いたスレッドのデータ移動について説明する。複数のプロセッサ（ＣＰＵ＃０，＃１）１０１と、ＯＳ２０１と、ＤＭＡ制御部２０７（ＤＭＡＣ１１１）の各部について縦軸の時間経過毎の処理内容を示した。
【００８３】
第１のプロセッサ（ＣＰＵ＃０）１０１は、ランキュー２２０のスレッドｎ，ｍ，ｌの順で処理実行し、第２のプロセッサ（ＣＰＵ＃１）は、ランキュー２２０のスレッドｋを処理実行しているとする。このとき、ＯＳ２０１は、負荷分散部２０５が第１のプロセッサ（ＣＰＵ＃０）１０１の負荷が高いため、負荷分散をおこない、第１のプロセッサ（ＣＰＵ＃０）１０１のスレッドｌを第２のプロセッサ（ＣＰＵ＃１）１０１に移動させることを決定したとする（ステップＳ２１０１）。
【００８４】
この際、ＯＳ２０１は、スレッドｌの固有データを第２のプロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３に移動させる（ステップＳ２１０２）。これにより、第２のプロセッサ（ＣＰＵ＃１）１０１のランキュー２２０には、つぎの処理としてスレッドｌが入っている。なお、図２１の処理例では、スレッドｌの固有データの移動中において、第１のプロセッサ（ＣＰＵ＃０）１０１にスレッド切り替えを指示し（ステップＳ２１０３）、第１のプロセッサ（ＣＰＵ＃０）１０１は、処理実行するスレッドがスレッドｎからスレッドｍを実行する。
【００８５】
ＤＭＡ２０７により、スレッドｌの固有データを第２のプロセッサ（ＣＰＵ＃１）１０１のワークメモリ１０３に移動終了した後（ステップＳ２１０４）、ＯＳ２０１は、第２のプロセッサ（ＣＰＵ＃１）１０１のスレッドｋの実行終了により、つぎにスレッドｌを処理実行させるスレッド切り替えを指示する（ステップＳ２１０５）。また、第１のプロセッサ（ＣＰＵ＃０）１０１に対してもスレッドｍの処理終了によりスレッドｎの処理を再開させるスレッド切り替えを指示する（ステップＳ２１０６）。
【００８６】
このように、実施の形態１によれば、タイムスライス実行に基づき複数のスレッドを実行している間に、移動先プロセッサのワークメモリにスレッド固有のデータを移動させる。データの移動は、ＤＭＡを用いてプロセッサによるスレッド実行と並行しておこなう。これにより、複数のプロセッサにおける負荷分散時のオーバーヘッドを小さくできるようになる。
【００８７】
また、移動先のワークメモリの空きがない場合には、移動先のプロセッサのスレッド実行順に基づいて、スレッドの実行順を優先順にしたがい変更し、実行順が遅いスレッドのデータを一旦メモリに追い出す。これにより、空いたワークメモリにスレッドのデータを移動させることができ、スレッドの実行を効率的におこなえるようになり、複数のプロセッサを備えたシステム全体の処理効率を向上できるようになる。
【００８８】
（実施の形態２）
実施の形態１ではスタック領域７０１のみをワークメモリ１０３に載せる構成としたが、データ領域のなかにも特定のスレッドからしか利用されない領域を有することがある。実施の形態２は、プログラムの解析などにより、データ領域にも特定のスレッドからしか利用されないデータがあることがわかっている場合に対応する構成例である。
【００８９】
図２２は、実施の形態２にかかるデータ領域の配置を示す図表である。図示のように、データ領域を共有データ領域２２０１と固有データ領域２２０２とに分け、特定のスレッドからのみ利用されるデータは、固有データ領域２２０２にそれぞれ配置するように実行モジュールを作成する。実行モジュールの段階ではスレッドが存在しないため、識別番号（固有データ＃０，＃１）で管理し、スレッドを生成する段階でスレッド（スレッドＸ，Ｙ）と関連づける。
【００９０】
実施の形態２においても、ワークメモリ管理部２０６の処理内容は基本的に実施の形態１と変わらない。異なる処理としては、必要な領域を求めるときＭＭＵ１１３の設定でスタック領域７０１に固有データ領域を含めておこなう。固有データ領域２２０２は、初期値が設定されるため、ワークメモリデータ移動処理（図２０）における領域の確保に成功したときに（ステップＳ２００４）、ＤＭＡＣ１１１を用いてメモリ１１０上の固有データ領域２２０２のデータをワークメモリ１０３に移動させればよい。このように、実施の形態２によれば、実施の形態１に加えて、特定のスレッドからしか利用されないデータのワークメモリ１０３への移動にも対応できるようになる。
【００９１】
（実施の形態３）
実施の形態３では、短時間で処理されるスレッド実行時におけるデータ転送の判断について説明する。Ｉ／Ｏスレッドと呼ばれる不定期に短時間だけ動作するようなスレッドがある。このようなスレッドは、たとえばキーボードからの入力を処理するためのスレッドなどがある。多くの場合、これらのスレッドは、優先度の高いスレッドとして取り扱われ、起動後速やかに実行されるようにスケジューリングされる。
【００９２】
したがって、このようなスレッドのスタック領域７０１を、上述した実施の形態１，２で説明した処理のままでワークメモリ１０３に配置すると、ＤＭＡＣ１１１でのデータ転送がスレッドの実行開始に間に合わない場合が生じる。しかしながら、このようなスレッドの多くは、高い処理性能が求められないものが多く、ワークメモリ１０３を利用しなくても処理に問題ないものが多い。また、このようなスレッドは不定期に短時間動作するため、負荷分散の対象とする必要がない。
【００９３】
このため、実施の形態３では、このようなスレッドを取り扱うために、スレッド管理情報２２３にワークメモリ１０３固定フラグを含ませる。そして、Ｉ／Ｏスレッドのなかでワークメモリ１０３を利用する必要のないスレッドについては、ワークメモリ管理情報２２１の利用フラグ１１０２の初期値をＦａｌｓｅにする。また、Ｉ／Ｏスレッドのなかでワークメモリ１０３を利用する必要があるスレッドについては、利用フラグ１１０２と、ワークメモリ１０３固定フラグの初期値をＴｒｕｅに設定しておく。なお、通常のスレッドは、ワークメモリ１０３の利用フラグ１１０２の初期値がＴｒｕｅ、ワークメモリ１０３固定フラグの初期値はＦａｌｓｅとする。
【００９４】
そして、ワークメモリ１０３の利用フラグ１１０２の初期値がＦａｌｓｅの場合は、ワークメモリ管理部２０６は、ワークメモリ１０３領域の初期獲得の処理（図１３に示すスタック領域確保処理）において、スタック領域７０１の大きさにかかわらず領域の確保をおこなわないこととすればよい。これにより、以降の処理では、ワークメモリ１０３の利用フラグ１１０２がＦａｌｓｅであるため、ワークメモリ１０３に関する処理はおこなわれないこととなる。
【００９５】
ワークメモリ１０３固定フラグがＴｒｕｅの場合は、ワークメモリ領域確保の処理（図１５参照）、あるいは領域入れ替えの処理（図１８参照）において、メモリ１１０に転送する対象の領域として、ワークメモリ１０３固定フラグがＴｒｕｅのスレッドが利用している領域を選択しないようにする。また、これに伴い、ワークメモリ１０３の領域数が減るため、領域確保の処理（図１５参照）において、空き領域を算出するときに（ステップＳ１５０４）、ワークメモリ１０３固定フラグがＴｒｕｅのスレッドが利用している領域を除外して算出する。
【００９６】
また、新たにワークメモリ１０３利用フラグがＴｒｕｅのスレッドが領域を確保する際には、ランキュー２２０に登録されている全てのスレッドに対して必要な領域数を求めて事実上の最大利用可能領域数（ワークメモリ１０３の領域数−固定フラグの領域数）からワークメモリ１０３利用フラグの再設定をおこなうようにすればよい。このように、実施の形態３では、短時間で処理される特定のスレッド実行時には、ワークメモリ１０３の領域確保およびスレッドの移動にかかる処理を除外することができるため、スレッドの種別にかかわらずシステム全体の処理効率を向上させることができるようになる。
【００９７】
（システムの適用例）
図２３は、図３および図４に示したデータ処理装置を用いたシステムの適用例を示す図である。図２３において、ネットワークＮＷは、サーバ２３０１，２３０２とクライアント２３３１〜２３３４とが通信可能なネットワークであり、たとえば、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネット、携帯電話網などで構成される。
【００９８】
サーバ２３０２は、クラウド２３２０を構成するサーバ群（サーバ２３２１〜２３２５）の管理サーバである。クライアント２３３１〜２３３４のうち、クライアント２３３１はノート型パソコン、クライアント２３３２はデスクトップ型パソコン、クライアント２３３３は携帯電話機（スマートフォン、ＰＨＳ（Ｐｅｒｓｏｎａｌ  Ｈａｎｄｙｐｈｏｎｅ  Ｓｙｓｔｅｍ）でもよい）、クライアント２３３４はタブレット型端末である。図２３のサーバ２３０１，２３０２，２３２１〜２３２５、クライアント２３３１〜２３３４は、たとえば、図３，４に示したデータ処理装置１００により実現される。
【００９９】
また、図３，４に示したデータ処理装置１００は、複数のデータ処理装置１００のそれぞれに対応してワークメモリ１０３と、複数のデータ処理装置１００で共有されるメモリ１１０とを備え、データ処理装置１００の間でスレッドを移動させる構成にも適用することができる。さらに、ワークメモリ１０３は、複数のデータ処理装置１００のうちのいずれかのデータ処理装置１００が備えた構成とすることもできる。
【０１００】
以上説明した各実施の形態によれば、ワークメモリを有する複数のプロセッサがそれぞれ複数のスレッドを実行している間に、移動先プロセッサのワークメモリにスレッド固有のデータを移動させることができるようになる。また、ＤＭＡを用いてデータの移動をバックグラウンドでおこなうため、このデータの移動がスレッドの処理性能に影響を与えず、データの移動を効率的におこなうことができ、負荷分散時のオーバーヘッドを小さくできるようになる。これにより、負荷分散しやすくなるため、複数のスレッドの実行時間を公平化でき、複数のプロセッサを備えたシステム全体の処理効率を向上できるとともに、消費電力を削減することもできるようになる。特に、汎用のＤＶＦＳ制御（Ｄｙｎａｍｉｃ  Ｖｏｌｔａｇｅ  Ｆｒｅｑｕｅｎｃｙ  Ｓｃａｌｉｎｇ）と組み合わせることにより、消費電力の大幅な削減が期待できるようになる。
【符号の説明】
【０１０１】
１００  データ処理装置
１０１  プロセッサ（ＣＰＵ）
１０２  Ｌ１キャッシュ
１０３  ワークメモリ
１０５  Ｌ２キャッシュ
１０６  スヌープ機構
１０９  タイマー
１１０  メモリ
１１０ａ  ＯＳ領域
１１０ｂ  プロセス領域
１１１  ＤＭＡＣ
２０２  プロセス管理部
２０３  スレッド管理部
２０４  メモリ管理部
２０５  負荷分散部
２０６  ワークメモリ管理部
２０７  ＤＭＡ制御部
２１０  スケジューラ部
２２０  ランキュー
２２１  ワークメモリ管理情報
２２２  プロセス管理情報
２２３  スレッド管理情報
【図１】
2013001614.tif 000003
【図２】
2013001614.tif 000004
【図３】
2013001614.tif 000005
【図４】
2013001614.tif 000006
【図５】
2013001614.tif 000007
【図６】
2013001614.tif 000008
【図７】
2013001614.tif 000009
【図８】
2013001614.tif 000010
【図９】
2013001614.tif 000011
【図１０】
2013001614.tif 000012
【図１１】
2013001614.tif 000013
【図１２】
2013001614.tif 000014
【図１３】
2013001614.tif 000015
【図１４】
2013001614.tif 000016
【図１５】
2013001614.tif 000017
【図１６】
2013001614.tif 000018
【図１７】
2013001614.tif 000019
【図１８】
2013001614.tif 000020
【図１９】
2013001614.tif 000021
【図２０】
2013001614.tif 000022
【図２１】
2013001614.tif 000023
【図２２】
2013001614.tif 000024
【図２３】
2013001614.tif 000025
【国際調査報告】
2013001614.tif 000026
2013001614.tif 000027
2013001614.tif 000028