(57)【要約】【課題】マルチプロセッサシステムの処理性能の向上を図ること。【解決手段】ＣＰＵ＃ｃ１にて実行されているＯＳ制御アプリ１０１は、ＯＳ＃ｏ１によって実行されるスレッド＃ｔ１から実行要求のあった同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断する。互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断した場合、ＯＳ制御アプリ１０１は、ＣＰＵ＃ｃ１に固有の記憶領域であるローカルメモリ＃ｌｍ１を用いて、実行要求があった同期処理を実行する。【選択図】図１
2014063235.tif 000002
【特許請求の範囲】
【請求項１】
複数のＯｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ（ＯＳ）によって制御されるマルチプロセッサシステムの第１のプロセッサが、
記憶部に格納された、前記複数のＯＳのうちの互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を参照して、前記第１のプロセッサを制御する前記複数のＯＳのうちの第１のＯＳによって実行されるスレッドから実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断し、
前記互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断した場合、前記第１のＯＳがアクセス可能な前記第１のプロセッサに固有の記憶領域を用いて、前記実行要求があった同期処理を実行する、
ことを特徴とする実行制御方法。
【請求項２】
前記第１のプロセッサが、
前記第１のＯＳによって実行されるスレッドから実行要求があった同期処理が前記互いに異なるＯＳによって実行されるスレッド間の同期処理であると判断した場合、前記複数のＯＳがアクセス可能な記憶領域を用いて、前記実行要求があった同期処理を実行することを特徴とする請求項１に記載の実行制御方法。
【請求項３】
前記第１のプロセッサが、
同期処理の実行要求を行うスレッドを前記複数のＯＳのうちのいずれかのＯＳが実行した場合、前記同期処理の実行要求を行うスレッドと当該スレッドを実行したＯＳとを関連付け、
前記関連付けた結果に基づいて、前記第１の情報を更新する、処理を実行し、
前記判断する処理は、
更新した前記第１の情報を参照して、前記実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断することを特徴とする請求項１または２に記載の実行制御方法。
【請求項４】
前記記憶部は、前記マルチプロセッサシステムの動作モード毎に前記第１の情報を記憶しており、
前記判断する処理は、
前記第１の情報を参照して、前記マルチプロセッサシステムの動作モードに基づいて、前記実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断することを特徴とする請求項１〜３のいずれか一つに記載の実行制御方法。
【請求項５】
前記第１のプロセッサが、
前記複数のＯＳの中から、割り当てられた全てのスレッドの実行を終了したＯＳを検出した場合、前記マルチプロセッサシステム内で実行待ちのスレッドのうちの、前記終了したＯＳが実行可能な１つのスレッドを選択し、
選択した前記スレッドを前記終了したＯＳによって実行させる、
ことを特徴とする請求項１〜４のいずれか一つに記載の実行制御方法。
【請求項６】
前記第１のプロセッサが、
前記複数のＯＳの中から、割り当てられた全てのスレッドの実行が終了したＯＳを検出した場合、前記マルチプロセッサシステム内で実行待ちのスレッドのうちの、前記終了したＯＳを実行するプロセッサが実行可能なスレッドから１つのスレッドを選択し、
選択した前記スレッドを前記終了したＯＳによって実行させる、
処理を実行することを特徴とする請求項１〜５のいずれか一つに記載の実行制御方法。
【請求項７】
複数のＯＳによって制御されるマルチプロセッサシステムであって、
第１のプロセッサと、
前記複数のＯＳのうちの互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を記憶する記憶部と、
前記第１の情報を参照して、前記第１のプロセッサを制御する前記複数のＯＳのうちの第１のＯＳによって実行されるスレッドから実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断する判断部とを有し、
前記第１のプロセッサは、前記判断部によって前記互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断された場合、前記第１のＯＳがアクセス可能な前記第１のプロセッサに固有の記憶領域を用いて、前記実行要求があった同期処理を実行する、
ことを特徴とするマルチプロセッサシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、実行制御方法、およびマルチプロセッサシステムに関する。
【背景技術】
【０００２】
従来、複数のＯｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ（ＯＳ）によって制御されるシステムがある。たとえば、複数のＯＳ上で実行されるスレッドの優先順位に基づいて、プロセッサにより優先して実行するＯＳを切り替える技術がある。また、複数のプロセッサにより複数のＯＳを実行するシステムに、各ＯＳに固有の処理を実行する処理部と、複数のＯＳにより実行する並列処理を実行する処理部とを含み、並列処理を実行するＯＳを決定する技術がある。（たとえば、下記特許文献１、２を参照。）
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０００−２４２５１２号公報
【特許文献２】特開２００９−１６３５２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、上述した従来技術を適用した、複数のＣＰＵにより複数のＯＳを実行するマルチプロセッサシステムにおいて、互いに異なるＯＳによって実行されるスレッド間の同期処理により、マルチプロセッサシステムの処理性能の低下を招く。
【０００５】
本発明は、上述した従来技術による問題点を解消するため、マルチプロセッサシステムの処理性能の向上を図る実行制御方法、およびマルチプロセッサシステムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、複数のＯＳによって制御されるマルチプロセッサシステムの第１のプロセッサが、記憶部に格納された、複数のＯＳのうちの互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を参照して、第１のプロセッサを制御する複数のＯＳのうちの第１のＯＳによって実行されるスレッドから実行要求があった同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断し、互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断した場合、第１のＯＳがアクセス可能な第１のプロセッサに固有の記憶領域を用いて、実行要求があった同期処理を実行する実行制御方法、およびマルチプロセッサシステムが提案される。
【発明の効果】
【０００７】
本発明の一側面によれば、マルチプロセッサシステムの処理性能の向上を図ることができるという効果を奏する。
【図面の簡単な説明】
【０００８】
【図１】図１は、本実施の形態にかかるマルチプロセッサシステムの動作例を示す説明図である。
【図２】図２は、マルチプロセッサシステムのハードウェア構成例の一例を示すブロック図である。
【図３】図３は、ＣＰＵｓとメモリとの接続例を示す説明図である。
【図４】図４は、マルチプロセッサシステムの機能構成例を示すブロック図である。
【図５】図５は、スレッドおよびＯＳ関連付けテーブルの記憶内容の一例を示す説明図である。
【図６】図６は、スレッドおよび同期処理ＩＤ関連付けテーブルの記憶内容の一例を示す説明図である。
【図７】図７は、同期処理ＩＤおよびＯＳ関連付けテーブルの記憶内容の一例を示す説明図である。
【図８】図８は、管理情報の記憶内容の一例を示す説明図である。
【図９】図９は、同期処理ＩＤおよびＯＳ関連付けテーブルの更新例を示す説明図である。
【図１０】図１０は、同期処理の実行主体決定処理手順の一例を示すフローチャートである。
【図１１】図１１は、スレッドおよびＯＳ関連付けテーブルの更新処理手順の一例を示すフローチャートである。
【図１２】図１２は、同期処理ＩＤおよびＯＳ関連付けテーブルの更新処理手順の一例を示すフローチャートである。
【図１３】図１３は、ＣＰＵ割当テーブルの記憶内容の一例を示す説明図である。
【図１４】図１４は、スレッド情報テーブルの記憶内容の一例を示す説明図である。
【図１５】図１５は、割当可能ＯＳ数テーブルの記憶内容の一例を示す説明図である。
【図１６】図１６は、ＣＰＵ状態テーブルの記憶内容の一例を示す説明図である。
【図１７】図１７は、スレッド割当予定記憶テーブルの記憶内容の一例を示す説明図である。
【図１８】図１８は、統一スケジューリングを行う前のスレッドの割当状態を示す説明図である。
【図１９】図１９は、統一スケジューリングの探索処理における第１の段階を示す説明図である。
【図２０】図２０は、統一スケジューリングの探索処理における第２の段階を示す説明図である。
【図２１】図２１は、統一スケジューリングの探索処理における第３の段階を示す説明図である。
【図２２】図２２は、統一スケジューリングの探索処理における第４の段階を示す説明図である。
【図２３】図２３は、統一スケジューリングの探索処理における第５の段階を示す説明図である。
【図２４】図２４は、統一スケジューリングの探索処理における第６の段階を示す説明図である。
【図２５】図２５は、統一スケジューリングの探索処理における第７の段階を示す説明図である。
【図２６】図２６は、統一スケジューリングの探索処理における第８の段階を示す説明図である。
【図２７】図２７は、統一スケジューリングの探索処理における第９の段階を示す説明図である。
【図２８】図２８は、統一スケジューリングの停止再開処理における第１の段階を示す説明図である。
【図２９】図２９は、統一スケジューリングの停止再開処理における第２の段階を示す説明図である。
【図３０】図３０は、統一スケジューリングの停止再開処理における第３の段階を示す説明図である。
【図３１】図３１は、統一スケジューリングの停止再開処理における第４の段階を示す説明図である。
【図３２】図３２は、統一スケジューリングの停止再開処理における第５の段階を示す説明図である。
【図３３】図３３は、統一スケジューリングの停止再開処理における第６の段階を示す説明図である。
【図３４】図３４は、統一スケジューリング処理手順の一例を示すフローチャートである。
【図３５】図３５は、統一スケジューリングの前処理手順の一例を示すフローチャートである。
【図３６】図３６は、統一スケジューリングの探索処理手順の一例を示すフローチャートである。
【図３７】図３７は、統一スケジューリングの停止再開処理手順の一例を示すフローチャート（その１）である。
【図３８】図３８は、統一スケジューリングの停止再開処理手順の一例を示すフローチャート（その２）である。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、開示の実行制御方法、およびマルチプロセッサシステムの実施の形態を詳細に説明する。
【００１０】
図１は、本実施の形態にかかるマルチプロセッサシステムの動作例を示す説明図である。マルチプロセッサシステム１００は、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ３と、ローカルメモリ＃ｌｍ１、シェアードメモリ＃ｓｍ２と、グローバルメモリ＃ｇｍを含む。以下の説明にて、“＃”以降の接尾符号を、図１〜図３８内では各ハードウェア、各ソフトウェアの識別情報としても用いる。
【００１１】
マルチプロセッサシステムとは、複数のプロセッサを含むコンピュータのシステムである。また、１つのプロセッサに複数のコアが含まれていてもよい。なお、本実施の形態では、シングルコアのプロセッサであるＣＰＵが並列されている形態を例にあげて説明する。
【００１２】
ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３は、共通の命令セットとレジスタセットのプロセッサであり、ＣＰＵ＃ｃ１とＣＰＵ＃ｃ２は、異なる命令セットとレジスタセットのプロセッサである。このように、マルチプロセッサシステム１００は、ヘテロジニアス・プロセッサとなっている。ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ３を１つのＯＳで制御するには、命令セットやレジスタセットの違いやキャッシュの違いからキャッシュの一貫性を取る処理量が多くなる。したがって、マルチプロセッサシステム１００は、ＣＰＵ＃ｃ１をＯＳ＃ｏ１によって制御し、ＣＰＵ＃ｃ２、ＣＰＵ＃ｃ３をＯＳ＃ｏ１とは異なるＯＳ＃ｏ２によって制御している。ＯＳ＃ｏ１は、スレッド＃ｔ１を実行し、ＯＳ＃ｏ２は、スレッド＃ｔ２を実行している。
【００１３】
次に、ＣＰＵとローカルメモリ＃ｌｍ１、シェアードメモリ＃ｓｍ２と、グローバルメモリ＃ｇｍについて説明する。ローカルメモリ＃ｌｍ１は、ＣＰＵ＃ｃ１固有の記憶装置である。なお、ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３の固有の記憶装置があってもよい。ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３の固有の記憶装置を含めた説明は、図３にて後述する。シェアードメモリ＃ｓｍ２は、ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３とから共有される記憶装置である。グローバルメモリ＃ｇｍは、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ３から共有される記憶装置である。ローカルメモリ＃ｌｍ、シェアードメモリ＃ｓｍ、グローバルメモリ＃ｇｍは、ＣＰＵから近い記憶装置の方が、読み書き速度が速い。
【００１４】
続けて、スレッド＃ｔ１、スレッド＃ｔ２について説明する。スレッドとはプログラムの実行単位である。スレッドは、ＯＳの種類によっては、タスクとも呼ばれる。本実施の形態では、スレッドで統一して説明を行う。スレッドの状態としては、ＯＳによってＣＰＵに割り当てられて実行中である実行状態、実行要求を受けて実行待ちであるがＣＰＵに割り当てられていない実行可能状態とがある。
【００１５】
また、ＯＳ制御アプリ１０１は、ＯＳ＃ｏ１上で実行するソフトウェアである。ＯＳ制御アプリ１０１は、ＯＳ＃ｏ２上で実行することも可能である。ＯＳ制御アプリ１０１は、同期処理が実行される場合に、処理性能の向上を図るため、同期処理が用いる情報が格納される位置を変更する。また、ＯＳ制御アプリ１０１は、マルチプロセッサシステム１００全体のスレッドのスケジューリングを行ってもよい。以下、ＯＳ制御アプリ１０１が実行するスケジューリングを、「統一スケジューリング」と呼称する。
【００１６】
同期処理とは、複数のスレッドの処理を制御する処理である。同期処理は、たとえば、セマフォ、イベントフラグ、メールボックス、メモリプールがある。具体的に、複数のスレッドで１つの値を共有する場合、複数のスレッドは、セマフォを用いて値の共有を実現することができる。このとき、セマフォが用いる情報は、複数のＯＳからアクセスできるように、グローバルメモリ＃ｇｍとなる。マルチプロセッサシステム１００の第１のＣＰＵとなるＣＰＵ＃ｃ１にて実行されているＯＳ制御アプリ１０１は、処理性能の向上を図るため、同期処理が用いる情報が格納される位置を変更する。
【００１７】
ＯＳ制御アプリ１０１は、第１のＯＳとなるＯＳ＃ｏ１によって実行されるスレッド＃ｔ１から実行要求のあった同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断する。実行要求のあった同期処理を検出する方法として、たとえば、ＯＳ制御アプリ１０１は、スレッドが呼び出す同期処理のＡｐｐｌｉｃａｔｉｏｎ  Ｐｒｏｇｒａｍｍｉｎｇ  Ｉｎｔｅｒｆａｃｅ（ＡＰＩ）のアドレスにフックを仕掛けておく。これにより、ＯＳ制御アプリ１０１が実行要求のあった同期処理を検出することができる。また、具体的な判断方法として、ＯＳ制御アプリ１０１は、互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を記憶する記憶部を参照する。具体的な記憶内容については、図７にて後述する。
【００１８】
互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断した場合、ＯＳ制御アプリ１０１は、ＣＰＵ＃ｃ１に固有の記憶領域であるローカルメモリ＃ｌｍ１を用いて、実行要求があった同期処理を実行する。
【００１９】
このように、ＯＳ制御アプリ１０１は、あるＯＳからの同期処理が他ＯＳが実行するスレッドから呼ばれない時、ＯＳを実行するＣＰＵ固有の記憶領域を用いて同期処理を行う。これにより、メモリ一貫性を取らなくてよい同期処理について、複数のＣＰＵ共有の記憶領域であるグローバルメモリ＃ｇｍを用いずに済み、マルチプロセッサシステム１００の処理性能が向上する。以下、図２〜図３８を用いて、マルチプロセッサシステム１００について詳細に説明する。
【００２０】
（マルチプロセッサシステム１００のハードウェア）
図２は、マルチプロセッサシステムのハードウェア構成例の一例を示すブロック図である。図２において、携帯端末を想定するマルチプロセッサシステム１００は、ＣＰＵｓ２０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、フラッシュＲＯＭ２０４と、フラッシュＲＯＭコントローラ２０５と、フラッシュＲＯＭ２０６を有する。さらに、マルチプロセッサシステム１００は、さらに、ディスプレイ２０７と、Ｉ／Ｆ２０８と、キーボード２０９と、カメラデバイス２１０を有する。また、図１に示したグローバルメモリ＃ｇｍは、ＲＡＭ２０３、フラッシュＲＯＭ２０４と、フラッシュＲＯＭ２０６といった記憶装置となる。
【００２１】
ここで、ＣＰＵｓ２０１は、マルチプロセッサシステム１００の全体の制御を司る制御装置群である。ＣＰＵｓ２０１の具体的な例については、図３にて記述する。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶している不揮発性メモリである。ＲＡＭ２０３は、ＣＰＵｓ２０１のワークエリアとして使用される揮発性メモリである。フラッシュＲＯＭ２０４は、書き換え可能な不揮発性メモリである。たとえば、フラッシュＲＯＭ２０４は、読出し速度が高速なＮＯＲ型フラッシュメモリである。フラッシュＲＯＭ２０４は、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）などのシステムソフトウェアやアプリなどを記憶している。たとえば、ＯＳを更新する場合、マルチプロセッサシステム１００は、Ｉ／Ｆ２０８によって新しいＯＳを受信し、フラッシュＲＯＭ２０４に格納されている古いＯＳを、受信した新しいＯＳに更新する。
【００２２】
フラッシュＲＯＭコントローラ２０５は、ＣＰＵｓ２０１の制御にしたがってフラッシュＲＯＭ２０６に対するデータのリード／ライトを制御する制御装置である。フラッシュＲＯＭ２０６は、書き換え可能な不揮発性メモリであり、たとえば、データの保存、運搬を主に目的とした、ＮＡＮＤ型フラッシュメモリである。フラッシュＲＯＭ２０６は、フラッシュＲＯＭコントローラ２０５の制御で書き込まれたデータを記憶する。データの具体例としては、マルチプロセッサシステム１００を使用するユーザがＩ／Ｆ２０８を通して取得した画像データ、映像データなどや、また本実施の形態にかかる実行制御方法を実行するプログラムを記憶してもよい。フラッシュＲＯＭ２０６は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００２３】
ディスプレイ２０７は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する表示装置である。ディスプレイ２０７は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。
【００２４】
Ｉ／Ｆ２０８は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２１２に接続され、ネットワーク２１２を介して他の装置に接続される。そして、Ｉ／Ｆ２０８は、ネットワーク２１２と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０８には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００２５】
キーボード２０９は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０９は、タッチパネル式の入力パッドやテンキーなどであってもよい。カメラデバイス２１０は、静止画や動画を撮影する装置である。
【００２６】
図３は、ＣＰＵｓとメモリとの接続例を示す説明図である。図３では、ＣＰＵｓ２０１に含まれるＣＰＵ群と、ＣＰＵ群がアクセス可能なメモリであるローカルメモリ＃ｌｍと、シェアードメモリ＃ｓｍと、グローバルメモリ＃ｇｍとについて説明する。
【００２７】
ＣＰＵｓ２０１は、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６を含む。ＣＰＵ＃ｃ１、ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３、ＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６は、それぞれ共通の命令セットとレジスタセットのプロセッサである。また、ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３は、命令セットとレジスタセットが同一であれば、処理性能が異なってもよい。同様に、ＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６も、命令セットとレジスタセットが同一であれば、処理性能が異なってもよい。
【００２８】
ＯＳ＃ｏ１は、ＣＰＵ＃ｃ１が実行するＯＳである。ＯＳ＃ｏ２は、ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３が実行するＯＳである。ＯＳ＃ｏ３は、ＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６が実行するＯＳである。
【００２９】
ローカルメモリ＃ｌｍ１〜ローカルメモリ＃ｌｍ６は、それぞれ、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６固有の記憶装置である。ローカルメモリ＃ｌｍ１〜ローカルメモリ＃ｌｍ６は、たとえば、各ＣＰＵにて用いられるデータを記憶している。また、ローカルメモリ＃ｌｍ１は、ＯＳ＃ｏ１のプログラムデータである、ＯＳ＃ｏ１プログラムを記憶している。ＯＳのプログラムデータは、変更しない命令コード列と固定値の変数やテーブル、変更する初期値付き変数やテーブル、初期値なし変数やテーブルを含む。
【００３０】
シェアードメモリ＃ｓｍ２は、ＣＰＵ＃ｃ２とＣＰＵ＃ｃ３とから共有される記憶装置である。また、シェアードメモリ＃ｓｍ３は、ＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６とから共有される記憶装置である。シェアードメモリ＃ｓｍ２は、ＯＳ＃ｏ２のプログラムデータである、ＯＳ＃ｏ２プログラムを記憶している。同様に、シェアードメモリ＃ｓｍ３は、ＯＳ＃ｏ３のプログラムデータである、ＯＳ＃ｏ３プログラムを記憶している。
【００３１】
グローバルメモリ＃ｇｍは、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６から共有される記憶装置である。ローカルメモリ＃ｌｍ、シェアードメモリ＃ｓｍ、グローバルメモリ＃ｇｍは、ＣＰＵから近い記憶装置の方が、読み書き速度が速い。ＣＰＵ＃ｃ２の例では、ローカルメモリ＃ｌｍ２が最も読み書き速度が速く、シェアードメモリ＃ｓｍ２、グローバルメモリ＃ｇｍの順に遅くなる。
【００３２】
（マルチプロセッサシステム１００の機能）
次に、マルチプロセッサシステム１００の機能について説明する。図４は、マルチプロセッサシステムの機能構成例を示すブロック図である。マルチプロセッサシステム１００は、関連付け部４０１と、更新部４０２と、判断部４０３と、実行部４０４と、選択部４０５と、制御部４０６とを含む。関連付け部４０１〜制御部４０６は、記憶装置に記憶されたＯＳ制御アプリ１０１のプログラムコードをＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６のいずれかが実行することにより、関連付け部４０１〜制御部４０６の機能を実現する。記憶装置とは、具体的には、たとえば、ローカルメモリ＃ｌｍ、シェアードメモリ＃ｓｍ、グローバルメモリ＃ｇｍなどである。関連付け部４０１〜制御部４０６は、図４では、ＯＳ＃ｏ３上の機能として図示してあるが、ＯＳ＃ｏ１や、ＯＳ＃ｏ２の機能であってもよい。
【００３３】
また、マルチプロセッサシステム１００は、スレッドおよびＯＳ関連付けテーブル４１１と、スレッドおよび同期処理ＩＤ関連付けテーブル４１２と、同期処理ＩＤおよびＯＳ関連付けテーブル４１３と、管理情報４１４とにアクセス可能である。さらに、マルチプロセッサシステム１００は、ＣＰＵ割当テーブル４２１と、スレッド情報テーブル４２２と、割当可能ＯＳ数テーブル４２３と、ＣＰＵ状態テーブル４２４と、スレッド割当予定記憶テーブル４２５とにアクセス可能である。
【００３４】
スレッドおよびＯＳ関連付けテーブル４１１〜管理情報４１４、ＣＰＵ割当テーブル４２１〜スレッド割当予定記憶テーブル４２５は、グローバルメモリ＃ｇｍに格納されている。スレッドおよびＯＳ関連付けテーブル４１１〜管理情報４１４、ＣＰＵ割当テーブル４２１〜スレッド割当予定記憶テーブル４２５の具体的な説明は、図５〜図８、図１３〜図１７に説明する。
【００３５】
同期処理ＩＤおよびＯＳ関連付けテーブル４１３は、互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を記憶する。第１の情報は、たとえば、同期処理の識別情報と、該当の同期処理が互いに異なるＯＳによって実行されるスレッド間の同期処理であるか否かを示す値とを有する。また、第１の情報は、同期処理の識別情報と、該当の同期処理の実行要求を行うスレッドを実行するＯＳの識別情報と、を有してもよい。
【００３６】
関連付け部４０１は、同期処理の実行要求を行うスレッドを複数のＯＳのうちのいずれかのＯＳが実行した場合、同期処理の実行要求を行うスレッドと当該スレッドを実行したＯＳとを関連付ける。たとえば、スレッド＃ｔ１をＯＳ＃ｏ１が実行した場合、関連付け部４０１は、スレッド＃ｔ１とＯＳ＃ｏ１を関連付ける。また、どのスレッドが同期処理の実行要求を行うかを特定するかについて、関連付け部４０１は、スレッドおよび同期処理ＩＤ関連付けテーブル４１２を参照してもよいし、スレッドから実行要求があった同期処理を記憶しておいた情報を参照してもよい。なお、関連付けた情報は、ローカルメモリ＃ｌｍ、スレッドおよびＯＳ関連付けテーブル４１１等に記憶される。
【００３７】
更新部４０２は、関連付け部４０１によって関連付けられた関連付け結果に基づいて、同期処理ＩＤおよびＯＳ関連付けテーブル４１３に記憶されている、互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を更新する。たとえば、関連付け部４０１が、スレッド＃ｔ１とＯＳ＃ｏ１とを関連付け、さらに、スレッド＃ｔ１とＯＳ＃ｏ２とを関連付けたとする。このとき、更新部４０２は、スレッド＃ｔ１から実行要求が行われる同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理であるとして、同期処理ＩＤおよびＯＳ関連付けテーブル４１３を更新する。
【００３８】
判断部４０３は、第１の情報を参照して、第１のＣＰＵを制御する複数のＯＳのうちの第１のＯＳによって実行されるスレッドから実行要求があった同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断する。たとえば、同期処理ＩＤおよびＯＳ関連付けテーブル４１３が、セマフォＩＤ＃ｓ１と、ＯＳ＃ｏ１およびＯＳ＃ｏ２とを関連付けて記憶している状態とする。この状態で、セマフォＩＤ＃ｓ１の実行要求があった場合、判断部４０３は、実行要求があった同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理であると判断する。
【００３９】
また、判断部４０３は、第１の情報を参照して、スレッドから実行要求があった同期処理が、複数のＣＰＵの同一種別のＯＳによって実行されるスレッド間の同期処理か否かを判断してもよい。
【００４０】
また、判断部４０３は、更新部４０２によって更新された第１の情報を参照して、実行要求があった同期処理が、同一種類のＯＳによって実行されるスレッド間の同期処理か否かを判断してもよい。たとえば、判断部４０３は、セマフォＩＤ＃ｓ１と、ＯＳ＃ｏ１と、ＯＳ＃ｏ１と同一種類のＯＳ＃ｏ１’とを関連付けて記憶しているとする。このとき、判断部４０３は、セマフォＩＤ＃ｓ１が同一種類のＯＳによって実行されるスレッド間の同期処理であると判断する。
【００４１】
また、判断部４０３は、第１の情報を参照して、マルチプロセッサシステム１００の動作モードに基づき、実行要求があった同期処理が、互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断する。マルチプロセッサシステム１００の動作モードとは、ユーザ等により指定され、マルチプロセッサシステム１００の動作の状態を示している。動作モードが変わると、同期処理の実行要求を実行するか否かが変わるスレッドがあってもよい。なお、判断結果は、ローカルメモリ＃ｌｍ等に記憶される。
【００４２】
実行部４０４は、判断部４０３によって互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断された場合、第１のＯＳがアクセス可能な第１のＣＰＵに固有の記憶領域を用いて、実行要求があった同期処理を実行する。たとえば、実行部４０４は、ローカルメモリ＃ｌｍを用いて、実行要求があった同期処理を実行する。具体的に、実行部４０４として、ＯＳが同期処理を実行してもよいし、ＯＳ制御アプリ１０１が同期処理を実行してもよい。
【００４３】
また、実行部４０４は、判断部４０３によって実行要求があった同期処理が同一種類のＯＳによって実行されるスレッド間の同期処理であると判断された場合、同一種類のＯＳがアクセス可能な記憶領域を用いて、実行要求があった同期処理を実行してもよい。たとえば、判断部４０３が、ＯＳ＃ｏ１によって実行されるスレッドと、ＯＳ＃ｏ１と同一種類のＯＳ＃ｏ１’によって実行されるスレッド間の同期処理であると判断したとする。このとき、実行部４０４は、ＯＳ＃ｏ１とＯＳ＃ｏ１’とがアクセス可能な記憶領域を用いて、実行要求があった同期処理を実行してもよい。これにより、多くのＣＰＵによってアクセスされる記憶領域を可能な限り避けて同期処理を実行することができるため、マルチプロセッサシステム１００の処理性能を向上できる。
【００４４】
また、実行部４０４は、判断部４０３によって実行要求があった同期処理が互いに異なるＯＳによって実行されるスレッド間の同期処理であると判断された場合、複数のＯＳがアクセス可能な記憶領域を用いて、実行要求があった同期処理を実行してもよい。たとえば、実行部４０４は、グローバルメモリ＃ｇｍを用いて、実行要求があった同期処理を実行する。
【００４５】
選択部４０５は、複数のＯＳの中から、割り当てられた全てのスレッドの実行を終了したＯＳを検出した場合、マルチプロセッサシステム内で実行待ちのスレッドのうちの、終了したＯＳが実行可能な１つのスレッドを選択する。たとえば、ＯＳ＃ｏ１に割り当てられた１つのスレッドの実行が終了したとする。このとき、選択部４０５は、ＯＳ＃ｏ１が実行可能なスレッドから１つのスレッドを選択する。
【００４６】
また、複数のＯＳの中から、割り当てられた全てのスレッドの実行が終了したＯＳを検出したとする。このとき、選択部４０５は、マルチプロセッサシステム内で実行待ちのスレッドのうちの、終了したＯＳを実行するＣＰＵが実行可能な１つのスレッドを選択してもよい。たとえば、ＯＳ＃ｏ２に割り当てられた１つのスレッドの実行が終了したとする。このとき、選択部４０５は、ＯＳ＃ｏ２を実行するＣＰＵ＃ｃ２が実行可能なスレッドから１つのスレッドを選択する。なお、選択結果は、ローカルメモリ＃ｌｍ等に記憶される。
【００４７】
制御部４０６は、選択部４０５によって選択されたスレッドを終了したＯＳによって実行させる。たとえば、制御部４０６は、スレッドの実行が終わったＯＳ＃ｏ１に、スレッド＃ｔ２を実行させる。
【００４８】
図５は、スレッドおよびＯＳ関連付けテーブルの記憶内容の一例を示す説明図である。スレッドおよびＯＳ関連付けテーブル４１１は、動作モード毎に、スレッドとＯＳの関連付けた情報を記憶している。
【００４９】
図５で示すスレッドおよびＯＳ関連付けテーブル４１１は、撮影前のビューモードにおけるスレッドおよびＯＳ関連付けテーブル５０１−１と、静止画撮影モードにおけるスレッドおよびＯＳ関連付けテーブル５０１−２を含む。さらに、図５で示すスレッドおよびＯＳ関連付けテーブル４１１は、動画撮影モードにおけるスレッドおよびＯＳ関連付けテーブル５０１−３と、動画再生モードにおけるスレッドおよびＯＳ関連付けテーブル５０１−４と、を含む。また、図５にて図示していないが、スレッドおよびＯＳ関連付けテーブル４１１は、他のモードにおけるスレッドおよびＯＳ関連付けテーブル５０１−ｘを含む。ｘは、正の整数である。
【００５０】
各動作モードのスレッドとＯＳの関連付けテーブルは、同一のフィールドを有しており、説明の簡略化のため、撮影前のビューモードにおけるスレッドおよびＯＳ関連付けテーブル５０１−１について説明する。
【００５１】
撮影前のビューモードにおけるスレッドおよびＯＳ関連付けテーブル５０１−１は、レコード５０１−１−１〜レコード５０１−１−１０を記憶する。撮影前のビューモードにおけるスレッドおよびＯＳ関連付けテーブル５０１−１は、スレッドＩＤ、属するＯＳという２つのフィールドを含む。スレッドＩＤフィールドには、スレッドを識別する識別情報が格納される。属するＯＳフィールドには、スレッドフィールドに格納されたスレッドが属するＯＳの識別情報が格納される。たとえば、レコード５０１−１−１は、スレッド＃ｔ１が、ＯＳ＃ｏ２に属するということを示している。
【００５２】
図６は、スレッドおよび同期処理ＩＤ関連付けテーブルの記憶内容の一例を示す説明図である。スレッドおよび同期処理ＩＤ関連付けテーブル４１２は、スレッドごとに、該当のスレッドが利用する同期処理を記憶している。図６に示すスレッドおよび同期処理ＩＤ関連付けテーブル４１２は、レコード６０１−１〜レコード６０１−１０を記憶している。
【００５３】
スレッドおよび同期処理ＩＤ関連付けテーブル４１２は、スレッドＩＤ、利用セマフォＩＤ、利用イベントフラグＩＤ、利用メールボックスＩＤ、利用メモリプールＩＤという５つのフィールドを含む。スレッドＩＤフィールドには、スレッドを識別する識別情報が格納される。利用セマフォＩＤフィールドには、スレッドフィールドに格納されたスレッドが利用するセマフォの識別情報が格納される。利用イベントフラグＩＤフィールドには、スレッドフィールドに格納されたスレッドが利用するイベントフラグの識別情報が格納される。利用メールボックスＩＤフィールドには、スレッドフィールドに格納されたスレッドが利用するメールボックスの識別情報が格納される。利用メモリプールＩＤフィールドには、スレッドフィールドに格納されたスレッドが利用するメモリプールの識別情報が格納される。
【００５４】
たとえば、レコード６０１−２は、スレッド＃ｔ２が、セマフォＩＤ＃ｓ７と、イベントフラグＩＤ＃ｅ３と、イベントフラグＩＤ＃ｅ４と、メールボックスＩＤ＃ｍｂ１と、メモリプールＩＤ＃ｍｐ２を利用することを示している。
【００５５】
図７は、同期処理ＩＤおよびＯＳ関連付けテーブルの記憶内容の一例を示す説明図である。同期処理ＩＤおよびＯＳ関連付けテーブル４１３は、同期処理ごとに、該当の同期処理を利用するスレッドの属するＯＳを記憶している。図７に示す同期処理ＩＤおよびＯＳ関連付けテーブル４１３は、セマフォＩＤおよびＯＳ関連付けテーブル７０１−１と、イベントフラグＩＤおよびＯＳ関連付けテーブル７０１−２と、を含む。さらに、図７に示す同期処理ＩＤおよびＯＳ関連付けテーブル４１３は、メールボックスＩＤおよびＯＳ関連付けテーブル７０１−３と、メールプールＩＤおよびＯＳ関連付けテーブル７０１−４と、を含む。以下、説明の簡略化のため、セマフォＩＤおよびＯＳ関連付けテーブル７０１−１について説明を行う。
【００５６】
図７に示すセマフォＩＤおよびＯＳ関連付けテーブル７０１−１は、レコード７０１−１−１〜レコード７０１−１−８を記憶する。セマフォＩＤおよびＯＳ関連付けテーブル７０１−１は、セマフォＩＤ、利用スレッドの属するＯＳという２つのフィールドを含む。セマフォＩＤフィールドには、セマフォの識別情報が格納される。利用スレッドの属するＯＳフィールドには、該当のセマフォを利用するスレッドが属するＯＳの識別情報が格納される。
【００５７】
たとえば、レコード７０１−１−１は、セマフォＩＤ＃ｓ１が、ＯＳ＃ｏ１とＯＳ＃ｏ２とに属するスレッドから利用されることを示している。
【００５８】
図８は、管理情報の記憶内容の一例を示す説明図である。管理情報４１４は、実行中管理情報８０１、実行可能管理情報８０２、スレッド情報８０３、時間待ち管理情報８０４、セマフォ情報８０５、イベントフラグ情報８０６、メールボックス情報８０７、メモリプール情報８０８を有する。
【００５９】
実行中管理情報８０１は、ＣＰＵ個数分あり、該当のＣＰＵが実行中のスレッドを示す情報である。実行中管理情報８０１のチェーン要素は実行中の１つのスレッド情報８０３へのポインタが格納されている。
【００６０】
実行可能管理情報８０２は、１つ存在し、実行可能なスレッド群を示す情報である。実行可能管理情報８０２の待ちキュー要素は、一方向リストを形成しており、実行可能なスレッド情報８０３が数珠つなぎにつながる。
【００６１】
スレッド情報８０３はスレッド個数分あり、スレッドの属性を示す情報である。複数のスレッド情報８０３を識別するため、ＯＳ制御アプリ１０１は、スレッドＩＤを用いて索引する。スレッド情報８０３のチェーン要素は、管理情報４１４のうちの時間待ち管理情報８０４以外の情報に結合している。
【００６２】
スレッド情報８０３の時間待ちチェーン要素は、タイムアウトを実現する場合、時間待ち管理情報８０４の待ちキュー要素からつながる。スレッド情報８０３のＯＳＩＤ要素は、スレッドを実行中のＯＳの識別情報を示している。スレッド情報８０３のスレッドＩＤ要素はスレッドの識別情報である。スレッド情報８０３のＣＰＵＩＤ要素はスレッドを実行中のＣＰＵの識別情報を示している。
【００６３】
スレッド情報８０３の状態値要素はスレッドの状態である。スレッド情報８０３の状態値は実行状態、実行可能状態、待ち状態（時間、セマフォ、イベント、メールボックス、メモリプール）、未登録がある。スレッド情報８０３の優先度要素はスレッドの優先度を示す値である。スレッド情報８０３の待ちフラグ要素とスレッド情報８０３のフラグモード要素はイベントフラグ待ちにおいて条件を格納するものである。スレッド情報８０３の待ち時間要素は時間待ち時に復帰時間を示すものである。
【００６４】
時間待ち管理情報８０４は、１つ存在し、待ち状態となっているスレッドを示す情報である。時間待ちしているスレッド情報８０３が、待ちキュー要素により数珠つなぎにつながる。待ち時間は、スレッド情報８０３内の待ち時間要素に格納される。
【００６５】
セマフォ情報８０５はセマフォ個数分ある。複数のセマフォ情報８０５を識別するため、ＯＳ制御アプリ１０１は、セマフォＩＤで索引する。セマフォ獲得待ちのスレッド情報８０３が、セマフォ情報８０５の待ちキュー要素により数珠つなぎにつながる。セマフォ情報８０５のカウンタ要素は、未割当資源数である。セマフォ情報８０５のカウンタ要素の値が０の場合、資源なしの状態を示す。
【００６６】
イベントフラグ情報８０６は、イベント個数分ある。複数のイベントフラグ情報８０６を識別するため、ＯＳ制御アプリ１０１は、イベントフラグＩＤで索引する。イベントフラグ待ちのスレッド情報８０３が、イベントフラグ情報８０６の待ちキュー要素により数珠つなぎにつながる。イベント待ち条件は、スレッド情報８０３内の待ちフラグ要素とフラグモード要素に格納される。イベントフラグ情報８０６のフラグ要素は現在のイベントフラグの値である。
【００６７】
メールボックス情報８０７は、メールボックス個数分ある。複数のメールボックス情報８０７を識別するため、ＯＳ制御アプリ１０１は、メールボックスＩＤで索引する。メール待ちのスレッド情報８０３が、メールボックス情報８０７の待ちキュー要素により数珠つなぎにつながる。メールボックス情報８０７の先頭要素と末尾要素はメッセージチェーン要素から始まるメッセージバッファの先頭と末尾の位置を示している。
【００６８】
メモリプール情報８０８は、メモリプール個数分ある。複数のメモリプール情報８０８を識別するため、ＯＳ制御アプリ１０１は、メモリプールＩＤで索引する。メモリプール取得待ちのスレッド情報８０３が、メモリプール情報８０８の待ちキュー要素により数珠つなぎにつながる。メモリプール情報８０８のカウンタ要素は最大メモリブロック個数の値である。メモリプール情報８０８のブロックサイズ要素は一度のメモリプール取得で取得できるメモリサイズを示している。メモリプール情報８０８の管理テーブル要素はメモリブロックの使用状態を示している。メモリプール情報８０８のメモリプールアドレス要素はメモリプールの先頭アドレスを示している。
【００６９】
図９は、同期処理ＩＤおよびＯＳ関連付けテーブルの更新例を示す説明図である。図９では、スレッドの割り当て結果に応じて、同期処理ＩＤおよびＯＳ関連付けテーブル４１３を更新する例を示す。
【００７０】
たとえば、更新前のレコード７０１−１−１は、セマフォＩＤ＃ｓ１が、ＯＳ＃ｏ１とＯＳ＃ｏ２とに属するスレッドから利用されることを示していたと状態とする。この状態で、マルチプロセッサシステム１００は、スレッド＃ｔ１〜スレッド＃ｔ１０が所定期間、ＯＳ＃ｏ１〜ＯＳ＃ｏ３に割り当てられた結果、スレッド＃ｔ９がＯＳ＃ｏ２に割り当てられず、ＯＳ＃ｏ１に割り当てられたと状態になったとする。所定期間は、マルチプロセッサシステム１００の開発者によって指定される期間であり、たとえば、１秒間である。この状態で、マルチプロセッサシステム１００は、スレッド＃ｔ１〜スレッド＃ｔ１０を所定期間、ＯＳ＃ｏ１〜ＯＳ＃ｏ３に割り当てた結果、スレッド＃ｔ９がＯＳ＃ｏ２に割り当てられず、ＯＳ＃ｏ１に割り当てられたとする。このとき、マルチプロセッサシステム１００は、レコード５０１−１−９の属するＯＳフィールドの値を、“ｏ１，ｏ２”から、“ｏ１”に更新する。
【００７１】
次に、マルチプロセッサシステム１００は、レコード６０１−９を参照して、スレッド＃ｔ９が利用するセマフォＩＤが、セマフォＩＤ＃ｓ１、セマフォＩＤ＃ｓ２、セマフォＩＤ＃ｓ５であることを特定する。続けて、マルチプロセッサシステム１００は、同期処理ＩＤおよびＯＳ関連付けテーブル４１３のうちの、セマフォＩＤ＃ｓ１のレコード７０１−１−１と、セマフォＩＤ＃ｓ２のレコード７０１−１−２と、セマフォＩＤ＃ｓ５のレコード７０１−１−５と、を更新する。たとえば、レコード７０１−１−１について、マルチプロセッサシステム１００は、レコード７０１−１−１の利用スレッドの属するＯＳフィールドの値を“ｏ１，ｏ２”から、“ｏ１”に更新する。このように、同期処理に対して、利用スレッドの属するＯＳが複数から１つになった場合、マルチプロセッサシステム１００は、複数のＯＳに跨った同期処理を行わずに済むため、マルチプロセッサシステム１００の処理性能を向上できる。
【００７２】
なお、同期処理ＩＤおよびＯＳ関連付けテーブル４１３を更新する場合、マルチプロセッサシステム１００は、実動作で参照し用いるテーブルと、更新用として用いるテーブルとの２つ用意しておいてもよい。更新する際に、マルチプロセッサシステム１００は、実動作で参照し用いるテーブルを複製したテーブルを、更新用として用いるテーブルとして、用意する。続けて、マルチプロセッサシステム１００は、更新用として用いるテーブルに対して更新処理を行う。
【００７３】
また、スレッドおよびＯＳ関連付けテーブル４１１の更新量について説明する。動作モードは、マルチプロセッサシステム１００がデジタルカメラであれば、撮影前のビューモード、静止画撮影モード、静止画再生モード、動画撮影モード、動画再生モード、音声録音モード、音声再生モード、ＵＳＢ接続モード、プリンタ接続モード等がある。このような動作モード毎にスレッドおよびＯＳ関連付けテーブル４１１を用意することになるが、ユーザによる付加設定により、実際に実行されるスレッドが変わってしまうことがある。ユーザによる付加設定として、顔検出設定、スマイル検出設定、肌きれい設定、動体検出設定、動体追尾設定、シーン検出設定、手振れ補正設定等がある。
【００７４】
したがって、マルチプロセッサシステム１００は、スレッドおよびＯＳ関連付けテーブル４１１の更新量を、全体の半分以上行うことになる。したがって更新をすることにより、マルチプロセッサシステム１００は、グローバルメモリ＃ｇｍを用いる機会を大きく減らすことができる。
【００７５】
続けて、図１０〜図１２を用いて、同期処理の実行主体決定処理と、スレッドおよびＯＳ関連付けテーブル４１１および同期処理ＩＤおよびＯＳ関連付けテーブル４１３の更新処理について説明する。それぞれの処理は、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６のうちのいずれのＣＰＵが実行してもよい。説明の簡略化のため、本実施の形態では、ＣＰＵ＃ｃ１がそれぞれの処理を実行する場合を例として説明を行う。
【００７６】
図１０は、同期処理の実行主体決定処理手順の一例を示すフローチャートである。同期処理の実行主体決定処理は、同期処理を実行する実行主体を、同期処理が呼ばれたＯＳとするか、ＯＳ制御アプリ１０１とするかを決定して、決定した実行主体に同期処理を実行させる処理である。
【００７７】
ＣＰＵ＃ｃ１は、スレッドから同期処理の実行要求が呼ばれたことを検出する（ステップＳ１００１）。次に、ＣＰＵ＃ｃ１は、同期処理ＩＤおよびＯＳ関連付けテーブル４１３を参照して、該当の同期処理が複数のＯＳから用いられるか否かを判断する（ステップＳ１００２）。該当の同期処理とは、スレッドから呼ばれた同期処理のことである。該当の同期処理が単独のＯＳから用いられる場合（ステップＳ１００２：Ｎｏ）、ＣＰＵ＃ｃ１は、該当の同期処理がＯＳ制御アプリ１０１で実行されていたか否かを判断する（ステップＳ１００３）。
【００７８】
該当の同期処理がＯＳ制御アプリ１０１で実行されていた場合（ステップＳ１００３：Ｙｅｓ）、ＯＳ制御アプリ１０１の該当の同期処理の管理情報４１４を、同期処理が呼ばれたＯＳの同期処理の管理情報に複製する（ステップＳ１００４）。同期処理が呼ばれたＯＳの同期処理の管理情報は、同期処理が呼ばれたＯＳがＯＳ＃ｏ１であれば、ローカルメモリ＃ｌｍ１に格納されている。また、同期処理が呼ばれたＯＳがＯＳ＃ｏ２であれば、シェアードメモリ＃ｓｍ２に格納されており、同期処理が呼ばれたＯＳがＯＳ＃ｏ３であれば、シェアードメモリ＃ｓｍ３に格納されている。ステップＳ１００４の終了後、または、該当の同期処理が単独のＯＳで実行されていた場合（ステップＳ１００３：Ｎｏ）、ＣＰＵ＃ｃ１は、同期処理が呼ばれたＯＳによって、同期処理を実行する（ステップＳ１００５）。
【００７９】
該当の同期処理が複数のＯＳから用いられる場合（ステップＳ１００２：Ｙｅｓ）、ＣＰＵ＃ｃ１は、該当の同期処理が単独のＯＳで実行されていたか否かを判断する（ステップＳ１００６）。該当の同期処理が単独のＯＳで実行されていた場合（ステップＳ１００６：Ｙｅｓ）、ＣＰＵ＃ｃ１は、該当のＯＳの該当の同期処理の管理情報を、ＯＳ制御アプリ１０１の同期処理の管理情報４１４に複製する（ステップＳ１００７）。ステップＳ１００７の終了後、または、該当の同期処理がＯＳ制御アプリ１０１で実行されていた場合（ステップＳ１００６：Ｎｏ）、ＣＰＵ＃ｃ１は、ＯＳ制御アプリ１０１によって、同期処理を実行する（ステップＳ１００８）。なお、具体的なＯＳ制御アプリ１０１が行う同期処理の処理内容は、ＯＳが同期処理を行う処理内容と同一であるため、説明を省略する。
【００８０】
ステップＳ１００５、またはステップＳ１００８の実行終了後、ＣＰＵ＃ｃ１は、同期処理の実行主体決定処理を終了する。同期処理が単独のＯＳから用いられる場合、ＣＰＵ＃ｃ１は、ローカルメモリ＃ｌｍを用いて同期処理を行い、ＣＰＵ＃ｃ２〜ＣＰＵ＃ｃ６は、シェアードメモリ＃ｓｍを用いて同期処理を行う。したがって、マルチプロセッサシステム１００は、同期処理が単独のＯＳから用いられる場合、ローカルメモリ＃ｇｍを用いないため、マルチプロセッサシステム１００の性能を向上することができる。
【００８１】
また、ＣＰＵ＃ｃ１は、ステップＳ１００３、ステップＳ１００４、ステップＳ１００６、ステップＳ１００７の処理を行わないことも可能である。ステップＳ１００３、ステップＳ１００４、ステップＳ１００６、ステップＳ１００７を行わない場合、ＣＰＵ＃ｃ１は、同期処理の利用を解放した後に、ステップＳ１００５、またはステップＳ１００８の処理を実行すればよい。同期処理の利用を解放することが困難であれば、ＣＰＵ＃ｃ１は、ステップＳ１００３、ステップＳ１００４、ステップＳ１００６、ステップＳ１００７の処理を行うことにより、同期処理の利用を継続したまま同期処理の実行主体を切り替えることができる。
【００８２】
図１１は、スレッドおよびＯＳ関連付けテーブルの更新処理手順の一例を示すフローチャートである。スレッドおよびＯＳ関連付けテーブルの更新処理は、スレッドの割当状態に応じて、スレッドおよびＯＳ関連付けテーブル４１１を更新する処理である。
【００８３】
ＣＰＵ＃ｃ１は、動作モードの遷移が発生したか否かを判断する（ステップＳ１１０１）。動作モードの遷移が発生した場合（ステップＳ１１０１：Ｙｅｓ）、ＣＰＵ＃ｃ１は、遷移した動作モードの動作ログ用のスレッドおよびＯＳ関連付けテーブル５０１−ｘを確保する（ステップＳ１１０２）。次に、ＣＰＵ＃ｃ１は、スレッド遷移の状態を、所定期間として１秒間記録する（ステップＳ１１０３）。続けて、ＣＰＵ＃ｃ１は、先頭のスレッドを選択する（ステップＳ１１０４）。
【００８４】
次に、ＣＰＵ＃ｃ１は、選択したスレッドが１秒間のうちＣＰＵに割り当てられていたか否かを判断する（ステップＳ１１０５）。選択したスレッドがＣＰＵに割り当てられている場合（ステップＳ１１０５：Ｙｅｓ）、ＣＰＵ＃ｃ１は、選択したスレッドと割り当てられたＯＳを関連付けた情報を、スレッドおよびＯＳ関連付けテーブル５０１−ｘに格納する（ステップＳ１１０６）。
【００８５】
選択したスレッドがＣＰＵに割り当てられていなかった場合（ステップＳ１１０５：Ｎｏ）、ＣＰＵ＃ｃ１は、選択したスレッドと全てのＯＳを関連付けた情報を、スレッドおよびＯＳ関連付けテーブル５０１−ｘに格納する（ステップＳ１１０７）。
【００８６】
ステップＳ１１０６、またはステップＳ１１０７の終了後、ＣＰＵ＃ｃ１は、全てのスレッドを選択したか否かを判断する（ステップＳ１１０８）。まだ選択していないスレッドがある場合（ステップＳ１１０８：Ｎｏ）、ＣＰＵ＃ｃ１は、次のスレッドを選択する（ステップＳ１１０９）。ステップＳ１１０９の実行終了後、ＣＰＵ＃ｃ１は、ステップＳ１１０５の処理に移行する。動作モードの遷移が発生していない場合（ステップＳ１１０１：Ｎｏ）、または全てのスレッドを選択した場合（ステップＳ１１０８：Ｙｅｓ）、ＣＰＵ＃ｃ１は、スレッドおよびＯＳ関連付けテーブルの更新処理を終了する。スレッドおよびＯＳ関連付けテーブルの更新処理を実行することにより、マルチプロセッサシステム１００は、複数のＯＳに跨って同期処理を行う実行する頻度を減らすことを図るために用いる情報を生成できる。
【００８７】
図１２は、同期処理ＩＤおよびＯＳ関連付けテーブルの更新処理手順の一例を示すフローチャートである。同期処理ＩＤおよびＯＳ関連付けテーブルの更新処理は、図１１により更新した、スレッドおよびＯＳ関連付けテーブル４１１とスレッドおよび同期処理ＩＤ関連付けテーブル４１２に基づき、同期処理ＩＤおよびＯＳ関連付けテーブル４１３を更新する処理である。また、図１２では、説明の簡略化のため、セマフォＩＤおよびＯＳ関連付けテーブル７０１−１を更新する例について説明する。
【００８８】
ＣＰＵ＃ｃ１は、先頭のセマフォＩＤを選択する（ステップＳ１２０１）。次に、ＣＰＵ＃ｃ１は、先頭のスレッドを選択する（ステップＳ１２０２）。続けて、ＣＰＵ＃ｃ１は、スレッドおよび同期処理ＩＤ関連付けテーブル４１２を参照して、選択したスレッドが選択したセマフォＩＤを利用するか否かを判断する（ステップＳ１２０３）。選択したスレッドが選択したセマフォＩＤを利用する場合（ステップＳ１２０３：Ｙｅｓ）、ＣＰＵ＃ｃ１は、先頭のＯＳを選択する（ステップＳ１２０４）。
【００８９】
次に、ＣＰＵ＃ｃ１は、図１１のフローチャートにより更新した、スレッドおよびＯＳ関連付けテーブル４１１を参照して、選択したスレッドが選択したＯＳに割り当てられる可能性があるか否かを判断する（ステップＳ１２０５）。割り当てられる可能性がある場合（ステップＳ１２０５：Ｙｅｓ）、ＣＰＵ＃ｃ１は、選択したセマフォＩＤと選択したＯＳを関連付けた情報を、同期処理ＩＤおよびＯＳ関連付けテーブル４１３に格納する（ステップＳ１２０６）。
【００９０】
ステップＳ１２０６の終了後、または割り当てられる可能性がない場合（ステップＳ１２０５：Ｎｏ）、ＣＰＵ＃ｃ１は、全てのＯＳを選択したか否かを判断する（ステップＳ１２０７）。まだ選択していないＯＳがある場合（ステップＳ１２０７：Ｎｏ）、ＣＰＵ＃ｃ１は、次のＯＳを選択する（ステップＳ１２０８）。ステップＳ１２０８の終了後、ＣＰＵ＃ｃ１は、ステップＳ１２０５の処理に移行する。
【００９１】
選択したスレッドが選択したセマフォＩＤを利用しない場合（ステップＳ１２０３：Ｎｏ）、または全てのＯＳを選択した場合（ステップＳ１２０７：Ｙｅｓ）、ＣＰＵ＃ｃ１は、全てのスレッドを選択したか否かを判断する（ステップＳ１２０９）。まだ選択していないスレッドがある場合（ステップＳ１２０９：Ｎｏ）、ＣＰＵ＃ｃ１は、次のスレッドを選択する（ステップＳ１２１０）。ステップＳ１２１０の終了後、ＣＰＵ＃ｃ１は、ステップＳ１２０３の処理に移行する。
【００９２】
全てのスレッドを選択した場合（ステップＳ１２０９：Ｙｅｓ）、ＣＰＵ＃ｃ１は、全てのセマフォＩＤを選択したか否かを判断する（ステップＳ１２１１）。まだ選択していないセマフォＩＤがある場合（ステップＳ１２１１：Ｎｏ）、ＣＰＵ＃ｃ１は、次のセマフォＩＤを選択する（ステップＳ１２１２）。ステップＳ１２１２の終了後、ＣＰＵ＃ｃ１は、ステップＳ１２０２の処理に移行する。
【００９３】
全てのセマフォＩＤを選択した場合（ステップＳ１２１１：Ｙｅｓ）、ＣＰＵ＃ｃ１は、同期処理ＩＤおよびＯＳ関連付けテーブルの更新処理を終了する。同期処理ＩＤおよびＯＳ関連付けテーブルの更新処理を実行することにより、マルチプロセッサシステム１００は、複数のＯＳに跨って同期処理を行う実行する頻度を減らすことを図ることができる。
【００９４】
（統一スケジューリングの説明）
続けて、図１３〜図３８を用いて、複数のＯＳに跨って同期処理を行う実行する際に、ＯＳ制御アプリ１０１によって実行される統一スケジューリングの説明を行う。統一スケジューリングは、停止したスレッドがあれば、停止したスレッドの代わりに最も優先度が高いスレッドを割り当てるといった、優先度に従ったスケジューリング方法を行う。
【００９５】
図１３は、ＣＰＵ割当テーブルの記憶内容の一例を示す説明図である。ＣＰＵ割当テーブル４２１は、現在実行中のスレッドの識別情報を記憶するテーブルである。図１３に示すＣＰＵ割当テーブル４２１は、レコード１３０１−１〜レコード１３０１−６を記憶する。ＣＰＵ割当テーブル４２１は、ＣＰＵＩＤ、実行状態スレッドＩＤという２つのフィールドを含む。ＣＰＵＩＤフィールドには、ＣＰＵの識別情報が格納される。実行状態スレッドＩＤフィールドには、ＣＰＵＩＤフィールドに格納されているＣＰＵが現在実行中のスレッドの識別情報が格納される。
【００９６】
たとえば、レコード１３０１−１は、ＣＰＵ＃ｃ１が、現在スレッド＃ｔ１を実行していることを示している。また、レコード１３０１−６は、ＣＰＵ＃ｃ６が、現在実行しているスレッドがないことを示している。
【００９７】
図１４は、スレッド情報テーブルの記憶内容の一例を示す説明図である。スレッド情報テーブル４２２は、スレッドごとに、該当のスレッドの実行可能なＣＰＵＩＤとＣＰＵが実行するＯＳＩＤをスレッドの優先度順で記憶する。図１４に示すスレッド情報テーブル４２２は、レコード１４０１−１〜レコード１４０１−１０を記憶する。
【００９８】
スレッド情報テーブル４２２は、検索キー、スレッドＩＤ、割当可能なＣＰＵＩＤ、制御ＯＳＩＤという４つのフィールドを含む。検索キーフィールドには、該当のレコードの検索順序を示す値が格納される。図１４では、先に検索されるレコードが、検索キーフィールドに格納される値が小さくなるようになっている。スレッドＩＤフィールドには、スレッドの識別情報が格納される。割当可能なＣＰＵＩＤフィールドには、スレッドＩＤフィールドに格納されるスレッドが割当可能なＣＰＵの識別情報が格納される。制御ＯＳＩＤフィールドには、割当可能なＣＰＵＩＤフィールドに格納されたＣＰＵが実行するＯＳの識別情報が格納される。
【００９９】
たとえば、レコード１４０１−１は、１番目に検索され、スレッド＃ｔ１０がＣＰＵ＃ｃ２に割当可能であり、ＣＰＵ＃ｃ２がＯＳ＃ｏ２を実行することを示している。また、レコード１４０１−２は、２番目に検索され、スレッド＃ｔ９がＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６のいずれも割当可能であり、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６がＯＳ＃ｏ１〜ＯＳ＃ｏ３を実行することを示している。
【０１００】
図１５は、割当可能ＯＳ数テーブルの記憶内容の一例を示す説明図である。割当可能ＯＳ数テーブル４２３は、ＯＳごとに、スレッドが未割当のＣＰＵの個数を記憶するテーブルである。図１５に示す割当可能ＯＳ数テーブル４２３は、レコード１５０１−１〜レコード１５０１−３を記憶している。
【０１０１】
割当可能ＯＳ数テーブル４２３は、ＯＳＩＤ、割当可能数という２つのフィールドを含む。ＯＳＩＤフィールドには、ＯＳの識別情報が格納される。割当可能数フィールドには、ＯＳＩＤフィールドに格納されたＯＳを実行するＣＰＵのうち、スレッドが未割当のＣＰＵの個数が格納される。たとえば、レコード１５０１−１は、ＯＳ＃ｏ１を実行するＣＰＵのうち、スレッドが未割当のＣＰＵの個数が１個であることを示している。
【０１０２】
図１６は、ＣＰＵ状態テーブルの記憶内容の一例を示す説明図である。ＣＰＵ状態テーブル４２４は、統一スケジューリングの探索処理にて用いられるテーブルであり、ＣＰＵへの割当候補となるスレッドを記憶するテーブルである。図１６に示すＣＰＵ状態テーブル４２４は、レコード１６０１−１〜レコード１６０１−６を記憶している。
【０１０３】
ＣＰＵ状態テーブル４２４は、ＣＰＵＩＤ、割当スレッドＩＤという２つのフィールドを含む。ＣＰＵＩＤフィールドには、ＣＰＵの識別情報が格納される。割当スレッドＩＤフィールドには、ＣＰＵＩＤフィールドに格納されているＣＰＵへの割当候補となるスレッドの識別情報が格納される。割当スレッドＩＤフィールドに“ｅｍｐｔｙ”が格納されている場合、ＣＰＵＩＤフィールドに格納されているＣＰＵへの割当候補となるスレッドがないことを示す。たとえば、レコード１６０１−１は、ＣＰＵ＃ｃ１への割当候補となるスレッドがないことを示す。
【０１０４】
図１７は、スレッド割当予定記憶テーブルの記憶内容の一例を示す説明図である。スレッド割当予定記憶テーブル４２５は、ＯＳごとに、該当のＯＳを実行するＣＰＵであればどのＣＰＵでも割当可能となったスレッドを記憶するテーブルである。図１７に示すスレッド割当予定記憶テーブル４２５は、レコード１７０１−１〜レコード１７０１−３を記憶している。
【０１０５】
スレッド割当予定記憶テーブル４２５は、ＯＳＩＤ、割当予定スレッドＩＤという２つのフィールドを含む。ＯＳＩＤフィールドには、ＯＳの識別情報が格納される。割当予定スレッドＩＤフィールドには、ＯＳＩＤフィールドに格納されたＯＳを実行するＣＰＵであればどのＣＰＵでも割当可能となったスレッドの識別情報が格納される。割当予定スレッドＩＤフィールドに“ｅｍｐｔｙ”が格納されていた場合、該当のＯＳを実行するＣＰＵに対して割当可能となったスレッドがないことを示す。たとえば、レコード１７０１−１は、ＯＳ＃ｏ１を実行するＣＰＵであればどのＣＰＵでも割当可能となったスレッドがないことを示している。
【０１０６】
図１８は、統一スケジューリングを行う前のスレッドの割当状態を示す説明図である。図１８では、統一スケジューリングを行う前の状態として、ＣＰＵ割当テーブル４２１の図１３で示した内容と、スレッド情報テーブル４２２の図１４で示した内容とに則した状態を図示している。図１８では、各スレッドを、スレッドの状態と、スレッドが割当可能なＣＰＵとＯＳに基づいて、領域１８０１と領域１８０２を用いて分類している。
【０１０７】
領域１８０１は、実行状態のスレッド群を含んでいる。領域１８０２は、実行可能状態のスレッド群を含んでいる。領域１８０２は、さらにスレッドが割当可能なＣＰＵとＯＳに基づいて、領域１８１１〜領域１８１６、領域１８２１、領域１８２２、領域１８３１とを含む。
【０１０８】
領域１８０１は、スレッド＃ｔ１、スレッド＃ｔ３、スレッド＃ｔ４、スレッド＃ｔ６、スレッド＃ｔ７を含む。スレッド＃ｔ１は、ＣＰＵ＃ｃ１に割り当てられている。また、スレッド＃ｔ３は、ＣＰＵ＃ｃ２に割り当てられており、スレッド＃ｔ４は、ＣＰＵ＃ｃ３に割り当てられている。また、スレッド＃ｔ６は、ＣＰＵ＃ｃ４に割り当てられており、スレッド＃ｔ７は、ＣＰＵ＃ｃ５に割り当てられている。また、ＣＰＵ＃ｃ６に割り当てられたスレッドはない。
【０１０９】
領域１８１１は、ＣＰＵ＃ｃ１に割当可能なスレッドを含む領域であり、スレッド＃ｔ２を含む。領域１８１２は、ＣＰＵ＃ｃ２に割当可能なスレッドを含む領域であり、スレッド＃ｔ１０を含む。領域１８１３は、ＣＰＵ＃ｃ３に割当可能なスレッドを含む領域である。領域１８１４は、ＣＰＵ＃ｃ４に割当可能なスレッドを含む領域である。領域１８１５は、ＣＰＵ＃ｃ５に割当可能なスレッドを含む領域である。領域１８１６は、ＣＰＵ＃ｃ６に割当可能なスレッドを含む領域である。
【０１１０】
領域１８２１は、ＯＳ＃ｏ２を実行するＣＰＵ＃ｃ２とＣＰＵ＃ｃ３に割当可能なスレッドを含む領域であり、スレッド＃ｔ５を含む。領域１８２２は、ＯＳ＃ｏ３を実行するＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６に割当可能なスレッドを含む領域であり、スレッド＃ｔ８を含む。領域１８３１は、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６に割当可能なスレッドを含む領域であり、スレッド＃ｔ９を含む。
【０１１１】
続けて、図１９〜図２７を用いて、統一スケジューリングの探索処理の動作について説明する。統一スケジューリングの探索処理は、ＣＰＵごとに、ＣＰＵの割当候補となるスレッドを探索する処理である。統一スケジューリング処理は、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６のうちのいずれのＣＰＵが実行してもよい。説明の簡略化のため、本実施の形態では、ＣＰＵ＃ｃ１が統一スケジューリング処理を実行する場合を例として説明を行う。
【０１１２】
図１９は、統一スケジューリングの探索処理における第１の段階を示す説明図である。図１９の状態では、探索ＣＰＵ数が６となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の１番目のレコードである、レコード１４０１−１を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−１の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ２を特定し、ＣＰＵ状態テーブル４２４のＣＰＵ＃ｃ２のレコードであるレコード１６０１−２を特定する。続けて、ＣＰＵ＃ｃ１は、レコード１６０１−２の割当スレッドＩＤフィールドが“ｅｍｐｔｙ”であるため、スレッド＃ｔ１０の識別情報“ｔ１０”を格納する。ＯＳ＃ｏ２に一つスレッドを割り当てることになったため、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３のレコード１５０１−２について、“２”から“１”に変更する。また、図１９にて、ＣＰＵ＃２について探索したため、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を５に設定する。
【０１１３】
図２０は、統一スケジューリングの探索処理における第２の段階を示す説明図である。図２０の状態では、探索ＣＰＵ数が５となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の２番目のレコードである、レコード１４０１−２を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−２の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６を特定する。レコード１４０１−２が示すように、スレッド＃ｔ９が複数のＣＰＵで実行可能であるため、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５に、スレッド＃ｔ９の情報を追加する。具体的に、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５のレコード１７０１−１〜レコード１７０１−３の“ｅｍｐｔｙ”を“ｔ９”に変更する。
【０１１４】
また、スレッド＃ｔ９が複数のＯＳで動作可能であるため、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３の更新を行わない。さらに、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を４に設定する。
【０１１５】
図２１は、統一スケジューリングの探索処理における第３の段階を示す説明図である。図２１の状態では、探索ＣＰＵ数が４となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の３番目のレコードである、レコード１４０１−３を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−３の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ２、ＣＰＵ＃ｃ３を特定する。レコード１４０１−３が示すように、スレッド＃ｔ３が複数のＣＰＵで実行可能であるため、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５に、スレッド＃ｔ３の情報を追加する。具体的に、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５のレコード１７０１−２の“ｔ９”を“ｔ３，ｔ９”に変更する。
【０１１６】
ＯＳ＃ｏ２に一つスレッドを割り当てることになったため、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３のレコード１５０１−２について、“１”から“０”に変更する。また、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を３に設定する。
【０１１７】
図２２は、統一スケジューリングの探索処理における第４の段階を示す説明図である。図２２の状態では、探索ＣＰＵ数が３となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の４番目のレコードである、レコード１４０１−４を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−４の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ１を特定し、ＣＰＵ状態テーブル４２４のＣＰＵ＃ｃ１のレコードであるレコード１６０１−１を特定する。続けて、ＣＰＵ＃ｃ１は、レコード１６０１−１の割当スレッドＩＤフィールドが“ｅｍｐｔｙ”であるため、スレッド＃ｔ２の識別情報“ｔ２”を格納する。ＯＳ＃ｏ１に一つスレッドを割り当てることになったため、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３のレコード１５０１−１について、“１”から“０”に変更する。また、図２２にて、ＣＰＵ＃１について探索したため、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を２に設定する。
【０１１８】
図２３は、統一スケジューリングの探索処理における第５の段階を示す説明図である。図２３の状態では、探索ＣＰＵ数が２となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の５番目のレコードである、レコード１４０１−５を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−５の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ１を特定し、ＣＰＵ状態テーブル４２４のＣＰＵ＃ｃ１のレコードであるレコード１６０１−１を特定する。続けて、ＣＰＵ＃ｃ１は、レコード１６０１−１の割当スレッドＩＤフィールドが“ｔ２”であり、既にスレッドの割当候補があるため、スレッド＃ｔ１を割当候補にしない。
【０１１９】
図２４は、統一スケジューリングの探索処理における第６の段階を示す説明図である。図２４の状態では、探索ＣＰＵ数が２となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の６番目のレコードである、レコード１４０１−６を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−６の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ２、ＣＰＵ＃ｃ３を特定する。レコード１４０１−６が示すように、スレッド＃ｔ４は複数のＣＰＵで実行可能である。しかし、スレッド＃ｔ４を実行するＯＳ＃ｏ２について、割当可能ＯＳ数テーブル４２３のレコード１５０１−２が示すように、割当可能数が０であるから、ＣＰＵ＃ｃ１は、スレッド＃ｔ５を割当候補にしない。
【０１２０】
図２５は、統一スケジューリングの探索処理における第７の段階を示す説明図である。図２５の状態では、探索ＣＰＵ数が２となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の７番目のレコードである、レコード１４０１−７を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−７の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６を特定する。レコード１４０１−７が示すように、スレッド＃ｔ８が複数のＣＰＵで実行可能であるため、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５に、スレッド＃ｔ８の情報を追加する。具体的に、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５のレコード１７０１−３の“ｔ９”を“ｔ８，ｔ９”に変更する。
【０１２１】
ＯＳ＃ｏ３に一つスレッドを割り当てることになったため、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３のレコード１５０１−３について、“３”から“２”に変更する。また、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を１に設定する。
【０１２２】
図２６は、統一スケジューリングの探索処理における第８の段階を示す説明図である。図２６の状態では、探索ＣＰＵ数が１となっている。この状態で、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２の８番目のレコードである、レコード１４０１−８を選択する。次に、ＣＰＵ＃ｃ１は、レコード１４０１−８の割当可能なＣＰＵＩＤフィールドから、ＣＰＵ＃ｃ４〜ＣＰＵ＃ｃ６を特定する。レコード１４０１−８が示すように、スレッド＃ｔ７が複数のＣＰＵで実行可能であるため、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５に、スレッド＃ｔ７の情報を追加する。具体的に、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５のレコード１７０１−３の“ｔ８，ｔ９”を“ｔ７，ｔ８，ｔ９”に変更する。
【０１２３】
ＯＳ＃ｏ３に一つスレッドを割り当てることになったため、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３のレコード１５０１−３について、“２”から“１”に変更する。また、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を０に設定する。
【０１２４】
図２７は、統一スケジューリングの探索処理における第９の段階を示す説明図である。ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５に登録してあるスレッドのうち、ＣＰＵ割当テーブル４２１に既に登録してあるスレッドがあり、他のＣＰＵに割当を変更しなくてよいスレッドは該当のＣＰＵに割当済みに設定する。図２７の例では、ＣＰＵ＃ｃ１は、ＣＰＵ割当テーブル４２１のレコード１３０１−５にスレッド＃ｔ７が登録してあり、他のＣＰＵに割当を変更しなくてよいため、ＣＰＵ状態テーブル４２４のレコード１６０１−５について、“ｅｍｐｔｙ”から“ｔ７”に変更する。続けて、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５のレコード１７０１−３について、“ｔ７，ｔ８，ｔ９”から“ｔ８，ｔ９”に変更する。
【０１２５】
続けて、図２８〜図３３を用いて、統一スケジューリングの停止再開処理の動作について説明する。統一スケジューリングの停止再開処理は、ＣＰＵ状態テーブル４２４とスレッド割当予定記憶テーブル４２５のレコードごとに、実行状態のスレッドを切り替えるか否かを判断する処理である。続けて、統一スケジューリングの停止再開処理は、切り替える場合、現在実行状態のスレッドを停止させて、割当の候補となったスレッドを再開させる。
【０１２６】
図２８は、統一スケジューリングの停止再開処理における第１の段階を示す説明図である。図２８で示すマルチプロセッサシステム１００の状態は、図２７にて探索処理が完了した後の状態である。ＣＰＵ＃ｃ１について、ＣＰＵ状態テーブル４２４のレコード１６０１−１の割当スレッドＩＤフィールドにスレッドの識別情報が格納されているため、ＣＰＵ＃ｃ１は、ＣＰＵ割当テーブル４２１のレコード１３０１−１を参照して、スレッド＃ｔ１を停止させる。続けて、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４のレコード１６０１−１の割当スレッドＩＤフィールドに格納されているスレッド＃ｔ２を再開させる。
【０１２７】
図２９は、統一スケジューリングの停止再開処理における第２の段階を示す説明図である。図２９で示すマルチプロセッサシステム１００の状態は、図２８にてスレッド＃ｔ２を再開させた後の状態である。ＣＰＵ＃ｃ２について、ＣＰＵ状態テーブル４２４のレコード１６０１−２の割当スレッドＩＤフィールドにスレッドの識別情報が格納されているため、ＣＰＵ＃ｃ１は、ＣＰＵ割当テーブル４２１のレコード１３０１−２を参照して、スレッド＃ｔ３を停止させる。続けて、マルチプロセッサシステム１００は、ＣＰＵ状態テーブル４２４のレコード１６０１−２の割当スレッドＩＤフィールドに格納されているスレッド＃ｔ１０を再開させる。
【０１２８】
スレッド＃ｔ１０を再開させた後、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４のレコード１６０１−３の割当スレッドＩＤフィールドにスレッドの識別情報が格納されていないため、ＣＰＵ＃ｃ３については特に処理を行わない。同様に、レコード１６０１−４、レコード１６０１−６についても、スレッドの識別情報が格納されていないため、ＣＰＵ＃ｃ１は、ＣＰＵ＃ｃ４、ＣＰＵ＃ｃ６については特に処理を行わない。また、レコード１６０１−５に格納されているスレッドと、レコード１３０１−５に格納されているスレッドとが、共にスレッド＃ｔ７であるため、ＣＰＵ＃ｃ１は、ＣＰＵ＃ｃ５についても、特に処理を行わない。
【０１２９】
図３０は、統一スケジューリングの停止再開処理における第３の段階を示す説明図である。図３０で示すマルチプロセッサシステム１００の状態は、ＣＰＵ状態テーブル４２４のレコード１６０１−１〜レコード１６０１−６について確認した後の状態である。
【０１３０】
ＯＳ＃ｏ１について、スレッド割当予定記憶テーブル４２５のレコード１７０１−１の割当スレッドＩＤフィールドにスレッドの識別情報として“ｔ９”が格納されている。しかし、既に、ＣＰＵ状態テーブル４２４のレコード１６０１−１に“ｔ２”が格納されているため、ＣＰＵ＃ｃ１は、特に処理を行わない。
【０１３１】
図３１は、統一スケジューリングの停止再開処理における第４の段階を示す説明図である。図３１で示すマルチプロセッサシステム１００の状態は、スレッド割当予定記憶テーブル４２５のレコード１７０１−１について確認した後の状態である。
【０１３２】
ＯＳ＃ｏ２について、スレッド割当予定記憶テーブル４２５のレコード１７０１−２の割当スレッドＩＤフィールドにスレッドの識別情報として“ｔ３，ｔ９”が格納されている。また、レコード１６０１−３の割当スレッドＩＤフィールドにスレッドの識別情報が格納されていないため、ＣＰＵ＃ｃ１は、レコード１６０１−３の割当スレッドＩＤフィールドについて、“ｅｍｐｔｙ”から“ｔ３”に変更する。さらに、ＣＰＵ＃ｃ１は、レコード１７０１−２の割当予定スレッドＩＤフィールドについて、“ｔ３，ｔ９”から“ｔ９”に変更する。
【０１３３】
続けて、ＣＰＵ＃ｃ１は、スレッド＃ｔ４を停止させる。続けて、ＣＰＵ＃ｃ１は、レコード１６０１−３の割当スレッドＩＤフィールドに設定したスレッド＃ｔ３を再開させる。
【０１３４】
図３２は、統一スケジューリングの停止再開処理における第５の段階を示す説明図である。図３２で示すマルチプロセッサシステム１００の状態は、スレッド割当予定記憶テーブル４２５のレコード１７０１−２について確認した後の状態である。
【０１３５】
ＯＳ＃ｏ３について、スレッド割当予定記憶テーブル４２５のレコード１７０１−３の割当スレッドＩＤフィールドにスレッドの識別情報として“ｔ８，ｔ９”が格納されている。また、レコード１６０１−４の割当スレッドＩＤフィールドにスレッドの識別情報が格納されていないため、ＣＰＵ＃ｃ１は、レコード１６０１−４の割当スレッドＩＤフィールドについて、“ｅｍｐｔｙ”から“ｔ８”に変更する。さらに、ＣＰＵ＃ｃ１は、レコード１７０１−３の割当予定スレッドＩＤフィールドについて、“ｔ８，ｔ９”から“ｔ９”に変更する。
【０１３６】
続けて、ＣＰＵ＃ｃ１は、スレッド＃ｔ６を停止させる。続けて、ＣＰＵ＃ｃ１は、レコード１６０１−４の割当スレッドＩＤフィールドに設定したスレッド＃ｔ８を再開させる。
【０１３７】
図３３は、統一スケジューリングの停止再開処理における第６の段階を示す説明図である。図３３で示すマルチプロセッサシステム１００の状態は、スレッド割当予定記憶テーブル４２５のレコード１７０１−３について確認した後の状態である。
【０１３８】
ＯＳ＃ｏ３について、スレッド割当予定記憶テーブル４２５のレコード１７０１−３の割当スレッドＩＤフィールドにスレッドの識別情報として“ｔ９”が格納されている。また、レコード１６０１−６の割当スレッドＩＤフィールドにスレッドの識別情報が格納されていないため、ＣＰＵ＃ｃ１は、レコード１６０１−６の割当スレッドＩＤフィールドについて、“ｅｍｐｔｙ”から“ｔ９”に変更する。さらに、ＣＰＵ＃ｃ１は、レコード１７０１−１〜レコード１７０１−３の割当予定スレッドＩＤフィールドについて、“ｔ９”から“ｅｍｐｔｙ”に変更する。続けて、ＣＰＵ＃ｃ１は、レコード１６０１−６の割当スレッドＩＤフィールドに設定したスレッド＃ｔ９を再開させる。
【０１３９】
統一スケジューリングの結果、次のようになる。ＣＰＵ＃ｃ１が実行するスレッドは、スレッド＃ｔ１からスレッド＃ｔ２となる。ＣＰＵ＃ｃ２が実行するスレッドは、スレッド＃ｔ３からスレッド＃ｔ１０となる。ＣＰＵ＃ｃ３が実行するスレッドは、スレッド＃ｔ４からスレッド＃ｔ３となる。ＣＰＵ＃ｃ４が実行するスレッドは、スレッド＃ｔ６からスレッド＃ｔ８となる。ＣＰＵ＃ｃ５が実行するスレッドは、スレッド＃ｔ７のまま継続する。ＣＰＵ＃ｃ６が実行するスレッドは、スレッド＃ｔ９となる。続けて、図３４〜図３８を用いて、統一スケジューリング処理について説明する。統一スケジューリング処理は、ＣＰＵ＃ｃ１〜ＣＰＵ＃ｃ６のうちのいずれのＣＰＵが実行してもよい。説明の簡略化のため、本実施の形態では、ＣＰＵ＃ｃ１が統一スケジューリング処理を実行する場合を例として説明を行う。
【０１４０】
図３４は、統一スケジューリング処理手順の一例を示すフローチャートである。統一スケジューリング処理は、マルチプロセッサシステム１００全体でスレッドを切り替える処理である。ＣＰＵ＃ｃ１は、前処理を実行する（ステップＳ３４０１）。前処理の詳細は、図３５にて後述する。次に、ＣＰＵ＃ｃ１は、探索処理を実行する（ステップＳ３４０２）。探索処理の詳細は、図３６にて後述する。続けて、ＣＰＵ＃ｃ１は、停止再開処理を実行する（ステップＳ３４０３）。停止再開処理の詳細は、図３７と図３８にて後述する。ステップＳ３４０３の実行終了後、ＣＰＵ＃ｃ１は、統一スケジューリング処理を終了する。統一スケジューリング処理を実行することにより、マルチプロセッサシステム１００は、マルチプロセッサシステム１００全体でスレッドを切り替えることができる。
【０１４１】
図３５は、統一スケジューリングの前処理手順の一例を示すフローチャートである。統一スケジューリングの前処理は、ＣＰＵ＃ｃ１は、変数ｉに１を設定する（ステップＳ３５０１）。次に、ＣＰＵ＃ｃ１は、ＣＰＵ＃ｃｉで実行中のスレッドを、ＣＰＵ割当テーブル４２１のｉ番目のレコードに格納する（ステップＳ３５０２）。続けて、ＣＰＵ＃ｃ１は、全てのＣＰＵを確認したか否かを判断する（ステップＳ３５０３）。まだ全てのＣＰＵを確認していない場合（ステップＳ３５０３：Ｎｏ）、ＣＰＵ＃ｃ１は、変数ｉをインクリメントする（ステップＳ３５０４）。ステップＳ３５０４の実行終了後、ＣＰＵ＃ｃ１は、ステップＳ３５０２の処理に移行する。
【０１４２】
全てのＣＰＵを確認した場合（ステップＳ３５０３：Ｙｅｓ）、ＣＰＵ＃ｃ１は、探索ＣＰＵ数を、ＣＰＵ総数に設定する（ステップＳ３５０５）。次に、ＣＰＵ＃ｃ１は、実行待ちスレッドを、スレッド情報テーブル４２２に追加する（ステップＳ３５０６）。続けて、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４の各レコードの割当スレッドＩＤフィールドの値を“ｅｍｐｔｙ”に設定する（ステップＳ３５０７）。次に、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３の各レコードの割当可能数を、各ＯＳを実行するＣＰＵ数の個数に設定する（ステップＳ３５０８）。続けて、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５の各レコードの割当予定スレッドＩＤフィールドの値を“ｅｍｐｔｙ”に設定する（ステップＳ３５０９）。ステップＳ３５０９の実行終了後、ＣＰＵ＃ｃ１は、統一スケジューリングの前処理を終了する。統一スケジューリングの前処理を実行することにより、マルチプロセッサシステム１００は、統一スケジューリングの探索処理の準備を行うことができる。
【０１４３】
図３６は、統一スケジューリングの探索処理手順の一例を示すフローチャートである。統一スケジューリングの探索処理は、ＣＰＵごとに、ＣＰＵの割当候補となるスレッドを探索する処理である。
【０１４４】
ＣＰＵ＃ｃ１は、変数ｉを１に設定する（ステップＳ３６０１）。次に、ＣＰＵ＃ｃ１は、実行可能なスレッドがあるか否かを判断する（ステップＳ３６０２）。実行可能なスレッドがある場合（ステップＳ３６０２：Ｙｅｓ）、ＣＰＵ＃ｃ１は、探索ＣＰＵ数が０か否かを判断する（ステップＳ３６０３）。実行可能なスレッドがない場合（ステップＳ３６０２：Ｎｏ）、または探索ＣＰＵ数が０である場合（ステップＳ３６０３：Ｙｅｓ）、ＣＰＵ＃ｃ１は、統一スケジューリングの探索処理を終了する。
【０１４５】
探索ＣＰＵ数が０でない場合（ステップＳ３６０３：Ｎｏ）、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２のｉ番目のレコードの割当可能なＣＰＵフィールドに複数のＣＰＵの識別情報が格納されているか否かを判断する（ステップＳ３６０４）。複数のＣＰＵの識別情報が格納されている場合（ステップＳ３６０４：Ｙｅｓ）、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２のｉ番目のレコードの制御ＯＳＩＤフィールドに格納されていたＯＳを特定する（ステップＳ３６０５）。
【０１４６】
なお、ステップＳ３６０５の処理は、説明を簡単にするために、記述しているため、実際の処理内容として行わなくてもよい。ステップＳ３６０５の処理を行わない場合、ＣＰＵ＃ｃ１は、後述の特定したＯＳについて、スレッド情報テーブル４２２のｉ番目のレコードの制御ＯＳＩＤフィールドをその都度参照することで取得することができる。
【０１４７】
次に、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３の、特定したＯＳのレコードの割当可能数フィールドの値が０か否かを判断する（ステップＳ３６０６）。割当可能数フィールドの値が０でない場合（ステップＳ３６０６：Ｎｏ）、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５の、特定したＯＳのレコードに、スレッド情報テーブル４２２のｉ番目のスレッドを追加する（ステップＳ３６０７）。
【０１４８】
１つのＣＰＵの識別情報が格納されている場合（ステップＳ３６０４：Ｎｏ）、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２のｉ番目のレコードの割当可能なＣＰＵフィールドに格納されていたＣＰＵを特定する（ステップＳ３６０８）。次に、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４の、特定したＣＰＵのレコードの割当スレッドＩＤフィールドにスレッドの識別情報が格納されているか否かを判断する（ステップＳ３６０９）。スレッドの識別が格納されていない場合（ステップＳ３６０９：Ｎｏ）、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４の、特定したＣＰＵのレコードの割当スレッドＩＤフィールドに、スレッド情報テーブル４２２のｉ番目のレコードのスレッドの識別情報を格納する（ステップＳ３６１０）。続けて、ＣＰＵ＃ｃ１は、スレッド情報テーブル４２２のｉ番目のレコードの制御ＯＳＩＤフィールドに格納されていたＯＳを特定する（ステップＳ３６１１）。
【０１４９】
ステップＳ３６０７、またはステップＳ３６１１の実行終了後、ＣＰＵ＃ｃ１は、割当可能ＯＳ数テーブル４２３の、特定したＯＳのレコードの割当可能数フィールドの値をデクリメントする（ステップＳ３６１２）。さらに、ＣＰＵ＃ｃ１は、探索ＣＰＵ数をデクリメントする（ステップＳ３６１３）。
【０１５０】
割当可能数フィールドの値が０である場合（ステップＳ３６０６：Ｙｅｓ）、スレッドの識別情報が格納されている場合（ステップＳ３６０９：Ｙｅｓ）、またはステップＳ３６１３の実行終了後、ＣＰＵ＃ｃ１は、変数ｉをインクリメントする（ステップＳ３６１４）。ステップＳ３６１４の実行終了後、ＣＰＵ＃ｃ１は、ステップＳ３６０２の処理に移行する。統一スケジューリングの探索処理を実行することにより、マルチプロセッサシステム１００は、ＣＰＵごとに、ＣＰＵの割当候補となるスレッドを探索する処理である。
【０１５１】
図３７は、統一スケジューリングの停止再開処理手順の一例を示すフローチャート（その１）である。統一スケジューリングの停止再開処理は、ＣＰＵ状態テーブル４２４とスレッド割当予定記憶テーブル４２５のレコードごとに、実行状態のスレッドを切り替えるか否かを判断する処理である。続けて、統一スケジューリングの停止再開処理は、切り替える場合、現在実行状態のスレッドを停止させて、割当の候補となったスレッドを再開させる。
【０１５２】
ＣＰＵ＃ｃ１は、変数ｊに１を設定する（ステップＳ３７０１）。次に、ＣＰＵ＃ｃ１は、全てのＣＰＵを確認したか否かを判断する（ステップＳ３７０２）。まだ確認していないＣＰＵがある場合（ステップＳ３７０２：Ｎｏ）、続けて、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４のｊ番目のレコードの割当スレッドＩＤフィールドにスレッドの識別情報が格納されているか否かを判断する（ステップＳ３７０３）。スレッドの識別情報が格納されている場合（ステップＳ３７０３：Ｙｅｓ）、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４のｊ番目のレコードの割当スレッドＩＤフィールドに格納されているスレッドが実行中のスレッドとは異なるか否かを判断する（ステップＳ３７０４）。
【０１５３】
割当スレッドＩＤフィールドに格納されているスレッドが実行中のスレッドとは異なる場合（ステップＳ３７０４：Ｙｅｓ）、ＣＰＵ＃ｃ１は、ＣＰＵ割当テーブル４２１のｊ番目のレコードのＣＰＵ担当であるＯＳに、実行中のスレッドを停止指示する（ステップＳ３７０５）。続けて、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２１のｊ番目のレコードのＣＰＵ担当であるＯＳに、新規に割り当てるスレッドを再開指示する（ステップＳ３７０６）。なお、具体的な停止指示方法として、ＣＰＵ＃ｃ１で実行中のＯＳ制御アプリ１０１が、ＯＳ＃ｏ１〜ＯＳ＃ｏ３のスレッドを停止させるＡＰＩを呼び出す。再開指示も同様に、ＯＳ制御アプリ１０１が、再開を行うＡＰＩを呼び出す。
【０１５４】
スレッドの識別情報が格納されていない場合（ステップＳ３７０３：Ｎｏ）、割当スレッドＩＤフィールドに格納されているスレッドが実行中のスレッドと一致する場合（ステップＳ３７０４：Ｎｏ）、またはステップＳ３７０６の実行終了後、ＣＰＵ＃ｃ１は、変数ｊをインクリメントする（ステップＳ３７０７）。ステップＳ３７０７の実行終了後、ＣＰＵ＃ｃ１は、ステップＳ３７０２の処理に移行する。全てのＣＰＵを確認した場合（ステップＳ３７０２：Ｙｅｓ）、ＣＰＵ＃ｃ１は、変数ｊに１を設定する（ステップＳ３７０８）。ステップＳ３７０８の実行終了後、ＣＰＵ＃ｃ１は、図３８に示すステップＳ３８０１に移行する。
【０１５５】
図３８は、統一スケジューリングの停止再開処理手順の一例を示すフローチャート（その２）である。ＣＰＵ＃ｃ１は、全てのＯＳを確認したか否かを判断する（ステップＳ３８０１）。全てのＯＳを確認した場合（ステップＳ３８０１：Ｙｅｓ）、ＣＰＵ＃ｃ１は、統一スケジューリングの停止再開処理を終了する。
【０１５６】
まだ確認していないＯＳがある場合（ステップＳ３８０１：Ｎｏ）、ＣＰＵ＃ｃ１は、スレッド割当予定記憶テーブル４２５のｊ番目のレコードの割当予定スレッドＩＤから、スレッド＃ｉを特定する（ステップＳ３８０２）。次に、ＣＰＵ＃ｃ１は、スレッドが特定できたか否かを判断する（ステップＳ３８０３）。スレッドが特定できた場合（ステップＳ３８０３：Ｙｅｓ）、ＣＰＵ＃ｃ１は、ｊ番目のＯＳを実行する先頭ＣＰＵのＣＰＵＩＤをｋに設定する（ステップＳ３８０４）。続けて、ＣＰＵ＃ｃ１は、ｊ番目のＯＳを実行する末尾ＣＰＵのＣＰＵＩＤをｍに設定する（ステップＳ３８０５）。続けて、ＣＰＵ＃ｃ１は、ｋがｍ以下か否かを判断する（ステップＳ３８０６）。スレッドが特定できない場合（ステップＳ３８０３：Ｎｏ）、またはｋがｍより大きい場合（ステップＳ３８０６：Ｎｏ）、ＣＰＵ＃ｃ１は、変数ｊをインクリメントする（ステップＳ３８０７）。ステップＳ３８０７の実行終了後、ＣＰＵ＃ｃ１は、ステップＳ３８０１の処理に移行する。
【０１５７】
ｋがｍ以下である場合（ステップＳ３８０６：Ｙｅｓ）、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４のＣＰＵ＃ｃｋのレコードの割当スレッドＩＤフィールドにスレッドの識別情報が格納されているか否かを判断する（ステップＳ３８０８）。スレッドの識別情報が格納されていない場合（ステップＳ３８０８：Ｎｏ）、ＣＰＵ＃ｃ１は、ＣＰＵ状態テーブル４２４のＣＰＵ＃ｃｋのレコードの割当スレッドＩＤフィールドにスレッド＃ｉを格納する（ステップＳ３８０９）。次に、ＣＰＵ＃ｃ１は、ｊ番目のＯＳに、実行中のスレッドを停止指示する（ステップＳ３８１０）。続けて、ＣＰＵ＃ｃ１は、ｊ番目のＯＳに、スレッド＃ｉを再開指示する（ステップＳ３８１１）。
【０１５８】
スレッドの識別情報が格納されている場合（ステップＳ３８０８：Ｙｅｓ）、または、ステップＳ３８１１の実行終了後、ＣＰＵ＃ｃ１は、ｊ番目のＯＳを実行する次のＣＰＵのＣＰＵＩＤをｋに設定する（ステップＳ３８１２）。ステップＳ３８１２の実行終了後、ＣＰＵ＃ｃ１は、ステップＳ３８０６の処理に移行する。統一スケジューリングの停止再開処理を実行することにより、マルチプロセッサシステム１００は、探索結果に基づいて、スレッドの停止再開を行える。
【０１５９】
以上説明したように、マルチプロセッサシステム１００によれば、実行要求があった同期処理が互いに異なるＯＳによって実行されるスレッド間の同期処理でない場合、ＯＳを実行するＣＰＵ固有の記憶領域を用いて同期処理を行う。これにより、マルチプロセッサシステム１００は、複数のＣＰＵ共有の記憶領域となるグローバルメモリ＃ｇｍを用いずに済むため、マルチプロセッサシステム１００の処理性能が向上する。同期処理の処理結果をグローバルメモリ＃ｇｍに書き込むと、グローバルメモリ＃ｇｍへのアクセスに時間がかかり、マルチプロセッサシステム１００の処理性能の低下を招くことになる。
【０１６０】
また、マルチプロセッサシステム１００によれば、実行要求があった同期処理が互いに異なるＯＳによって実行されるスレッド間の同期処理である場合、ＯＳを実行するＣＰＵ固有の記憶領域を用いて同期処理を行う。これにより、マルチプロセッサシステム１００は、同期処理を仕様通りの動作で処理することができる。
【０１６１】
また、マルチプロセッサシステム１００によれば、同期処理の実行要求を行うスレッドが実行された場合に、互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する情報を更新してもよい。これにより、マルチプロセッサシステム１００は、互いに異なるＯＳによって実行されるスレッド間の同期処理としている同期処理の数が減らせれば、グローバルメモリ＃ｇｍを用いる頻度も減るため、マルチプロセッサシステム１００の処理性能を向上できる。
【０１６２】
また、マルチプロセッサシステム１００によれば、マルチプロセッサシステム１００の動作モードに基づいて、互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断してもよい。動作モードが変わることにより、実行されるスレッドの処理内容も変化して、同期処理の実行要求を行わないスレッドが発生する可能性がある。したがって、動作モード毎に互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断することにより、マルチプロセッサシステム１００の処理性能を向上できる可能性がある。
【０１６３】
また、マルチプロセッサシステム１００によれば、割り当てられた全てのスレッドの実行が終了したＯＳを検出した場合、実行待ちのスレッドのうちの、終了したＯＳが実行可能なスレッドから１つのスレッドを選択し、終了したＯＳに実行させてもよい。これにより、１つのＣＰＵには１つのスレッドしか実行しておらず、他の処理に妨害されることがなくなるため、スレッドに一定時間までに定められた処理を行うといったリアルタイム制約を遵守しやすくなる。
【０１６４】
また、マルチプロセッサシステム１００は、割り当てられた全てのスレッドの実行が終了したＯＳを検出したとする。このとき、マルチプロセッサシステム１００によれば、実行待ちのスレッドのうちの終了したＯＳを実行するＣＰＵが実行可能なスレッドから１つのスレッドを選択し、終了したＯＳに実行させてもよい。これにより、１つのＣＰＵには１つのスレッドしか実行しておらず、他の処理に妨害されることがなくなるため、スレッドに一定時間までに定められた処理を行うといったリアルタイム制約を遵守しやすくなる。また、特定のＣＰＵでなければ実行できないスレッドを優先することにより、実行可能の条件が狭いスレッドを先に実行することができる。
【０１６５】
なお、同じＯＳを用いるにも関わらず、ＣＰＵによって実行できるスレッド、実行できないスレッドというのが発生する理由の一つとして、一部の命令セットの有無がある。たとえば、ある２つＣＰＵのうち、一方のＣＰＵがＳｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉｐｌｅ  Ｄａｔａ（ＳＩＭＤ）といった命令セットを有している場合、ＳＩＭＤ命令を利用するスレッドは、一方のＣＰＵによって実行可能となり、ＳＩＭＤ命令を利用せずＣＰＵの一般命令を利用するスレッドは、両方のＣＰＵによって実行可能となる。
【０１６６】
また、本実施の形態にかかるマルチプロセッサシステム１００は、複数のＯＳの１つがリアルタイムＯＳであり、ヘテロジニアス・プロセッサとなるものであればどのような装置であっても適用できる。たとえば、マルチプロセッサシステム１００は、コピー機、ファクシミリ、セットトップボックス、ビデオレコーダー、携帯電話に適用することができる。
【０１６７】
なお、本実施の形態で説明した実行制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本実行制御方法を実行するプログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また実行制御方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
【０１６８】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１６９】
（付記１）複数のＯｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ（ＯＳ）によって制御されるマルチプロセッサシステムの第１のプロセッサが、
記憶部に格納された、前記複数のＯＳのうちの互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を参照して、前記第１のプロセッサを制御する前記複数のＯＳのうちの第１のＯＳによって実行されるスレッドから実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断し、
前記互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断した場合、前記第１のＯＳがアクセス可能な前記第１のプロセッサに固有の記憶領域を用いて、前記実行要求があった同期処理を実行する、
ことを特徴とする実行制御方法。
【０１７０】
（付記２）前記第１のプロセッサが、
前記第１のＯＳによって実行されるスレッドから実行要求があった同期処理が前記互いに異なるＯＳによって実行されるスレッド間の同期処理であると判断した場合、前記複数のＯＳがアクセス可能な記憶領域を用いて、前記実行要求があった同期処理を実行することを特徴とする付記１に記載の実行制御方法。
【０１７１】
（付記３）前記第１のプロセッサが、
同期処理の実行要求を行うスレッドを前記複数のＯＳのうちのいずれかのＯＳが実行した場合、前記同期処理の実行要求を行うスレッドと当該スレッドを実行したＯＳとを関連付け、
前記関連付けた結果に基づいて、前記第１の情報を更新する、処理を実行し、
前記判断する処理は、
更新した前記第１の情報を参照して、前記実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断することを特徴とする付記１または２に記載の実行制御方法。
【０１７２】
（付記４）前記記憶部は、前記マルチプロセッサシステムの動作モード毎に前記第１の情報を記憶しており、
前記判断する処理は、
前記第１の情報を参照して、前記マルチプロセッサシステムの動作モードに基づいて、前記実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断することを特徴とする付記１〜３のいずれか一つに記載の実行制御方法。
【０１７３】
（付記５）前記第１のプロセッサが、
前記複数のＯＳの中から、割り当てられた全てのスレッドの実行を終了したＯＳを検出した場合、前記マルチプロセッサシステム内で実行待ちのスレッドのうちの、前記終了したＯＳが実行可能な１つのスレッドを選択し、
選択した前記スレッドを前記終了したＯＳによって実行させる、
ことを特徴とする付記１〜４のいずれか一つに記載の実行制御方法。
【０１７４】
（付記６）前記第１のプロセッサが、
前記複数のＯＳの中から、割り当てられた全てのスレッドの実行が終了したＯＳを検出した場合、前記マルチプロセッサシステム内で実行待ちのスレッドのうちの、前記終了したＯＳを実行するプロセッサが実行可能なスレッドから１つのスレッドを選択し、
選択した前記スレッドを前記終了したＯＳによって実行させる、
処理を実行することを特徴とする付記１〜５のいずれか一つに記載の実行制御方法。
【０１７５】
（付記７）複数のＯＳによって制御されるマルチプロセッサシステムであって、
第１のプロセッサと、
前記複数のＯＳのうちの互いに異なるＯＳによって実行されるスレッド間の同期処理を特定する第１の情報を記憶する記憶部と、
前記第１の情報を参照して、前記第１のプロセッサを制御する前記複数のＯＳのうちの第１のＯＳによって実行されるスレッドから実行要求があった同期処理が、前記互いに異なるＯＳによって実行されるスレッド間の同期処理か否かを判断する判断部とを有し、
前記第１のプロセッサは、前記判断部によって前記互いに異なるＯＳによって実行されるスレッド間の同期処理ではないと判断された場合、前記第１のＯＳがアクセス可能な前記第１のプロセッサに固有の記憶領域を用いて、前記実行要求があった同期処理を実行する、
ことを特徴とするマルチプロセッサシステム。
【符号の説明】
【０１７６】
ｃ１〜ｃ６  ＣＰＵ
ｏ１〜ｏ３  ＯＳ
ｌｍ１〜ｌｍ６  ローカルメモリ
ｓｍ２、ｓｍ３  シェアードメモリ
ｇｍ  グローバルメモリ
ｔ１〜ｔ１０  スレッド
１００  マルチプロセッサシステム
４０１  関連付け部
４０２  更新部
４０３  判断部
４０４  実行部
４０５  選択部
４０６  制御部
【図１】
2014063235.tif 000003
【図２】
2014063235.tif 000004
【図３】
2014063235.tif 000005
【図４】
2014063235.tif 000006
【図５】
2014063235.tif 000007
【図６】
2014063235.tif 000008
【図７】
2014063235.tif 000009
【図８】
2014063235.tif 000010
【図９】
2014063235.tif 000011
【図１０】
2014063235.tif 000012
【図１１】
2014063235.tif 000013
【図１２】
2014063235.tif 000014
【図１３】
2014063235.tif 000015
【図１４】
2014063235.tif 000016
【図１５】
2014063235.tif 000017
【図１６】
2014063235.tif 000018
【図１７】
2014063235.tif 000019
【図１８】
2014063235.tif 000020
【図１９】
2014063235.tif 000021
【図２０】
2014063235.tif 000022
【図２１】
2014063235.tif 000023
【図２２】
2014063235.tif 000024
【図２３】
2014063235.tif 000025
【図２４】
2014063235.tif 000026
【図２５】
2014063235.tif 000027
【図２６】
2014063235.tif 000028
【図２７】
2014063235.tif 000029
【図２８】
2014063235.tif 000030
【図２９】
2014063235.tif 000031
【図３０】
2014063235.tif 000032
【図３１】
2014063235.tif 000033
【図３２】
2014063235.tif 000034
【図３３】
2014063235.tif 000035
【図３４】
2014063235.tif 000036
【図３５】
2014063235.tif 000037
【図３６】
2014063235.tif 000038
【図３７】
2014063235.tif 000039
【図３８】
2014063235.tif 000040