(57)【要約】  シングルコア向けの実行オブジェクトを変更せずに、複数のコアに負荷分散する。ＣＰＵ（＃０）は、検出部（３０３）により、ＣＰＵ（＃２）に割り当てられた親スレッド（３０１）から生成される子スレッド（３０２）をＣＰＵ（＃１）に割り当てることを検出する。検出後、ＣＰＵ（＃０）は、親スレッド（３０１）と子スレッド（３０２）が排他的に動作するか否かを判定する。親スレッド（３０１）と子スレッド（３０２）が排他的に動作する場合、ＣＰＵ（＃０）は、親スレッドコンテキスト領域（３１１）に記憶される複写元データを、複写先の親スレッドコンテキスト領域（３１２）へ複写する。複写後、ＣＰＵ（＃０）は、複写先データのアドレスと所定値に基づいて、複写先データのアドレスへのオフセット値を算出する。算出後、ＣＰＵ（＃０）は、通知部（３０７）によって、複写先データのアドレスへのオフセット値をＣＰＵ（＃１）に通知する。
2012093488.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータによって実行されるスレッドを管理するスケジューラが、
処理される第１スレッドから第２スレッドが生成されるときに負荷が低いＣＰＵを選択し、
前記第２スレッドが前記第１スレッドと排他的動作を行うか否かを判定し、
前記第２スレッドが排他的動作を行うときに前記第１スレッドがアクセスする第１記憶領域を前記ＣＰＵが管理する第２記憶領域に複写し、
前記第２記憶領域のアドレスと所定値とに基づいて、前記第２スレッドが前記第１記憶領域にアクセスするための第２アドレスへのオフセットを算出し、
第１アドレスを、前記第２記憶領域にアクセスするための第３アドレスに変換するために前記第２アドレスへのオフセットを前記ＣＰＵに通知すること
を特徴とするスケジューリング方法。
【請求項２】
前記第２スレッドにおいて前記第３アドレスに基づいて前記第２記憶領域がアクセスされること
を特徴とする請求項１に記載のスケジューリング方法。
【請求項３】
前記第１記憶領域のアドレスと前記所定値に基づいて、前記第１アドレスへのオフセットを算出し、
前記第２記憶領域へのアクセスのレスポンスに対して、前記第１アドレスへのオフセットと前記所定値に基づいて、前記第３アドレスを前記第１記憶領域内を示す第４アドレスに変換するために前記第１アドレスへのオフセットを前記ＣＰＵに通知すること
を特徴とする請求項１に記載のスケジューリング方法。
【請求項４】
前記第１記憶領域が前記第２記憶領域に複写された後に、前記第１スレッドを退避させること
を特徴とする請求項１または請求項２に記載のスケジューリング方法。
【請求項５】
前記第１スレッドが排他的動作を行わないとき、キャッシュメモリを同期させるためのフラグをオンすること
を特徴とする請求項１に記載のスケジューリング方法。
【請求項６】
前記第１記憶領域が前記第２記憶領域に複写された後に、キャッシュメモリを同期させるためのフラグをオフすること
を特徴とする請求項１、請求項２または請求項４に記載のスケジューリング方法。
【請求項７】
前記第２スレッドが終了したときに、前記第２記憶領域内の更新部分を前記第１記憶領域に反映して、前記第１スレッドを復帰させること
を特徴とする請求項１乃至請求項６の何れか一に記載のスケジューリング方法。
【請求項８】
第１ＣＰＵと第２ＣＰＵとを含む複数のＣＰＵと、
前記第１ＣＰＵに対応するスケジューラと、
前記複数のＣＰＵにバスを介して接続されるとともに、第１記憶領域と第２記憶領域とを含むメモリと、
前記複数のＣＰＵのうちの少なくとも一のＣＰＵと前記メモリとの間に配置されるアドレス変換装置と、
を含み、
前記アドレス変換装置は、前記第１ＣＰＵが管理する前記第１記憶領域にアクセスするためのアドレスを前記第２ＣＰＵが管理する前記第２記憶領域にアクセスするためのアドレスに変換すること
を特徴とするマルチコアプロセッサシステム。
【請求項９】
前記アドレス変換装置は、前記第１記憶領域のアドレスと前記第１ＣＰＵにおいて実行される第１スレッドに基づいて生成される第２スレッドが前記第１記憶領域にアクセスするためのアドレスとのオフセットに基づいて、アドレスを変換すること
を特徴とする請求項８に記載のマルチコアプロセッサシステム。
【請求項１０】
前記アドレス変換装置は、前記第２記憶領域へのアクセスのレスポンスに対して、前記第１記憶領域へのオフセットと所定値に基づいて、前記第２記憶領域のアドレスを前記第１領域のアドレスに変換すること
を特徴とする請求項８に記載のマルチコアプロセッサシステム。
【請求項１１】
前記アドレス変換装置は、フラグがオン設定されているときにアドレスを変換し、前記フラグがオフ設定されているときにアドレスを変換しないこと
を特徴とする請求項８または請求項９に記載のマルチコアプロセッサシステム。
【請求項１２】
前記フラグは、前記第１ＣＰＵにおいて実行される第１スレッドに基づいて生成される第２スレッドの種類に基づいて設定されること
を特徴とする請求項１１に記載にマルチコアプロセッサシステム。
【請求項１３】
前記第２スレッドが前記第１スレッドと排他的動作を行う場合に前記フラグがオン設定されること
を特徴とする請求項１２に記載のマルチコアプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スレッドのスケジューリング方法、およびマルチコアプロセッサシステムに関する。
【背景技術】
【０００２】
近年、１つのシステム内に、複数のコアを有するマルチコアプロセッサシステムの形態を採用する機器が増加している。マルチコアプロセッサシステム対応のプログラムを生成する場合、従来の１つのシステム内に１つのコアを有するシングルコアプロセッサシステム用のプログラムを基に、プログラム内の並列性を抽出する作業が発生する。特に、近年のソフトウェアは複雑で規模が大きいため、新しく生成するのではなく、従来からあるソフトウェア資産を流用してマルチコアプロセッサシステム用のプログラムを生成することで、プログラム生成に伴う工数、検証に伴う工数を減らすことができる。並列性を抽出する方法としては、人為的に検索する場合、または、コンパイラが並列性を抽出する技術が存在する（従来技術１と称する。）。【０００３】
従来技術１を適用し、抽出された並列処理をそれぞれのコアに割り当てることで、マルチコアプロセッサシステムは、単一のコアで処理を実行する場合より高速に処理を実行することができる。なお、各コアは、プログラムの実行単位となるスレッドを実行している。また、１以上のスレッドを有するプロセスは、スレッドが利用するメモリやデバイスの管理単位である。プロセス、スレッドの性質として、同一のプロセスに属するスレッドは、メモリ空間を共有し、異なるプロセスに属するスレッド間では、メモリ空間を共有しない。【０００４】
また、複数のコアの処理能力を生かす技術として、複数のアプリケーションソフトウェア（以下、「アプリ」と称する）が起動された場合、これらのアプリを別々のコアで実行することで、コアの並列効果を得る技術が開示されている（従来技術２と称する。）。また、複数のコアの負荷分散を行う技術として、周期的に複数のコアの負荷量を取得し、各コアに割り当てられたスレッドを再配置する技術が開示されている（従来技術３と称する）。【０００５】
また、並列処理を行うか否かの判断技術として、親スレッドによるフォーク命令を、他のコアで実行可能か否かを判定し、可能である場合は、他のコアで子スレッドを実行する技術が開示されている。また、他のコアで子スレッドを実行する際に用いられる技術として、スレッドのコンテキスト領域を他のコアが管理する記憶領域に複写する技術が開示されている（たとえば、下記特許文献１、２を参照。）。なお、コンテキスト領域とは、ＣＰＵのレジスタの値、プログラムカウンタ、スタックポインタなどといったスレッドが使用するデータを格納する領域である。【０００６】
また、スレッドを他のコアに移動させる際に発生するアドレス衝突を回避する技術として、メモリのアドレス空間を複数のスレッドで共有するアドレス空間と、スレッド間で共有しないアドレス空間を有する技術が開示されている（たとえば、下記特許文献３を参照。）。特許文献３にかかる技術では、後者のアドレス空間に対するメモリアクセスの場合にアドレス変換を行い、アドレス空間を任意に移動できるようにすることで、アドレス衝突を回避できる。【０００７】
また、親スレッドから生成される子スレッドの種別として、子スレッドが親スレッドと排他動作するブロッキングスレッドと、子スレッドと親スレッドが独立して動作するノンブロッキングスレッドが存在する。以下、図１５にてブロッキングスレッドとノンブロッキングスレッドの動作を示す。【０００８】
図１５は、ブロッキングスレッドとノンブロッキングスレッドの動作を示す説明図である。符号１５０１で示す説明図はブロッキングスレッドの動作について説明を行い、符号１５０２で示す説明図はノンブロッキングスレッドの動作について説明を行う。【０００９】
符号１５０１で示す説明図内におけるプロセス１５０３は、親スレッド１５０４とブロッキング子スレッド１５０５を含んでいる。親スレッド１５０４とブロッキング子スレッド１５０５は、メモリ内に存在する同一のコンテキスト領域１５０６にアクセスする。ブロッキング子スレッド１５０５の実行中において、親スレッド１５０４は停止しており、ブロッキング子スレッド１５０５は、コンテキスト領域１５０６に記憶されたデータを更新する。ブロッキング子スレッド１５０５の実行終了後、親スレッド１５０４は、更新されたコンテキスト領域１５０６を継承し、処理を実行する。【００１０】
このように、ブロッキング子スレッド１５０５は、親スレッド１５０４と独立した動作を行うが、親スレッド１５０４と同時実行すると、コンテキスト領域１５０６への同時アクセスによるリスクが存在する。したがって、ブロッキング子スレッド１５０５は、親スレッド１５０４と完全排他を取って実行する。【００１１】
次に、符号１５０２で示す説明図内におけるプロセス１５０７は、親スレッド１５０８とノンブロッキング子スレッド１５０９を含んでいる。親スレッド１５０８とノンブロッキング子スレッド１５０９は、メモリ内に存在する同一のコンテキスト領域１５１０にアクセスする。ノンブロッキング子スレッド１５０９の実行中も親スレッド１５０８は実行され、ノンブロッキング子スレッド１５０９のアクセスとは異なるタイミングでコンテキスト領域１５１０にアクセスする。【００１２】
このように、ノンブロッキング子スレッド１５０９は、親スレッド１５０８とは異なるタイミングでメモリアクセスを行うため、同時実行が許容されている。もし、コンテキスト領域１５１０に同時にアクセスする可能性があり、親スレッド１５０８とノンブロッキング子スレッド１５０９間で同期を取る場合、両スレッドのコードには、スレッド間通信を用いて排他処理、または同期処理を行うコードが挿入されている。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００３−２９９８４号公報
【特許文献２】特開平５−１２７９０４号公報
【特許文献３】特開平９−１４６９０４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１４】
上述した従来技術において、従来技術１にかかる技術では、並列動作させる際にはソースコードに排他処理、または同期処理を挿入する。しかしながら、人為的に検索した場合は、排他処理、または同期処理の挿入漏れが発生し、プログラム内に不具合が発生してしまうという問題があった。また、コンパイラが並列性を抽出する場合、ソフトウェア内の様々な動作状態を判断することが困難であり、適切な排他処理、または同期処理を選択することが困難であるという問題があった。【００１５】
また、人為的に検索した場合、またはコンパイラが並列性を抽出する場合のいずれの方法であっても、生成される実行オブジェクトは、シングルコアプロセッサシステム用の実行オブジェクトから変更されている。したがって、検証工数の減少はほとんどなく、マルチコアプロセッサシステム用の実行オブジェクトに対する膨大な検証工程が発生するという問題があった。【００１６】
また、従来技術２にかかる技術では、１つのアプリに着目すると、シングルコアプロセッサシステムと同速度で実行することになり、マルチコアプロセッサの恩恵を受けていないという問題があった。また、１つのアプリに着目した場合、複数のコアが存在するにも関わらず、１つのコアに負荷が集中するという問題があった。また、従来技術３にかかる技術は、スレッドが別のコアに移行可能であることを要求する。しかしながら、子スレッドがブロッキングスレッドの場合、子スレッドが親スレッドをブロッキングするために移行することが困難であるという問題があった。【００１７】
本発明は、上述した従来技術による問題点を解消するため、シングルコア向けの実行オブジェクトを変更せずに、複数のコアに負荷分散できるスケジューリング方法、およびマルチコアプロセッサシステムを提供することを目的とする。
【課題を解決するための手段】
【００１８】
上述した課題を解決し、目的を達成するため、開示のスケジューリング方法は、処理される第１スレッドから第２スレッドが生成されるときに負荷が低いＣＰＵを選択し、第２スレッドが第１スレッドと排他的動作を行うか否かを判定し、第２スレッドが排他的動作を行うときに第１スレッドがアクセスする第１記憶領域を負荷が低いＣＰＵが管理する第２記憶領域に複写し、第２記憶領域のアドレスと所定値とに基づいて、第２スレッドが第１記憶領域にアクセスするための第２アドレスへのオフセットを算出し、第１アドレスを、第２記憶領域にアクセスするための第３アドレスに変換するために第２アドレスへのオフセットをＣＰＵに通知する。
【発明の効果】
【００１９】
本スケジューリング方法、およびマルチコアプロセッサシステムによれば、シングルコア向けの実行オブジェクトを変更せずに、複数のコアに負荷分散できるという効果を奏する。
【図面の簡単な説明】
【００２０】
【図１】図１は、マルチコアプロセッサシステム１００の動作を示す説明図である。
【図２】図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。
【図３】図３は、マルチコアプロセッサシステム１００の機能を示すブロック図である。
【図４】図４は、ブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。
【図５】図５は、ノンブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。
【図６】図６は、アドレス変換装置１０４の機能を示す説明図である。
【図７】図７は、ブロッキングスレッドを別ＣＰＵで実行する場合のアドレス変換装置１０４の設定例を示す説明図である。
【図８】図８は、シングルコア実行時におけるブロッキングスレッドとノンブロッキングスレッドの実行タイミングを示す説明図である。
【図９】図９は、ブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。
【図１０】図１０は、ノンブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。
【図１１】図１１は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その１）である。
【図１２】図１２は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その２）である。
【図１３】図１３は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その１）である。
【図１４】図１４は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その２）である。
【図１５】図１５は、ブロッキングスレッドとノンブロッキングスレッドの動作を示す説明図である。
【発明を実施するための形態】
【００２１】
以下に添付図面を参照して、開示のスケジューリング方法、およびマルチコアプロセッサシステムの好適な実施の形態を詳細に説明する。
【００２２】
図１は、マルチコアプロセッサシステム１００の動作を示す説明図である。図１におけるマルチコアプロセッサシステム１００は、複数のコアとなるＣＰＵｓ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０１と、メモリ１０２とを含む。マルチコアプロセッサシステム１００は、携帯電話といった携帯端末を想定している。ＣＰＵｓ１０１には、ＣＰＵ＃０とＣＰＵ＃１が含まれる。ＣＰＵｓ１０１とメモリ１０２は、バス１０３で接続されている。また、ＣＰＵ＃０、ＣＰＵ＃１は、それぞれ、アドレス変換装置１０４＃０、アドレス変換装置１０４＃１と通信可能である。アドレス変換装置１０４は、ＣＰＵのアクセス先アドレスを変換する機能を有する。
【００２３】
また、ＣＰＵ＃０は、メモリ１０２内の０ｘ１０００〜０ｘ１ｆｆｆをＣＰＵ＃０管理領域として使用し、ＣＰＵ＃１は、メモリ１０２内の０ｘ２０００〜０ｘ２ｆｆｆをＣＰＵ＃１管理領域として使用する。なお、ＣＰＵｓ１０１の各ＣＰＵは、自身の管理領域以外の領域にもアクセスできる。
【００２４】
また、ＣＰＵ＃０は、プロセス０、プロセス１を実行している。ＣＰＵ＃０は、プロセス０のデータを格納するプロセス０コンテキスト領域と、プロセス１のデータを格納するプロセス１コンテキスト領域とを、ＣＰＵ＃０管理領域に確保する。なお、プロセス０は、メモリ１０２に格納されている実行オブジェクト１０５が読み込まれた結果、生成されている。実行オブジェクト１０５は、シングルコア向けに生成された実行オブジェクトである。
【００２５】
プロセス０内の親スレッドがブロッキング子スレッド１の生成要求を行うと、マルチコアプロセッサシステム１００は、プロセス０の親スレッドコンテキスト領域１０６をＣＰＵ＃１管理領域に複写する。複写後、ブロッキング子スレッド１が割り当てられるＣＰＵ＃１は、複写先の親スレッドコンテキスト領域１０７内に、子スレッド１コンテキスト領域１０８を生成する。
【００２６】
続けて、プロセス０のブロッキング子スレッド１が実行されるタイミングにあわせて、マルチコアプロセッサシステム１００は、アドレス変換装置１０４＃１に対して、アドレス変換を行うように設定する。具体的には、アドレス変換装置１０４＃１は、ブロッキング子スレッド１からのアクセスに対し、ＣＰＵ＃１によるシングルコア時の子スレッド１コンテキスト領域１０９のアドレスから、子スレッド１コンテキスト領域１０８のアドレスに変換する。また、アドレス変換装置１０４＃１は、子スレッド１コンテキスト領域１０８から取得されたアクセスに対するレスポンスに対して、子スレッド１コンテキスト領域１０８のアドレスから、シングルコア時の子スレッド１コンテキスト領域１０９のアドレスに変換する。
【００２７】
このように、マルチコアプロセッサシステム１００は、ブロッキングスレッドを実行する場合、親スレッドのコンテキスト領域を複写し、ブロッキング子スレッドを実行するＣＰＵが複写先のコンテキスト領域にアクセスするようにアドレス変換する。これにより、マルチコアプロセッサシステム１００は、それぞれのＣＰＵが異なるアドレスにアクセスするために、ブロッキングスレッドを親スレッドのＣＰＵとは別のＣＰＵで実行できるため、シングルコア用のプロセスを負荷分散可能となる。
【００２８】
（マルチコアプロセッサシステムのハードウェア）
図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。図２において、マルチコアプロセッサシステム１００は、ＣＰＵを複数搭載するＣＰＵｓ１０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０１と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０２と、を含む。また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ２０３と、フラッシュＲＯＭコントローラ２０４と、フラッシュＲＯＭ２０５と、を含む。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ２０６と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０７と、キーボード２０８と、を含む。また、各部はバス１０３によってそれぞれ接続されている。
【００２９】
ここで、ＣＰＵｓ１０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ１０１は、シングルコアのプロセッサを並列して接続した全てのＣＰＵを指している。ＣＰＵｓ１０１は、ＣＰＵ＃０〜ＣＰＵ＃Ｎを含む。なお、Ｎは１以上の整数である。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００３０】
また、ＣＰＵ＃０〜ＣＰＵ＃Ｎは、それぞれ、アドレス変換装置１０４と通信可能である。さらに、ＣＰＵ＃０〜ＣＰＵ＃Ｎは、それぞれ専用のキャッシュメモリを有する。また、ＣＰＵ＃０〜ＣＰＵ＃Ｎは、専用のキャッシュメモリのコヒーレンシを取るため、スヌープ機構２１０＃０〜スヌープ機構２１０＃Ｎを有する。
【００３１】
スヌープ機構２１０は、ＣＰＵ＃０〜ＣＰＵ＃Ｎがアクセスするキャッシュメモリの整合性を取る装置である。スヌープ機構２１０＃０〜スヌープ機構２１０＃Ｎは、それぞれ通信を行っており、たとえば、ＣＰＵ＃０のキャッシュメモリが更新されると、スヌープ機構２１０＃０が、スヌープ機構２１０＃１〜スヌープ機構２１０＃Ｎに更新内容を通知する。スヌープ機構２１０のプロトコルとしては、無効型プロトコルと更新型プロトコルが存在する。いずれのプロトコルであっても、スヌープ機構２１０＃１〜スヌープ機構２１０＃Ｎは、自身のキャッシュメモリと他のキャッシュメモリと更新状態の情報を交換する。
【００３２】
なお、キャッシュメモリの整合性を取る装置は、キャッシュコヒーレンシ機構に分類され、キャッシュコヒーレンシ機構の一例として、スヌープ機構が存在する。キャッシュコヒーレンシ機構は、大別してスヌープ方式を採用したスヌープ機構とディレクトリ方式とがある。本実施の形態にかかるスヌープ機構２１０は、ディレクトリ方式を採用したキャッシュコヒーレンシ機構であってもよい。また、スヌープ機構２１０は、アドレス変換装置１０４とバス１０３の間に設置される。
【００３３】
ＲＯＭ２０１は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０２は、ＣＰＵｓ１０１のワークエリアとして使用される。フラッシュＲＯＭ２０３は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ２０７によって新しいＯＳを受信し、フラッシュＲＯＭ２０３に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００３４】
フラッシュＲＯＭコントローラ２０４は、ＣＰＵｓ１０１の制御にしたがってフラッシュＲＯＭ２０５に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２０５は、フラッシュＲＯＭコントローラ２０４の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ２０７を通して取得した画像データ、映像データや、本実施の形態であるスケジューリング方法を実行するプログラムが格納されていてもよい。フラッシュＲＯＭ２０５は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００３５】
ディスプレイ２０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイ２０６は、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００３６】
Ｉ／Ｆ２０７は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２０９に接続され、ネットワーク２０９を介して他の装置に接続される。そして、Ｉ／Ｆ２０７は、ネットワーク２０９と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０７には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３７】
キーボード２０８は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０８は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３８】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図３は、マルチコアプロセッサシステム１００の機能を示すブロック図である。マルチコアプロセッサシステム１００は、検出部３０３と、判定部３０４と、複写部３０５と、算出部３０６と、通知部３０７と、設定部３０８と、変換部３０９と、を含む。
【００３９】
この制御部となる機能のうち、検出部３０３〜通知部３０７は、記憶装置に記憶されたプログラムをＣＰＵ＃０が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０１、ＲＡＭ２０２、フラッシュＲＯＭ２０３、フラッシュＲＯＭ２０５などである。または、Ｉ／Ｆ２０７を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００４０】
なお、ＣＰＵ＃０は、ハイパーバイザ＃０、ＯＳ＃０を実行する。ハイパーバイザ＃０は、ＣＰＵ＃０などのハードウェア上で直接動作するプログラムである。ハイパーバイザ＃０は、ＣＰＵ＃０内のレジスタを直接参照したり、ＣＰＵ＃０内のレジスタの情報を読み出したり、ＣＰＵ＃０内のレジスタの情報を書き換えたりする特権命令を実行することができるプログラムである。ＯＳ＃０は、ハイパーバイザ＃０上で動作するソフトウェアである。ＯＳ＃０は、具体的には、スレッド、プロセスが利用するライブラリ群を提供する。また、ＯＳ＃０は、スレッド、プロセスをＣＰＵ＃０に割り当てるディスパッチャ、また、割り当てるスレッドを決定するスケジューラ３１０を有する。
【００４１】
なお、図３にて示しているように、ＣＰＵ＃１も、ハイパーバイザ＃１、ＯＳ＃１を実行する。さらに、図示していないが、ＣＰＵ＃２〜ＣＰＵ＃Ｎも、ハイパーバイザ、ＯＳを実行する。検出部３０３〜通知部３０７は、ＯＳ＃０の機能に含まれ、設定部３０８はハイパーバイザ＃１の機能に含まれ、変換部３０９は、アドレス変換装置１０４＃１の機能に含まれる。
【００４２】
なお、検出部３０３〜通知部３０７は、スケジューラ３１０の機能に含まれてもよい。また、検出部３０３〜通知部３０７がスケジューラ３１０の機能に含まれない場合、スケジューラ３１０がスレッド割当を行うことを通知する。また、図３では、ＣＰＵ＃２が、プロセス０の親スレッド３０１を実行し、ＣＰＵ＃１が子スレッド３０２を実行すると想定する。ＣＰＵ＃２は、親スレッド３０１の処理によって、親スレッドコンテキスト領域３１１にアクセスする。
【００４３】
また、図３では、検出部３０３〜通知部３０７が、ＣＰＵ＃０の機能であるように図示されているが、ＣＰＵ＃１〜ＣＰＵ＃Ｎの機能であってもよい。また、設定部３０８、変換部３０９は、子スレッドが割り当てられたＣＰＵに対応する機能である。したがって、たとえば、子スレッドがＣＰＵ＃０に割り当てられた場合に対応するため、ハイパーバイザ＃０とアドレス変換装置１０４＃０は、設定部３０８、変換部３０９と同等の機能を有していてもよい。同様に、ＣＰＵ＃２〜ＣＰＵ＃Ｎに対応するハイパーバイザ＃２〜ハイパーバイザ＃Ｎ、アドレス変換装置１０４＃２〜アドレス変換装置１０４＃Ｎも、設定部３０８、変換部３０９と同等の機能を有していてもよい。
【００４４】
検出部３０３は、複数のコアのうち第１コアに割り当てられた第１スレッドから生成される第２スレッドを第２コアに割り当てることを検出する機能を有する。たとえば、検出部３０３は、ＣＰＵｓ１０１のうちＣＰＵ＃２に割り当てられた第１スレッドとなる親スレッドから生成される子スレッド３０２をＣＰＵ＃１に割り当てることを検出する。なお、検出されたという情報は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００４５】
判定部３０４は、第１および第２スレッドが排他的に動作するか否かを判定する機能を有する。たとえば、判定部３０４は、子スレッド３０２がブロッキングスレッドである場合、第１および第２スレッドが排他的に動作すると判定し、子スレッド３０２がノンブロッキングスレッドである場合、第１および第２スレッドが排他的に動作しないと判定する。なお、判定結果は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００４６】
また、具体的な判定方法としては、ＯＳが、実行オブジェクトに親スレッドが実行停止するコードが記載されているか否かで判定することができる。たとえば、ＯＳが、ＰＯＳＩＸ（Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ）に準拠したＯＳである場合を想定する。ブロッキングスレッドが生成される場合、実行オブジェクトの親スレッドのコードには、スレッドの生成を行うｐｔｈｒｅａｄ＿ｃｒｅａｔｅ（）関数への命令が記載された後、スレッドの終了を待つｐｔｈｒｅａｄ＿ｊｏｉｎ（）関数への命令が記載されている。このような記載がされている場合、判定部３０４は、第２スレッドがブロッキングスレッドであると判定する。
【００４７】
複写部３０５は、判定部３０４によって第１および第２スレッドが排他的に動作すると判定された場合、第１スレッドがアクセスする複写元データを、複写元データが記憶される第１記憶領域とは異なる第２記憶領域へ複写する機能を有する。たとえば、複写部３０５は、子スレッド３０２がブロッキングスレッドである場合、親スレッドがアクセスする第１記憶領域となる親スレッドコンテキスト領域３１１内の複写元データを、第２記憶領域となる複写先の親スレッドコンテキスト領域３１２へ複写する。なお、複写を行ったという情報は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００４８】
算出部３０６は、複写部３０５によって複写された複写先データのアドレスとなる第２アドレスと所定値とに基づいて、第２アドレスへのオフセット値を算出する機能を有する。なお、所定値とは、スレッドのアクセスするメモリ範囲を示すマスク値である。たとえば、スレッドがアクセスするメモリ範囲が０ｘ１０００〜０ｘ１０ｆｆ、または０ｘ３１００〜０ｘ３１ｆｆのように、０ｘ０１００［バイト］である場合、マスク値は０ｘ００ｆｆとなる。メモリ範囲の大きさは、ＯＳが有するメモリ管理機能によって決定される。
【００４９】
また、算出部３０６は、複写先データのアドレスとなる第２アドレスと、所定値となるマスク値に対して反転した値と、の論理積を算出して、第２アドレスのオフセット値を算出してもよい。たとえば、算出部３０６は、複写先データのアドレスが０ｘ２０００で、マスク値が０ｘ００ｆｆである場合、複写先データへのアドレスのオフセット値を、０ｘ２０００＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ２０００として算出する。なお、ＮＯＴ（）は、引数内のビットを反転する機能を有する関数とする。
【００５０】
また、算出部３０６は、複写元データのアドレスとなる第１アドレスと所定値とに基づいて、複写元データのアドレスへのオフセット値を算出してもよい。また、算出部３０６は、複写元データのアドレスと、マスク値に対して反転した値と、の論理積を算出して、複写元データへのアドレスのオフセット値を算出してもよい。たとえば、算出部３０６は、複写元データのアドレスが０ｘ３０００で、マスク値が０ｘ００ｆｆである場合、複写元データへのアドレスのオフセット値を、０ｘ３０００＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ３０００として算出する。なお、算出結果は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００５１】
通知部３０７は、第１および第２スレッドが排他的に動作すると判定された場合、複写先データのアドレスへのオフセット値を通知する機能を有する。また、通知部３０７は、さらに第２スレッドの情報と所定値と複写元データのアドレスへのオフセット値とを第２コアに通知してもよい。たとえば、通知部３０７は、子スレッドがブロッキングスレッドか、ノンブロッキングスレッドかのうちいずれかという情報と、マスク値と、複写先データのアドレスへのオフセット値と、複写元データのアドレスへのオフセット値と、をＣＰＵ＃１に通知する。また、通知部３０７は、第１および第２スレッドが排他的に動作しないと判定された場合、第２スレッドの情報を第２コアに通知してもよい。
【００５２】
設定部３０８は、第２スレッドが実行される場合、通知された情報を、第２スレッドを実行するコアに対応するアドレス変換装置１０４とスヌープ機構２１０に設定する機能を有する。たとえば、設定部３０８は、第２スレッドがブロッキングスレッドである場合、アドレス変換装置１０４＃１に対しアドレス変換を行う設定にする。また、設定部３０８は、変換を行う情報として、所定値と複写先データのアドレスへのオフセット値と複写元データのアドレスへのオフセット値とをアドレス変換装置１０４＃１に設定する。あわせて、設定部３０８は、コヒーレンシオフの設定をスヌープ機構２１０＃１に設定する。
【００５３】
また、設定部３０８は、第２スレッドがノンブロッキングスレッドである場合、アドレス変換装置１０４＃１に対しアドレス変換を行わない設定にし、コヒーレンシオンの設定をスヌープ機構２１０＃１に設定する。
【００５４】
変換部３０９は、第２スレッドを割り当てることが検出された後、第２コアによる複写元データへのアクセスに対して、複写元データを示す第１アドレスを複写先データへのオフセット値と所定値とに応じて複写先データを示す第３アドレスに変換する機能を有する。たとえば、複写元データとなるシングルコア時の子スレッドコンテキスト領域３１３のアドレスを０ｘ３０１０とし、複写先データとなる子スレッドコンテキスト領域３１４のアドレスを０ｘ２０１０と想定する。このとき、変換部３０９は、複写元データとなるシングルコア時の子スレッドコンテキスト領域３１３へのアクセスに対して、アクセス先となるアドレス０ｘ３０１０を０ｘ２０１０に変換する。
【００５５】
また、変換部３０９は、第３アドレスから取得されたアクセスに対するレスポンスに対して、第３アドレスを複写元データへのオフセット値と所定値とに応じて複写元データを示す第４アドレスに変換してもよい。たとえば、第３アドレスを０ｘ２０１０とし、複写元データとなるシングルコア時の子スレッドコンテキスト領域３１３のアドレスを０ｘ３０１０と想定する。このとき、変換部３０９は、レスポンス元のアドレス０ｘ２０１０を０ｘ３０１０に変換する。なお、具体的な変換方法は、図７に後述する。
【００５６】
スケジューラ３１０は、マルチコアプロセッサシステム１００内のスレッドの割当を制御する機能を有する。たとえば、スケジューラ３１０は、マルチコアプロセッサシステム１００で実行中のスレッドのうち、親スレッド３０１をＣＰＵ＃２に割り当て、子スレッド３０２をＣＰＵ＃１に割り当てる。
【００５７】
図４は、ブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。図４で示すマルチコアプロセッサシステム１００は、ＣＰＵｓ１０１内にＣＰＵ＃０〜ＣＰＵ＃２を含んでいる。ＣＰＵ＃０は、プロセス０の親スレッドを実行し、ＣＰＵ＃１はプロセス０のブロッキング子スレッド１を実行し、ＣＰＵ＃２はプロセス０のブロッキング子スレッド２を実行する。
【００５８】
ブロッキング子スレッド１とブロッキング子スレッド２の実行開始時に、ＣＰＵ＃０は、ＣＰＵ＃０管理領域内に存在する親スレッドコンテキスト領域４０１を、ＣＰＵ＃１管理領域、ＣＰＵ＃２管理領域に複写する。複写後、ＣＰＵ＃１は、複写先の親スレッドコンテキスト領域４０２に、子スレッド１コンテキスト領域４０３を生成する。同様に、ＣＰＵ＃２は、複写先の親スレッドコンテキスト領域４０４に、子スレッド２コンテキスト領域４０５を生成する。
【００５９】
また、ブロッキング子スレッド１とブロッキング子スレッド２が実行されるタイミングにあわせて、マルチコアプロセッサシステム１００は、スヌープ機構２１０＃１とスヌープ機構２１０＃２を、コヒーレンシオフに設定する。スヌープ機構２１０の設定と同時に、マルチコアプロセッサシステム１００は、アドレス変換装置１０４＃１とアドレス変換装置１０４＃２に対して、アドレス変換を行うように設定する。
【００６０】
なお、コヒーレンシオフとなったスヌープ機構２１０＃１とスヌープ機構２１０＃２は、キャッシュメモリの整合性を取ることを停止する。具体的に、スヌープ機構２１０＃１とスヌープ機構２１０＃２は、他のスヌープ機構２１０にキャッシュメモリの更新内容を通知しない。
【００６１】
具体的には、アドレス変換装置１０４＃１は、ＣＰＵ＃１によるメモリ１０２へのアクセスのアドレスを、シングルコア時の子スレッド１コンテキスト領域４０６のアドレスから、子スレッド１コンテキスト領域４０３に変換する。たとえば、アドレス変換装置１０４＃１は、シングルコア時の子スレッド１コンテキスト領域４０６の先頭アドレスである０ｘ１０１０を、子スレッド１コンテキスト領域４０３の先頭アドレス０ｘ２０１０に変換する。
【００６２】
同様に、アドレス変換装置１０４＃２は、ＣＰＵ＃２によるメモリ１０２へのアクセスのアドレスを、シングルコア時の子スレッド２コンテキスト領域４０７のアドレスから、子スレッド２コンテキスト領域４０５に変換する。たとえば、アドレス変換装置１０４＃２は、シングルコア時の子スレッド２コンテキスト領域４０７の先頭アドレスである０ｘ１０２０を、子スレッド２コンテキスト領域４０５の先頭アドレス０ｘ３０２０に変換する。
【００６３】
なお、ブロッキング子スレッド１は、子スレッド１コンテキスト領域４０３へのアクセスの他に、複写先の親スレッドコンテキスト領域４０２にもアクセスする場合がある。親スレッドコンテキスト領域には、たとえば、他の子スレッドの情報が格納されている。たとえば、ブロッキング子スレッド１が他の子スレッドの停止、再開といったような制御を行う場合、ＣＰＵ＃１は、複写先の親スレッドコンテキスト領域４０２内に存在する他の子スレッドの状態情報を変更する。
【００６４】
ブロッキング子スレッド１の終了後、ＣＰＵ＃１は、複写先の親スレッドコンテキスト領域４０２の更新部分を複写元となる親スレッドコンテキスト領域４０１に反映する。同様に、ブロッキング子スレッド２の終了後、ＣＰＵ＃２は、複写先の親スレッドコンテキスト領域４０４の更新部分を複写元となる親スレッドコンテキスト領域４０１に反映する。
【００６５】
また、図４で示すマルチコアプロセッサシステム１００において、ブロッキング子スレッドを実行するＣＰＵ＃１とＣＰＵ＃２は、別々の記憶領域にアクセスするようになるため、メモリアクセスの効率化が行われる。
【００６６】
図５は、ノンブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。図５で示すマルチコアプロセッサシステム１００は、ＣＰＵｓ１０１内にＣＰＵ＃０〜ＣＰＵ＃２を含んでいる。ＣＰＵ＃０は、プロセス１の親スレッドを実行し、ＣＰＵ＃１はプロセス１のノンブロッキング子スレッド１を実行し、ＣＰＵ＃２はプロセス１のノンブロッキング子スレッド２を実行する。
【００６７】
ノンブロッキングスレッドが生成される場合、ＣＰＵ＃１、ＣＰＵ＃２は、親スレッドコンテキスト領域５０１内に、子スレッド１コンテキスト領域５０２、子スレッド２コンテキスト領域５０３を生成する。また、ノンブロッキング子スレッド１とノンブロッキング子スレッド２が実行されるタイミングにあわせて、マルチコアプロセッサシステム１００は、スヌープ機構２１０＃１とスヌープ機構２１０＃２を、コヒーレンシオンに設定する。
【００６８】
図６は、アドレス変換装置１０４の機能を示す説明図である。図６では、アドレス変換装置１０４＃１を例にして説明を行うが、アドレス変換装置１０４＃０、アドレス変換装置１０４＃２〜アドレス変換装置１０４＃Ｎも、アドレス変換装置１０４＃１と同様の機能となる。アドレス変換装置１０４＃１は、記憶部６０１、判定部６０２、変換部３０９を含む。
【００６９】
記憶部６０１は、所定値と複写先データのアドレスへのオフセット値と複写元データのアドレスへのオフセット値を記憶する機能を有する。また、記憶部６０１は、所定値と複写先データのアドレスへのオフセット値と複写元データのアドレスへのオフセット値の組み合わせを複数記憶し、アドレス変換を行うかという情報と、複数の組み合わせのうち、適用する組み合わせを指定する情報を記憶してもよい。
【００７０】
具体的に、記憶部６０１は、制御レジスタ６０３と設定レジスタ６０４＃１〜設定レジスタ６０４＃Ｍを含む。Ｍは１以上の整数である。なお、具体的なＭの値としては、マルチコアプロセッサシステム１００が同時実行可能なアプリの数の最大値でよい。本実施の形態にかかるマルチコアプロセッサシステム１００は、携帯電話等を想定しており、パーソナル・コンピュータのように多数のアプリを同時実行することを想定していない。たとえば、Ｍは８、または１６といった値となる。
【００７１】
制御レジスタは、変換ビット、設定レジスタ管理番号という２つのフィールドを含む。変換ビットフィールドには、アドレス変換を行うか否かを示すビットが格納される。設定レジスタ管理番号フィールドには、変換を行う場合、設定レジスタ６０４＃１〜設定レジスタ６０４＃Ｍのうち、どの設定レジスタを適用するかが格納される。
【００７２】
続けて、設定レジスタ６０４の各フィールドについて説明を行う。設定レジスタ６０４は、有効ビット、マスク値、オフセット値１、オフセット値２という４つのフィールドを含む。
【００７３】
有効ビットフィールドには、該当の設定レジスタ６０４が有効か否かを示すビットが格納される。マスク値フィールドには、アドレス変換装置１０４＃１に入力されたアドレスのうち、スレッドの情報を抽出するために使用するマスクの値が格納される。オフセット値１フィールドには、複写先データのアドレスへのオフセット値となる、複写先に生成された子スレッドコンテキスト領域へのオフセットの値が格納される。オフセット値２フィールドには、複写元データのアドレスへのオフセット値となる、ＣＰＵが想定している子スレッドコンテキスト領域へのオフセットの値が格納される。なお、制御レジスタ６０３、設定レジスタ６０４の具体的な設定例は、図７にて後述する。
【００７４】
判定部６０２は、記憶部６０１に記憶された情報に応じてアドレス変換を行うか否かを判定する機能を有する。具体的には、判定部６０２は、変換ビットフィールドが有効であれば、アドレス変換を行い、変換ビットフィールドが無効であればアドレス変換を行わず、アドレススルーする。なお、変換部３０９は、判定部６０２によりアドレス変換を行うと判定された場合、アドレス変換を行う機能を有する。
【００７５】
図７は、ブロッキングスレッドを別ＣＰＵで実行する場合のアドレス変換装置１０４の設定例を示す説明図である。図７に示すマルチコアプロセッサシステム１００は、ＣＰＵ＃０がプロセス０を実行し、ＣＰＵ＃２がプロセス１を実行している状態である。なお、図７で示すマルチコアプロセッサシステム１００は、スヌープ機構２１０の表示を省略している。さらに、ＣＰＵ＃０は、プロセス０の親スレッド０から生成要求があったブロッキング子スレッド０をＣＰＵ＃１に割り当てている。また、割当とあわせて、ＣＰＵ＃０は、親スレッド０コンテキスト領域７０１をＣＰＵ＃１管理領域に複写する。ＣＰＵ＃１は、複写先の親スレッド０コンテキスト領域７０２内に、子スレッド０コンテキスト領域７０３を生成する。
【００７６】
同様に、ＣＰＵ＃２は、プロセス１の親スレッド１から生成要求があったブロッキング子スレッド１をＣＰＵ＃１に割り当てている。また、割当とあわせて、ＣＰＵ＃２は、親スレッド１コンテキスト領域７０４をＣＰＵ＃１管理領域に複写する。ＣＰＵ＃１は、複写先の親スレッド１コンテキスト領域７０５内に、子スレッド１コンテキスト領域７０６を生成する。
【００７７】
このような状態で、アドレス変換装置１０４＃１は、ブロッキング子スレッド０がアクセスしようとするシングルコア時の子スレッド０コンテキスト領域７０７を、実領域である子スレッド０コンテキスト領域７０３に変換する。アドレス変換装置１０４は、下記（１）式によって入力された変換前のアドレスを変換後のアドレスに変換する。
【００７８】
変換後のアドレス＝変換前のアドレス＆マスク値＋オフセット値１…（１）
【００７９】
たとえば、図７に示すようにブロッキング子スレッド０によるアクセスが通知される場合を想定する。ハイパーバイザ＃１は、ＣＰＵ＃１にブロッキングキング子スレッド０が実行されることを検出して、制御レジスタ６０３の変換ビットに変換を示す“１”、設定レジスタ管理番号に“１”を設定する。設定レジスタ６０４＃１は、有効ビットに有効を示す“１”、マスク値に“０ｘ００ｆｆ”、オフセット値１に“０ｘ２０００”、オフセット値２に“０ｘ１０００”を格納している。したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ１０１０”を（１）式にしたがって、以下のように変換する。
【００８０】
変換後のアドレス＝０ｘ１０１０＆０ｘ００ｆｆ＋０ｘ２０００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ２０００
⇔変換後のアドレス＝０ｘ２０１０
【００８１】
このように、アドレス変換装置１０４＃１の変換により、ブロッキング子スレッド０によるアクセス先が、シングルコア時の子スレッド０コンテキスト領域７０７から、子スレッド０コンテキスト領域７０３に変換される。
【００８２】
また、子スレッド０コンテキスト領域７０３から取得されたアクセスに対するレスポンスに対して、アドレス変換装置１０４＃１は、実領域である子スレッド０コンテキスト領域７０３をシングルコア時の子スレッド０コンテキスト領域７０７に変換する。アドレス変換装置１０４＃１は、下記（２）式によって入力された変換前のアドレスを変換後のアドレスに変換する。
【００８３】
変換後のアドレス＝変換前のアドレス＆マスク値＋オフセット値２…（２）
【００８４】
したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ２０１０”を（２）式にしたがって、以下のように変換する。
【００８５】
変換後のアドレス＝０ｘ２０１０＆０ｘ００ｆｆ＋０ｘ１０００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ１０００
⇔変換後のアドレス＝０ｘ１０１０
【００８６】
（２）式によるアドレス変換装置１０４＃１の変換により、アクセスに対するレスポンス元のアドレスは、子スレッド０コンテキスト領域７０３から、シングルコア時の子スレッド０コンテキスト領域７０７に変換される。変換により、（１）式の変換前のアドレスと（２）式の変換後のアドレスが一致するため、ＣＰＵ＃１は、ブロッキング子スレッド０によるアクセスに対するレスポンスが返却されたことを検出できる。
【００８７】
続けて、ブロッキング子スレッド１によるアクセスが通知される場合を想定する。このとき、アドレス変換装置１０４＃１は、ブロッキング子スレッド１がアクセスしようとするシングルコア時の子スレッド１コンテキスト領域７０８を、実領域である子スレッド１コンテキスト領域７０６に変換する。ハイパーバイザ＃１は、ＣＰＵ＃１にブロッキングキング子スレッド１が割り当てられたことを検出して、制御レジスタ６０３の変換ビットに変換を示す“１”、設定レジスタ管理番号に“２”を設定する。
【００８８】
設定レジスタ６０４＃２は、有効ビットに有効を示す“１”、マスク値に“０ｘ００ｆｆ”、オフセット値１に“０ｘ２１００”、オフセット値２に“０ｘ３０００”を格納している。したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ３０１０”を（１）式にしたがって、以下のように変換する。
【００８９】
変換後のアドレス＝０ｘ３０１０＆０ｘ００ｆｆ＋０ｘ２１００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ２１００
⇔変換後のアドレス＝０ｘ２１１０
【００９０】
このように、アドレス変換装置１０４＃１の変換により、ブロッキング子スレッド１によるアクセス先が、シングルコア時の子スレッド１コンテキスト領域７０８から、子スレッド１コンテキスト領域７０６に変換される。
【００９１】
また、子スレッド１コンテキスト領域７０６から取得されたアクセスに対するレスポンスに対して、アドレス変換装置１０４＃１は、実領域である子スレッド１コンテキスト領域７０６をシングルコア時の子スレッド１コンテキスト領域７０８に変換する。したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ２１１０”を（２）式にしたがって、以下のように変換する。
【００９２】
変換後のアドレス＝０ｘ２１１０＆０ｘ００ｆｆ＋０ｘ３０００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ３０００
⇔変換後のアドレス＝０ｘ３０１０
【００９３】
（２）式によるアドレス変換装置１０４＃１の変換により、アクセスに対するレスポンス元のアドレスは、子スレッド１コンテキスト領域７０６から、シングルコア時の子スレッド１コンテキスト領域７０８に変換される。変換により、（１）式の変換前のアドレスと（２）式の変換後のアドレスが一致するため、ＣＰＵ＃１は、ブロッキング子スレッド１によるアクセスに対するレスポンスが返却されたことを検出できる。
【００９４】
図８は、シングルコア実行時におけるブロッキングスレッドとノンブロッキングスレッドの実行タイミングを示す説明図である。符号８０１に示す説明図では、ブロッキングスレッドの実行タイミングを示し、符号８０２に示す説明図では、ノンブロッキングスレッドの実行タイミングを示す。なお、符号８０１に示す説明図、符号８０２に示す説明図にて、ディスパッチ間隔となる時刻ｔｘ〜時刻ｔｘ＋１の間隔は、１プロセスの割当時間となるτと設定する。また、ディスパッチを行う時刻が、ハイパーバイザ＃０と通信可能な時刻である。なお、親スレッド、プロセス１、プロセス２は、ＣＰＵ＃０のディスパッチテーブルに格納されている。ディスパッチテーブルとは、実行可能なスレッド、プロセスを格納するテーブルである。ＯＳ＃０は、ディスパッチテーブルに格納されているスレッドまたはプロセスのいずれか一つをＣＰＵ＃０にディスパッチする。
【００９５】
符号８０１に示す説明図では、ＣＰＵ＃０が、ブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行している。時刻ｔ０にて、ＣＰＵ＃０が、ＯＳ＃０内のディスパッチャにより、プロセス０内の親スレッドをディスパッチし、親スレッドを実行する。τを経過した時刻ｔ１にて、ＣＰＵ＃０は、プロセス１をディスパッチする。プロセス１を実行後、さらにτを経過した時刻ｔ２にて、ＣＰＵ＃０は、プロセス２をディスパッチする。プロセス２を実行後、さらにτを経過した時刻ｔ３にて、ＣＰＵ＃０は、プロセス０の親スレッドをディスパッチする。
【００９６】
時刻ｔ３からτの経過前となる時刻ｔ３’にて、親スレッドがブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、親スレッドからブロッキング子スレッドにディスパッチする。なお、ブロッキング子スレッドは、親スレッドをブロッキングするため、ブロッキング子スレッドが終了するまでは、親スレッドが実行されない。続けて、時刻ｔ３からτ経過した時刻ｔ４にて、ＣＰＵ＃０は、プロセス１をディスパッチする。
【００９７】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ７〜時刻ｔ８、時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ８〜時刻ｔ９、時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス２を実行する。また、時刻ｔ６〜時刻ｔ７、時刻ｔ９〜時刻ｔ１０にて、ＣＰＵ＃０はブロッキング子スレッドを実行する。時刻ｔ１２からτの経過前となる時刻ｔ１２’に、ブロッキング子スレッドが終了すると、ＣＰＵ＃０は、親スレッドをディスパッチし、時刻ｔ１３まで実行する。
【００９８】
このように、親スレッドとブロッキングスレッドをシングルコアで実行する場合、親スレッドが実行していても、子スレッドが実行していても、他のプロセスのＣＰＵの割当時間は変更しない。説明図となる符号８０１の例では、親スレッドが実行している時刻ｔ０〜時刻ｔ３の期間では、プロセス１、プロセス２のＣＰＵ割当時間は、全体の１／３となっている。続けて、ブロッキング子スレッドが実行している時刻ｔ４〜時刻ｔ１２の期間でも、プロセス１、プロセス２のＣＰＵ割当時間は、全体の１／３となっている。
【００９９】
また、ブロッキングスレッドによって停止していた親スレッドの復帰時間としては、時刻ｔ３’から時刻ｔ１２’となる。時刻ｔ３〜時刻ｔ３’、時刻ｔ１２〜時刻ｔ１２’が合わせてτと想定すると、親スレッドの復帰時間は、９τとなる。
【０１００】
続けて、符号８０２に示す説明図では、ＣＰＵ＃０が、ノンブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行している。時刻ｔ０〜時刻ｔ３までは、プロセス０〜プロセス２は、符号８０１に示す説明図と等しいタイミングで動作するため、説明を省略する。
【０１０１】
時刻ｔ３からτの経過前となる時刻ｔ３’にて、親スレッドがノンブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、親スレッドからノンブロッキング子スレッドにディスパッチする。なお、ノンブロッキング子スレッドは、親スレッドをブロッキングせず、ノンブロッキング子スレッドが実行中も、親スレッドが実行され続ける。続けて、時刻ｔ３からτ経過した時刻ｔ４にて、ＣＰＵ＃０は、プロセス１をディスパッチする。
【０１０２】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ７〜時刻ｔ８、時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ８〜時刻ｔ９、時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス２を実行する。
【０１０３】
また、時刻ｔ６からτの経過前となる時刻ｔ６’まで、ＣＰＵ＃０は親スレッドを実行し、時刻ｔ６’から時刻ｔ７まで、ＣＰＵ＃０はノンブロッキング子スレッドを実行する。同様に、時刻ｔ９からτの経過前となる時刻ｔ９’、時刻ｔ１２からτの経過前となる時刻ｔ１２’にて、ＣＰＵ＃０は親スレッドを実行する。さらに、時刻ｔ９’〜時刻ｔ１０、時刻ｔ１２’〜時刻ｔ１３にて、ＣＰＵ＃０はノンブロッキング子スレッドを実行する。
【０１０４】
このように、親スレッドとノンブロッキングスレッドをシングルコアで実行する場合も、ブロッキングスレッドと同様に、親スレッドが実行していても、子スレッドが実行していても、他のプロセスのＣＰＵの割当時間は変更しない。また、親スレッドとノンブロッキング子スレッドのＣＰＵ割当時間は、合計して１プロセス分であるτに等しくなる。
【０１０５】
次に、図９、図１０にて、ブロッキング子スレッド、または、ノンブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す。なお、図９、図１０にて、ＣＰＵ＃０のディスパッチ間隔となる時刻ｔｘ〜時刻ｔｘ＋１の間隔と、ＣＰＵ＃１のディスパッチ間隔となる時刻ｔ’ｘ〜時刻ｔ’ｘ＋１の間隔は、１プロセスの割当時間となるτであると想定する。
【０１０６】
図９は、ブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。図９に示す説明図では、ＣＰＵ＃０がブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行し、ＣＰＵ＃１が、プロセス０内のブロッキング子スレッドと、プロセス３を実行する。時刻ｔ０にて、ＣＰＵ＃０のディスパッチテーブルには、プロセス０の親スレッド、プロセス１、プロセス２が格納されており、ＣＰＵ＃１のディスパッチテーブルには、プロセス３が格納されている。
【０１０７】
時刻ｔ０〜時刻ｔ１にて、ＣＰＵ＃０は、プロセス０の親スレッドを実行し、時刻ｔ１〜時刻ｔ２にて、プロセス１を実行し、時刻ｔ２〜時刻ｔ３にて、プロセス２を実行する。続けて、時刻ｔ３にて、ＣＰＵ＃０は、親スレッドをディスパッチする。また、時刻ｔ’０〜時刻ｔ’２にて、ＣＰＵ＃１は、プロセス３を実行する。
【０１０８】
時刻ｔ３からτの経過前となる時刻ｔ３’にて、親スレッドがブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、生成されるブロッキング子スレッドをＣＰＵ＃１にディスパッチする。具体的には、時刻ｔ’２にて、ＣＰＵ＃１のディスパッチテーブルに、ブロッキング子スレッドが格納される。続けて、ＣＰＵ＃１は、ディスパッチテーブルからブロッキング子スレッドを取得して、ＣＰＵ＃１にディスパッチする。なお、ブロッキング子スレッドは、親スレッドをブロッキングするため、ブロッキング子スレッドが終了するまでは、親スレッドが実行されない。したがって、ＣＰＵ＃０は、親スレッドをＣＰＵ＃０のディスパッチテーブルから退避する。これにより、親スレッドはディスパッチされなくなったため、実行されなくなる。続けて、時刻ｔ３からτ経過した時刻ｔ４にて、ＣＰＵ＃０は、プロセス１をディスパッチする。
【０１０９】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ６〜時刻ｔ７、時刻ｔ８〜時刻ｔ９にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ７〜時刻ｔ８にて、ＣＰＵ＃０はプロセス２を実行する。また、時刻ｔ’２〜時刻ｔ’３、時刻ｔ’４〜時刻ｔ’５にて、ＣＰＵ＃１は、ブロッキング子スレッドを実行し、時刻ｔ’３〜時刻ｔ’４、時刻ｔ’５〜時刻ｔ’６にて、プロセス３を実行する。
【０１１０】
時刻ｔ’６からτの経過前となる時刻ｔ’６’にて、ブロッキング子スレッドが終了すると、ＣＰＵ＃１は、親スレッドをＣＰＵ＃０のディスパッチテーブルに復帰するようＣＰＵ＃０に通知する。通知を受けたＣＰＵ＃０は、時刻ｔ９にて親スレッドをディスパッチする。時刻ｔ９以降、時刻ｔ９〜時刻ｔ１０、時刻ｔ１２〜時刻ｔ１３にて、ＣＰＵ＃０は親スレッドを実行する。時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス２を実行する。時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス１を実行する。また、時刻ｔ’７〜時刻ｔ’１０にて、ＣＰＵ＃１はプロセス３を実行する。
【０１１１】
このように、親スレッドとブロッキングスレッドをマルチコアで実行する場合、他のＣＰＵの割当時間がシングルコア時より増加することになる。図９の例では、親スレッドが実行している時刻ｔ０〜時刻ｔ３の期間では、プロセス１、プロセス２のＣＰＵ割当時間は、全体の１／３となっている。続けて、ブロッキング子スレッドがＣＰＵ＃１で実行している時刻ｔ４〜時刻ｔ９の期間では、プロセス１、プロセス２のＣＰＵ割当時間は１／２となり、ＣＰＵ割当時間が増加している。
【０１１２】
また、ブロッキングスレッドによって停止していた親スレッドの復帰時間としては、時刻ｔ３’から時刻ｔ９となる。時刻ｔ３〜時刻ｔ３’が０．５τと想定すると、親スレッドの復帰時間が５．５τとなり、親スレッドとブロッキングスレッドをマルチコアで実行する場合は、シングルコアで実行する場合より、復帰時間を短縮することができる。
【０１１３】
図１０は、ノンブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。図１０に示す説明図では、ＣＰＵ＃０がノンブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行し、ＣＰＵ＃１が、プロセス０内のノンブロッキング子スレッドと、プロセス３を実行する。時刻ｔ０にて、ＣＰＵ＃０のディスパッチテーブルには、プロセス０の親スレッド、プロセス１、プロセス２が格納されており、ＣＰＵ＃１のディスパッチテーブルには、プロセス３が格納されている。
【０１１４】
時刻ｔ０〜時刻ｔ１にて、ＣＰＵ＃０は、プロセス０の親スレッドを実行し、時刻ｔ１〜時刻ｔ２にて、プロセス１を実行し、時刻ｔ２〜時刻ｔ３にて、プロセス１を実行する。続けて、時刻ｔ３にて、ＣＰＵ＃０は、親スレッドをディスパッチする。また、時刻ｔ’０〜時刻ｔ’２にて、ＣＰＵ＃１は、プロセス３を実行する。また、時刻ｔ’２〜時刻ｔ’３にて、ＣＰＵ＃１は、プロセス３を実行する。
【０１１５】
時刻ｔ３からτの経過前にて、親スレッドがノンブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、ノンブロッキング子スレッドをＣＰＵ＃１にディスパッチする。具体的には、時刻ｔ’３にて、ＣＰＵ＃１のディスパッチテーブルに、ノンブロッキング子スレッドが格納される。続けて、ＣＰＵ＃１は、ディスパッチテーブルからノンブロッキング子スレッドを取得して、ＣＰＵ＃１にディスパッチする。なお、ノンブロッキング子スレッドは、親スレッドをブロッキングせず、ノンブロッキング子スレッドが実行中も、親スレッドが実行され続ける。したがって、ＣＰＵ＃０は、親スレッドを時刻ｔ４まで実行する。
【０１１６】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ７〜時刻ｔ８、時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ８〜時刻ｔ９、時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス２を実行する。また、時刻ｔ’３〜時刻ｔ’４、時刻ｔ’５〜時刻ｔ’６にて、ＣＰＵ＃１は、ノンブロッキング子スレッドを実行し、時刻ｔ’４〜時刻ｔ’５、時刻ｔ’６〜時刻ｔ’７にて、プロセス３を実行する。
【０１１７】
時刻ｔ’７からτの経過前となる時刻ｔ’７’にて、ノンブロッキング子スレッドが終了すると、ＣＰＵ＃０は、時刻ｔ’８にて、プロセス３をディスパッチする。続けて、時刻ｔ’８〜時刻ｔ’１０にて、ＣＰＵ＃１は、プロセス３を実行する。
【０１１８】
このように、親スレッドとノンブロッキングスレッドをマルチコアで実行する場合、親スレッドとノンブロッキング子スレッドのＣＰＵ割当時間は、それぞれ１プロセス分であるτとなり、シングルコア時の割当時間より増加する。これにより、ノンブロッキングスレッドが、シングルコア時に比べてより早く終了することになる。
【０１１９】
図３、図６に示した機能を用いて、マルチコアプロセッサシステム１００は、シングルコア用の実行オブジェクトを、マルチコアで実行する。以下、図１１〜図１４にて、他ＣＰＵに割り当てる割当対象スレッドの実行開始時の設定処理と、実行時の処理、終了時の処理を説明する。図１１〜図１４では、ＣＰＵ＃０で実行しているＯＳ＃０が割当対象スレッドの生成を検出しているが、他のＣＰＵとなるＣＰＵ＃１〜ＣＰＵ＃Ｎで実行しているＯＳが検出してもよい。
【０１２０】
図１１は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その１）である。ＯＳ＃０は、子スレッドの生成イベントを検出する（ステップＳ１１０１）。検出後、ＯＳ＃０は、ＣＰＵｓ１０１のうち、低負荷ＣＰＵを検索する（ステップＳ１１０２）。検索した結果ＣＰＵ＃ｘを低負荷ＣＰＵとして発見した場合、ＯＳ＃０は、発見されたＣＰＵ＃ｘの識別情報を設定情報として記憶する（ステップＳ１１０３）。なお、設定情報の記憶先は、メモリ１０２内である。記憶後、ＯＳ＃０は、生成される子スレッドがブロッキングスレッドかを判断する（ステップＳ１１０４）。
【０１２１】
ノンブロッキングスレッドである場合（ステップＳ１１０４：Ｎｏ）、ＯＳ＃０は、コヒーレンシオン設定をスヌープ機構２１０＃ｘ設定情報として、設定情報に追加する（ステップＳ１１０５）。ブロッキングスレッドである場合（ステップＳ１１０４：Ｙｅｓ）、ＯＳ＃０は、ＣＰＵ＃ｘが管理するＣＰＵ＃ｘ管理領域に、生成される子スレッドの親スレッドのコンテキスト領域を複写する（ステップＳ１１０６）。複写後、ＯＳ＃０は、親スレッドをディスパッチテーブルから退避する（ステップＳ１１０７）。退避後、ＯＳ＃０は、コヒーレンシオフ設定をスヌープ機構２１０＃ｘ設定情報として、設定情報に追加する（ステップＳ１１０８）。
【０１２２】
ステップＳ１１０５、または、ステップＳ１１０８にてスヌープ機構２１０の設定情報を追加した後、ＯＳ＃０は、子スレッド生成要求をＯＳ＃ｘに通知する（ステップＳ１１０９）。通知後、ＯＳ＃０は、図１２に示すステップＳ１２０１の処理に移行する。また、通知を受けたＯＳ＃ｘは、子スレッドのコンテキストを生成する（ステップＳ１１１０）。子スレッドのコンテキスト生成を行うことで、子スレッドが生成されたことになる。
【０１２３】
なお、子スレッドのコンテキストの生成先は、生成される子スレッドがブロッキングスレッドであれば、ＣＰＵ＃ｘ管理領域内に複写された親スレッドのコンテキスト領域内となる。生成される子スレッドがノンブロッキングスレッドであれば、ＣＰＵ＃０管理領域内に存在する親スレッドのコンテキスト領域内となる。生成後、ＣＰＵ＃ｘは、獲得されたコンテキスト領域のアドレスをＯＳ＃０に通知する（ステップＳ１１１１）。通知後、ＯＳ＃ｘは、図１２に示すステップＳ１２１１のＯＳ＃０からの通知まで待機する。
【０１２４】
図１２は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その２）である。ステップＳ１１１１の処理にてＯＳ＃ｘから通知を受けた後、ＯＳ＃０は、通知されたアドレスを取得する（ステップＳ１２０１）。取得後、ＯＳ＃０は、生成された子スレッドがブロッキングスレッドか否かを判断する（ステップＳ１２０２）。ブロッキングスレッドである場合（ステップＳ１２０２：Ｙｅｓ）、ＯＳ＃０は、取得されたアドレスとマスク値からオフセット値１を算出する（ステップＳ１２０３）。
【０１２５】
なお、具体的なオフセット値１の算出方法として、たとえば、ＯＳ＃０が、取得されたアドレスと、所定値となるスレッドのアクセスするメモリ範囲のマスク値に対して反転した値と、の論理積を算出し、算出結果をオフセット値１とする。具体的に、取得されたアドレスが０ｘ２０１０であり、マスク値が０ｘ００ｆｆである場合、ＯＳ＃０は、オフセット値１として、０ｘ２０１０＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ２０００を得る。
【０１２６】
続けて、ＯＳ＃０は、親スレッドのコンテキスト領域のアドレスとマスク値からオフセット値２を算出する（ステップＳ１２０４）。なお、具体的なオフセット値２の算出方法として、たとえば、オフセット値１の算出方法と同様に、ＯＳ＃０が、親スレッドのコンテキスト領域のアドレスと、所定値となるマスク値の反転した値との論理積を算出し、算出結果をオフセット値２とする。具体的に、親スレッドのコンテキスト領域のアドレスが０ｘ１０００であり、マスク値が０ｘ００ｆｆである場合、ＯＳ＃０は、オフセット値２として、０ｘ１０００＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ１０００を得る。
【０１２７】
算出後、ＯＳ＃０は、生成された子スレッドの識別情報とマスク値とオフセット値１とオフセット値２を設定情報に追加する（ステップＳ１２０５）。追加後、または、子スレッドがノンブロッキングスレッドである場合（ステップＳ１２０２：Ｎｏ）、ＯＳ＃０は、ハイパーバイザ＃ｘに設定情報を通知する（ステップＳ１２０６）。
【０１２８】
なお、ＯＳ＃０から直接ハイパーバイザ＃ｘに通知できない場合は、ＯＳ＃０が設定情報を一旦ハイパーバイザ＃０に通知し、ハイパーバイザ＃０からハイパーバイザ＃ｘに対してハイパーバイザ間通信を行って設定情報を通知してもよい。または、ＯＳ＃０がＯＳ＃ｘに設定情報を通知し、さらにＯＳ＃ｘがハイパーバイザ＃ｘに設定情報を通知してもよい。また、設定情報は、メモリ１０２内に記憶されているため、ＯＳ＃０は、ハイパーバイザ＃ｘに設定情報へのポインタを通知してもよい。
【０１２９】
通知を受けたハイパーバイザ＃ｘは、アドレス変換装置１０４＃ｘの有効ビットが無効になっている設定レジスタ６０４＃ｙを検索する（ステップＳ１２０７）。なお、検索方法として、ハイパーバイザ＃ｘは、設定レジスタ６０４＃１〜設定レジスタ６０４＃Ｍのうち、番号の小さい設定レジスタ６０４から順に検索してよい。
【０１３０】
発見後、ハイパーバイザ＃ｘは、設定情報に管理番号＃ｙを追加する（ステップＳ１２０８）。追加後、ハイパーバイザ＃ｘは、設定レジスタ６０４＃ｙの有効ビットフィールドを有効に設定する（ステップＳ１２０９）。設定後、ハイパーバイザ＃ｘは、設定情報内のマスク値とオフセット値１とオフセット値２を、設定レジスタ６０４＃ｙのマスク値フィールドとオフセット値１フィールドとオフセット値２フィールドに設定する（ステップＳ１２１０）。設定終了後、ハイパーバイザ＃ｘは、子スレッドの実行開始時における設定処理を終了する。
【０１３１】
ハイパーバイザ＃ｘに通知を行ったＯＳ＃０は、生成された子スレッドの実行開始要求をＯＳ＃ｘに通知し（ステップＳ１２１１）、ＯＳ＃０は、子スレッドの実行開始時における設定処理を終了する。通知を受けたＯＳ＃ｘは、生成された子スレッドを実行開始し（ステップＳ１２１２）、子スレッドの実行開始時における設定処理を終了する。
【０１３２】
なお、ステップＳ１２０７の処理にて、有効ビットが無効になっている設定レジスタ６０４が存在しない場合、ハイパーバイザ＃ｘは、ＯＳ＃０に失敗したという通知を行ってもよい。失敗したという通知を受けたＯＳ＃０は、たとえば、ＯＳ＃ｘに生成させた子スレッドのコンテキストを破棄させた後、ＣＰＵ＃ｘとは異なる低負荷ＣＰＵを再度検索してもよい。
【０１３３】
図１３は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その１）である。なお、設定情報については、図１１、図１２に示したフローチャートにより、ＣＰＵ識別情報、スレッド識別情報、スヌープ機構２１０＃ｘ設定情報が含まれる。また、スレッド識別情報として設定された子スレッドがブロッキングスレッドである場合、設定情報には、さらに、管理番号＃ｙ、マスク値、オフセット値１、オフセット値２が含まれる。
【０１３４】
図１３では、子スレッドの実行時の処理を示す。ＯＳ＃ｘは、子スレッドがディスパッチされることを検出する（ステップＳ１３０１）。検出後、ＯＳ＃ｘは、ハイパーバイザ＃ｘに、ディスパッチされる子スレッドの識別情報を通知する（ステップＳ１３０２）。通知を受けたハイパーバイザ＃ｘは、子スレッドがブロッキングスレッドか否かを判断する（ステップＳ１３０３）。ブロッキングスレッドである場合（ステップＳ１３０３：Ｙｅｓ）、ハイパーバイザ＃ｘは、スレッド識別情報に対応する管理番号＃ｙと変換ビットをアドレス変換装置１０４＃ｘの制御レジスタ６０３に設定する（ステップＳ１３０４）。
【０１３５】
設定後、または、ブロッキングスレッドでない場合（ステップＳ１３０３：Ｎｏ）、ハイパーバイザ＃ｘは、スレッド識別情報に対応するスヌープ機構２１０＃ｘ設定情報に基づいて、スヌープ機構２１０＃ｘを設定する（ステップＳ１３０５）。ハイパーバイザ＃ｘによる設定の完了後、ＯＳ＃ｘは、ハイパーバイザ＃ｘと同期を取って、子スレッドを実行する（ステップＳ１３０６）。具体的には、ＯＳ＃ｘは、ハイパーバイザ＃ｘによる設定が完了するまで待機し、設定の完了後に子スレッドを実行する。
【０１３６】
子スレッド実行後、ＯＳ＃ｘは、子スレッドが終了したかを判断する（ステップＳ１３０７）。子スレッドが終了していない場合（ステップＳ１３０７：Ｎｏ）、ＯＳ＃ｘは、ステップＳ１３０１の処理に移行する。子スレッドが終了した場合（ステップＳ１３０７：Ｙｅｓ）、ＯＳ＃ｘは、図１４に示すステップＳ１４０１の処理に移行する。また、ハイパーバイザ＃ｘは、ステップＳ１３０２によるＯＳ＃ｘによるスレッドの識別情報の通知を受けるたびに、ステップＳ１３０３〜ステップＳ１３０５の処理を行う。
【０１３７】
図１４は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その２）である。図１４では、子スレッドの終了時の処理を示す。子スレッドが終了した場合、ＯＳ＃ｘは、子スレッドがブロッキングスレッドか否かを判断する（ステップＳ１４０１）。ブロッキングスレッドである場合（ステップＳ１４０１：Ｙｅｓ）、ＯＳ＃ｘは、複写先の親スレッドのコンテキスト領域の更新部分を、複写元の親スレッドのコンテキスト領域に反映する（ステップＳ１４０２）。反映後、ＯＳ＃ｘは、親スレッドのディスパッチテーブル復帰要求をＯＳ＃０に通知する（ステップＳ１４０３）。通知を受けたＯＳ＃０は、親スレッドをディスパッチテーブルに復帰し（ステップＳ１４０４）、子スレッドの終了時の処理を終了する。
【０１３８】
ＯＳ＃０に通知後、または、子スレッドがノンブロッキングスレッドである場合（ステップＳ１４０１：Ｎｏ）、ＯＳ＃ｘは、ハイパーバイザ＃ｘに管理番号の消去要求を通知する（ステップＳ１４０５）。通知を受けたハイパーバイザ＃ｘは、アドレス変換装置１０４＃ｘの設定レジスタ６０４＃ｙの有効ビットを無効に設定し（ステップＳ１４０６）、子スレッドの終了時の処理を終了する。ハイパーバイザ＃ｘに通知後、ＯＳ＃ｘは、設定情報を消去し（ステップＳ１４０７）、子スレッドの終了時の処理を終了する。
【０１３９】
以上説明したように、スケジューリング方法、およびマルチコアプロセッサシステムによれば、親スレッドのコンテキスト領域を複写し、ブロッキング子スレッドを実行するＣＰＵが複写先のコンテキスト領域をアクセスするようなオフセット値を変換する。これにより、マルチコアプロセッサシステムは、それぞれのＣＰＵが異なるアドレスをアクセスするために、ブロッキング子スレッドを親スレッドのＣＰＵとは他のＣＰＵで実行できるため、シングルコア用のプロセスを負荷分散することができる。また、マルチコアプロセッサシステムは、シングルコア用の実行オブジェクトを変更せずに、マルチコアで並列処理が可能となり、ソフトウェアの検証工数を削減することができる。
【０１４０】
また、本実施の形態にかかるマルチコアプロセッサシステムは、ブロッキングスレッドが他ＣＰＵに移行可能となり、各ＣＰＵの負荷量を、従来例にかかるマルチコアプロセッサシステムより均衡状態に近づけることができる。
【０１４１】
たとえば、親スレッドが実行しており、負荷量の大きいブロッキング子スレッドが未実行の状態で、従来技術３にかかる技術による負荷分散が行われ、その後負荷量の大きいブロッキング子スレッドが実行された場合を想定する。このとき、従来例にかかるマルチコアプロセッサシステムでは、ブロッキング子スレッドを移行することができないため、親スレッドを実行するＣＰＵに負荷が偏る結果となる。本実施の形態にかかるマルチコアプロセッサシステムでは、ブロッキング子スレッドを負荷量の低いＣＰＵに移行可能であるため、負荷量をより均衡状態にすることができる。
【０１４２】
また、マルチコアプロセッサシステムは、複数のＣＰＵのうち、負荷の低いＣＰＵにブロッキング子スレッドを実行させてもよい。これにより、マルチコアプロセッサシステムは、全体の負荷を均等にすることができる。また、マルチコアプロセッサシステムは、ブロッキング子スレッドを負荷の低いＣＰＵで実行させることで、ブロッキング子スレッドの割当時間が増加されるため、子スレッドの終了時間が短縮され、同時に親スレッドの復帰時間を短縮することができる。
【０１４３】
また、マルチコアプロセッサシステムは、ブロッキング子スレッドを他のＣＰＵに割り当てる場合、親スレッドを、親スレッドを実行するＣＰＵのディスパッチテーブルから退避してもよい。これにより、マルチコアプロセッサシステムは、親スレッドがＣＰＵに割り当てられなくなり、他のプロセス、または他のスレッドのＣＰＵの割当時間を増加することができる。
【０１４４】
また、マルチコアプロセッサシステムは、ノンブロッキングスレッドを他のＣＰＵに実行する場合、キャッシュメモリのコヒーレンシ設定をオンにしてもよい。これにより、マルチコアプロセッサシステムは、同一の領域にアクセスを行うデータの整合性を保つことができる。
【０１４５】
また、マルチコアプロセッサシステムは、ブロッキングスレッドを他のＣＰＵに実行する場合、キャッシュメモリのコヒーレンシ設定をオフにしてもよい。子スレッドがブロッキングスレッドである場合、他のＣＰＵは、複写先の親スレッドコンテキスト領域にアクセスする。したがって、複数のＣＰＵ間で、同一のアドレスにアクセスが行われることがないため、キャッシュメモリのコヒーレンシを行わなくてよい。これにより、マルチコアプロセッサシステムは、メモリアクセスを行うたびに発生していたスヌープ機構の機能を停止できメモリアクセスの処理を高速化できる。また、マルチコアプロセッサシステムは、スヌープ機構を停止するために、消費電力を削減することができる。
【０１４６】
また、マルチコアプロセッサシステムは、ブロッキングスレッドが終了した場合、複写先の親スレッドコンテキスト領域の更新部分を複写元の親スレッドコンテキスト領域に反映し、親スレッドをディスパッチ周期に復帰させてもよい。これにより、マルチコアプロセッサシステムは、シングルコアにて実行した状態と等しい状態にすることができる。
【０１４７】
なお、本実施の形態で説明したスケジューリング方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スケジューリング方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スケジューリング方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１４８】
また、本実施の形態で説明したアドレス変換装置１０４は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、たとえば、上述したアドレス変換装置１０４の機能（記憶部６０１、判定部６０２、変換部３０９）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、アドレス変換装置１０４を製造することができる。
【符号の説明】
【０１４９】
１００  マルチコアプロセッサシステム
＃０、＃１、＃２  ＣＰＵ、ＯＳ、ハイパーバイザ
１０２  メモリ
１０３  バス
１０４  アドレス変換装置
２１０  スヌープ機構
３０１  親スレッド
３０２  子スレッド
３０３  検出部
３０４  判定部
３０５  複写部
３０６  算出部
３０７  通知部
３０８  設定部
３０９  変換部
３１０  スケジューラ
３１１  親スレッドコンテキスト領域
３１２  複写先の親スレッドコンテキスト領域
３１３  シングルコア時の子スレッドコンテキスト領域
３１４  子スレッドコンテキスト領域
【図１】
2012093488.tif 000003
【図２】
2012093488.tif 000004
【図３】
2012093488.tif 000005
【図４】
2012093488.tif 000006
【図５】
2012093488.tif 000007
【図６】
2012093488.tif 000008
【図７】
2012093488.tif 000009
【図８】
2012093488.tif 000010
【図９】
2012093488.tif 000011
【図１０】
2012093488.tif 000012
【図１１】
2012093488.tif 000013
【図１２】
2012093488.tif 000014
【図１３】
2012093488.tif 000015
【図１４】
2012093488.tif 000016
【図１５】
2012093488.tif 000017
【手続補正書】
【提出日】平成25年7月26日(2013.7.26)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
コンピュータによって実行されるスレッドを管理するスケジューラが、
処理される第１スレッドから第２スレッドが生成されるときに負荷が低いＣＰＵを選択し、
前記第２スレッドが前記第１スレッドと排他的動作を行うか否かを判定し、
前記第２スレッドが排他的動作を行うときに前記第１スレッドがアクセスする第１記憶領域を前記ＣＰＵが管理する第２記憶領域に複写し、
前記第２記憶領域のアドレスと所定値とに基づいて、前記第２スレッドが前記第１記憶領域にアクセスするための第２アドレスへのオフセットを算出し、
第１アドレスを、前記第２記憶領域にアクセスするための第３アドレスに変換するために前記第２アドレスへのオフセットを前記ＣＰＵに通知すること
を特徴とするスケジューリング方法。
【請求項２】
前記第２スレッドにおいて前記第３アドレスに基づいて前記第２記憶領域がアクセスされること
を特徴とする請求項１に記載のスケジューリング方法。
【請求項３】
前記第１記憶領域が前記第２記憶領域に複写された後に、前記第１スレッドを退避させること
を特徴とする請求項１または請求項２に記載のスケジューリング方法。
【請求項４】
前記第１スレッドが排他的動作を行わないとき、キャッシュメモリを同期させるためのフラグをオンすること
を特徴とする請求項１に記載のスケジューリング方法。
【請求項５】
前記第１記憶領域が前記第２記憶領域に複写された後に、キャッシュメモリを同期させるためのフラグをオフすること
を特徴とする請求項１乃至請求項３の何れか一に記載のスケジューリング方法。
【請求項６】
前記第２スレッドが終了したときに、前記第２記憶領域内の更新部分を前記第１記憶領域に反映して、前記第１スレッドを復帰させること
を特徴とする請求項１乃至請求項５の何れか一に記載のスケジューリング方法。
【請求項７】
第１ＣＰＵと第２ＣＰＵとを含む複数のＣＰＵと、
前記第１ＣＰＵに対応するスケジューラと、
前記複数のＣＰＵにバスを介して接続されるとともに、第１記憶領域と第２記憶領域とを含むメモリと、
前記複数のＣＰＵのうちの少なくとも一のＣＰＵと前記メモリとの間に配置されるアドレス変換装置と、
を含み、
前記アドレス変換装置は、前記第１ＣＰＵが管理する前記第１記憶領域にアクセスするためのアドレスを前記第２ＣＰＵが管理する前記第２記憶領域にアクセスするためのアドレスに変換すること
を特徴とするマルチコアプロセッサシステム。
【請求項８】
前記アドレス変換装置は、前記第１記憶領域のアドレスと前記第１ＣＰＵにおいて実行される第１スレッドに基づいて生成される第２スレッドが前記第１記憶領域にアクセスするためのアドレスとのオフセットに基づいて、アドレスを変換すること
を特徴とする請求項７に記載のマルチコアプロセッサシステム。
【請求項９】
前記アドレス変換装置は、フラグがオン設定されているときにアドレスを変換し、前記フラグがオフ設定されているときにアドレスを変換しないこと
を特徴とする請求項７または請求項８に記載のマルチコアプロセッサシステム。
【請求項１０】
前記フラグは、前記第１ＣＰＵにおいて実行される第１スレッドに基づいて生成される第２スレッドの種類に基づいて設定されること
を特徴とする請求項９に記載にマルチコアプロセッサシステム。
【請求項１１】
前記第２スレッドが前記第１スレッドと排他的動作を行う場合に前記フラグがオン設定されること
を特徴とする請求項１０に記載のマルチコアプロセッサシステム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スレッドのスケジューリング方法、およびマルチコアプロセッサシステムに関する。
【背景技術】
【０００２】
近年、１つのシステム内に、複数のコアを有するマルチコアプロセッサシステムの形態を採用する機器が増加している。マルチコアプロセッサシステム対応のプログラムを生成する場合、従来の１つのシステム内に１つのコアを有するシングルコアプロセッサシステム用のプログラムを基に、プログラム内の並列性を抽出する作業が発生する。特に、近年のソフトウェアは複雑で規模が大きいため、新しく生成するのではなく、従来からあるソフトウェア資産を流用してマルチコアプロセッサシステム用のプログラムを生成することで、プログラム生成に伴う工数、検証に伴う工数を減らすことができる。並列性を抽出する方法としては、人為的に検索する場合、または、コンパイラが並列性を抽出する技術が存在する（従来技術１と称する。）。
【０００３】
従来技術１を適用し、抽出された並列処理をそれぞれのコアに割り当てることで、マルチコアプロセッサシステムは、単一のコアで処理を実行する場合より高速に処理を実行することができる。なお、各コアは、プログラムの実行単位となるスレッドを実行している。また、１以上のスレッドを有するプロセスは、スレッドが利用するメモリやデバイスの管理単位である。プロセス、スレッドの性質として、同一のプロセスに属するスレッドは、メモリ空間を共有し、異なるプロセスに属するスレッド間では、メモリ空間を共有しない。
【０００４】
また、複数のコアの処理能力を生かす技術として、複数のアプリケーションソフトウェア（以下、「アプリ」と称する）が起動された場合、これらのアプリを別々のコアで実行することで、コアの並列効果を得る技術が開示されている（従来技術２と称する。）。また、複数のコアの負荷分散を行う技術として、周期的に複数のコアの負荷量を取得し、各コアに割り当てられたスレッドを再配置する技術が開示されている（従来技術３と称する）。
【０００５】
また、並列処理を行うか否かの判断技術として、親スレッドによるフォーク命令を、他のコアで実行可能か否かを判定し、可能である場合は、他のコアで子スレッドを実行する技術が開示されている。また、他のコアで子スレッドを実行する際に用いられる技術として、スレッドのコンテキスト領域を他のコアが管理する記憶領域に複写する技術が開示されている（たとえば、下記特許文献１、２を参照。）。なお、コンテキスト領域とは、ＣＰＵのレジスタの値、プログラムカウンタ、スタックポインタなどといったスレッドが使用するデータを格納する領域である。
【０００６】
また、スレッドを他のコアに移動させる際に発生するアドレス衝突を回避する技術として、メモリのアドレス空間を複数のスレッドで共有するアドレス空間と、スレッド間で共有しないアドレス空間を有する技術が開示されている（たとえば、下記特許文献３を参照。）。特許文献３にかかる技術では、後者のアドレス空間に対するメモリアクセスの場合にアドレス変換を行い、アドレス空間を任意に移動できるようにすることで、アドレス衝突を回避できる。
【０００７】
また、親スレッドから生成される子スレッドの種別として、子スレッドが親スレッドと排他動作するブロッキングスレッドと、子スレッドと親スレッドが独立して動作するノンブロッキングスレッドが存在する。以下、図１５にてブロッキングスレッドとノンブロッキングスレッドの動作を示す。
【０００８】
図１５は、ブロッキングスレッドとノンブロッキングスレッドの動作を示す説明図である。符号１５０１で示す説明図はブロッキングスレッドの動作について説明を行い、符号１５０２で示す説明図はノンブロッキングスレッドの動作について説明を行う。
【０００９】
符号１５０１で示す説明図内におけるプロセス１５０３は、親スレッド１５０４とブロッキング子スレッド１５０５を含んでいる。親スレッド１５０４とブロッキング子スレッド１５０５は、メモリ内に存在する同一のコンテキスト領域１５０６にアクセスする。ブロッキング子スレッド１５０５の実行中において、親スレッド１５０４は停止しており、ブロッキング子スレッド１５０５は、コンテキスト領域１５０６に記憶されたデータを更新する。ブロッキング子スレッド１５０５の実行終了後、親スレッド１５０４は、更新されたコンテキスト領域１５０６を継承し、処理を実行する。
【００１０】
このように、ブロッキング子スレッド１５０５は、親スレッド１５０４と独立した動作を行うが、親スレッド１５０４と同時実行すると、コンテキスト領域１５０６への同時アクセスによるリスクが存在する。したがって、ブロッキング子スレッド１５０５は、親スレッド１５０４と完全排他を取って実行する。
【００１１】
次に、符号１５０２で示す説明図内におけるプロセス１５０７は、親スレッド１５０８とノンブロッキング子スレッド１５０９を含んでいる。親スレッド１５０８とノンブロッキング子スレッド１５０９は、メモリ内に存在する同一のコンテキスト領域１５１０にアクセスする。ノンブロッキング子スレッド１５０９の実行中も親スレッド１５０８は実行され、ノンブロッキング子スレッド１５０９のアクセスとは異なるタイミングでコンテキスト領域１５１０にアクセスする。
【００１２】
このように、ノンブロッキング子スレッド１５０９は、親スレッド１５０８とは異なるタイミングでメモリアクセスを行うため、同時実行が許容されている。もし、コンテキスト領域１５１０に同時にアクセスする可能性があり、親スレッド１５０８とノンブロッキング子スレッド１５０９間で同期を取る場合、両スレッドのコードには、スレッド間通信を用いて排他処理、または同期処理を行うコードが挿入されている。
【先行技術文献】
【特許文献】
【００１３】
【特許文献１】特開２００３−２９９８４号公報
【特許文献２】特開平５−１２７９０４号公報
【特許文献３】特開平９−１４６９０４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１４】
上述した従来技術において、従来技術１にかかる技術では、並列動作させる際にはソースコードに排他処理、または同期処理を挿入する。しかしながら、人為的に検索した場合は、排他処理、または同期処理の挿入漏れが発生し、プログラム内に不具合が発生してしまうという問題があった。また、コンパイラが並列性を抽出する場合、ソフトウェア内の様々な動作状態を判断することが困難であり、適切な排他処理、または同期処理を選択することが困難であるという問題があった。
【００１５】
また、人為的に検索した場合、またはコンパイラが並列性を抽出する場合のいずれの方法であっても、生成される実行オブジェクトは、シングルコアプロセッサシステム用の実行オブジェクトから変更されている。したがって、検証工数の減少はほとんどなく、マルチコアプロセッサシステム用の実行オブジェクトに対する膨大な検証工程が発生するという問題があった。
【００１６】
また、従来技術２にかかる技術では、１つのアプリに着目すると、シングルコアプロセッサシステムと同速度で実行することになり、マルチコアプロセッサの恩恵を受けていないという問題があった。また、１つのアプリに着目した場合、複数のコアが存在するにも関わらず、１つのコアに負荷が集中するという問題があった。また、従来技術３にかかる技術は、スレッドが別のコアに移行可能であることを要求する。しかしながら、子スレッドがブロッキングスレッドの場合、子スレッドが親スレッドをブロッキングするために移行することが困難であるという問題があった。
【００１７】
本発明は、上述した従来技術による問題点を解消するため、シングルコア向けの実行オブジェクトを変更せずに、複数のコアに負荷分散できるスケジューリング方法、およびマルチコアプロセッサシステムを提供することを目的とする。
【課題を解決するための手段】
【００１８】
上述した課題を解決し、目的を達成するため、開示のスケジューリング方法は、処理される第１スレッドから第２スレッドが生成されるときに負荷が低いＣＰＵを選択し、第２スレッドが第１スレッドと排他的動作を行うか否かを判定し、第２スレッドが排他的動作を行うときに第１スレッドがアクセスする第１記憶領域を負荷が低いＣＰＵが管理する第２記憶領域に複写し、第２記憶領域のアドレスと所定値とに基づいて、第２スレッドが第１記憶領域にアクセスするための第２アドレスへのオフセットを算出し、第１アドレスを、第２記憶領域にアクセスするための第３アドレスに変換するために第２アドレスへのオフセットをＣＰＵに通知する。
【発明の効果】
【００１９】
本スケジューリング方法、およびマルチコアプロセッサシステムによれば、シングルコア向けの実行オブジェクトを変更せずに、複数のコアに負荷分散できるという効果を奏する。
【図面の簡単な説明】
【００２０】
【図１】図１は、マルチコアプロセッサシステム１００の動作を示す説明図である。
【図２】図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。
【図３】図３は、マルチコアプロセッサシステム１００の機能を示すブロック図である。
【図４】図４は、ブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。
【図５】図５は、ノンブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。
【図６】図６は、アドレス変換装置１０４の機能を示す説明図である。
【図７】図７は、ブロッキングスレッドを別ＣＰＵで実行する場合のアドレス変換装置１０４の設定例を示す説明図である。
【図８】図８は、シングルコア実行時におけるブロッキングスレッドとノンブロッキングスレッドの実行タイミングを示す説明図である。
【図９】図９は、ブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。
【図１０】図１０は、ノンブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。
【図１１】図１１は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その１）である。
【図１２】図１２は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その２）である。
【図１３】図１３は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その１）である。
【図１４】図１４は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その２）である。
【図１５】図１５は、ブロッキングスレッドとノンブロッキングスレッドの動作を示す説明図である。
【発明を実施するための形態】
【００２１】
以下に添付図面を参照して、開示のスケジューリング方法、およびマルチコアプロセッサシステムの好適な実施の形態を詳細に説明する。
【００２２】
図１は、マルチコアプロセッサシステム１００の動作を示す説明図である。図１におけるマルチコアプロセッサシステム１００は、複数のコアとなるＣＰＵｓ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０１と、メモリ１０２とを含む。マルチコアプロセッサシステム１００は、携帯電話といった携帯端末を想定している。ＣＰＵｓ１０１には、ＣＰＵ＃０とＣＰＵ＃１が含まれる。ＣＰＵｓ１０１とメモリ１０２は、バス１０３で接続されている。また、ＣＰＵ＃０、ＣＰＵ＃１は、それぞれ、アドレス変換装置１０４＃０、アドレス変換装置１０４＃１と通信可能である。アドレス変換装置１０４は、ＣＰＵのアクセス先アドレスを変換する機能を有する。
【００２３】
また、ＣＰＵ＃０は、メモリ１０２内の０ｘ１０００〜０ｘ１ｆｆｆをＣＰＵ＃０管理領域として使用し、ＣＰＵ＃１は、メモリ１０２内の０ｘ２０００〜０ｘ２ｆｆｆをＣＰＵ＃１管理領域として使用する。なお、ＣＰＵｓ１０１の各ＣＰＵは、自身の管理領域以外の領域にもアクセスできる。
【００２４】
また、ＣＰＵ＃０は、プロセス０、プロセス１を実行している。ＣＰＵ＃０は、プロセス０のデータを格納するプロセス０コンテキスト領域と、プロセス１のデータを格納するプロセス１コンテキスト領域とを、ＣＰＵ＃０管理領域に確保する。なお、プロセス０は、メモリ１０２に格納されている実行オブジェクト１０５が読み込まれた結果、生成されている。実行オブジェクト１０５は、シングルコア向けに生成された実行オブジェクトである。
【００２５】
プロセス０内の親スレッドがブロッキング子スレッド１の生成要求を行うと、マルチコアプロセッサシステム１００は、プロセス０の親スレッドコンテキスト領域１０６をＣＰＵ＃１管理領域に複写する。複写後、ブロッキング子スレッド１が割り当てられるＣＰＵ＃１は、複写先の親スレッドコンテキスト領域１０７内に、子スレッド１コンテキスト領域１０８を生成する。
【００２６】
続けて、プロセス０のブロッキング子スレッド１が実行されるタイミングにあわせて、マルチコアプロセッサシステム１００は、アドレス変換装置１０４＃１に対して、アドレス変換を行うように設定する。具体的には、アドレス変換装置１０４＃１は、ブロッキング子スレッド１からのアクセスに対し、ＣＰＵ＃１によるシングルコア時の子スレッド１コンテキスト領域１０９のアドレスから、子スレッド１コンテキスト領域１０８のアドレスに変換する。また、アドレス変換装置１０４＃１は、子スレッド１コンテキスト領域１０８から取得されたアクセスに対するレスポンスに対して、子スレッド１コンテキスト領域１０８のアドレスから、シングルコア時の子スレッド１コンテキスト領域１０９のアドレスに変換する。
【００２７】
このように、マルチコアプロセッサシステム１００は、ブロッキングスレッドを実行する場合、親スレッドのコンテキスト領域を複写し、ブロッキング子スレッドを実行するＣＰＵが複写先のコンテキスト領域にアクセスするようにアドレス変換する。これにより、マルチコアプロセッサシステム１００は、それぞれのＣＰＵが異なるアドレスにアクセスするために、ブロッキングスレッドを親スレッドのＣＰＵとは別のＣＰＵで実行できるため、シングルコア用のプロセスを負荷分散可能となる。
【００２８】
（マルチコアプロセッサシステムのハードウェア）
図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェアを示すブロック図である。図２において、マルチコアプロセッサシステム１００は、ＣＰＵを複数搭載するＣＰＵｓ１０１と、ＲＯＭ（Ｒｅａｄ‐Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０１と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０２と、を含む。また、マルチコアプロセッサシステム１００は、フラッシュＲＯＭ２０３と、フラッシュＲＯＭコントローラ２０４と、フラッシュＲＯＭ２０５と、を含む。また、マルチコアプロセッサシステム１００は、ユーザやその他の機器との入出力装置として、ディスプレイ２０６と、Ｉ／Ｆ（Ｉｎｔｅｒｆａｃｅ）２０７と、キーボード２０８と、を含む。また、各部はバス１０３によってそれぞれ接続されている。
【００２９】
ここで、ＣＰＵｓ１０１は、マルチコアプロセッサシステム１００の全体の制御を司る。ＣＰＵｓ１０１は、シングルコアのプロセッサを並列して接続した全てのＣＰＵを指している。ＣＰＵｓ１０１は、ＣＰＵ＃０〜ＣＰＵ＃Ｎを含む。なお、Ｎは１以上の整数である。また、マルチコアプロセッサシステムとは、コアが複数搭載されたプロセッサを含むコンピュータのシステムである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００３０】
また、ＣＰＵ＃０〜ＣＰＵ＃Ｎは、それぞれ、アドレス変換装置１０４と通信可能である。さらに、ＣＰＵ＃０〜ＣＰＵ＃Ｎは、それぞれ専用のキャッシュメモリを有する。また、ＣＰＵ＃０〜ＣＰＵ＃Ｎは、専用のキャッシュメモリのコヒーレンシを取るため、スヌープ機構２１０＃０〜スヌープ機構２１０＃Ｎを有する。
【００３１】
スヌープ機構２１０は、ＣＰＵ＃０〜ＣＰＵ＃Ｎがアクセスするキャッシュメモリの整合性を取る装置である。スヌープ機構２１０＃０〜スヌープ機構２１０＃Ｎは、それぞれ通信を行っており、たとえば、ＣＰＵ＃０のキャッシュメモリが更新されると、スヌープ機構２１０＃０が、スヌープ機構２１０＃１〜スヌープ機構２１０＃Ｎに更新内容を通知する。スヌープ機構２１０のプロトコルとしては、無効型プロトコルと更新型プロトコルが存在する。いずれのプロトコルであっても、スヌープ機構２１０＃１〜スヌープ機構２１０＃Ｎは、自身のキャッシュメモリと他のキャッシュメモリと更新状態の情報を交換する。
【００３２】
なお、キャッシュメモリの整合性を取る装置は、キャッシュコヒーレンシ機構に分類され、キャッシュコヒーレンシ機構の一例として、スヌープ機構が存在する。キャッシュコヒーレンシ機構は、大別してスヌープ方式を採用したスヌープ機構とディレクトリ方式とがある。本実施の形態にかかるスヌープ機構２１０は、ディレクトリ方式を採用したキャッシュコヒーレンシ機構であってもよい。また、スヌープ機構２１０は、アドレス変換装置１０４とバス１０３の間に設置される。
【００３３】
ＲＯＭ２０１は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０２は、ＣＰＵｓ１０１のワークエリアとして使用される。フラッシュＲＯＭ２０３は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、ＯＳを更新する場合、マルチコアプロセッサシステム１００は、Ｉ／Ｆ２０７によって新しいＯＳを受信し、フラッシュＲＯＭ２０３に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００３４】
フラッシュＲＯＭコントローラ２０４は、ＣＰＵｓ１０１の制御にしたがってフラッシュＲＯＭ２０５に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２０５は、フラッシュＲＯＭコントローラ２０４の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム１００を使用するユーザがＩ／Ｆ２０７を通して取得した画像データ、映像データや、本実施の形態であるスケジューリング方法を実行するプログラムが格納されていてもよい。フラッシュＲＯＭ２０５は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００３５】
ディスプレイ２０６は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイ２０６は、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００３６】
Ｉ／Ｆ２０７は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２０９に接続され、ネットワーク２０９を介して他の装置に接続される。そして、Ｉ／Ｆ２０７は、ネットワーク２０９と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０７には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００３７】
キーボード２０８は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０８は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３８】
（マルチコアプロセッサシステム１００の機能）
次に、マルチコアプロセッサシステム１００の機能について説明する。図３は、マルチコアプロセッサシステム１００の機能を示すブロック図である。マルチコアプロセッサシステム１００は、検出部３０３と、判定部３０４と、複写部３０５と、算出部３０６と、通知部３０７と、設定部３０８と、変換部３０９と、を含む。
【００３９】
この制御部となる機能のうち、検出部３０３〜通知部３０７は、記憶装置に記憶されたプログラムをＣＰＵ＃０が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図２に示したＲＯＭ２０１、ＲＡＭ２０２、フラッシュＲＯＭ２０３、フラッシュＲＯＭ２０５などである。または、Ｉ／Ｆ２０７を経由して他のＣＰＵが実行することにより、その機能を実現してもよい。
【００４０】
なお、ＣＰＵ＃０は、ハイパーバイザ＃０、ＯＳ＃０を実行する。ハイパーバイザ＃０は、ＣＰＵ＃０などのハードウェア上で直接動作するプログラムである。ハイパーバイザ＃０は、ＣＰＵ＃０内のレジスタを直接参照したり、ＣＰＵ＃０内のレジスタの情報を読み出したり、ＣＰＵ＃０内のレジスタの情報を書き換えたりする特権命令を実行することができるプログラムである。ＯＳ＃０は、ハイパーバイザ＃０上で動作するソフトウェアである。ＯＳ＃０は、具体的には、スレッド、プロセスが利用するライブラリ群を提供する。また、ＯＳ＃０は、スレッド、プロセスをＣＰＵ＃０に割り当てるディスパッチャ、また、割り当てるスレッドを決定するスケジューラ３１０を有する。
【００４１】
なお、図３にて示しているように、ＣＰＵ＃１も、ハイパーバイザ＃１、ＯＳ＃１を実行する。さらに、図示していないが、ＣＰＵ＃２〜ＣＰＵ＃Ｎも、ハイパーバイザ、ＯＳを実行する。検出部３０３〜通知部３０７は、ＯＳ＃０の機能に含まれ、設定部３０８はハイパーバイザ＃１の機能に含まれ、変換部３０９は、アドレス変換装置１０４＃１の機能に含まれる。
【００４２】
なお、検出部３０３〜通知部３０７は、スケジューラ３１０の機能に含まれてもよい。また、検出部３０３〜通知部３０７がスケジューラ３１０の機能に含まれない場合、スケジューラ３１０がスレッド割当を行うことを通知する。また、図３では、ＣＰＵ＃２が、プロセス０の親スレッド３０１を実行し、ＣＰＵ＃１が子スレッド３０２を実行すると想定する。ＣＰＵ＃２は、親スレッド３０１の処理によって、親スレッドコンテキスト領域３１１にアクセスする。
【００４３】
また、図３では、検出部３０３〜通知部３０７が、ＣＰＵ＃０の機能であるように図示されているが、ＣＰＵ＃１〜ＣＰＵ＃Ｎの機能であってもよい。また、設定部３０８、変換部３０９は、子スレッドが割り当てられたＣＰＵに対応する機能である。したがって、たとえば、子スレッドがＣＰＵ＃０に割り当てられた場合に対応するため、ハイパーバイザ＃０とアドレス変換装置１０４＃０は、設定部３０８、変換部３０９と同等の機能を有していてもよい。同様に、ＣＰＵ＃２〜ＣＰＵ＃Ｎに対応するハイパーバイザ＃２〜ハイパーバイザ＃Ｎ、アドレス変換装置１０４＃２〜アドレス変換装置１０４＃Ｎも、設定部３０８、変換部３０９と同等の機能を有していてもよい。
【００４４】
検出部３０３は、複数のコアのうち第１コアに割り当てられた第１スレッドから生成される第２スレッドを第２コアに割り当てることを検出する機能を有する。たとえば、検出部３０３は、ＣＰＵｓ１０１のうちＣＰＵ＃２に割り当てられた第１スレッドとなる親スレッドから生成される子スレッド３０２をＣＰＵ＃１に割り当てることを検出する。なお、検出されたという情報は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００４５】
判定部３０４は、第１および第２スレッドが排他的に動作するか否かを判定する機能を有する。たとえば、判定部３０４は、子スレッド３０２がブロッキングスレッドである場合、第１および第２スレッドが排他的に動作すると判定し、子スレッド３０２がノンブロッキングスレッドである場合、第１および第２スレッドが排他的に動作しないと判定する。なお、判定結果は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００４６】
また、具体的な判定方法としては、ＯＳが、実行オブジェクトに親スレッドが実行停止するコードが記載されているか否かで判定することができる。たとえば、ＯＳが、ＰＯＳＩＸ（Ｐｏｒｔａｂｌｅ  Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ  Ｉｎｔｅｒｆａｃｅ）に準拠したＯＳである場合を想定する。ブロッキングスレッドが生成される場合、実行オブジェクトの親スレッドのコードには、スレッドの生成を行うｐｔｈｒｅａｄ＿ｃｒｅａｔｅ（）関数への命令が記載された後、スレッドの終了を待つｐｔｈｒｅａｄ＿ｊｏｉｎ（）関数への命令が記載されている。このような記載がされている場合、判定部３０４は、第２スレッドがブロッキングスレッドであると判定する。
【００４７】
複写部３０５は、判定部３０４によって第１および第２スレッドが排他的に動作すると判定された場合、第１スレッドがアクセスする複写元データを、複写元データが記憶される第１記憶領域とは異なる第２記憶領域へ複写する機能を有する。たとえば、複写部３０５は、子スレッド３０２がブロッキングスレッドである場合、親スレッドがアクセスする第１記憶領域となる親スレッドコンテキスト領域３１１内の複写元データを、第２記憶領域となる複写先の親スレッドコンテキスト領域３１２へ複写する。なお、複写を行ったという情報は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００４８】
算出部３０６は、複写部３０５によって複写された複写先データのアドレスとなる第２アドレスと所定値とに基づいて、第２アドレスへのオフセット値を算出する機能を有する。なお、所定値とは、スレッドのアクセスするメモリ範囲を示すマスク値である。たとえば、スレッドがアクセスするメモリ範囲が０ｘ１０００〜０ｘ１０ｆｆ、または０ｘ３１００〜０ｘ３１ｆｆのように、０ｘ０１００［バイト］である場合、マスク値は０ｘ００ｆｆとなる。メモリ範囲の大きさは、ＯＳが有するメモリ管理機能によって決定される。
【００４９】
また、算出部３０６は、複写先データのアドレスとなる第２アドレスと、所定値となるマスク値に対して反転した値と、の論理積を算出して、第２アドレスのオフセット値を算出してもよい。たとえば、算出部３０６は、複写先データのアドレスが０ｘ２０００で、マスク値が０ｘ００ｆｆである場合、複写先データへのアドレスのオフセット値を、０ｘ２０００＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ２０００として算出する。なお、ＮＯＴ（）は、引数内のビットを反転する機能を有する関数とする。
【００５０】
また、算出部３０６は、複写元データのアドレスとなる第１アドレスと所定値とに基づいて、複写元データのアドレスへのオフセット値を算出してもよい。また、算出部３０６は、複写元データのアドレスと、マスク値に対して反転した値と、の論理積を算出して、複写元データへのアドレスのオフセット値を算出してもよい。たとえば、算出部３０６は、複写元データのアドレスが０ｘ３０００で、マスク値が０ｘ００ｆｆである場合、複写元データへのアドレスのオフセット値を、０ｘ３０００＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ３０００として算出する。なお、算出結果は、ＣＰＵ＃０のレジスタまたはキャッシュメモリ、ＲＡＭ２０２などの記憶領域に記憶される。
【００５１】
通知部３０７は、第１および第２スレッドが排他的に動作すると判定された場合、複写先データのアドレスへのオフセット値を通知する機能を有する。また、通知部３０７は、さらに第２スレッドの情報と所定値と複写元データのアドレスへのオフセット値とを第２コアに通知してもよい。たとえば、通知部３０７は、子スレッドがブロッキングスレッドか、ノンブロッキングスレッドかのうちいずれかという情報と、マスク値と、複写先データのアドレスへのオフセット値と、複写元データのアドレスへのオフセット値と、をＣＰＵ＃１に通知する。また、通知部３０７は、第１および第２スレッドが排他的に動作しないと判定された場合、第２スレッドの情報を第２コアに通知してもよい。
【００５２】
設定部３０８は、第２スレッドが実行される場合、通知された情報を、第２スレッドを実行するコアに対応するアドレス変換装置１０４とスヌープ機構２１０に設定する機能を有する。たとえば、設定部３０８は、第２スレッドがブロッキングスレッドである場合、アドレス変換装置１０４＃１に対しアドレス変換を行う設定にする。また、設定部３０８は、変換を行う情報として、所定値と複写先データのアドレスへのオフセット値と複写元データのアドレスへのオフセット値とをアドレス変換装置１０４＃１に設定する。あわせて、設定部３０８は、コヒーレンシオフの設定をスヌープ機構２１０＃１に設定する。
【００５３】
また、設定部３０８は、第２スレッドがノンブロッキングスレッドである場合、アドレス変換装置１０４＃１に対しアドレス変換を行わない設定にし、コヒーレンシオンの設定をスヌープ機構２１０＃１に設定する。
【００５４】
変換部３０９は、第２スレッドを割り当てることが検出された後、第２コアによる複写元データへのアクセスに対して、複写元データを示す第１アドレスを複写先データへのオフセット値と所定値とに応じて複写先データを示す第３アドレスに変換する機能を有する。たとえば、複写元データとなるシングルコア時の子スレッドコンテキスト領域３１３のアドレスを０ｘ３０１０とし、複写先データとなる子スレッドコンテキスト領域３１４のアドレスを０ｘ２０１０と想定する。このとき、変換部３０９は、複写元データとなるシングルコア時の子スレッドコンテキスト領域３１３へのアクセスに対して、アクセス先となるアドレス０ｘ３０１０を０ｘ２０１０に変換する。
【００５５】
また、変換部３０９は、第３アドレスから取得されたアクセスに対するレスポンスに対して、第３アドレスを複写元データへのオフセット値と所定値とに応じて複写元データを示す第４アドレスに変換してもよい。たとえば、第３アドレスを０ｘ２０１０とし、複写元データとなるシングルコア時の子スレッドコンテキスト領域３１３のアドレスを０ｘ３０１０と想定する。このとき、変換部３０９は、レスポンス元のアドレス０ｘ２０１０を０ｘ３０１０に変換する。なお、具体的な変換方法は、図７に後述する。
【００５６】
スケジューラ３１０は、マルチコアプロセッサシステム１００内のスレッドの割当を制御する機能を有する。たとえば、スケジューラ３１０は、マルチコアプロセッサシステム１００で実行中のスレッドのうち、親スレッド３０１をＣＰＵ＃２に割り当て、子スレッド３０２をＣＰＵ＃１に割り当てる。
【００５７】
図４は、ブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。図４で示すマルチコアプロセッサシステム１００は、ＣＰＵｓ１０１内にＣＰＵ＃０〜ＣＰＵ＃２を含んでいる。ＣＰＵ＃０は、プロセス０の親スレッドを実行し、ＣＰＵ＃１はプロセス０のブロッキング子スレッド１を実行し、ＣＰＵ＃２はプロセス０のブロッキング子スレッド２を実行する。
【００５８】
ブロッキング子スレッド１とブロッキング子スレッド２の実行開始時に、ＣＰＵ＃０は、ＣＰＵ＃０管理領域内に存在する親スレッドコンテキスト領域４０１を、ＣＰＵ＃１管理領域、ＣＰＵ＃２管理領域に複写する。複写後、ＣＰＵ＃１は、複写先の親スレッドコンテキスト領域４０２に、子スレッド１コンテキスト領域４０３を生成する。同様に、ＣＰＵ＃２は、複写先の親スレッドコンテキスト領域４０４に、子スレッド２コンテキスト領域４０５を生成する。
【００５９】
また、ブロッキング子スレッド１とブロッキング子スレッド２が実行されるタイミングにあわせて、マルチコアプロセッサシステム１００は、スヌープ機構２１０＃１とスヌープ機構２１０＃２を、コヒーレンシオフに設定する。スヌープ機構２１０の設定と同時に、マルチコアプロセッサシステム１００は、アドレス変換装置１０４＃１とアドレス変換装置１０４＃２に対して、アドレス変換を行うように設定する。
【００６０】
なお、コヒーレンシオフとなったスヌープ機構２１０＃１とスヌープ機構２１０＃２は、キャッシュメモリの整合性を取ることを停止する。具体的に、スヌープ機構２１０＃１とスヌープ機構２１０＃２は、他のスヌープ機構２１０にキャッシュメモリの更新内容を通知しない。
【００６１】
具体的には、アドレス変換装置１０４＃１は、ＣＰＵ＃１によるメモリ１０２へのアクセスのアドレスを、シングルコア時の子スレッド１コンテキスト領域４０６のアドレスから、子スレッド１コンテキスト領域４０３に変換する。たとえば、アドレス変換装置１０４＃１は、シングルコア時の子スレッド１コンテキスト領域４０６の先頭アドレスである０ｘ１０１０を、子スレッド１コンテキスト領域４０３の先頭アドレス０ｘ２０１０に変換する。
【００６２】
同様に、アドレス変換装置１０４＃２は、ＣＰＵ＃２によるメモリ１０２へのアクセスのアドレスを、シングルコア時の子スレッド２コンテキスト領域４０７のアドレスから、子スレッド２コンテキスト領域４０５に変換する。たとえば、アドレス変換装置１０４＃２は、シングルコア時の子スレッド２コンテキスト領域４０７の先頭アドレスである０ｘ１０２０を、子スレッド２コンテキスト領域４０５の先頭アドレス０ｘ３０２０に変換する。
【００６３】
なお、ブロッキング子スレッド１は、子スレッド１コンテキスト領域４０３へのアクセスの他に、複写先の親スレッドコンテキスト領域４０２にもアクセスする場合がある。親スレッドコンテキスト領域には、たとえば、他の子スレッドの情報が格納されている。たとえば、ブロッキング子スレッド１が他の子スレッドの停止、再開といったような制御を行う場合、ＣＰＵ＃１は、複写先の親スレッドコンテキスト領域４０２内に存在する他の子スレッドの状態情報を変更する。
【００６４】
ブロッキング子スレッド１の終了後、ＣＰＵ＃１は、複写先の親スレッドコンテキスト領域４０２の更新部分を複写元となる親スレッドコンテキスト領域４０１に反映する。同様に、ブロッキング子スレッド２の終了後、ＣＰＵ＃２は、複写先の親スレッドコンテキスト領域４０４の更新部分を複写元となる親スレッドコンテキスト領域４０１に反映する。
【００６５】
また、図４で示すマルチコアプロセッサシステム１００において、ブロッキング子スレッドを実行するＣＰＵ＃１とＣＰＵ＃２は、別々の記憶領域にアクセスするようになるため、メモリアクセスの効率化が行われる。
【００６６】
図５は、ノンブロッキングスレッドを別ＣＰＵで実行する場合のマルチコアプロセッサシステム１００の状態を示す説明図である。図５で示すマルチコアプロセッサシステム１００は、ＣＰＵｓ１０１内にＣＰＵ＃０〜ＣＰＵ＃２を含んでいる。ＣＰＵ＃０は、プロセス１の親スレッドを実行し、ＣＰＵ＃１はプロセス１のノンブロッキング子スレッド１を実行し、ＣＰＵ＃２はプロセス１のノンブロッキング子スレッド２を実行する。
【００６７】
ノンブロッキングスレッドが生成される場合、ＣＰＵ＃１、ＣＰＵ＃２は、親スレッドコンテキスト領域５０１内に、子スレッド１コンテキスト領域５０２、子スレッド２コンテキスト領域５０３を生成する。また、ノンブロッキング子スレッド１とノンブロッキング子スレッド２が実行されるタイミングにあわせて、マルチコアプロセッサシステム１００は、スヌープ機構２１０＃１とスヌープ機構２１０＃２を、コヒーレンシオンに設定する。
【００６８】
図６は、アドレス変換装置１０４の機能を示す説明図である。図６では、アドレス変換装置１０４＃１を例にして説明を行うが、アドレス変換装置１０４＃０、アドレス変換装置１０４＃２〜アドレス変換装置１０４＃Ｎも、アドレス変換装置１０４＃１と同様の機能となる。アドレス変換装置１０４＃１は、記憶部６０１、判定部６０２、変換部３０９を含む。
【００６９】
記憶部６０１は、所定値と複写先データのアドレスへのオフセット値と複写元データのアドレスへのオフセット値を記憶する機能を有する。また、記憶部６０１は、所定値と複写先データのアドレスへのオフセット値と複写元データのアドレスへのオフセット値の組み合わせを複数記憶し、アドレス変換を行うかという情報と、複数の組み合わせのうち、適用する組み合わせを指定する情報を記憶してもよい。
【００７０】
具体的に、記憶部６０１は、制御レジスタ６０３と設定レジスタ６０４＃１〜設定レジスタ６０４＃Ｍを含む。Ｍは１以上の整数である。なお、具体的なＭの値としては、マルチコアプロセッサシステム１００が同時実行可能なアプリの数の最大値でよい。本実施の形態にかかるマルチコアプロセッサシステム１００は、携帯電話等を想定しており、パーソナル・コンピュータのように多数のアプリを同時実行することを想定していない。たとえば、Ｍは８、または１６といった値となる。
【００７１】
制御レジスタは、変換ビット、設定レジスタ管理番号という２つのフィールドを含む。変換ビットフィールドには、アドレス変換を行うか否かを示すビットが格納される。設定レジスタ管理番号フィールドには、変換を行う場合、設定レジスタ６０４＃１〜設定レジスタ６０４＃Ｍのうち、どの設定レジスタを適用するかが格納される。
【００７２】
続けて、設定レジスタ６０４の各フィールドについて説明を行う。設定レジスタ６０４は、有効ビット、マスク値、オフセット値１、オフセット値２という４つのフィールドを含む。
【００７３】
有効ビットフィールドには、該当の設定レジスタ６０４が有効か否かを示すビットが格納される。マスク値フィールドには、アドレス変換装置１０４＃１に入力されたアドレスのうち、スレッドの情報を抽出するために使用するマスクの値が格納される。オフセット値１フィールドには、複写先データのアドレスへのオフセット値となる、複写先に生成された子スレッドコンテキスト領域へのオフセットの値が格納される。オフセット値２フィールドには、複写元データのアドレスへのオフセット値となる、ＣＰＵが想定している子スレッドコンテキスト領域へのオフセットの値が格納される。なお、制御レジスタ６０３、設定レジスタ６０４の具体的な設定例は、図７にて後述する。
【００７４】
判定部６０２は、記憶部６０１に記憶された情報に応じてアドレス変換を行うか否かを判定する機能を有する。具体的には、判定部６０２は、変換ビットフィールドが有効であれば、アドレス変換を行い、変換ビットフィールドが無効であればアドレス変換を行わず、アドレススルーする。なお、変換部３０９は、判定部６０２によりアドレス変換を行うと判定された場合、アドレス変換を行う機能を有する。
【００７５】
図７は、ブロッキングスレッドを別ＣＰＵで実行する場合のアドレス変換装置１０４の設定例を示す説明図である。図７に示すマルチコアプロセッサシステム１００は、ＣＰＵ＃０がプロセス０を実行し、ＣＰＵ＃２がプロセス１を実行している状態である。なお、図７で示すマルチコアプロセッサシステム１００は、スヌープ機構２１０の表示を省略している。さらに、ＣＰＵ＃０は、プロセス０の親スレッド０から生成要求があったブロッキング子スレッド０をＣＰＵ＃１に割り当てている。また、割当とあわせて、ＣＰＵ＃０は、親スレッド０コンテキスト領域７０１をＣＰＵ＃１管理領域に複写する。ＣＰＵ＃１は、複写先の親スレッド０コンテキスト領域７０２内に、子スレッド０コンテキスト領域７０３を生成する。
【００７６】
同様に、ＣＰＵ＃２は、プロセス１の親スレッド１から生成要求があったブロッキング子スレッド１をＣＰＵ＃１に割り当てている。また、割当とあわせて、ＣＰＵ＃２は、親スレッド１コンテキスト領域７０４をＣＰＵ＃１管理領域に複写する。ＣＰＵ＃１は、複写先の親スレッド１コンテキスト領域７０５内に、子スレッド１コンテキスト領域７０６を生成する。
【００７７】
このような状態で、アドレス変換装置１０４＃１は、ブロッキング子スレッド０がアクセスしようとするシングルコア時の子スレッド０コンテキスト領域７０７を、実領域である子スレッド０コンテキスト領域７０３に変換する。アドレス変換装置１０４は、下記（１）式によって入力された変換前のアドレスを変換後のアドレスに変換する。
【００７８】
変換後のアドレス＝変換前のアドレス＆マスク値＋オフセット値１…（１）
【００７９】
たとえば、図７に示すようにブロッキング子スレッド０によるアクセスが通知される場合を想定する。ハイパーバイザ＃１は、ＣＰＵ＃１にブロッキングキング子スレッド０が実行されることを検出して、制御レジスタ６０３の変換ビットに変換を示す“１”、設定レジスタ管理番号に“１”を設定する。設定レジスタ６０４＃１は、有効ビットに有効を示す“１”、マスク値に“０ｘ００ｆｆ”、オフセット値１に“０ｘ２０００”、オフセット値２に“０ｘ１０００”を格納している。したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ１０１０”を（１）式にしたがって、以下のように変換する。
【００８０】
変換後のアドレス＝０ｘ１０１０＆０ｘ００ｆｆ＋０ｘ２０００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ２０００
⇔変換後のアドレス＝０ｘ２０１０
【００８１】
このように、アドレス変換装置１０４＃１の変換により、ブロッキング子スレッド０によるアクセス先が、シングルコア時の子スレッド０コンテキスト領域７０７から、子スレッド０コンテキスト領域７０３に変換される。
【００８２】
また、子スレッド０コンテキスト領域７０３から取得されたアクセスに対するレスポンスに対して、アドレス変換装置１０４＃１は、実領域である子スレッド０コンテキスト領域７０３をシングルコア時の子スレッド０コンテキスト領域７０７に変換する。アドレス変換装置１０４＃１は、下記（２）式によって入力された変換前のアドレスを変換後のアドレスに変換する。
【００８３】
変換後のアドレス＝変換前のアドレス＆マスク値＋オフセット値２…（２）
【００８４】
したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ２０１０”を（２）式にしたがって、以下のように変換する。
【００８５】
変換後のアドレス＝０ｘ２０１０＆０ｘ００ｆｆ＋０ｘ１０００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ１０００
⇔変換後のアドレス＝０ｘ１０１０
【００８６】
（２）式によるアドレス変換装置１０４＃１の変換により、アクセスに対するレスポンス元のアドレスは、子スレッド０コンテキスト領域７０３から、シングルコア時の子スレッド０コンテキスト領域７０７に変換される。変換により、（１）式の変換前のアドレスと（２）式の変換後のアドレスが一致するため、ＣＰＵ＃１は、ブロッキング子スレッド０によるアクセスに対するレスポンスが返却されたことを検出できる。
【００８７】
続けて、ブロッキング子スレッド１によるアクセスが通知される場合を想定する。このとき、アドレス変換装置１０４＃１は、ブロッキング子スレッド１がアクセスしようとするシングルコア時の子スレッド１コンテキスト領域７０８を、実領域である子スレッド１コンテキスト領域７０６に変換する。ハイパーバイザ＃１は、ＣＰＵ＃１にブロッキングキング子スレッド１が割り当てられたことを検出して、制御レジスタ６０３の変換ビットに変換を示す“１”、設定レジスタ管理番号に“２”を設定する。
【００８８】
設定レジスタ６０４＃２は、有効ビットに有効を示す“１”、マスク値に“０ｘ００ｆｆ”、オフセット値１に“０ｘ２１００”、オフセット値２に“０ｘ３０００”を格納している。したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ３０１０”を（１）式にしたがって、以下のように変換する。
【００８９】
変換後のアドレス＝０ｘ３０１０＆０ｘ００ｆｆ＋０ｘ２１００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ２１００
⇔変換後のアドレス＝０ｘ２１１０
【００９０】
このように、アドレス変換装置１０４＃１の変換により、ブロッキング子スレッド１によるアクセス先が、シングルコア時の子スレッド１コンテキスト領域７０８から、子スレッド１コンテキスト領域７０６に変換される。
【００９１】
また、子スレッド１コンテキスト領域７０６から取得されたアクセスに対するレスポンスに対して、アドレス変換装置１０４＃１は、実領域である子スレッド１コンテキスト領域７０６をシングルコア時の子スレッド１コンテキスト領域７０８に変換する。したがって、アドレス変換装置１０４＃１は、変換前のアドレス＝“０ｘ２１１０”を（２）式にしたがって、以下のように変換する。
【００９２】
変換後のアドレス＝０ｘ２１１０＆０ｘ００ｆｆ＋０ｘ３０００
⇔変換後のアドレス＝０ｘ００１０＋０ｘ３０００
⇔変換後のアドレス＝０ｘ３０１０
【００９３】
（２）式によるアドレス変換装置１０４＃１の変換により、アクセスに対するレスポンス元のアドレスは、子スレッド１コンテキスト領域７０６から、シングルコア時の子スレッド１コンテキスト領域７０８に変換される。変換により、（１）式の変換前のアドレスと（２）式の変換後のアドレスが一致するため、ＣＰＵ＃１は、ブロッキング子スレッド１によるアクセスに対するレスポンスが返却されたことを検出できる。
【００９４】
図８は、シングルコア実行時におけるブロッキングスレッドとノンブロッキングスレッドの実行タイミングを示す説明図である。符号８０１に示す説明図では、ブロッキングスレッドの実行タイミングを示し、符号８０２に示す説明図では、ノンブロッキングスレッドの実行タイミングを示す。なお、符号８０１に示す説明図、符号８０２に示す説明図にて、ディスパッチ間隔となる時刻ｔｘ〜時刻ｔｘ＋１の間隔は、１プロセスの割当時間となるτと設定する。また、ディスパッチを行う時刻が、ハイパーバイザ＃０と通信可能な時刻である。なお、親スレッド、プロセス１、プロセス２は、ＣＰＵ＃０のディスパッチテーブルに格納されている。ディスパッチテーブルとは、実行可能なスレッド、プロセスを格納するテーブルである。ＯＳ＃０は、ディスパッチテーブルに格納されているスレッドまたはプロセスのいずれか一つをＣＰＵ＃０にディスパッチする。
【００９５】
符号８０１に示す説明図では、ＣＰＵ＃０が、ブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行している。時刻ｔ０にて、ＣＰＵ＃０が、ＯＳ＃０内のディスパッチャにより、プロセス０内の親スレッドをディスパッチし、親スレッドを実行する。τを経過した時刻ｔ１にて、ＣＰＵ＃０は、プロセス１をディスパッチする。プロセス１を実行後、さらにτを経過した時刻ｔ２にて、ＣＰＵ＃０は、プロセス２をディスパッチする。プロセス２を実行後、さらにτを経過した時刻ｔ３にて、ＣＰＵ＃０は、プロセス０の親スレッドをディスパッチする。
【００９６】
時刻ｔ３からτの経過前となる時刻ｔ３’にて、親スレッドがブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、親スレッドからブロッキング子スレッドにディスパッチする。なお、ブロッキング子スレッドは、親スレッドをブロッキングするため、ブロッキング子スレッドが終了するまでは、親スレッドが実行されない。続けて、時刻ｔ３からτ経過した時刻ｔ４にて、ＣＰＵ＃０は、プロセス１をディスパッチする。
【００９７】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ７〜時刻ｔ８、時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ８〜時刻ｔ９、時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス２を実行する。また、時刻ｔ６〜時刻ｔ７、時刻ｔ９〜時刻ｔ１０にて、ＣＰＵ＃０はブロッキング子スレッドを実行する。時刻ｔ１２からτの経過前となる時刻ｔ１２’に、ブロッキング子スレッドが終了すると、ＣＰＵ＃０は、親スレッドをディスパッチし、時刻ｔ１３まで実行する。
【００９８】
このように、親スレッドとブロッキングスレッドをシングルコアで実行する場合、親スレッドが実行していても、子スレッドが実行していても、他のプロセスのＣＰＵの割当時間は変更しない。説明図となる符号８０１の例では、親スレッドが実行している時刻ｔ０〜時刻ｔ３の期間では、プロセス１、プロセス２のＣＰＵ割当時間は、全体の１／３となっている。続けて、ブロッキング子スレッドが実行している時刻ｔ４〜時刻ｔ１２の期間でも、プロセス１、プロセス２のＣＰＵ割当時間は、全体の１／３となっている。
【００９９】
また、ブロッキングスレッドによって停止していた親スレッドの復帰時間としては、時刻ｔ３’から時刻ｔ１２’となる。時刻ｔ３〜時刻ｔ３’、時刻ｔ１２〜時刻ｔ１２’が合わせてτと想定すると、親スレッドの復帰時間は、９τとなる。
【０１００】
続けて、符号８０２に示す説明図では、ＣＰＵ＃０が、ノンブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行している。時刻ｔ０〜時刻ｔ３までは、プロセス０〜プロセス２は、符号８０１に示す説明図と等しいタイミングで動作するため、説明を省略する。
【０１０１】
時刻ｔ３からτの経過前となる時刻ｔ３’にて、親スレッドがノンブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、親スレッドからノンブロッキング子スレッドにディスパッチする。なお、ノンブロッキング子スレッドは、親スレッドをブロッキングせず、ノンブロッキング子スレッドが実行中も、親スレッドが実行され続ける。続けて、時刻ｔ３からτ経過した時刻ｔ４にて、ＣＰＵ＃０は、プロセス１をディスパッチする。
【０１０２】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ７〜時刻ｔ８、時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ８〜時刻ｔ９、時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス２を実行する。
【０１０３】
また、時刻ｔ６からτの経過前となる時刻ｔ６’まで、ＣＰＵ＃０は親スレッドを実行し、時刻ｔ６’から時刻ｔ７まで、ＣＰＵ＃０はノンブロッキング子スレッドを実行する。同様に、時刻ｔ９からτの経過前となる時刻ｔ９’、時刻ｔ１２からτの経過前となる時刻ｔ１２’にて、ＣＰＵ＃０は親スレッドを実行する。さらに、時刻ｔ９’〜時刻ｔ１０、時刻ｔ１２’〜時刻ｔ１３にて、ＣＰＵ＃０はノンブロッキング子スレッドを実行する。
【０１０４】
このように、親スレッドとノンブロッキングスレッドをシングルコアで実行する場合も、ブロッキングスレッドと同様に、親スレッドが実行していても、子スレッドが実行していても、他のプロセスのＣＰＵの割当時間は変更しない。また、親スレッドとノンブロッキング子スレッドのＣＰＵ割当時間は、合計して１プロセス分であるτに等しくなる。
【０１０５】
次に、図９、図１０にて、ブロッキング子スレッド、または、ノンブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す。なお、図９、図１０にて、ＣＰＵ＃０のディスパッチ間隔となる時刻ｔｘ〜時刻ｔｘ＋１の間隔と、ＣＰＵ＃１のディスパッチ間隔となる時刻ｔ’ｘ〜時刻ｔ’ｘ＋１の間隔は、１プロセスの割当時間となるτであると想定する。
【０１０６】
図９は、ブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。図９に示す説明図では、ＣＰＵ＃０がブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行し、ＣＰＵ＃１が、プロセス０内のブロッキング子スレッドと、プロセス３を実行する。時刻ｔ０にて、ＣＰＵ＃０のディスパッチテーブルには、プロセス０の親スレッド、プロセス１、プロセス２が格納されており、ＣＰＵ＃１のディスパッチテーブルには、プロセス３が格納されている。
【０１０７】
時刻ｔ０〜時刻ｔ１にて、ＣＰＵ＃０は、プロセス０の親スレッドを実行し、時刻ｔ１〜時刻ｔ２にて、プロセス１を実行し、時刻ｔ２〜時刻ｔ３にて、プロセス２を実行する。続けて、時刻ｔ３にて、ＣＰＵ＃０は、親スレッドをディスパッチする。また、時刻ｔ’０〜時刻ｔ’２にて、ＣＰＵ＃１は、プロセス３を実行する。
【０１０８】
時刻ｔ３からτの経過前となる時刻ｔ３’にて、親スレッドがブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、生成されるブロッキング子スレッドをＣＰＵ＃１にディスパッチする。具体的には、時刻ｔ’２にて、ＣＰＵ＃１のディスパッチテーブルに、ブロッキング子スレッドが格納される。続けて、ＣＰＵ＃１は、ディスパッチテーブルからブロッキング子スレッドを取得して、ＣＰＵ＃１にディスパッチする。なお、ブロッキング子スレッドは、親スレッドをブロッキングするため、ブロッキング子スレッドが終了するまでは、親スレッドが実行されない。したがって、ＣＰＵ＃０は、親スレッドをＣＰＵ＃０のディスパッチテーブルから退避する。これにより、親スレッドはディスパッチされなくなったため、実行されなくなる。続けて、時刻ｔ３からτ経過した時刻ｔ４にて、ＣＰＵ＃０は、プロセス１をディスパッチする。
【０１０９】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ６〜時刻ｔ７、時刻ｔ８〜時刻ｔ９にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ７〜時刻ｔ８にて、ＣＰＵ＃０はプロセス２を実行する。また、時刻ｔ’２〜時刻ｔ’３、時刻ｔ’４〜時刻ｔ’５にて、ＣＰＵ＃１は、ブロッキング子スレッドを実行し、時刻ｔ’３〜時刻ｔ’４、時刻ｔ’５〜時刻ｔ’６にて、プロセス３を実行する。
【０１１０】
時刻ｔ’６からτの経過前となる時刻ｔ’６’にて、ブロッキング子スレッドが終了すると、ＣＰＵ＃１は、親スレッドをＣＰＵ＃０のディスパッチテーブルに復帰するようＣＰＵ＃０に通知する。通知を受けたＣＰＵ＃０は、時刻ｔ９にて親スレッドをディスパッチする。時刻ｔ９以降、時刻ｔ９〜時刻ｔ１０、時刻ｔ１２〜時刻ｔ１３にて、ＣＰＵ＃０は親スレッドを実行する。時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス２を実行する。時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス１を実行する。また、時刻ｔ’７〜時刻ｔ’１０にて、ＣＰＵ＃１はプロセス３を実行する。
【０１１１】
このように、親スレッドとブロッキングスレッドをマルチコアで実行する場合、他のＣＰＵの割当時間がシングルコア時より増加することになる。図９の例では、親スレッドが実行している時刻ｔ０〜時刻ｔ３の期間では、プロセス１、プロセス２のＣＰＵ割当時間は、全体の１／３となっている。続けて、ブロッキング子スレッドがＣＰＵ＃１で実行している時刻ｔ４〜時刻ｔ９の期間では、プロセス１、プロセス２のＣＰＵ割当時間は１／２となり、ＣＰＵ割当時間が増加している。
【０１１２】
また、ブロッキングスレッドによって停止していた親スレッドの復帰時間としては、時刻ｔ３’から時刻ｔ９となる。時刻ｔ３〜時刻ｔ３’が０．５τと想定すると、親スレッドの復帰時間が５．５τとなり、親スレッドとブロッキングスレッドをマルチコアで実行する場合は、シングルコアで実行する場合より、復帰時間を短縮することができる。
【０１１３】
図１０は、ノンブロッキング子スレッドをＣＰＵ＃１に割り当てる場合の実行タイミングを示す説明図である。図１０に示す説明図では、ＣＰＵ＃０がノンブロッキング子スレッドの生成要求を行う親スレッドを含むプロセス０と、プロセス１、プロセス２を実行し、ＣＰＵ＃１が、プロセス０内のノンブロッキング子スレッドと、プロセス３を実行する。時刻ｔ０にて、ＣＰＵ＃０のディスパッチテーブルには、プロセス０の親スレッド、プロセス１、プロセス２が格納されており、ＣＰＵ＃１のディスパッチテーブルには、プロセス３が格納されている。
【０１１４】
時刻ｔ０〜時刻ｔ１にて、ＣＰＵ＃０は、プロセス０の親スレッドを実行し、時刻ｔ１〜時刻ｔ２にて、プロセス１を実行し、時刻ｔ２〜時刻ｔ３にて、プロセス１を実行する。続けて、時刻ｔ３にて、ＣＰＵ＃０は、親スレッドをディスパッチする。また、時刻ｔ’０〜時刻ｔ’２にて、ＣＰＵ＃１は、プロセス３を実行する。また、時刻ｔ’２〜時刻ｔ’３にて、ＣＰＵ＃１は、プロセス３を実行する。
【０１１５】
時刻ｔ３からτの経過前にて、親スレッドがノンブロッキング子スレッドの生成要求を行うと、ＣＰＵ＃０は、ノンブロッキング子スレッドをＣＰＵ＃１にディスパッチする。具体的には、時刻ｔ’３にて、ＣＰＵ＃１のディスパッチテーブルに、ノンブロッキング子スレッドが格納される。続けて、ＣＰＵ＃１は、ディスパッチテーブルからノンブロッキング子スレッドを取得して、ＣＰＵ＃１にディスパッチする。なお、ノンブロッキング子スレッドは、親スレッドをブロッキングせず、ノンブロッキング子スレッドが実行中も、親スレッドが実行され続ける。したがって、ＣＰＵ＃０は、親スレッドを時刻ｔ４まで実行する。
【０１１６】
時刻ｔ４以降、時刻ｔ４〜時刻ｔ５、時刻ｔ７〜時刻ｔ８、時刻ｔ１０〜時刻ｔ１１にて、ＣＰＵ＃０はプロセス１を実行する。同様に、時刻ｔ５〜時刻ｔ６、時刻ｔ８〜時刻ｔ９、時刻ｔ１１〜時刻ｔ１２にて、ＣＰＵ＃０はプロセス２を実行する。また、時刻ｔ’３〜時刻ｔ’４、時刻ｔ’５〜時刻ｔ’６にて、ＣＰＵ＃１は、ノンブロッキング子スレッドを実行し、時刻ｔ’４〜時刻ｔ’５、時刻ｔ’６〜時刻ｔ’７にて、プロセス３を実行する。
【０１１７】
時刻ｔ’７からτの経過前となる時刻ｔ’７’にて、ノンブロッキング子スレッドが終了すると、ＣＰＵ＃０は、時刻ｔ’８にて、プロセス３をディスパッチする。続けて、時刻ｔ’８〜時刻ｔ’１０にて、ＣＰＵ＃１は、プロセス３を実行する。
【０１１８】
このように、親スレッドとノンブロッキングスレッドをマルチコアで実行する場合、親スレッドとノンブロッキング子スレッドのＣＰＵ割当時間は、それぞれ１プロセス分であるτとなり、シングルコア時の割当時間より増加する。これにより、ノンブロッキングスレッドが、シングルコア時に比べてより早く終了することになる。
【０１１９】
図３、図６に示した機能を用いて、マルチコアプロセッサシステム１００は、シングルコア用の実行オブジェクトを、マルチコアで実行する。以下、図１１〜図１４にて、他ＣＰＵに割り当てる割当対象スレッドの実行開始時の設定処理と、実行時の処理、終了時の処理を説明する。図１１〜図１４では、ＣＰＵ＃０で実行しているＯＳ＃０が割当対象スレッドの生成を検出しているが、他のＣＰＵとなるＣＰＵ＃１〜ＣＰＵ＃Ｎで実行しているＯＳが検出してもよい。
【０１２０】
図１１は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その１）である。ＯＳ＃０は、子スレッドの生成イベントを検出する（ステップＳ１１０１）。検出後、ＯＳ＃０は、ＣＰＵｓ１０１のうち、低負荷ＣＰＵを検索する（ステップＳ１１０２）。検索した結果ＣＰＵ＃ｘを低負荷ＣＰＵとして発見した場合、ＯＳ＃０は、発見されたＣＰＵ＃ｘの識別情報を設定情報として記憶する（ステップＳ１１０３）。なお、設定情報の記憶先は、メモリ１０２内である。記憶後、ＯＳ＃０は、生成される子スレッドがブロッキングスレッドかを判断する（ステップＳ１１０４）。
【０１２１】
ノンブロッキングスレッドである場合（ステップＳ１１０４：Ｎｏ）、ＯＳ＃０は、コヒーレンシオン設定をスヌープ機構２１０＃ｘ設定情報として、設定情報に追加する（ステップＳ１１０５）。ブロッキングスレッドである場合（ステップＳ１１０４：Ｙｅｓ）、ＯＳ＃０は、ＣＰＵ＃ｘが管理するＣＰＵ＃ｘ管理領域に、生成される子スレッドの親スレッドのコンテキスト領域を複写する（ステップＳ１１０６）。複写後、ＯＳ＃０は、親スレッドをディスパッチテーブルから退避する（ステップＳ１１０７）。退避後、ＯＳ＃０は、コヒーレンシオフ設定をスヌープ機構２１０＃ｘ設定情報として、設定情報に追加する（ステップＳ１１０８）。
【０１２２】
ステップＳ１１０５、または、ステップＳ１１０８にてスヌープ機構２１０の設定情報を追加した後、ＯＳ＃０は、子スレッド生成要求をＯＳ＃ｘに通知する（ステップＳ１１０９）。通知後、ＯＳ＃０は、図１２に示すステップＳ１２０１の処理に移行する。また、通知を受けたＯＳ＃ｘは、子スレッドのコンテキストを生成する（ステップＳ１１１０）。子スレッドのコンテキスト生成を行うことで、子スレッドが生成されたことになる。
【０１２３】
なお、子スレッドのコンテキストの生成先は、生成される子スレッドがブロッキングスレッドであれば、ＣＰＵ＃ｘ管理領域内に複写された親スレッドのコンテキスト領域内となる。生成される子スレッドがノンブロッキングスレッドであれば、ＣＰＵ＃０管理領域内に存在する親スレッドのコンテキスト領域内となる。生成後、ＣＰＵ＃ｘは、獲得されたコンテキスト領域のアドレスをＯＳ＃０に通知する（ステップＳ１１１１）。通知後、ＯＳ＃ｘは、図１２に示すステップＳ１２１１のＯＳ＃０からの通知まで待機する。
【０１２４】
図１２は、他ＣＰＵに割り当てる子スレッドの実行開始時における設定処理を示すフローチャート（その２）である。ステップＳ１１１１の処理にてＯＳ＃ｘから通知を受けた後、ＯＳ＃０は、通知されたアドレスを取得する（ステップＳ１２０１）。取得後、ＯＳ＃０は、生成された子スレッドがブロッキングスレッドか否かを判断する（ステップＳ１２０２）。ブロッキングスレッドである場合（ステップＳ１２０２：Ｙｅｓ）、ＯＳ＃０は、取得されたアドレスとマスク値からオフセット値１を算出する（ステップＳ１２０３）。
【０１２５】
なお、具体的なオフセット値１の算出方法として、たとえば、ＯＳ＃０が、取得されたアドレスと、所定値となるスレッドのアクセスするメモリ範囲のマスク値に対して反転した値と、の論理積を算出し、算出結果をオフセット値１とする。具体的に、取得されたアドレスが０ｘ２０１０であり、マスク値が０ｘ００ｆｆである場合、ＯＳ＃０は、オフセット値１として、０ｘ２０１０＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ２０００を得る。
【０１２６】
続けて、ＯＳ＃０は、親スレッドのコンテキスト領域のアドレスとマスク値からオフセット値２を算出する（ステップＳ１２０４）。なお、具体的なオフセット値２の算出方法として、たとえば、オフセット値１の算出方法と同様に、ＯＳ＃０が、親スレッドのコンテキスト領域のアドレスと、所定値となるマスク値の反転した値との論理積を算出し、算出結果をオフセット値２とする。具体的に、親スレッドのコンテキスト領域のアドレスが０ｘ１０００であり、マスク値が０ｘ００ｆｆである場合、ＯＳ＃０は、オフセット値２として、０ｘ１０００＆ＮＯＴ（０ｘ００ｆｆ）＝０ｘ１０００を得る。
【０１２７】
算出後、ＯＳ＃０は、生成された子スレッドの識別情報とマスク値とオフセット値１とオフセット値２を設定情報に追加する（ステップＳ１２０５）。追加後、または、子スレッドがノンブロッキングスレッドである場合（ステップＳ１２０２：Ｎｏ）、ＯＳ＃０は、ハイパーバイザ＃ｘに設定情報を通知する（ステップＳ１２０６）。
【０１２８】
なお、ＯＳ＃０から直接ハイパーバイザ＃ｘに通知できない場合は、ＯＳ＃０が設定情報を一旦ハイパーバイザ＃０に通知し、ハイパーバイザ＃０からハイパーバイザ＃ｘに対してハイパーバイザ間通信を行って設定情報を通知してもよい。または、ＯＳ＃０がＯＳ＃ｘに設定情報を通知し、さらにＯＳ＃ｘがハイパーバイザ＃ｘに設定情報を通知してもよい。また、設定情報は、メモリ１０２内に記憶されているため、ＯＳ＃０は、ハイパーバイザ＃ｘに設定情報へのポインタを通知してもよい。
【０１２９】
通知を受けたハイパーバイザ＃ｘは、アドレス変換装置１０４＃ｘの有効ビットが無効になっている設定レジスタ６０４＃ｙを検索する（ステップＳ１２０７）。なお、検索方法として、ハイパーバイザ＃ｘは、設定レジスタ６０４＃１〜設定レジスタ６０４＃Ｍのうち、番号の小さい設定レジスタ６０４から順に検索してよい。
【０１３０】
発見後、ハイパーバイザ＃ｘは、設定情報に管理番号＃ｙを追加する（ステップＳ１２０８）。追加後、ハイパーバイザ＃ｘは、設定レジスタ６０４＃ｙの有効ビットフィールドを有効に設定する（ステップＳ１２０９）。設定後、ハイパーバイザ＃ｘは、設定情報内のマスク値とオフセット値１とオフセット値２を、設定レジスタ６０４＃ｙのマスク値フィールドとオフセット値１フィールドとオフセット値２フィールドに設定する（ステップＳ１２１０）。設定終了後、ハイパーバイザ＃ｘは、子スレッドの実行開始時における設定処理を終了する。
【０１３１】
ハイパーバイザ＃ｘに通知を行ったＯＳ＃０は、生成された子スレッドの実行開始要求をＯＳ＃ｘに通知し（ステップＳ１２１１）、ＯＳ＃０は、子スレッドの実行開始時における設定処理を終了する。通知を受けたＯＳ＃ｘは、生成された子スレッドを実行開始し（ステップＳ１２１２）、子スレッドの実行開始時における設定処理を終了する。
【０１３２】
なお、ステップＳ１２０７の処理にて、有効ビットが無効になっている設定レジスタ６０４が存在しない場合、ハイパーバイザ＃ｘは、ＯＳ＃０に失敗したという通知を行ってもよい。失敗したという通知を受けたＯＳ＃０は、たとえば、ＯＳ＃ｘに生成させた子スレッドのコンテキストを破棄させた後、ＣＰＵ＃ｘとは異なる低負荷ＣＰＵを再度検索してもよい。
【０１３３】
図１３は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その１）である。なお、設定情報については、図１１、図１２に示したフローチャートにより、ＣＰＵ識別情報、スレッド識別情報、スヌープ機構２１０＃ｘ設定情報が含まれる。また、スレッド識別情報として設定された子スレッドがブロッキングスレッドである場合、設定情報には、さらに、管理番号＃ｙ、マスク値、オフセット値１、オフセット値２が含まれる。
【０１３４】
図１３では、子スレッドの実行時の処理を示す。ＯＳ＃ｘは、子スレッドがディスパッチされることを検出する（ステップＳ１３０１）。検出後、ＯＳ＃ｘは、ハイパーバイザ＃ｘに、ディスパッチされる子スレッドの識別情報を通知する（ステップＳ１３０２）。通知を受けたハイパーバイザ＃ｘは、子スレッドがブロッキングスレッドか否かを判断する（ステップＳ１３０３）。ブロッキングスレッドである場合（ステップＳ１３０３：Ｙｅｓ）、ハイパーバイザ＃ｘは、スレッド識別情報に対応する管理番号＃ｙと変換ビットをアドレス変換装置１０４＃ｘの制御レジスタ６０３に設定する（ステップＳ１３０４）。
【０１３５】
設定後、または、ブロッキングスレッドでない場合（ステップＳ１３０３：Ｎｏ）、ハイパーバイザ＃ｘは、スレッド識別情報に対応するスヌープ機構２１０＃ｘ設定情報に基づいて、スヌープ機構２１０＃ｘを設定する（ステップＳ１３０５）。ハイパーバイザ＃ｘによる設定の完了後、ＯＳ＃ｘは、ハイパーバイザ＃ｘと同期を取って、子スレッドを実行する（ステップＳ１３０６）。具体的には、ＯＳ＃ｘは、ハイパーバイザ＃ｘによる設定が完了するまで待機し、設定の完了後に子スレッドを実行する。
【０１３６】
子スレッド実行後、ＯＳ＃ｘは、子スレッドが終了したかを判断する（ステップＳ１３０７）。子スレッドが終了していない場合（ステップＳ１３０７：Ｎｏ）、ＯＳ＃ｘは、ステップＳ１３０１の処理に移行する。子スレッドが終了した場合（ステップＳ１３０７：Ｙｅｓ）、ＯＳ＃ｘは、図１４に示すステップＳ１４０１の処理に移行する。また、ハイパーバイザ＃ｘは、ステップＳ１３０２によるＯＳ＃ｘによるスレッドの識別情報の通知を受けるたびに、ステップＳ１３０３〜ステップＳ１３０５の処理を行う。
【０１３７】
図１４は、子スレッドの実行時の処理および終了時の処理を示すフローチャート（その２）である。図１４では、子スレッドの終了時の処理を示す。子スレッドが終了した場合、ＯＳ＃ｘは、子スレッドがブロッキングスレッドか否かを判断する（ステップＳ１４０１）。ブロッキングスレッドである場合（ステップＳ１４０１：Ｙｅｓ）、ＯＳ＃ｘは、複写先の親スレッドのコンテキスト領域の更新部分を、複写元の親スレッドのコンテキスト領域に反映する（ステップＳ１４０２）。反映後、ＯＳ＃ｘは、親スレッドのディスパッチテーブル復帰要求をＯＳ＃０に通知する（ステップＳ１４０３）。通知を受けたＯＳ＃０は、親スレッドをディスパッチテーブルに復帰し（ステップＳ１４０４）、子スレッドの終了時の処理を終了する。
【０１３８】
ＯＳ＃０に通知後、または、子スレッドがノンブロッキングスレッドである場合（ステップＳ１４０１：Ｎｏ）、ＯＳ＃ｘは、ハイパーバイザ＃ｘに管理番号の消去要求を通知する（ステップＳ１４０５）。通知を受けたハイパーバイザ＃ｘは、アドレス変換装置１０４＃ｘの設定レジスタ６０４＃ｙの有効ビットを無効に設定し（ステップＳ１４０６）、子スレッドの終了時の処理を終了する。ハイパーバイザ＃ｘに通知後、ＯＳ＃ｘは、設定情報を消去し（ステップＳ１４０７）、子スレッドの終了時の処理を終了する。
【０１３９】
以上説明したように、スケジューリング方法、およびマルチコアプロセッサシステムによれば、親スレッドのコンテキスト領域を複写し、ブロッキング子スレッドを実行するＣＰＵが複写先のコンテキスト領域をアクセスするようなオフセット値を変換する。これにより、マルチコアプロセッサシステムは、それぞれのＣＰＵが異なるアドレスをアクセスするために、ブロッキング子スレッドを親スレッドのＣＰＵとは他のＣＰＵで実行できるため、シングルコア用のプロセスを負荷分散することができる。また、マルチコアプロセッサシステムは、シングルコア用の実行オブジェクトを変更せずに、マルチコアで並列処理が可能となり、ソフトウェアの検証工数を削減することができる。
【０１４０】
また、本実施の形態にかかるマルチコアプロセッサシステムは、ブロッキングスレッドが他ＣＰＵに移行可能となり、各ＣＰＵの負荷量を、従来例にかかるマルチコアプロセッサシステムより均衡状態に近づけることができる。
【０１４１】
たとえば、親スレッドが実行しており、負荷量の大きいブロッキング子スレッドが未実行の状態で、従来技術３にかかる技術による負荷分散が行われ、その後負荷量の大きいブロッキング子スレッドが実行された場合を想定する。このとき、従来例にかかるマルチコアプロセッサシステムでは、ブロッキング子スレッドを移行することができないため、親スレッドを実行するＣＰＵに負荷が偏る結果となる。本実施の形態にかかるマルチコアプロセッサシステムでは、ブロッキング子スレッドを負荷量の低いＣＰＵに移行可能であるため、負荷量をより均衡状態にすることができる。
【０１４２】
また、マルチコアプロセッサシステムは、複数のＣＰＵのうち、負荷の低いＣＰＵにブロッキング子スレッドを実行させてもよい。これにより、マルチコアプロセッサシステムは、全体の負荷を均等にすることができる。また、マルチコアプロセッサシステムは、ブロッキング子スレッドを負荷の低いＣＰＵで実行させることで、ブロッキング子スレッドの割当時間が増加されるため、子スレッドの終了時間が短縮され、同時に親スレッドの復帰時間を短縮することができる。
【０１４３】
また、マルチコアプロセッサシステムは、ブロッキング子スレッドを他のＣＰＵに割り当てる場合、親スレッドを、親スレッドを実行するＣＰＵのディスパッチテーブルから退避してもよい。これにより、マルチコアプロセッサシステムは、親スレッドがＣＰＵに割り当てられなくなり、他のプロセス、または他のスレッドのＣＰＵの割当時間を増加することができる。
【０１４４】
また、マルチコアプロセッサシステムは、ノンブロッキングスレッドを他のＣＰＵに実行する場合、キャッシュメモリのコヒーレンシ設定をオンにしてもよい。これにより、マルチコアプロセッサシステムは、同一の領域にアクセスを行うデータの整合性を保つことができる。
【０１４５】
また、マルチコアプロセッサシステムは、ブロッキングスレッドを他のＣＰＵに実行する場合、キャッシュメモリのコヒーレンシ設定をオフにしてもよい。子スレッドがブロッキングスレッドである場合、他のＣＰＵは、複写先の親スレッドコンテキスト領域にアクセスする。したがって、複数のＣＰＵ間で、同一のアドレスにアクセスが行われることがないため、キャッシュメモリのコヒーレンシを行わなくてよい。これにより、マルチコアプロセッサシステムは、メモリアクセスを行うたびに発生していたスヌープ機構の機能を停止できメモリアクセスの処理を高速化できる。また、マルチコアプロセッサシステムは、スヌープ機構を停止するために、消費電力を削減することができる。
【０１４６】
また、マルチコアプロセッサシステムは、ブロッキングスレッドが終了した場合、複写先の親スレッドコンテキスト領域の更新部分を複写元の親スレッドコンテキスト領域に反映し、親スレッドをディスパッチ周期に復帰させてもよい。これにより、マルチコアプロセッサシステムは、シングルコアにて実行した状態と等しい状態にすることができる。
【０１４７】
なお、本実施の形態で説明したスケジューリング方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本スケジューリング方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本スケジューリング方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１４８】
また、本実施の形態で説明したアドレス変換装置１０４は、スタンダードセルやストラクチャードＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの特定用途向けＩＣ（以下、単に「ＡＳＩＣ」と称す。）やＦＰＧＡなどのＰＬＤ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｄｅｖｉｃｅ）によっても実現することができる。具体的には、たとえば、上述したアドレス変換装置１０４の機能（記憶部６０１、判定部６０２、変換部３０９）をＨＤＬ記述によって機能定義し、そのＨＤＬ記述を論理合成してＡＳＩＣやＰＬＤに与えることにより、アドレス変換装置１０４を製造することができる。
【０１４９】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５０】
（付記１）コンピュータによって実行されるスレッドを管理するスケジューラが、
処理される第１スレッドから第２スレッドが生成されるときに負荷が低いＣＰＵを選択し、
前記第２スレッドが前記第１スレッドと排他的動作を行うか否かを判定し、
前記第２スレッドが排他的動作を行うときに前記第１スレッドがアクセスする第１記憶領域を前記ＣＰＵが管理する第２記憶領域に複写し、
前記第２記憶領域のアドレスと所定値とに基づいて、前記第２スレッドが前記第１記憶領域にアクセスするための第２アドレスへのオフセットを算出し、
第１アドレスを、前記第２記憶領域にアクセスするための第３アドレスに変換するために前記第２アドレスへのオフセットを前記ＣＰＵに通知すること
を特徴とするスケジューリング方法。
【０１５１】
（付記２）前記第２スレッドにおいて前記第３アドレスに基づいて前記第２記憶領域がアクセスされること
を特徴とする付記１に記載のスケジューリング方法。
【０１５２】
（付記３）前記第１記憶領域のアドレスと前記所定値に基づいて、前記第１アドレスへのオフセットを算出し、
前記第２記憶領域へのアクセスのレスポンスに対して、前記第１アドレスへのオフセットと前記所定値に基づいて、前記第３アドレスを前記第１記憶領域内を示す第４アドレスに変換するために前記第１アドレスへのオフセットを前記ＣＰＵに通知すること
を特徴とする付記１に記載のスケジューリング方法。
【０１５３】
（付記４）前記第１記憶領域が前記第２記憶領域に複写された後に、前記第１スレッドを退避させること
を特徴とする付記１または付記２に記載のスケジューリング方法。
【０１５４】
（付記５）前記第１スレッドが排他的動作を行わないとき、キャッシュメモリを同期させるためのフラグをオンすること
を特徴とする付記１に記載のスケジューリング方法。
【０１５５】
（付記６）前記第１記憶領域が前記第２記憶領域に複写された後に、キャッシュメモリを同期させるためのフラグをオフすること
を特徴とする付記１、付記２または付記４に記載のスケジューリング方法。
【０１５６】
（付記７）前記第２スレッドが終了したときに、前記第２記憶領域内の更新部分を前記第１記憶領域に反映して、前記第１スレッドを復帰させること
を特徴とする付記１乃至付記６の何れか一に記載のスケジューリング方法。
【０１５７】
（付記８）第１ＣＰＵと第２ＣＰＵとを含む複数のＣＰＵと、
前記第１ＣＰＵに対応するスケジューラと、
前記複数のＣＰＵにバスを介して接続されるとともに、第１記憶領域と第２記憶領域とを含むメモリと、
前記複数のＣＰＵのうちの少なくとも一のＣＰＵと前記メモリとの間に配置されるアドレス変換装置と、
を含み、
前記アドレス変換装置は、前記第１ＣＰＵが管理する前記第１記憶領域にアクセスするためのアドレスを前記第２ＣＰＵが管理する前記第２記憶領域にアクセスするためのアドレスに変換すること
を特徴とするマルチコアプロセッサシステム。
【０１５８】
（付記９）前記アドレス変換装置は、前記第１記憶領域のアドレスと前記第１ＣＰＵにおいて実行される第１スレッドに基づいて生成される第２スレッドが前記第１記憶領域にアクセスするためのアドレスとのオフセットに基づいて、アドレスを変換すること
を特徴とする付記８に記載のマルチコアプロセッサシステム。
【０１５９】
（付記１０）前記アドレス変換装置は、前記第２記憶領域へのアクセスのレスポンスに対して、前記第１記憶領域へのオフセットと所定値に基づいて、前記第２記憶領域のアドレスを前記第１記憶領域のアドレスに変換すること
を特徴とする付記８に記載のマルチコアプロセッサシステム。
【０１６０】
（付記１１）前記アドレス変換装置は、フラグがオン設定されているときにアドレスを変換し、前記フラグがオフ設定されているときにアドレスを変換しないこと
を特徴とする付記８または付記９に記載のマルチコアプロセッサシステム。
【０１６１】
（付記１２）前記フラグは、前記第１ＣＰＵにおいて実行される第１スレッドに基づいて生成される第２スレッドの種類に基づいて設定されること
を特徴とする付記１１に記載にマルチコアプロセッサシステム。
【０１６２】
（付記１３）前記第２スレッドが前記第１スレッドと排他的動作を行う場合に前記フラグがオン設定されること
を特徴とする付記１２に記載のマルチコアプロセッサシステム。
【符号の説明】
【０１６３】
１００  マルチコアプロセッサシステム
＃０、＃１、＃２  ＣＰＵ、ＯＳ、ハイパーバイザ
１０２  メモリ
１０３  バス
１０４  アドレス変換装置
２１０  スヌープ機構
３０１  親スレッド
３０２  子スレッド
３０３  検出部
３０４  判定部
３０５  複写部
３０６  算出部
３０７  通知部
３０８  設定部
３０９  変換部
３１０  スケジューラ
３１１  親スレッドコンテキスト領域
３１２  複写先の親スレッドコンテキスト領域
３１３  シングルコア時の子スレッドコンテキスト領域
３１４  子スレッドコンテキスト領域
【国際調査報告】
2012093488.tif 000018
2012093488.tif 000019
2012093488.tif 000020
2012093488.tif 000021