以下に添付図面を参照して、開示の実行制御方法、およびマルチプロセッサシステムの実施の形態を詳細に説明する。
図1は、本実施の形態にかかるマルチプロセッサシステムの動作例を示す説明図である。マルチプロセッサシステム100は、CPU#c1〜CPU#c3と、ローカルメモリ#lm1、シェアードメモリ#sm2と、グローバルメモリ#gmを含む。以下の説明にて、“#”以降の接尾符号を、図1〜図38内では各ハードウェア、各ソフトウェアの識別情報としても用いる。
マルチプロセッサシステムとは、複数のプロセッサを含むコンピュータのシステムである。また、1つのプロセッサに複数のコアが含まれていてもよい。なお、本実施の形態では、シングルコアのプロセッサであるCPUが並列されている形態を例にあげて説明する。
CPU#c2とCPU#c3は、共通の命令セットとレジスタセットのプロセッサであり、CPU#c1とCPU#c2は、異なる命令セットとレジスタセットのプロセッサである。このように、マルチプロセッサシステム100は、ヘテロジニアス・プロセッサとなっている。CPU#c1〜CPU#c3を1つのOSで制御するには、命令セットやレジスタセットの違いやキャッシュの違いからキャッシュの一貫性を取る処理量が多くなる。したがって、マルチプロセッサシステム100は、CPU#c1をOS#o1によって制御し、CPU#c2、CPU#c3をOS#o1とは異なるOS#o2によって制御している。OS#o1は、スレッド#t1を実行し、OS#o2は、スレッド#t2を実行している。
次に、CPUとローカルメモリ#lm1、シェアードメモリ#sm2と、グローバルメモリ#gmについて説明する。ローカルメモリ#lm1は、CPU#c1固有の記憶装置である。なお、CPU#c2とCPU#c3の固有の記憶装置があってもよい。CPU#c2とCPU#c3の固有の記憶装置を含めた説明は、図3にて後述する。シェアードメモリ#sm2は、CPU#c2とCPU#c3とから共有される記憶装置である。グローバルメモリ#gmは、CPU#c1〜CPU#c3から共有される記憶装置である。ローカルメモリ#lm、シェアードメモリ#sm、グローバルメモリ#gmは、CPUから近い記憶装置の方が、読み書き速度が速い。
続けて、スレッド#t1、スレッド#t2について説明する。スレッドとはプログラムの実行単位である。スレッドは、OSの種類によっては、タスクとも呼ばれる。本実施の形態では、スレッドで統一して説明を行う。スレッドの状態としては、OSによってCPUに割り当てられて実行中である実行状態、実行要求を受けて実行待ちであるがCPUに割り当てられていない実行可能状態とがある。
また、OS制御アプリ101は、OS#o1上で実行するソフトウェアである。OS制御アプリ101は、OS#o2上で実行することも可能である。OS制御アプリ101は、同期処理が実行される場合に、処理性能の向上を図るため、同期処理が用いる情報が格納される位置を変更する。また、OS制御アプリ101は、マルチプロセッサシステム100全体のスレッドのスケジューリングを行ってもよい。以下、OS制御アプリ101が実行するスケジューリングを、「統一スケジューリング」と呼称する。
同期処理とは、複数のスレッドの処理を制御する処理である。同期処理は、たとえば、セマフォ、イベントフラグ、メールボックス、メモリプールがある。具体的に、複数のスレッドで1つの値を共有する場合、複数のスレッドは、セマフォを用いて値の共有を実現することができる。このとき、セマフォが用いる情報は、複数のOSからアクセスできるように、グローバルメモリ#gmとなる。マルチプロセッサシステム100の第1のCPUとなるCPU#c1にて実行されているOS制御アプリ101は、処理性能の向上を図るため、同期処理が用いる情報が格納される位置を変更する。
OS制御アプリ101は、第1のOSとなるOS#o1によって実行されるスレッド#t1から実行要求のあった同期処理が、互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断する。実行要求のあった同期処理を検出する方法として、たとえば、OS制御アプリ101は、スレッドが呼び出す同期処理のApplication Programming Interface(API)のアドレスにフックを仕掛けておく。これにより、OS制御アプリ101が実行要求のあった同期処理を検出することができる。また、具体的な判断方法として、OS制御アプリ101は、互いに異なるOSによって実行されるスレッド間の同期処理を特定する第1の情報を記憶する記憶部を参照する。具体的な記憶内容については、図7にて後述する。
互いに異なるOSによって実行されるスレッド間の同期処理ではないと判断した場合、OS制御アプリ101は、CPU#c1に固有の記憶領域であるローカルメモリ#lm1を用いて、実行要求があった同期処理を実行する。
このように、OS制御アプリ101は、あるOSからの同期処理が他OSが実行するスレッドから呼ばれない時、OSを実行するCPU固有の記憶領域を用いて同期処理を行う。これにより、メモリ一貫性を取らなくてよい同期処理について、複数のCPU共有の記憶領域であるグローバルメモリ#gmを用いずに済み、マルチプロセッサシステム100の処理性能が向上する。以下、図2〜図38を用いて、マルチプロセッサシステム100について詳細に説明する。
(マルチプロセッサシステム100のハードウェア)
図2は、マルチプロセッサシステムのハードウェア構成例の一例を示すブロック図である。図2において、携帯端末を想定するマルチプロセッサシステム100は、CPUs201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、フラッシュROM204と、フラッシュROMコントローラ205と、フラッシュROM206を有する。さらに、マルチプロセッサシステム100は、さらに、ディスプレイ207と、I/F208と、キーボード209と、カメラデバイス210を有する。また、図1に示したグローバルメモリ#gmは、RAM203、フラッシュROM204と、フラッシュROM206といった記憶装置となる。
ここで、CPUs201は、マルチプロセッサシステム100の全体の制御を司る制御装置群である。CPUs201の具体的な例については、図3にて記述する。ROM202は、ブートプログラムなどのプログラムを記憶している不揮発性メモリである。RAM203は、CPUs201のワークエリアとして使用される揮発性メモリである。フラッシュROM204は、書き換え可能な不揮発性メモリである。たとえば、フラッシュROM204は、読出し速度が高速なNOR型フラッシュメモリである。フラッシュROM204は、OS(Operating System)などのシステムソフトウェアやアプリなどを記憶している。たとえば、OSを更新する場合、マルチプロセッサシステム100は、I/F208によって新しいOSを受信し、フラッシュROM204に格納されている古いOSを、受信した新しいOSに更新する。
フラッシュROMコントローラ205は、CPUs201の制御にしたがってフラッシュROM206に対するデータのリード/ライトを制御する制御装置である。フラッシュROM206は、書き換え可能な不揮発性メモリであり、たとえば、データの保存、運搬を主に目的とした、NAND型フラッシュメモリである。フラッシュROM206は、フラッシュROMコントローラ205の制御で書き込まれたデータを記憶する。データの具体例としては、マルチプロセッサシステム100を使用するユーザがI/F208を通して取得した画像データ、映像データなどや、また本実施の形態にかかる実行制御方法を実行するプログラムを記憶してもよい。フラッシュROM206は、たとえば、メモリカード、SDカードなどを採用することができる。
ディスプレイ207は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する表示装置である。ディスプレイ207は、たとえば、TFT液晶ディスプレイなどを採用することができる。
I/F208は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク212に接続され、ネットワーク212を介して他の装置に接続される。そして、I/F208は、ネットワーク212と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F208には、たとえばモデムやLANアダプタなどを採用することができる。
キーボード209は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード209は、タッチパネル式の入力パッドやテンキーなどであってもよい。カメラデバイス210は、静止画や動画を撮影する装置である。
図3は、CPUsとメモリとの接続例を示す説明図である。図3では、CPUs201に含まれるCPU群と、CPU群がアクセス可能なメモリであるローカルメモリ#lmと、シェアードメモリ#smと、グローバルメモリ#gmとについて説明する。
CPUs201は、CPU#c1〜CPU#c6を含む。CPU#c1、CPU#c2とCPU#c3、CPU#c4〜CPU#c6は、それぞれ共通の命令セットとレジスタセットのプロセッサである。また、CPU#c2とCPU#c3は、命令セットとレジスタセットが同一であれば、処理性能が異なってもよい。同様に、CPU#c4〜CPU#c6も、命令セットとレジスタセットが同一であれば、処理性能が異なってもよい。
OS#o1は、CPU#c1が実行するOSである。OS#o2は、CPU#c2とCPU#c3が実行するOSである。OS#o3は、CPU#c4〜CPU#c6が実行するOSである。
ローカルメモリ#lm1〜ローカルメモリ#lm6は、それぞれ、CPU#c1〜CPU#c6固有の記憶装置である。ローカルメモリ#lm1〜ローカルメモリ#lm6は、たとえば、各CPUにて用いられるデータを記憶している。また、ローカルメモリ#lm1は、OS#o1のプログラムデータである、OS#o1プログラムを記憶している。OSのプログラムデータは、変更しない命令コード列と固定値の変数やテーブル、変更する初期値付き変数やテーブル、初期値なし変数やテーブルを含む。
シェアードメモリ#sm2は、CPU#c2とCPU#c3とから共有される記憶装置である。また、シェアードメモリ#sm3は、CPU#c4〜CPU#c6とから共有される記憶装置である。シェアードメモリ#sm2は、OS#o2のプログラムデータである、OS#o2プログラムを記憶している。同様に、シェアードメモリ#sm3は、OS#o3のプログラムデータである、OS#o3プログラムを記憶している。
グローバルメモリ#gmは、CPU#c1〜CPU#c6から共有される記憶装置である。ローカルメモリ#lm、シェアードメモリ#sm、グローバルメモリ#gmは、CPUから近い記憶装置の方が、読み書き速度が速い。CPU#c2の例では、ローカルメモリ#lm2が最も読み書き速度が速く、シェアードメモリ#sm2、グローバルメモリ#gmの順に遅くなる。
(マルチプロセッサシステム100の機能)
次に、マルチプロセッサシステム100の機能について説明する。図4は、マルチプロセッサシステムの機能構成例を示すブロック図である。マルチプロセッサシステム100は、関連付け部401と、更新部402と、判断部403と、実行部404と、選択部405と、制御部406とを含む。関連付け部401〜制御部406は、記憶装置に記憶されたOS制御アプリ101のプログラムコードをCPU#c1〜CPU#c6のいずれかが実行することにより、関連付け部401〜制御部406の機能を実現する。記憶装置とは、具体的には、たとえば、ローカルメモリ#lm、シェアードメモリ#sm、グローバルメモリ#gmなどである。関連付け部401〜制御部406は、図4では、OS#o3上の機能として図示してあるが、OS#o1や、OS#o2の機能であってもよい。
また、マルチプロセッサシステム100は、スレッドおよびOS関連付けテーブル411と、スレッドおよび同期処理ID関連付けテーブル412と、同期処理IDおよびOS関連付けテーブル413と、管理情報414とにアクセス可能である。さらに、マルチプロセッサシステム100は、CPU割当テーブル421と、スレッド情報テーブル422と、割当可能OS数テーブル423と、CPU状態テーブル424と、スレッド割当予定記憶テーブル425とにアクセス可能である。
スレッドおよびOS関連付けテーブル411〜管理情報414、CPU割当テーブル421〜スレッド割当予定記憶テーブル425は、グローバルメモリ#gmに格納されている。スレッドおよびOS関連付けテーブル411〜管理情報414、CPU割当テーブル421〜スレッド割当予定記憶テーブル425の具体的な説明は、図5〜図8、図13〜図17に説明する。
同期処理IDおよびOS関連付けテーブル413は、互いに異なるOSによって実行されるスレッド間の同期処理を特定する第1の情報を記憶する。第1の情報は、たとえば、同期処理の識別情報と、該当の同期処理が互いに異なるOSによって実行されるスレッド間の同期処理であるか否かを示す値とを有する。また、第1の情報は、同期処理の識別情報と、該当の同期処理の実行要求を行うスレッドを実行するOSの識別情報と、を有してもよい。
関連付け部401は、同期処理の実行要求を行うスレッドを複数のOSのうちのいずれかのOSが実行した場合、同期処理の実行要求を行うスレッドと当該スレッドを実行したOSとを関連付ける。たとえば、スレッド#t1をOS#o1が実行した場合、関連付け部401は、スレッド#t1とOS#o1を関連付ける。また、どのスレッドが同期処理の実行要求を行うかを特定するかについて、関連付け部401は、スレッドおよび同期処理ID関連付けテーブル412を参照してもよいし、スレッドから実行要求があった同期処理を記憶しておいた情報を参照してもよい。なお、関連付けた情報は、ローカルメモリ#lm、スレッドおよびOS関連付けテーブル411等に記憶される。
更新部402は、関連付け部401によって関連付けられた関連付け結果に基づいて、同期処理IDおよびOS関連付けテーブル413に記憶されている、互いに異なるOSによって実行されるスレッド間の同期処理を特定する第1の情報を更新する。たとえば、関連付け部401が、スレッド#t1とOS#o1とを関連付け、さらに、スレッド#t1とOS#o2とを関連付けたとする。このとき、更新部402は、スレッド#t1から実行要求が行われる同期処理が、互いに異なるOSによって実行されるスレッド間の同期処理であるとして、同期処理IDおよびOS関連付けテーブル413を更新する。
判断部403は、第1の情報を参照して、第1のCPUを制御する複数のOSのうちの第1のOSによって実行されるスレッドから実行要求があった同期処理が、互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断する。たとえば、同期処理IDおよびOS関連付けテーブル413が、セマフォID#s1と、OS#o1およびOS#o2とを関連付けて記憶している状態とする。この状態で、セマフォID#s1の実行要求があった場合、判断部403は、実行要求があった同期処理が、互いに異なるOSによって実行されるスレッド間の同期処理であると判断する。
また、判断部403は、第1の情報を参照して、スレッドから実行要求があった同期処理が、複数のCPUの同一種別のOSによって実行されるスレッド間の同期処理か否かを判断してもよい。
また、判断部403は、更新部402によって更新された第1の情報を参照して、実行要求があった同期処理が、同一種類のOSによって実行されるスレッド間の同期処理か否かを判断してもよい。たとえば、判断部403は、セマフォID#s1と、OS#o1と、OS#o1と同一種類のOS#o1’とを関連付けて記憶しているとする。このとき、判断部403は、セマフォID#s1が同一種類のOSによって実行されるスレッド間の同期処理であると判断する。
また、判断部403は、第1の情報を参照して、マルチプロセッサシステム100の動作モードに基づき、実行要求があった同期処理が、互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断する。マルチプロセッサシステム100の動作モードとは、ユーザ等により指定され、マルチプロセッサシステム100の動作の状態を示している。動作モードが変わると、同期処理の実行要求を実行するか否かが変わるスレッドがあってもよい。なお、判断結果は、ローカルメモリ#lm等に記憶される。
実行部404は、判断部403によって互いに異なるOSによって実行されるスレッド間の同期処理ではないと判断された場合、第1のOSがアクセス可能な第1のCPUに固有の記憶領域を用いて、実行要求があった同期処理を実行する。たとえば、実行部404は、ローカルメモリ#lmを用いて、実行要求があった同期処理を実行する。具体的に、実行部404として、OSが同期処理を実行してもよいし、OS制御アプリ101が同期処理を実行してもよい。
また、実行部404は、判断部403によって実行要求があった同期処理が同一種類のOSによって実行されるスレッド間の同期処理であると判断された場合、同一種類のOSがアクセス可能な記憶領域を用いて、実行要求があった同期処理を実行してもよい。たとえば、判断部403が、OS#o1によって実行されるスレッドと、OS#o1と同一種類のOS#o1’によって実行されるスレッド間の同期処理であると判断したとする。このとき、実行部404は、OS#o1とOS#o1’とがアクセス可能な記憶領域を用いて、実行要求があった同期処理を実行してもよい。これにより、多くのCPUによってアクセスされる記憶領域を可能な限り避けて同期処理を実行することができるため、マルチプロセッサシステム100の処理性能を向上できる。
また、実行部404は、判断部403によって実行要求があった同期処理が互いに異なるOSによって実行されるスレッド間の同期処理であると判断された場合、複数のOSがアクセス可能な記憶領域を用いて、実行要求があった同期処理を実行してもよい。たとえば、実行部404は、グローバルメモリ#gmを用いて、実行要求があった同期処理を実行する。
選択部405は、複数のOSの中から、割り当てられた全てのスレッドの実行を終了したOSを検出した場合、マルチプロセッサシステム内で実行待ちのスレッドのうちの、終了したOSが実行可能な1つのスレッドを選択する。たとえば、OS#o1に割り当てられた1つのスレッドの実行が終了したとする。このとき、選択部405は、OS#o1が実行可能なスレッドから1つのスレッドを選択する。
また、複数のOSの中から、割り当てられた全てのスレッドの実行が終了したOSを検出したとする。このとき、選択部405は、マルチプロセッサシステム内で実行待ちのスレッドのうちの、終了したOSを実行するCPUが実行可能な1つのスレッドを選択してもよい。たとえば、OS#o2に割り当てられた1つのスレッドの実行が終了したとする。このとき、選択部405は、OS#o2を実行するCPU#c2が実行可能なスレッドから1つのスレッドを選択する。なお、選択結果は、ローカルメモリ#lm等に記憶される。
制御部406は、選択部405によって選択されたスレッドを終了したOSによって実行させる。たとえば、制御部406は、スレッドの実行が終わったOS#o1に、スレッド#t2を実行させる。
図5は、スレッドおよびOS関連付けテーブルの記憶内容の一例を示す説明図である。スレッドおよびOS関連付けテーブル411は、動作モード毎に、スレッドとOSの関連付けた情報を記憶している。
図5で示すスレッドおよびOS関連付けテーブル411は、撮影前のビューモードにおけるスレッドおよびOS関連付けテーブル501−1と、静止画撮影モードにおけるスレッドおよびOS関連付けテーブル501−2を含む。さらに、図5で示すスレッドおよびOS関連付けテーブル411は、動画撮影モードにおけるスレッドおよびOS関連付けテーブル501−3と、動画再生モードにおけるスレッドおよびOS関連付けテーブル501−4と、を含む。また、図5にて図示していないが、スレッドおよびOS関連付けテーブル411は、他のモードにおけるスレッドおよびOS関連付けテーブル501−xを含む。xは、正の整数である。
各動作モードのスレッドとOSの関連付けテーブルは、同一のフィールドを有しており、説明の簡略化のため、撮影前のビューモードにおけるスレッドおよびOS関連付けテーブル501−1について説明する。
撮影前のビューモードにおけるスレッドおよびOS関連付けテーブル501−1は、レコード501−1−1〜レコード501−1−10を記憶する。撮影前のビューモードにおけるスレッドおよびOS関連付けテーブル501−1は、スレッドID、属するOSという2つのフィールドを含む。スレッドIDフィールドには、スレッドを識別する識別情報が格納される。属するOSフィールドには、スレッドフィールドに格納されたスレッドが属するOSの識別情報が格納される。たとえば、レコード501−1−1は、スレッド#t1が、OS#o2に属するということを示している。
図6は、スレッドおよび同期処理ID関連付けテーブルの記憶内容の一例を示す説明図である。スレッドおよび同期処理ID関連付けテーブル412は、スレッドごとに、該当のスレッドが利用する同期処理を記憶している。図6に示すスレッドおよび同期処理ID関連付けテーブル412は、レコード601−1〜レコード601−10を記憶している。
スレッドおよび同期処理ID関連付けテーブル412は、スレッドID、利用セマフォID、利用イベントフラグID、利用メールボックスID、利用メモリプールIDという5つのフィールドを含む。スレッドIDフィールドには、スレッドを識別する識別情報が格納される。利用セマフォIDフィールドには、スレッドフィールドに格納されたスレッドが利用するセマフォの識別情報が格納される。利用イベントフラグIDフィールドには、スレッドフィールドに格納されたスレッドが利用するイベントフラグの識別情報が格納される。利用メールボックスIDフィールドには、スレッドフィールドに格納されたスレッドが利用するメールボックスの識別情報が格納される。利用メモリプールIDフィールドには、スレッドフィールドに格納されたスレッドが利用するメモリプールの識別情報が格納される。
たとえば、レコード601−2は、スレッド#t2が、セマフォID#s7と、イベントフラグID#e3と、イベントフラグID#e4と、メールボックスID#mb1と、メモリプールID#mp2を利用することを示している。
図7は、同期処理IDおよびOS関連付けテーブルの記憶内容の一例を示す説明図である。同期処理IDおよびOS関連付けテーブル413は、同期処理ごとに、該当の同期処理を利用するスレッドの属するOSを記憶している。図7に示す同期処理IDおよびOS関連付けテーブル413は、セマフォIDおよびOS関連付けテーブル701−1と、イベントフラグIDおよびOS関連付けテーブル701−2と、を含む。さらに、図7に示す同期処理IDおよびOS関連付けテーブル413は、メールボックスIDおよびOS関連付けテーブル701−3と、メールプールIDおよびOS関連付けテーブル701−4と、を含む。以下、説明の簡略化のため、セマフォIDおよびOS関連付けテーブル701−1について説明を行う。
図7に示すセマフォIDおよびOS関連付けテーブル701−1は、レコード701−1−1〜レコード701−1−8を記憶する。セマフォIDおよびOS関連付けテーブル701−1は、セマフォID、利用スレッドの属するOSという2つのフィールドを含む。セマフォIDフィールドには、セマフォの識別情報が格納される。利用スレッドの属するOSフィールドには、該当のセマフォを利用するスレッドが属するOSの識別情報が格納される。
たとえば、レコード701−1−1は、セマフォID#s1が、OS#o1とOS#o2とに属するスレッドから利用されることを示している。
図8は、管理情報の記憶内容の一例を示す説明図である。管理情報414は、実行中管理情報801、実行可能管理情報802、スレッド情報803、時間待ち管理情報804、セマフォ情報805、イベントフラグ情報806、メールボックス情報807、メモリプール情報808を有する。
実行中管理情報801は、CPU個数分あり、該当のCPUが実行中のスレッドを示す情報である。実行中管理情報801のチェーン要素は実行中の1つのスレッド情報803へのポインタが格納されている。
実行可能管理情報802は、1つ存在し、実行可能なスレッド群を示す情報である。実行可能管理情報802の待ちキュー要素は、一方向リストを形成しており、実行可能なスレッド情報803が数珠つなぎにつながる。
スレッド情報803はスレッド個数分あり、スレッドの属性を示す情報である。複数のスレッド情報803を識別するため、OS制御アプリ101は、スレッドIDを用いて索引する。スレッド情報803のチェーン要素は、管理情報414のうちの時間待ち管理情報804以外の情報に結合している。
スレッド情報803の時間待ちチェーン要素は、タイムアウトを実現する場合、時間待ち管理情報804の待ちキュー要素からつながる。スレッド情報803のOSID要素は、スレッドを実行中のOSの識別情報を示している。スレッド情報803のスレッドID要素はスレッドの識別情報である。スレッド情報803のCPUID要素はスレッドを実行中のCPUの識別情報を示している。
スレッド情報803の状態値要素はスレッドの状態である。スレッド情報803の状態値は実行状態、実行可能状態、待ち状態(時間、セマフォ、イベント、メールボックス、メモリプール)、未登録がある。スレッド情報803の優先度要素はスレッドの優先度を示す値である。スレッド情報803の待ちフラグ要素とスレッド情報803のフラグモード要素はイベントフラグ待ちにおいて条件を格納するものである。スレッド情報803の待ち時間要素は時間待ち時に復帰時間を示すものである。
時間待ち管理情報804は、1つ存在し、待ち状態となっているスレッドを示す情報である。時間待ちしているスレッド情報803が、待ちキュー要素により数珠つなぎにつながる。待ち時間は、スレッド情報803内の待ち時間要素に格納される。
セマフォ情報805はセマフォ個数分ある。複数のセマフォ情報805を識別するため、OS制御アプリ101は、セマフォIDで索引する。セマフォ獲得待ちのスレッド情報803が、セマフォ情報805の待ちキュー要素により数珠つなぎにつながる。セマフォ情報805のカウンタ要素は、未割当資源数である。セマフォ情報805のカウンタ要素の値が0の場合、資源なしの状態を示す。
イベントフラグ情報806は、イベント個数分ある。複数のイベントフラグ情報806を識別するため、OS制御アプリ101は、イベントフラグIDで索引する。イベントフラグ待ちのスレッド情報803が、イベントフラグ情報806の待ちキュー要素により数珠つなぎにつながる。イベント待ち条件は、スレッド情報803内の待ちフラグ要素とフラグモード要素に格納される。イベントフラグ情報806のフラグ要素は現在のイベントフラグの値である。
メールボックス情報807は、メールボックス個数分ある。複数のメールボックス情報807を識別するため、OS制御アプリ101は、メールボックスIDで索引する。メール待ちのスレッド情報803が、メールボックス情報807の待ちキュー要素により数珠つなぎにつながる。メールボックス情報807の先頭要素と末尾要素はメッセージチェーン要素から始まるメッセージバッファの先頭と末尾の位置を示している。
メモリプール情報808は、メモリプール個数分ある。複数のメモリプール情報808を識別するため、OS制御アプリ101は、メモリプールIDで索引する。メモリプール取得待ちのスレッド情報803が、メモリプール情報808の待ちキュー要素により数珠つなぎにつながる。メモリプール情報808のカウンタ要素は最大メモリブロック個数の値である。メモリプール情報808のブロックサイズ要素は一度のメモリプール取得で取得できるメモリサイズを示している。メモリプール情報808の管理テーブル要素はメモリブロックの使用状態を示している。メモリプール情報808のメモリプールアドレス要素はメモリプールの先頭アドレスを示している。
図9は、同期処理IDおよびOS関連付けテーブルの更新例を示す説明図である。図9では、スレッドの割り当て結果に応じて、同期処理IDおよびOS関連付けテーブル413を更新する例を示す。
たとえば、更新前のレコード701−1−1は、セマフォID#s1が、OS#o1とOS#o2とに属するスレッドから利用されることを示していたと状態とする。この状態で、マルチプロセッサシステム100は、スレッド#t1〜スレッド#t10が所定期間、OS#o1〜OS#o3に割り当てられた結果、スレッド#t9がOS#o2に割り当てられず、OS#o1に割り当てられたと状態になったとする。所定期間は、マルチプロセッサシステム100の開発者によって指定される期間であり、たとえば、1秒間である。この状態で、マルチプロセッサシステム100は、スレッド#t1〜スレッド#t10を所定期間、OS#o1〜OS#o3に割り当てた結果、スレッド#t9がOS#o2に割り当てられず、OS#o1に割り当てられたとする。このとき、マルチプロセッサシステム100は、レコード501−1−9の属するOSフィールドの値を、“o1,o2”から、“o1”に更新する。
次に、マルチプロセッサシステム100は、レコード601−9を参照して、スレッド#t9が利用するセマフォIDが、セマフォID#s1、セマフォID#s2、セマフォID#s5であることを特定する。続けて、マルチプロセッサシステム100は、同期処理IDおよびOS関連付けテーブル413のうちの、セマフォID#s1のレコード701−1−1と、セマフォID#s2のレコード701−1−2と、セマフォID#s5のレコード701−1−5と、を更新する。たとえば、レコード701−1−1について、マルチプロセッサシステム100は、レコード701−1−1の利用スレッドの属するOSフィールドの値を“o1,o2”から、“o1”に更新する。このように、同期処理に対して、利用スレッドの属するOSが複数から1つになった場合、マルチプロセッサシステム100は、複数のOSに跨った同期処理を行わずに済むため、マルチプロセッサシステム100の処理性能を向上できる。
なお、同期処理IDおよびOS関連付けテーブル413を更新する場合、マルチプロセッサシステム100は、実動作で参照し用いるテーブルと、更新用として用いるテーブルとの2つ用意しておいてもよい。更新する際に、マルチプロセッサシステム100は、実動作で参照し用いるテーブルを複製したテーブルを、更新用として用いるテーブルとして、用意する。続けて、マルチプロセッサシステム100は、更新用として用いるテーブルに対して更新処理を行う。
また、スレッドおよびOS関連付けテーブル411の更新量について説明する。動作モードは、マルチプロセッサシステム100がデジタルカメラであれば、撮影前のビューモード、静止画撮影モード、静止画再生モード、動画撮影モード、動画再生モード、音声録音モード、音声再生モード、USB接続モード、プリンタ接続モード等がある。このような動作モード毎にスレッドおよびOS関連付けテーブル411を用意することになるが、ユーザによる付加設定により、実際に実行されるスレッドが変わってしまうことがある。ユーザによる付加設定として、顔検出設定、スマイル検出設定、肌きれい設定、動体検出設定、動体追尾設定、シーン検出設定、手振れ補正設定等がある。
したがって、マルチプロセッサシステム100は、スレッドおよびOS関連付けテーブル411の更新量を、全体の半分以上行うことになる。したがって更新をすることにより、マルチプロセッサシステム100は、グローバルメモリ#gmを用いる機会を大きく減らすことができる。
続けて、図10〜図12を用いて、同期処理の実行主体決定処理と、スレッドおよびOS関連付けテーブル411および同期処理IDおよびOS関連付けテーブル413の更新処理について説明する。それぞれの処理は、CPU#c1〜CPU#c6のうちのいずれのCPUが実行してもよい。説明の簡略化のため、本実施の形態では、CPU#c1がそれぞれの処理を実行する場合を例として説明を行う。
図10は、同期処理の実行主体決定処理手順の一例を示すフローチャートである。同期処理の実行主体決定処理は、同期処理を実行する実行主体を、同期処理が呼ばれたOSとするか、OS制御アプリ101とするかを決定して、決定した実行主体に同期処理を実行させる処理である。
CPU#c1は、スレッドから同期処理の実行要求が呼ばれたことを検出する(ステップS1001)。次に、CPU#c1は、同期処理IDおよびOS関連付けテーブル413を参照して、該当の同期処理が複数のOSから用いられるか否かを判断する(ステップS1002)。該当の同期処理とは、スレッドから呼ばれた同期処理のことである。該当の同期処理が単独のOSから用いられる場合(ステップS1002:No)、CPU#c1は、該当の同期処理がOS制御アプリ101で実行されていたか否かを判断する(ステップS1003)。
該当の同期処理がOS制御アプリ101で実行されていた場合(ステップS1003:Yes)、OS制御アプリ101の該当の同期処理の管理情報414を、同期処理が呼ばれたOSの同期処理の管理情報に複製する(ステップS1004)。同期処理が呼ばれたOSの同期処理の管理情報は、同期処理が呼ばれたOSがOS#o1であれば、ローカルメモリ#lm1に格納されている。また、同期処理が呼ばれたOSがOS#o2であれば、シェアードメモリ#sm2に格納されており、同期処理が呼ばれたOSがOS#o3であれば、シェアードメモリ#sm3に格納されている。ステップS1004の終了後、または、該当の同期処理が単独のOSで実行されていた場合(ステップS1003:No)、CPU#c1は、同期処理が呼ばれたOSによって、同期処理を実行する(ステップS1005)。
該当の同期処理が複数のOSから用いられる場合(ステップS1002:Yes)、CPU#c1は、該当の同期処理が単独のOSで実行されていたか否かを判断する(ステップS1006)。該当の同期処理が単独のOSで実行されていた場合(ステップS1006:Yes)、CPU#c1は、該当のOSの該当の同期処理の管理情報を、OS制御アプリ101の同期処理の管理情報414に複製する(ステップS1007)。ステップS1007の終了後、または、該当の同期処理がOS制御アプリ101で実行されていた場合(ステップS1006:No)、CPU#c1は、OS制御アプリ101によって、同期処理を実行する(ステップS1008)。なお、具体的なOS制御アプリ101が行う同期処理の処理内容は、OSが同期処理を行う処理内容と同一であるため、説明を省略する。
ステップS1005、またはステップS1008の実行終了後、CPU#c1は、同期処理の実行主体決定処理を終了する。同期処理が単独のOSから用いられる場合、CPU#c1は、ローカルメモリ#lmを用いて同期処理を行い、CPU#c2〜CPU#c6は、シェアードメモリ#smを用いて同期処理を行う。したがって、マルチプロセッサシステム100は、同期処理が単独のOSから用いられる場合、ローカルメモリ#gmを用いないため、マルチプロセッサシステム100の性能を向上することができる。
また、CPU#c1は、ステップS1003、ステップS1004、ステップS1006、ステップS1007の処理を行わないことも可能である。ステップS1003、ステップS1004、ステップS1006、ステップS1007を行わない場合、CPU#c1は、同期処理の利用を解放した後に、ステップS1005、またはステップS1008の処理を実行すればよい。同期処理の利用を解放することが困難であれば、CPU#c1は、ステップS1003、ステップS1004、ステップS1006、ステップS1007の処理を行うことにより、同期処理の利用を継続したまま同期処理の実行主体を切り替えることができる。
図11は、スレッドおよびOS関連付けテーブルの更新処理手順の一例を示すフローチャートである。スレッドおよびOS関連付けテーブルの更新処理は、スレッドの割当状態に応じて、スレッドおよびOS関連付けテーブル411を更新する処理である。
CPU#c1は、動作モードの遷移が発生したか否かを判断する(ステップS1101)。動作モードの遷移が発生した場合(ステップS1101:Yes)、CPU#c1は、遷移した動作モードの動作ログ用のスレッドおよびOS関連付けテーブル501−xを確保する(ステップS1102)。次に、CPU#c1は、スレッド遷移の状態を、所定期間として1秒間記録する(ステップS1103)。続けて、CPU#c1は、先頭のスレッドを選択する(ステップS1104)。
次に、CPU#c1は、選択したスレッドが1秒間のうちCPUに割り当てられていたか否かを判断する(ステップS1105)。選択したスレッドがCPUに割り当てられている場合(ステップS1105:Yes)、CPU#c1は、選択したスレッドと割り当てられたOSを関連付けた情報を、スレッドおよびOS関連付けテーブル501−xに格納する(ステップS1106)。
選択したスレッドがCPUに割り当てられていなかった場合(ステップS1105:No)、CPU#c1は、選択したスレッドと全てのOSを関連付けた情報を、スレッドおよびOS関連付けテーブル501−xに格納する(ステップS1107)。
ステップS1106、またはステップS1107の終了後、CPU#c1は、全てのスレッドを選択したか否かを判断する(ステップS1108)。まだ選択していないスレッドがある場合(ステップS1108:No)、CPU#c1は、次のスレッドを選択する(ステップS1109)。ステップS1109の実行終了後、CPU#c1は、ステップS1105の処理に移行する。動作モードの遷移が発生していない場合(ステップS1101:No)、または全てのスレッドを選択した場合(ステップS1108:Yes)、CPU#c1は、スレッドおよびOS関連付けテーブルの更新処理を終了する。スレッドおよびOS関連付けテーブルの更新処理を実行することにより、マルチプロセッサシステム100は、複数のOSに跨って同期処理を行う実行する頻度を減らすことを図るために用いる情報を生成できる。
図12は、同期処理IDおよびOS関連付けテーブルの更新処理手順の一例を示すフローチャートである。同期処理IDおよびOS関連付けテーブルの更新処理は、図11により更新した、スレッドおよびOS関連付けテーブル411とスレッドおよび同期処理ID関連付けテーブル412に基づき、同期処理IDおよびOS関連付けテーブル413を更新する処理である。また、図12では、説明の簡略化のため、セマフォIDおよびOS関連付けテーブル701−1を更新する例について説明する。
CPU#c1は、先頭のセマフォIDを選択する(ステップS1201)。次に、CPU#c1は、先頭のスレッドを選択する(ステップS1202)。続けて、CPU#c1は、スレッドおよび同期処理ID関連付けテーブル412を参照して、選択したスレッドが選択したセマフォIDを利用するか否かを判断する(ステップS1203)。選択したスレッドが選択したセマフォIDを利用する場合(ステップS1203:Yes)、CPU#c1は、先頭のOSを選択する(ステップS1204)。
次に、CPU#c1は、図11のフローチャートにより更新した、スレッドおよびOS関連付けテーブル411を参照して、選択したスレッドが選択したOSに割り当てられる可能性があるか否かを判断する(ステップS1205)。割り当てられる可能性がある場合(ステップS1205:Yes)、CPU#c1は、選択したセマフォIDと選択したOSを関連付けた情報を、同期処理IDおよびOS関連付けテーブル413に格納する(ステップS1206)。
ステップS1206の終了後、または割り当てられる可能性がない場合(ステップS1205:No)、CPU#c1は、全てのOSを選択したか否かを判断する(ステップS1207)。まだ選択していないOSがある場合(ステップS1207:No)、CPU#c1は、次のOSを選択する(ステップS1208)。ステップS1208の終了後、CPU#c1は、ステップS1205の処理に移行する。
選択したスレッドが選択したセマフォIDを利用しない場合(ステップS1203:No)、または全てのOSを選択した場合(ステップS1207:Yes)、CPU#c1は、全てのスレッドを選択したか否かを判断する(ステップS1209)。まだ選択していないスレッドがある場合(ステップS1209:No)、CPU#c1は、次のスレッドを選択する(ステップS1210)。ステップS1210の終了後、CPU#c1は、ステップS1203の処理に移行する。
全てのスレッドを選択した場合(ステップS1209:Yes)、CPU#c1は、全てのセマフォIDを選択したか否かを判断する(ステップS1211)。まだ選択していないセマフォIDがある場合(ステップS1211:No)、CPU#c1は、次のセマフォIDを選択する(ステップS1212)。ステップS1212の終了後、CPU#c1は、ステップS1202の処理に移行する。
全てのセマフォIDを選択した場合(ステップS1211:Yes)、CPU#c1は、同期処理IDおよびOS関連付けテーブルの更新処理を終了する。同期処理IDおよびOS関連付けテーブルの更新処理を実行することにより、マルチプロセッサシステム100は、複数のOSに跨って同期処理を行う実行する頻度を減らすことを図ることができる。
(統一スケジューリングの説明)
続けて、図13〜図38を用いて、複数のOSに跨って同期処理を行う実行する際に、OS制御アプリ101によって実行される統一スケジューリングの説明を行う。統一スケジューリングは、停止したスレッドがあれば、停止したスレッドの代わりに最も優先度が高いスレッドを割り当てるといった、優先度に従ったスケジューリング方法を行う。
図13は、CPU割当テーブルの記憶内容の一例を示す説明図である。CPU割当テーブル421は、現在実行中のスレッドの識別情報を記憶するテーブルである。図13に示すCPU割当テーブル421は、レコード1301−1〜レコード1301−6を記憶する。CPU割当テーブル421は、CPUID、実行状態スレッドIDという2つのフィールドを含む。CPUIDフィールドには、CPUの識別情報が格納される。実行状態スレッドIDフィールドには、CPUIDフィールドに格納されているCPUが現在実行中のスレッドの識別情報が格納される。
たとえば、レコード1301−1は、CPU#c1が、現在スレッド#t1を実行していることを示している。また、レコード1301−6は、CPU#c6が、現在実行しているスレッドがないことを示している。
図14は、スレッド情報テーブルの記憶内容の一例を示す説明図である。スレッド情報テーブル422は、スレッドごとに、該当のスレッドの実行可能なCPUIDとCPUが実行するOSIDをスレッドの優先度順で記憶する。図14に示すスレッド情報テーブル422は、レコード1401−1〜レコード1401−10を記憶する。
スレッド情報テーブル422は、検索キー、スレッドID、割当可能なCPUID、制御OSIDという4つのフィールドを含む。検索キーフィールドには、該当のレコードの検索順序を示す値が格納される。図14では、先に検索されるレコードが、検索キーフィールドに格納される値が小さくなるようになっている。スレッドIDフィールドには、スレッドの識別情報が格納される。割当可能なCPUIDフィールドには、スレッドIDフィールドに格納されるスレッドが割当可能なCPUの識別情報が格納される。制御OSIDフィールドには、割当可能なCPUIDフィールドに格納されたCPUが実行するOSの識別情報が格納される。
たとえば、レコード1401−1は、1番目に検索され、スレッド#t10がCPU#c2に割当可能であり、CPU#c2がOS#o2を実行することを示している。また、レコード1401−2は、2番目に検索され、スレッド#t9がCPU#c1〜CPU#c6のいずれも割当可能であり、CPU#c1〜CPU#c6がOS#o1〜OS#o3を実行することを示している。
図15は、割当可能OS数テーブルの記憶内容の一例を示す説明図である。割当可能OS数テーブル423は、OSごとに、スレッドが未割当のCPUの個数を記憶するテーブルである。図15に示す割当可能OS数テーブル423は、レコード1501−1〜レコード1501−3を記憶している。
割当可能OS数テーブル423は、OSID、割当可能数という2つのフィールドを含む。OSIDフィールドには、OSの識別情報が格納される。割当可能数フィールドには、OSIDフィールドに格納されたOSを実行するCPUのうち、スレッドが未割当のCPUの個数が格納される。たとえば、レコード1501−1は、OS#o1を実行するCPUのうち、スレッドが未割当のCPUの個数が1個であることを示している。
図16は、CPU状態テーブルの記憶内容の一例を示す説明図である。CPU状態テーブル424は、統一スケジューリングの探索処理にて用いられるテーブルであり、CPUへの割当候補となるスレッドを記憶するテーブルである。図16に示すCPU状態テーブル424は、レコード1601−1〜レコード1601−6を記憶している。
CPU状態テーブル424は、CPUID、割当スレッドIDという2つのフィールドを含む。CPUIDフィールドには、CPUの識別情報が格納される。割当スレッドIDフィールドには、CPUIDフィールドに格納されているCPUへの割当候補となるスレッドの識別情報が格納される。割当スレッドIDフィールドに“empty”が格納されている場合、CPUIDフィールドに格納されているCPUへの割当候補となるスレッドがないことを示す。たとえば、レコード1601−1は、CPU#c1への割当候補となるスレッドがないことを示す。
図17は、スレッド割当予定記憶テーブルの記憶内容の一例を示す説明図である。スレッド割当予定記憶テーブル425は、OSごとに、該当のOSを実行するCPUであればどのCPUでも割当可能となったスレッドを記憶するテーブルである。図17に示すスレッド割当予定記憶テーブル425は、レコード1701−1〜レコード1701−3を記憶している。
スレッド割当予定記憶テーブル425は、OSID、割当予定スレッドIDという2つのフィールドを含む。OSIDフィールドには、OSの識別情報が格納される。割当予定スレッドIDフィールドには、OSIDフィールドに格納されたOSを実行するCPUであればどのCPUでも割当可能となったスレッドの識別情報が格納される。割当予定スレッドIDフィールドに“empty”が格納されていた場合、該当のOSを実行するCPUに対して割当可能となったスレッドがないことを示す。たとえば、レコード1701−1は、OS#o1を実行するCPUであればどのCPUでも割当可能となったスレッドがないことを示している。
図18は、統一スケジューリングを行う前のスレッドの割当状態を示す説明図である。図18では、統一スケジューリングを行う前の状態として、CPU割当テーブル421の図13で示した内容と、スレッド情報テーブル422の図14で示した内容とに則した状態を図示している。図18では、各スレッドを、スレッドの状態と、スレッドが割当可能なCPUとOSに基づいて、領域1801と領域1802を用いて分類している。
領域1801は、実行状態のスレッド群を含んでいる。領域1802は、実行可能状態のスレッド群を含んでいる。領域1802は、さらにスレッドが割当可能なCPUとOSに基づいて、領域1811〜領域1816、領域1821、領域1822、領域1831とを含む。
領域1801は、スレッド#t1、スレッド#t3、スレッド#t4、スレッド#t6、スレッド#t7を含む。スレッド#t1は、CPU#c1に割り当てられている。また、スレッド#t3は、CPU#c2に割り当てられており、スレッド#t4は、CPU#c3に割り当てられている。また、スレッド#t6は、CPU#c4に割り当てられており、スレッド#t7は、CPU#c5に割り当てられている。また、CPU#c6に割り当てられたスレッドはない。
領域1811は、CPU#c1に割当可能なスレッドを含む領域であり、スレッド#t2を含む。領域1812は、CPU#c2に割当可能なスレッドを含む領域であり、スレッド#t10を含む。領域1813は、CPU#c3に割当可能なスレッドを含む領域である。領域1814は、CPU#c4に割当可能なスレッドを含む領域である。領域1815は、CPU#c5に割当可能なスレッドを含む領域である。領域1816は、CPU#c6に割当可能なスレッドを含む領域である。
領域1821は、OS#o2を実行するCPU#c2とCPU#c3に割当可能なスレッドを含む領域であり、スレッド#t5を含む。領域1822は、OS#o3を実行するCPU#c4〜CPU#c6に割当可能なスレッドを含む領域であり、スレッド#t8を含む。領域1831は、CPU#c1〜CPU#c6に割当可能なスレッドを含む領域であり、スレッド#t9を含む。
続けて、図19〜図27を用いて、統一スケジューリングの探索処理の動作について説明する。統一スケジューリングの探索処理は、CPUごとに、CPUの割当候補となるスレッドを探索する処理である。統一スケジューリング処理は、CPU#c1〜CPU#c6のうちのいずれのCPUが実行してもよい。説明の簡略化のため、本実施の形態では、CPU#c1が統一スケジューリング処理を実行する場合を例として説明を行う。
図19は、統一スケジューリングの探索処理における第1の段階を示す説明図である。図19の状態では、探索CPU数が6となっている。この状態で、CPU#c1は、スレッド情報テーブル422の1番目のレコードである、レコード1401−1を選択する。次に、CPU#c1は、レコード1401−1の割当可能なCPUIDフィールドから、CPU#c2を特定し、CPU状態テーブル424のCPU#c2のレコードであるレコード1601−2を特定する。続けて、CPU#c1は、レコード1601−2の割当スレッドIDフィールドが“empty”であるため、スレッド#t10の識別情報“t10”を格納する。OS#o2に一つスレッドを割り当てることになったため、CPU#c1は、割当可能OS数テーブル423のレコード1501−2について、“2”から“1”に変更する。また、図19にて、CPU#2について探索したため、CPU#c1は、探索CPU数を5に設定する。
図20は、統一スケジューリングの探索処理における第2の段階を示す説明図である。図20の状態では、探索CPU数が5となっている。この状態で、CPU#c1は、スレッド情報テーブル422の2番目のレコードである、レコード1401−2を選択する。次に、CPU#c1は、レコード1401−2の割当可能なCPUIDフィールドから、CPU#c1〜CPU#c6を特定する。レコード1401−2が示すように、スレッド#t9が複数のCPUで実行可能であるため、CPU#c1は、スレッド割当予定記憶テーブル425に、スレッド#t9の情報を追加する。具体的に、CPU#c1は、スレッド割当予定記憶テーブル425のレコード1701−1〜レコード1701−3の“empty”を“t9”に変更する。
また、スレッド#t9が複数のOSで動作可能であるため、CPU#c1は、割当可能OS数テーブル423の更新を行わない。さらに、CPU#c1は、探索CPU数を4に設定する。
図21は、統一スケジューリングの探索処理における第3の段階を示す説明図である。図21の状態では、探索CPU数が4となっている。この状態で、CPU#c1は、スレッド情報テーブル422の3番目のレコードである、レコード1401−3を選択する。次に、CPU#c1は、レコード1401−3の割当可能なCPUIDフィールドから、CPU#c2、CPU#c3を特定する。レコード1401−3が示すように、スレッド#t3が複数のCPUで実行可能であるため、CPU#c1は、スレッド割当予定記憶テーブル425に、スレッド#t3の情報を追加する。具体的に、CPU#c1は、スレッド割当予定記憶テーブル425のレコード1701−2の“t9”を“t3,t9”に変更する。
OS#o2に一つスレッドを割り当てることになったため、CPU#c1は、割当可能OS数テーブル423のレコード1501−2について、“1”から“0”に変更する。また、CPU#c1は、探索CPU数を3に設定する。
図22は、統一スケジューリングの探索処理における第4の段階を示す説明図である。図22の状態では、探索CPU数が3となっている。この状態で、CPU#c1は、スレッド情報テーブル422の4番目のレコードである、レコード1401−4を選択する。次に、CPU#c1は、レコード1401−4の割当可能なCPUIDフィールドから、CPU#c1を特定し、CPU状態テーブル424のCPU#c1のレコードであるレコード1601−1を特定する。続けて、CPU#c1は、レコード1601−1の割当スレッドIDフィールドが“empty”であるため、スレッド#t2の識別情報“t2”を格納する。OS#o1に一つスレッドを割り当てることになったため、CPU#c1は、割当可能OS数テーブル423のレコード1501−1について、“1”から“0”に変更する。また、図22にて、CPU#1について探索したため、CPU#c1は、探索CPU数を2に設定する。
図23は、統一スケジューリングの探索処理における第5の段階を示す説明図である。図23の状態では、探索CPU数が2となっている。この状態で、CPU#c1は、スレッド情報テーブル422の5番目のレコードである、レコード1401−5を選択する。次に、CPU#c1は、レコード1401−5の割当可能なCPUIDフィールドから、CPU#c1を特定し、CPU状態テーブル424のCPU#c1のレコードであるレコード1601−1を特定する。続けて、CPU#c1は、レコード1601−1の割当スレッドIDフィールドが“t2”であり、既にスレッドの割当候補があるため、スレッド#t1を割当候補にしない。
図24は、統一スケジューリングの探索処理における第6の段階を示す説明図である。図24の状態では、探索CPU数が2となっている。この状態で、CPU#c1は、スレッド情報テーブル422の6番目のレコードである、レコード1401−6を選択する。次に、CPU#c1は、レコード1401−6の割当可能なCPUIDフィールドから、CPU#c2、CPU#c3を特定する。レコード1401−6が示すように、スレッド#t4は複数のCPUで実行可能である。しかし、スレッド#t4を実行するOS#o2について、割当可能OS数テーブル423のレコード1501−2が示すように、割当可能数が0であるから、CPU#c1は、スレッド#t5を割当候補にしない。
図25は、統一スケジューリングの探索処理における第7の段階を示す説明図である。図25の状態では、探索CPU数が2となっている。この状態で、CPU#c1は、スレッド情報テーブル422の7番目のレコードである、レコード1401−7を選択する。次に、CPU#c1は、レコード1401−7の割当可能なCPUIDフィールドから、CPU#c4〜CPU#c6を特定する。レコード1401−7が示すように、スレッド#t8が複数のCPUで実行可能であるため、CPU#c1は、スレッド割当予定記憶テーブル425に、スレッド#t8の情報を追加する。具体的に、CPU#c1は、スレッド割当予定記憶テーブル425のレコード1701−3の“t9”を“t8,t9”に変更する。
OS#o3に一つスレッドを割り当てることになったため、CPU#c1は、割当可能OS数テーブル423のレコード1501−3について、“3”から“2”に変更する。また、CPU#c1は、探索CPU数を1に設定する。
図26は、統一スケジューリングの探索処理における第8の段階を示す説明図である。図26の状態では、探索CPU数が1となっている。この状態で、CPU#c1は、スレッド情報テーブル422の8番目のレコードである、レコード1401−8を選択する。次に、CPU#c1は、レコード1401−8の割当可能なCPUIDフィールドから、CPU#c4〜CPU#c6を特定する。レコード1401−8が示すように、スレッド#t7が複数のCPUで実行可能であるため、CPU#c1は、スレッド割当予定記憶テーブル425に、スレッド#t7の情報を追加する。具体的に、CPU#c1は、スレッド割当予定記憶テーブル425のレコード1701−3の“t8,t9”を“t7,t8,t9”に変更する。
OS#o3に一つスレッドを割り当てることになったため、CPU#c1は、割当可能OS数テーブル423のレコード1501−3について、“2”から“1”に変更する。また、CPU#c1は、探索CPU数を0に設定する。
図27は、統一スケジューリングの探索処理における第9の段階を示す説明図である。CPU#c1は、スレッド割当予定記憶テーブル425に登録してあるスレッドのうち、CPU割当テーブル421に既に登録してあるスレッドがあり、他のCPUに割当を変更しなくてよいスレッドは該当のCPUに割当済みに設定する。図27の例では、CPU#c1は、CPU割当テーブル421のレコード1301−5にスレッド#t7が登録してあり、他のCPUに割当を変更しなくてよいため、CPU状態テーブル424のレコード1601−5について、“empty”から“t7”に変更する。続けて、CPU#c1は、スレッド割当予定記憶テーブル425のレコード1701−3について、“t7,t8,t9”から“t8,t9”に変更する。
続けて、図28〜図33を用いて、統一スケジューリングの停止再開処理の動作について説明する。統一スケジューリングの停止再開処理は、CPU状態テーブル424とスレッド割当予定記憶テーブル425のレコードごとに、実行状態のスレッドを切り替えるか否かを判断する処理である。続けて、統一スケジューリングの停止再開処理は、切り替える場合、現在実行状態のスレッドを停止させて、割当の候補となったスレッドを再開させる。
図28は、統一スケジューリングの停止再開処理における第1の段階を示す説明図である。図28で示すマルチプロセッサシステム100の状態は、図27にて探索処理が完了した後の状態である。CPU#c1について、CPU状態テーブル424のレコード1601−1の割当スレッドIDフィールドにスレッドの識別情報が格納されているため、CPU#c1は、CPU割当テーブル421のレコード1301−1を参照して、スレッド#t1を停止させる。続けて、CPU#c1は、CPU状態テーブル424のレコード1601−1の割当スレッドIDフィールドに格納されているスレッド#t2を再開させる。
図29は、統一スケジューリングの停止再開処理における第2の段階を示す説明図である。図29で示すマルチプロセッサシステム100の状態は、図28にてスレッド#t2を再開させた後の状態である。CPU#c2について、CPU状態テーブル424のレコード1601−2の割当スレッドIDフィールドにスレッドの識別情報が格納されているため、CPU#c1は、CPU割当テーブル421のレコード1301−2を参照して、スレッド#t3を停止させる。続けて、マルチプロセッサシステム100は、CPU状態テーブル424のレコード1601−2の割当スレッドIDフィールドに格納されているスレッド#t10を再開させる。
スレッド#t10を再開させた後、CPU#c1は、CPU状態テーブル424のレコード1601−3の割当スレッドIDフィールドにスレッドの識別情報が格納されていないため、CPU#c3については特に処理を行わない。同様に、レコード1601−4、レコード1601−6についても、スレッドの識別情報が格納されていないため、CPU#c1は、CPU#c4、CPU#c6については特に処理を行わない。また、レコード1601−5に格納されているスレッドと、レコード1301−5に格納されているスレッドとが、共にスレッド#t7であるため、CPU#c1は、CPU#c5についても、特に処理を行わない。
図30は、統一スケジューリングの停止再開処理における第3の段階を示す説明図である。図30で示すマルチプロセッサシステム100の状態は、CPU状態テーブル424のレコード1601−1〜レコード1601−6について確認した後の状態である。
OS#o1について、スレッド割当予定記憶テーブル425のレコード1701−1の割当スレッドIDフィールドにスレッドの識別情報として“t9”が格納されている。しかし、既に、CPU状態テーブル424のレコード1601−1に“t2”が格納されているため、CPU#c1は、特に処理を行わない。
図31は、統一スケジューリングの停止再開処理における第4の段階を示す説明図である。図31で示すマルチプロセッサシステム100の状態は、スレッド割当予定記憶テーブル425のレコード1701−1について確認した後の状態である。
OS#o2について、スレッド割当予定記憶テーブル425のレコード1701−2の割当スレッドIDフィールドにスレッドの識別情報として“t3,t9”が格納されている。また、レコード1601−3の割当スレッドIDフィールドにスレッドの識別情報が格納されていないため、CPU#c1は、レコード1601−3の割当スレッドIDフィールドについて、“empty”から“t3”に変更する。さらに、CPU#c1は、レコード1701−2の割当予定スレッドIDフィールドについて、“t3,t9”から“t9”に変更する。
続けて、CPU#c1は、スレッド#t4を停止させる。続けて、CPU#c1は、レコード1601−3の割当スレッドIDフィールドに設定したスレッド#t3を再開させる。
図32は、統一スケジューリングの停止再開処理における第5の段階を示す説明図である。図32で示すマルチプロセッサシステム100の状態は、スレッド割当予定記憶テーブル425のレコード1701−2について確認した後の状態である。
OS#o3について、スレッド割当予定記憶テーブル425のレコード1701−3の割当スレッドIDフィールドにスレッドの識別情報として“t8,t9”が格納されている。また、レコード1601−4の割当スレッドIDフィールドにスレッドの識別情報が格納されていないため、CPU#c1は、レコード1601−4の割当スレッドIDフィールドについて、“empty”から“t8”に変更する。さらに、CPU#c1は、レコード1701−3の割当予定スレッドIDフィールドについて、“t8,t9”から“t9”に変更する。
続けて、CPU#c1は、スレッド#t6を停止させる。続けて、CPU#c1は、レコード1601−4の割当スレッドIDフィールドに設定したスレッド#t8を再開させる。
図33は、統一スケジューリングの停止再開処理における第6の段階を示す説明図である。図33で示すマルチプロセッサシステム100の状態は、スレッド割当予定記憶テーブル425のレコード1701−3について確認した後の状態である。
OS#o3について、スレッド割当予定記憶テーブル425のレコード1701−3の割当スレッドIDフィールドにスレッドの識別情報として“t9”が格納されている。また、レコード1601−6の割当スレッドIDフィールドにスレッドの識別情報が格納されていないため、CPU#c1は、レコード1601−6の割当スレッドIDフィールドについて、“empty”から“t9”に変更する。さらに、CPU#c1は、レコード1701−1〜レコード1701−3の割当予定スレッドIDフィールドについて、“t9”から“empty”に変更する。続けて、CPU#c1は、レコード1601−6の割当スレッドIDフィールドに設定したスレッド#t9を再開させる。
統一スケジューリングの結果、次のようになる。CPU#c1が実行するスレッドは、スレッド#t1からスレッド#t2となる。CPU#c2が実行するスレッドは、スレッド#t3からスレッド#t10となる。CPU#c3が実行するスレッドは、スレッド#t4からスレッド#t3となる。CPU#c4が実行するスレッドは、スレッド#t6からスレッド#t8となる。CPU#c5が実行するスレッドは、スレッド#t7のまま継続する。CPU#c6が実行するスレッドは、スレッド#t9となる。続けて、図34〜図38を用いて、統一スケジューリング処理について説明する。統一スケジューリング処理は、CPU#c1〜CPU#c6のうちのいずれのCPUが実行してもよい。説明の簡略化のため、本実施の形態では、CPU#c1が統一スケジューリング処理を実行する場合を例として説明を行う。
図34は、統一スケジューリング処理手順の一例を示すフローチャートである。統一スケジューリング処理は、マルチプロセッサシステム100全体でスレッドを切り替える処理である。CPU#c1は、前処理を実行する(ステップS3401)。前処理の詳細は、図35にて後述する。次に、CPU#c1は、探索処理を実行する(ステップS3402)。探索処理の詳細は、図36にて後述する。続けて、CPU#c1は、停止再開処理を実行する(ステップS3403)。停止再開処理の詳細は、図37と図38にて後述する。ステップS3403の実行終了後、CPU#c1は、統一スケジューリング処理を終了する。統一スケジューリング処理を実行することにより、マルチプロセッサシステム100は、マルチプロセッサシステム100全体でスレッドを切り替えることができる。
図35は、統一スケジューリングの前処理手順の一例を示すフローチャートである。統一スケジューリングの前処理は、CPU#c1は、変数iに1を設定する(ステップS3501)。次に、CPU#c1は、CPU#ciで実行中のスレッドを、CPU割当テーブル421のi番目のレコードに格納する(ステップS3502)。続けて、CPU#c1は、全てのCPUを確認したか否かを判断する(ステップS3503)。まだ全てのCPUを確認していない場合(ステップS3503:No)、CPU#c1は、変数iをインクリメントする(ステップS3504)。ステップS3504の実行終了後、CPU#c1は、ステップS3502の処理に移行する。
全てのCPUを確認した場合(ステップS3503:Yes)、CPU#c1は、探索CPU数を、CPU総数に設定する(ステップS3505)。次に、CPU#c1は、実行待ちスレッドを、スレッド情報テーブル422に追加する(ステップS3506)。続けて、CPU#c1は、CPU状態テーブル424の各レコードの割当スレッドIDフィールドの値を“empty”に設定する(ステップS3507)。次に、CPU#c1は、割当可能OS数テーブル423の各レコードの割当可能数を、各OSを実行するCPU数の個数に設定する(ステップS3508)。続けて、CPU#c1は、スレッド割当予定記憶テーブル425の各レコードの割当予定スレッドIDフィールドの値を“empty”に設定する(ステップS3509)。ステップS3509の実行終了後、CPU#c1は、統一スケジューリングの前処理を終了する。統一スケジューリングの前処理を実行することにより、マルチプロセッサシステム100は、統一スケジューリングの探索処理の準備を行うことができる。
図36は、統一スケジューリングの探索処理手順の一例を示すフローチャートである。統一スケジューリングの探索処理は、CPUごとに、CPUの割当候補となるスレッドを探索する処理である。
CPU#c1は、変数iを1に設定する(ステップS3601)。次に、CPU#c1は、実行可能なスレッドがあるか否かを判断する(ステップS3602)。実行可能なスレッドがある場合(ステップS3602:Yes)、CPU#c1は、探索CPU数が0か否かを判断する(ステップS3603)。実行可能なスレッドがない場合(ステップS3602:No)、または探索CPU数が0である場合(ステップS3603:Yes)、CPU#c1は、統一スケジューリングの探索処理を終了する。
探索CPU数が0でない場合(ステップS3603:No)、CPU#c1は、スレッド情報テーブル422のi番目のレコードの割当可能なCPUフィールドに複数のCPUの識別情報が格納されているか否かを判断する(ステップS3604)。複数のCPUの識別情報が格納されている場合(ステップS3604:Yes)、CPU#c1は、スレッド情報テーブル422のi番目のレコードの制御OSIDフィールドに格納されていたOSを特定する(ステップS3605)。
なお、ステップS3605の処理は、説明を簡単にするために、記述しているため、実際の処理内容として行わなくてもよい。ステップS3605の処理を行わない場合、CPU#c1は、後述の特定したOSについて、スレッド情報テーブル422のi番目のレコードの制御OSIDフィールドをその都度参照することで取得することができる。
次に、CPU#c1は、割当可能OS数テーブル423の、特定したOSのレコードの割当可能数フィールドの値が0か否かを判断する(ステップS3606)。割当可能数フィールドの値が0でない場合(ステップS3606:No)、CPU#c1は、スレッド割当予定記憶テーブル425の、特定したOSのレコードに、スレッド情報テーブル422のi番目のスレッドを追加する(ステップS3607)。
1つのCPUの識別情報が格納されている場合(ステップS3604:No)、CPU#c1は、スレッド情報テーブル422のi番目のレコードの割当可能なCPUフィールドに格納されていたCPUを特定する(ステップS3608)。次に、CPU#c1は、CPU状態テーブル424の、特定したCPUのレコードの割当スレッドIDフィールドにスレッドの識別情報が格納されているか否かを判断する(ステップS3609)。スレッドの識別が格納されていない場合(ステップS3609:No)、CPU#c1は、CPU状態テーブル424の、特定したCPUのレコードの割当スレッドIDフィールドに、スレッド情報テーブル422のi番目のレコードのスレッドの識別情報を格納する(ステップS3610)。続けて、CPU#c1は、スレッド情報テーブル422のi番目のレコードの制御OSIDフィールドに格納されていたOSを特定する(ステップS3611)。
ステップS3607、またはステップS3611の実行終了後、CPU#c1は、割当可能OS数テーブル423の、特定したOSのレコードの割当可能数フィールドの値をデクリメントする(ステップS3612)。さらに、CPU#c1は、探索CPU数をデクリメントする(ステップS3613)。
割当可能数フィールドの値が0である場合(ステップS3606:Yes)、スレッドの識別情報が格納されている場合(ステップS3609:Yes)、またはステップS3613の実行終了後、CPU#c1は、変数iをインクリメントする(ステップS3614)。ステップS3614の実行終了後、CPU#c1は、ステップS3602の処理に移行する。統一スケジューリングの探索処理を実行することにより、マルチプロセッサシステム100は、CPUごとに、CPUの割当候補となるスレッドを探索する処理である。
図37は、統一スケジューリングの停止再開処理手順の一例を示すフローチャート(その1)である。統一スケジューリングの停止再開処理は、CPU状態テーブル424とスレッド割当予定記憶テーブル425のレコードごとに、実行状態のスレッドを切り替えるか否かを判断する処理である。続けて、統一スケジューリングの停止再開処理は、切り替える場合、現在実行状態のスレッドを停止させて、割当の候補となったスレッドを再開させる。
CPU#c1は、変数jに1を設定する(ステップS3701)。次に、CPU#c1は、全てのCPUを確認したか否かを判断する(ステップS3702)。まだ確認していないCPUがある場合(ステップS3702:No)、続けて、CPU#c1は、CPU状態テーブル424のj番目のレコードの割当スレッドIDフィールドにスレッドの識別情報が格納されているか否かを判断する(ステップS3703)。スレッドの識別情報が格納されている場合(ステップS3703:Yes)、CPU#c1は、CPU状態テーブル424のj番目のレコードの割当スレッドIDフィールドに格納されているスレッドが実行中のスレッドとは異なるか否かを判断する(ステップS3704)。
割当スレッドIDフィールドに格納されているスレッドが実行中のスレッドとは異なる場合(ステップS3704:Yes)、CPU#c1は、CPU割当テーブル421のj番目のレコードのCPU担当であるOSに、実行中のスレッドを停止指示する(ステップS3705)。続けて、CPU#c1は、CPU状態テーブル421のj番目のレコードのCPU担当であるOSに、新規に割り当てるスレッドを再開指示する(ステップS3706)。なお、具体的な停止指示方法として、CPU#c1で実行中のOS制御アプリ101が、OS#o1〜OS#o3のスレッドを停止させるAPIを呼び出す。再開指示も同様に、OS制御アプリ101が、再開を行うAPIを呼び出す。
スレッドの識別情報が格納されていない場合(ステップS3703:No)、割当スレッドIDフィールドに格納されているスレッドが実行中のスレッドと一致する場合(ステップS3704:No)、またはステップS3706の実行終了後、CPU#c1は、変数jをインクリメントする(ステップS3707)。ステップS3707の実行終了後、CPU#c1は、ステップS3702の処理に移行する。全てのCPUを確認した場合(ステップS3702:Yes)、CPU#c1は、変数jに1を設定する(ステップS3708)。ステップS3708の実行終了後、CPU#c1は、図38に示すステップS3801に移行する。
図38は、統一スケジューリングの停止再開処理手順の一例を示すフローチャート(その2)である。CPU#c1は、全てのOSを確認したか否かを判断する(ステップS3801)。全てのOSを確認した場合(ステップS3801:Yes)、CPU#c1は、統一スケジューリングの停止再開処理を終了する。
まだ確認していないOSがある場合(ステップS3801:No)、CPU#c1は、スレッド割当予定記憶テーブル425のj番目のレコードの割当予定スレッドIDから、スレッド#iを特定する(ステップS3802)。次に、CPU#c1は、スレッドが特定できたか否かを判断する(ステップS3803)。スレッドが特定できた場合(ステップS3803:Yes)、CPU#c1は、j番目のOSを実行する先頭CPUのCPUIDをkに設定する(ステップS3804)。続けて、CPU#c1は、j番目のOSを実行する末尾CPUのCPUIDをmに設定する(ステップS3805)。続けて、CPU#c1は、kがm以下か否かを判断する(ステップS3806)。スレッドが特定できない場合(ステップS3803:No)、またはkがmより大きい場合(ステップS3806:No)、CPU#c1は、変数jをインクリメントする(ステップS3807)。ステップS3807の実行終了後、CPU#c1は、ステップS3801の処理に移行する。
kがm以下である場合(ステップS3806:Yes)、CPU#c1は、CPU状態テーブル424のCPU#ckのレコードの割当スレッドIDフィールドにスレッドの識別情報が格納されているか否かを判断する(ステップS3808)。スレッドの識別情報が格納されていない場合(ステップS3808:No)、CPU#c1は、CPU状態テーブル424のCPU#ckのレコードの割当スレッドIDフィールドにスレッド#iを格納する(ステップS3809)。次に、CPU#c1は、j番目のOSに、実行中のスレッドを停止指示する(ステップS3810)。続けて、CPU#c1は、j番目のOSに、スレッド#iを再開指示する(ステップS3811)。
スレッドの識別情報が格納されている場合(ステップS3808:Yes)、または、ステップS3811の実行終了後、CPU#c1は、j番目のOSを実行する次のCPUのCPUIDをkに設定する(ステップS3812)。ステップS3812の実行終了後、CPU#c1は、ステップS3806の処理に移行する。統一スケジューリングの停止再開処理を実行することにより、マルチプロセッサシステム100は、探索結果に基づいて、スレッドの停止再開を行える。
以上説明したように、マルチプロセッサシステム100によれば、実行要求があった同期処理が互いに異なるOSによって実行されるスレッド間の同期処理でない場合、OSを実行するCPU固有の記憶領域を用いて同期処理を行う。これにより、マルチプロセッサシステム100は、複数のCPU共有の記憶領域となるグローバルメモリ#gmを用いずに済むため、マルチプロセッサシステム100の処理性能が向上する。同期処理の処理結果をグローバルメモリ#gmに書き込むと、グローバルメモリ#gmへのアクセスに時間がかかり、マルチプロセッサシステム100の処理性能の低下を招くことになる。
また、マルチプロセッサシステム100によれば、実行要求があった同期処理が互いに異なるOSによって実行されるスレッド間の同期処理である場合、OSを実行するCPU固有の記憶領域を用いて同期処理を行う。これにより、マルチプロセッサシステム100は、同期処理を仕様通りの動作で処理することができる。
また、マルチプロセッサシステム100によれば、同期処理の実行要求を行うスレッドが実行された場合に、互いに異なるOSによって実行されるスレッド間の同期処理を特定する情報を更新してもよい。これにより、マルチプロセッサシステム100は、互いに異なるOSによって実行されるスレッド間の同期処理としている同期処理の数が減らせれば、グローバルメモリ#gmを用いる頻度も減るため、マルチプロセッサシステム100の処理性能を向上できる。
また、マルチプロセッサシステム100によれば、マルチプロセッサシステム100の動作モードに基づいて、互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断してもよい。動作モードが変わることにより、実行されるスレッドの処理内容も変化して、同期処理の実行要求を行わないスレッドが発生する可能性がある。したがって、動作モード毎に互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断することにより、マルチプロセッサシステム100の処理性能を向上できる可能性がある。
また、マルチプロセッサシステム100によれば、割り当てられた全てのスレッドの実行が終了したOSを検出した場合、実行待ちのスレッドのうちの、終了したOSが実行可能なスレッドから1つのスレッドを選択し、終了したOSに実行させてもよい。これにより、1つのCPUには1つのスレッドしか実行しておらず、他の処理に妨害されることがなくなるため、スレッドに一定時間までに定められた処理を行うといったリアルタイム制約を遵守しやすくなる。
また、マルチプロセッサシステム100は、割り当てられた全てのスレッドの実行が終了したOSを検出したとする。このとき、マルチプロセッサシステム100によれば、実行待ちのスレッドのうちの終了したOSを実行するCPUが実行可能なスレッドから1つのスレッドを選択し、終了したOSに実行させてもよい。これにより、1つのCPUには1つのスレッドしか実行しておらず、他の処理に妨害されることがなくなるため、スレッドに一定時間までに定められた処理を行うといったリアルタイム制約を遵守しやすくなる。また、特定のCPUでなければ実行できないスレッドを優先することにより、実行可能の条件が狭いスレッドを先に実行することができる。
なお、同じOSを用いるにも関わらず、CPUによって実行できるスレッド、実行できないスレッドというのが発生する理由の一つとして、一部の命令セットの有無がある。たとえば、ある2つCPUのうち、一方のCPUがSingle Instruction Multiple Data(SIMD)といった命令セットを有している場合、SIMD命令を利用するスレッドは、一方のCPUによって実行可能となり、SIMD命令を利用せずCPUの一般命令を利用するスレッドは、両方のCPUによって実行可能となる。
また、本実施の形態にかかるマルチプロセッサシステム100は、複数のOSの1つがリアルタイムOSであり、ヘテロジニアス・プロセッサとなるものであればどのような装置であっても適用できる。たとえば、マルチプロセッサシステム100は、コピー機、ファクシミリ、セットトップボックス、ビデオレコーダー、携帯電話に適用することができる。
なお、本実施の形態で説明した実行制御方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本実行制御方法を実行するプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また実行制御方法を実行するプログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)複数のOperating System(OS)によって制御されるマルチプロセッサシステムの第1のプロセッサが、
記憶部に格納された、前記複数のOSのうちの互いに異なるOSによって実行されるスレッド間の同期処理を特定する第1の情報を参照して、前記第1のプロセッサを制御する前記複数のOSのうちの第1のOSによって実行されるスレッドから実行要求があった同期処理が、前記互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断し、
前記互いに異なるOSによって実行されるスレッド間の同期処理ではないと判断した場合、前記第1のOSがアクセス可能な前記第1のプロセッサに固有の記憶領域を用いて、前記実行要求があった同期処理を実行する、
ことを特徴とする実行制御方法。
(付記2)前記第1のプロセッサが、
前記第1のOSによって実行されるスレッドから実行要求があった同期処理が前記互いに異なるOSによって実行されるスレッド間の同期処理であると判断した場合、前記複数のOSがアクセス可能な記憶領域を用いて、前記実行要求があった同期処理を実行することを特徴とする付記1に記載の実行制御方法。
(付記3)前記第1のプロセッサが、
同期処理の実行要求を行うスレッドを前記複数のOSのうちのいずれかのOSが実行した場合、前記同期処理の実行要求を行うスレッドと当該スレッドを実行したOSとを関連付け、
前記関連付けた結果に基づいて、前記第1の情報を更新する、処理を実行し、
前記判断する処理は、
更新した前記第1の情報を参照して、前記実行要求があった同期処理が、前記互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断することを特徴とする付記1または2に記載の実行制御方法。
(付記4)前記記憶部は、前記マルチプロセッサシステムの動作モード毎に前記第1の情報を記憶しており、
前記判断する処理は、
前記第1の情報を参照して、前記マルチプロセッサシステムの動作モードに基づいて、前記実行要求があった同期処理が、前記互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断することを特徴とする付記1〜3のいずれか一つに記載の実行制御方法。
(付記5)前記第1のプロセッサが、
前記複数のOSの中から、割り当てられた全てのスレッドの実行を終了したOSを検出した場合、前記マルチプロセッサシステム内で実行待ちのスレッドのうちの、前記終了したOSが実行可能な1つのスレッドを選択し、
選択した前記スレッドを前記終了したOSによって実行させる、
ことを特徴とする付記1〜4のいずれか一つに記載の実行制御方法。
(付記6)前記第1のプロセッサが、
前記複数のOSの中から、割り当てられた全てのスレッドの実行が終了したOSを検出した場合、前記マルチプロセッサシステム内で実行待ちのスレッドのうちの、前記終了したOSを実行するプロセッサが実行可能なスレッドから1つのスレッドを選択し、
選択した前記スレッドを前記終了したOSによって実行させる、
処理を実行することを特徴とする付記1〜5のいずれか一つに記載の実行制御方法。
(付記7)複数のOSによって制御されるマルチプロセッサシステムであって、
第1のプロセッサと、
前記複数のOSのうちの互いに異なるOSによって実行されるスレッド間の同期処理を特定する第1の情報を記憶する記憶部と、
前記第1の情報を参照して、前記第1のプロセッサを制御する前記複数のOSのうちの第1のOSによって実行されるスレッドから実行要求があった同期処理が、前記互いに異なるOSによって実行されるスレッド間の同期処理か否かを判断する判断部とを有し、
前記第1のプロセッサは、前記判断部によって前記互いに異なるOSによって実行されるスレッド間の同期処理ではないと判断された場合、前記第1のOSがアクセス可能な前記第1のプロセッサに固有の記憶領域を用いて、前記実行要求があった同期処理を実行する、
ことを特徴とするマルチプロセッサシステム。