(57)【要約】【課題】複数のプロセッサが共有リソースを獲得しようとする場合の排他制御において、コンピュータシステム全体の処理効率が低下することを防止する。【解決手段】複数のプロセッサで動作するＯＳ上のアプリケーションが共有リソースを使用する場合の排他制御方式であって、共有リソース毎に管理情報を設け、この管理情報には、各プロセッサ上で動作するＯＳ毎のセマフォと、各ＯＳからの要求を格納する待ち行列と、待ち行列に格納されている要求個数のカウンタとを備え、共有リソース獲得の可否はカウンタを参照して判断し、共有リソースの獲得通知は、各ＯＳのセマフォから通知を受けることで、各ＯＳにおける共有リソースの管理を行うことを特徴とする。【選択図】  図６
2011232956.tif 000002
【特許請求の範囲】
【請求項１】
各々で個別のＯＳを実行する複数のプロセッサと、前記複数のプロセッサが利用する１または２以上の共有リソースと、各共有リソースにそれぞれ対応する１または２以上の管理情報を記憶する記憶部とを備えたコンピュータシステムであって、
前記管理情報の各々は、前記複数のプロセッサ上で動作するタスクを管理するＯＳごとのセマフォと、当該管理情報に対応する共有リソースの獲得を要求したプロセッサを特定するための情報を順番に格納する待ち行列と、当該管理情報に対応する共有リソースを獲得可能な残数を表すリソースカウンタとを含み、
前記複数のプロセッサの各々は、
前記タスクの処理のために獲得しようとする共有リソースに対応した管理情報に含まれる前記リソースカウンタの値を取得するカウンタ取得手段と、
前記カウンタ取得手段により取得した前記リソースカウンタの値に基づいて当該共有リソースを獲得できるか否かを判定する獲得判定手段と、
前記獲得判定手段により当該共有リソースを獲得できると判定されたときは、当該共有リソースを獲得すると共に対応する管理情報の前記リソースカウンタの値を小さくして、獲得できないと判定されたときは、当該プロセッサを特定するための情報を当該共有リソースに対応する管理情報の前記待ち行列に格納すると共に当該プロセッサが処理しようとしたタスクを待ち状態にするリソース獲得手段とを備えることを特徴とするコンピュータシステム。
【請求項２】
請求項１に記載のコンピュータシステムにおいて、
前記複数のプロセッサの各々は、
獲得している前記共有リソースを解放するとき、当該共有リソースの前記待ち行列が空か否かを判定する空行列判定手段と、
前記空行列判定手段により前記共有リソースの前記待ち行列が空であると判定された場合は、当該共有リソースのリソースカウンタの値を大きくすると共に当該共有リソースを解放し、前記待ち行列が空でないと判定された場合は、その待ち行列に格納されている前記情報によって特定されるプロセッサに当該共有リソースを獲得させると共に当該プロセッサ上のタスクを実行状態にさせるリソース解放手段とを更に備えることを特徴とするコンピュータシステム。
【請求項３】
請求項１に記載のコンピュータシステムにおいて、
前記複数のプロセッサのうちの少なくとも一つは、
前記管理情報を生成する管理情報生成手段と、
前記管理情報生成手段が生成した前記管理情報を前記記憶部に記憶させる管理情報格納手段とを更に備えることを特徴とするコンピュータシステム。
【請求項４】
請求項２に記載のコンピュータシステムにおいて、
前記複数のプロセッサのうちの少なくとも一つは、
前記管理情報を生成する管理情報生成手段と、
前記管理情報生成手段が生成した前記管理情報を前記記憶部に記憶させる管理情報格納手段とを更に備え、
前記管理情報生成手段は、前記ＯＳごとのセマフォが有するセマフォカウンタをゼロに設定した前記管理情報を生成し、
前記リソース解放手段は、前記待ち行列が空でないと判定された場合、前記待ち行列に格納されている前記情報によって特定されるプロセッサに対応するセマフォカウンタを増加させることにより、当該プロセッサに前記共有リソースを獲得させると共に当該プロセッサ上のタスクを実行状態にさせることを特徴とするコンピュータシステム。
【請求項５】
請求項１から４のいずれかに記載のコンピュータシステムにおいて、
前記管理情報は、ロック変数を更に含み、
前記複数のプロセッサの各々は、
前記記憶部から前記管理情報を取得するとき、前記ロック変数に基づいて読み込み可能か否かを判定するロック判定手段を更に備え、
前記カウンタ取得手段は、前記ロック判定手段により読み込み可能と判定されたとき、前記管理情報に含まれる前記リソースカウンタの値を取得することを特徴とするコンピュータシステム。
【請求項６】
請求項２に記載のコンピュータシステムにおいて、
前記管理情報は、ロック変数を更に含み、
前記複数のプロセッサの各々は、
前記記憶部から前記管理情報を取得するとき、前記ロック変数に基づいて読み込み可能か否かを判定するロック判定手段を更に備え、
前記空行列判定手段は、前記ロック判定手段により読み込み可能と判定されたとき、前記リソース獲得手段により獲得された共有リソースに対応する管理情報において前記待ち行列が空か否かを判定することを特徴とするコンピュータシステム。
【請求項７】
請求項１から６のいずれか一項に記載のコンピュータシステムにおいて、
前記管理情報は、対応する共有リソースを獲得する優先順位を各プロセッサごとに規定する優先順位情報と、前記リソース獲得手段が前記待ち行列に前記情報を格納する方法を規定する待ち順決定方法情報とを更に含み、
前記リソース獲得手段は、前記待ち順決定方法情報および前記優先順位情報に基づいて、前記情報を格納する前記待ち行列の位置を決定することを特徴とするコンピュータシステム。
【請求項８】
請求項７に記載のコンピュータシステムにおいて、
前記リソース獲得手段は、前記待ち順決定方法情報および前記優先順位情報に基づいて、前記待ち行列に前記情報を先着順または前記優先順位に応じた順番に格納することを特徴とするコンピュータシステム。
【請求項９】
請求項７に記載のコンピュータシステムにおいて、
前記管理情報は、所定の優先順位閾値を更に含み、
前記リソース獲得手段は、前記待ち順決定方法情報と、前記優先順位情報と、前記優先順位閾値とに基づいて、前記情報を格納する前記待ち行列の位置を決定することを特徴とするコンピュータシステム。
【請求項１０】
請求項９に記載のコンピュータシステムにおいて、
前記リソース獲得手段は、前記待ち順決定方法情報と、前記優先順位情報と、前記優先順位閾値とに基づいて、前記待ち行列に前記情報を先着順または前記優先順位に応じた順番に格納することを特徴とするコンピュータシステム。
【請求項１１】
請求項１から１０のいずれか一項に記載のコンピュータシステムにおいて、
前記記憶部は、前記複数のプロセッサ間で共通にアクセス可能なＯＳシステムコールと、前記ＯＳシステムコールの位置を表すメモリアドレスとを更に記憶し、
前記プロセッサは、前記メモリアドレスに基づいて、前記ＯＳシステムコールを実行することを特徴とするコンピュータシステム。
【請求項１２】
請求項１に記載のコンピュータシステムにおいて実行されるプログラムであって、
前記複数のプロセッサの各々を、前記カウンタ取得手段と、前記獲得判定手段と、前記リソース獲得手段として機能させることを特徴とするプログラム。
【請求項１３】
請求項２に記載のコンピュータシステムにおいて実行されるプログラムであって、
前記複数のプロセッサの各々を、前記カウンタ取得手段と、前記獲得判定手段と、前記リソース獲得手段と、前記待ち行列情報取得手段と、前記空行列判定手段と、前記リソース解放手段として機能させることを特徴とするプログラム。
【請求項１４】
請求項３に記載のコンピュータシステムにおいて実行されるプログラムであって、
前記複数のプロセッサの各々を、前記カウンタ取得手段と、前記獲得判定手段と、前記リソース獲得手段と、前記待ち行列情報取得手段と、前記空行列判定手段と、前記リソース解放手段と、前記管理情報生成手段と、前記管理情報格納手段として機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータシステムとそれに利用するプログラムに関する。
【背景技術】
【０００２】
ナビゲーション装置などの組込み機器やパソコンなどのコンピュータシステムは、複数機能を同時に処理する機能へのニーズが高まっているため、ＭＰＵをシングルコアからマルチコアと呼ばれる密結合マルチプロセッサへ移行している。
【０００３】
マルチプロセッサの使い方には対称型マルチプロセッサ（ＳＭＰ）と非対称型マルチプロセッサ（ＡＭＰ）がある。対称型マルチプロセッサは一つのＯＳにより全てのＣＰＵコア（以下コアと呼称する）を管理するものであり、非対称マルチプロセッサはコアを管理するＯＳが複数になっているものである。パソコンではＳＭＰ対応のＯＳを用いて全てのコアを制御しており、組込み機器においてもＳＭＰ対応のＯＳを用いているものもある。
【０００４】
しかし、既存ソフトウェア資産を対称型マルチプロセッサ上で動作させるにはＳＭＰ対応ＯＳへの移植が必要であり、ＯＳに障害が発生するとシステム全体に普及する。また、既存ソフトウェア資産はシングルコア対応ＯＳしか動作しないものもある。したがって、上記２点の問題を解決するという目的で、非対称型マルチプロセッサを組込みシステムへ適用し、１機能につき１コア、１コアにつき１ＯＳを割り当てる。上記システムにおいて、ＳＲＡＭやＤＲＡＭなどリソースのコア間排他制御を考える。
【０００５】
特許文献１は、リソースのプロセッサ間排他制御を行うのに共有メモリに各ＯＳのセマフォを格納して連携させている。特許文献２は、リソースのプロセッサ間排他制御を行うのに共有メモリ内のロック変数を使用している。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平７−１６０６４５号公報
【特許文献２】特開２００３−３４５６１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１における排他制御方式は、他プロセッサの管理するリソースを獲得するのに自プロセッサＯＳと他プロセッサＯＳのセマフォ獲得システムコールおよび共有メモリへのアクセスを毎回実行する必要があった。そのため、リソース獲得までの時間が長くなり、コンピュータシステム全体の処理効率が低下する問題があった。
【０００８】
特許文献２における排他制御方式は、共有メモリ内ロック変数の獲得待ち時間中にプロセッサでループ処理を実行するため、コンピュータシステム全体の処理効率が低下する問題があった。さらに、ループ処理実行中は消費電力が大きくなる。
【課題を解決するための手段】
【０００９】
各々で個別のＯＳを実行する複数のプロセッサと、複数のプロセッサが利用する１または２以上の共有リソースと各共有リソースにそれぞれ対応する１または２以上の管理情報を記憶する記憶部とを備えたコンピュータシステムであって、管理情報の各々は、複数のプロセッサ上で動作するタスクを管理するＯＳごとのセマフォと、当該管理情報に対応する共有リソースの獲得を要求したプロセッサを特定するための情報を格納する待ち行列と、当該管理情報に対応する共有リソースを獲得可能な残数を表すリソースカウンタとを含み、複数のプロセッサの各々は、タスクの処理のために獲得しようとする共有リソースに対応した管理情報に含まれるリソースカウンタの値を取得するカウンタ取得手段と、カウンタ取得手段により取得したリソースカウンタの値に基づいて当該共有リソースを獲得できるか否かを判定する獲得判定手段と、獲得判定手段により当該共有リソースを獲得できると判定されたときは、当該共有リソースを獲得して、対応する管理情報のリソースカウンタの値を小さくし、獲得できないと判定されたときは、当該プロセッサを特定するための情報を当該共有リソースに対応する管理情報の待ち行列に格納し、当該プロセッサが処理しようとしたタスクを待ち状態にするリソース獲得手段とを備えることを特徴とする。
【発明の効果】
【００１０】
本発明では、共有リソースごとに管理情報を設け、共有リソースの獲得の可否について管理情報に基づいて即座に判断でき、リソース獲得までの時間を低減できる。また、共有リソースが獲得できなかったときは、ループ処理に入らず即座に待ち状態になるため、実行可能状態にある他の処理の進行を阻害することがない。そのため、共有リソースの獲得に関する排他制御のためにコンピュータシステム全体の処理効率が低下する問題の発生を防ぐことができる。
【図面の簡単な説明】
【００１１】
【図１】本発明の一実施形態におけるコンピュータシステムのハードウェア構成の一例を示した説明図である。
【図２】本発明の一実施形態におけるハードウェアおよびソフトウェアの階層の一例を示した説明図である。
【図３】本発明の一実施形態におけるアプリの構成の一例を示した説明図である。
【図４】本発明の一実施形態におけるＯＳの機能の一例を示した説明図である。
【図５】本発明の一実施形態におけるＯＳシステムコール群の一例を示した説明図である。
【図６】本発明の一実施形態における共有リソースの獲得に関する排他制御方法の概要を示した説明図である。
【図７】本発明のコア番号待ち行列とセマフォの待ち行列との関係の一例を示した説明である。
【図８】本発明の一実施形態におけるＯＳシステムコールポインタ群の一例を示した説明図である。
【図９】本発明の一実施形態におけるコア間共有関数群の一例を示した説明図である。
【図１０】本発明の一実施形態におけるコア番号待ち行列の一例を示した説明図である。
【図１１】本発明の一実施形態におけるコア間優先度情報の一例を示した説明図である。
【図１２】本発明の一実施形態におけるコア間リソース管理情報を生成するのに必要な初期化手順の一例を示した説明図である。
【図１３】本発明の一実施形態における各コアＯＳシステムコール登録関数の処理フローの一例を示した説明図である。
【図１４】本発明の一実施形態におけるリソース管理情報生成関数の処理フローの一例を示した説明図である。
【図１５】本発明の一実施形態におけるリソース獲得関数の処理フローの一例を示した説明図である。
【図１６】本発明の一実施形態におけるリソース解放関数の処理フローの一例を示した説明図である。
【図１７】本発明の一実施形態におけるリソース獲得関数の処理において、他に実行可能状態にあるタスクがないときの処理フローの一例を示した説明図である。
【図１８】本発明の一実施形態におけるコア間リソース管理情報およびタスクの状態に関するタイムチャートの一例を示した説明図である。
【図１９】本発明の一実施形態のリソース管理情報生成関数における、コア間リソース管理情報の初期値設定に関する処理フローの一例を示した説明図である。
【図２０】本発明の一実施形態におけるコア間リソース管理情報の初期値設定に関する処理フローにおける、コア間優先度情報の設定に関する処理フローの一例を示した説明図である。
【図２１】本発明の一実施形態におけるリソース獲得関数の処理において、コア間リソースカウンタの値を取得する際に実行する排他制御方法に関する処理フローの一例を示した説明図である。
【図２２】本発明の一実施形態におけるリソース解放関数の処理において、コア番号待ち行列の状態を取得する際に実行する処理フローの一例を示した説明図である。
【図２３】本発明の一実施形態におけるコア番号待ち行列の例を示した説明図である。
【図２４】本発明の一実施形態におけるコア間優先度情報の例を示した説明図である。
【図２５】本発明の一実施形態におけるコア間優先度情報の待ち順決定方法の一例を示した説明図である。
【図２６】本発明の一実施形態におけるコア間優先度情報の待ち順決定方法の一例を示した説明図である。
【図２７】本発明の一実施形態におけるコア間優先度情報の待ち順決定方法の一例を示した説明図である。
【図２８】本発明の一実施形態におけるコア間優先度情報の待ち順決定方法の一例を示した説明図である。
【図２９】本発明の一実施形態のリソース獲得関数における、コア番号待ち行列へコア番号を格納する処理の処理フローの一例を示した説明図である。
【図３０】従来のコア間共有リソースの獲得に関する排他制御について、ハードウェアおよびソフトウェアの階層の一例を示した説明図である。
【図３１】従来知られているコア間共有リソースの獲得に関する処理フローの一例を示した説明図である。
【図３２】本発明の一実施形態に対するコンピュータシステムのハードウェア構成の変形例を示した説明図である。
【図３３】本発明の一実施形態に対するハードウェアおよびソフトウェアの階層の変形例を示した説明図である。
【発明を実施するための形態】
【００１２】
図１は本実施例におけるコンピュータシステムのハードウェア構成の一例を示したものである。コンピュータシステム１はマルチコアプロセッサ２、システムバス３、ＲＡＭ４１、Ｉ／Ｏ４２などを備える。
【００１３】
マルチコアプロセッサ２は、システムバス３を介してＲＡＭ４１やＩ／Ｏ４２とデータ通信を行うことにより、Ｉ／Ｏ４２に接続された機器からデータを読み取りＲＡＭ４１へデータを一時保存しながら演算処理を行い、Ｉ／Ｏ４２に接続された機器へ演算結果を返すものである。マルチコアプロセッサ２は、複数のコア２１をプロセッサ内バス２０で接続しており、コア２１のうちのあるコアから他のコアへハードウェア割込みをかけることができるコア間割込み機能を有するものとする。また、各コアは演算処理を行わない間にスタンバイ状態にする省電力機能を有するものとする。
【００１４】
Ｉ／Ｏ４２はマルチコアプロセッサ２の入出力インターフェースであり、マルチコアプロセッサ２は、タッチパネル、キーボード、ディスプレイ、各種ディスクドライブなどの入出力装置とデータの送受信を行う。
【００１５】
図２は本実施例におけるハードウェアおよびソフトウェアの階層を示したものである。本実施例においては、マルチコアプロセッサ２の各コア２１にそれぞれＯＳが搭載され、各ＯＳ上でそれぞれアプリケーションプログラム（以下アプリと呼称）が動作するものとする。また、マルチコアプロセッサ２のコア２１は、ＲＡＭ４１やＩ／Ｏ４２などを共有する。以下、ＲＡＭ４１とＩ／Ｏ４２などをコア間共有リソースと呼称する。
【００１６】
図３は本実施例におけるアプリの構成を示したものである。アプリは複数のタスクと呼ばれる動作単位から成り立っている。タスクの実行順番はＯＳによって制御される。タスクは実行状態、実行可能状態、待ち状態の３つの状態をとることができる。実行状態は、コアがタスクの処理を実行している状態のことを指す。実行可能状態は、コアが処理を実行できるものの他のタスクによりコアが占有されているため実行していない状態のことを指す。待ち状態は、リソース獲得待ちなどにより処理を実行していない状態のことを指す。
【００１７】
図４は本実施例におけるＯＳの機能を示したものである。本実施例においてＯＳは、少なくともタスク生成・起動機能４０１、タスク切り替え機能４０２、排他制御機能４０３、割込みハンドラ４０４、省電力機能４０５、タスク優先度設定機能４０６を有するものとする。
【００１８】
タスク生成・起動機能４０１は、ＯＳがタスクを生成し、生成したタスクを起動し、実行状態または実行可能状態にする機能である。
【００１９】
タスク切り替え機能４０２は、タスクに設定される優先度と各タスクの状態とに基づいて、ＯＳが実行するタスクを切り換える機能である。複数のタスクが起動しており、あるタスクが実行状態にあるとき、実行状態にあるタスクよりも優先度の高い実行可能状態のタスクが起動したら実行状態のタスクを停止し、優先度の高いタスクを実行する。また、実行状態のタスクがリソース獲得待ちなどになることにより待ち状態になった場合、タスクを実行状態から待ち状態にして停止させ、実行可能状態にある別のタスクを実行状態にしてコア２１に処理を行わせる。
【００２０】
排他制御機能４０３は、セマフォを用いて複数のタスクまたはアプリによる共有リソースの獲得を排他制御する機能である。セマフォは、セマフォのカウンタとタスクの待ち行列とからなる。セマフォのカウンタは、整数型の変数であって、利用可能な共有リソースの個数を表す。セマフォのカウンタの値よりも多くのタスクが共有リソースを利用しようとした場合、一部のタスクは共有リソースの獲得待ちとなり、セマフォの待ち行列に格納される。以降、セマフォのカウンタのことをセマフォカウンタと呼称する。
【００２１】
割込みハンドラ４０４は、Ｉ／Ｏ４２からのハードウェア割込みや他コアからのコア間割り込みにより起動される処理を実行する機能を有するものである。
【００２２】
省電力機能４０５は、自コアを省電力モードに設定する機能である。
【００２３】
タスク優先度設定機能４０６は、タスクの実行に関する優先順位を設定する機能である。
【００２４】
図５は本実施例におけるＯＳシステムコール群を示したものである。ＯＳシステムコールとは、図４に示すＯＳの機能を実行するためのプログラミング関数である。たとえば、タスク生成・起動機能４０１やタスク優先度設定機能４０６を実現するＯＳシステムコールとしてタスク生成関数５０１やタスク起動関数５０２などがある。排他制御機能を実現するＯＳシステムコールとしては、セマフォ生成関数５０３やセマフォ獲得関数５０４、セマフォ解放関数５０５、セマフォ削除関数５０６などがある。ＯＳシステムコール群のプログラミング関数は公知のものを用いてもよい。
【００２５】
セマフォ生成関数５０３は、各ＯＳがセマフォを生成する関数である。セマフォ削除関数５０６は、セマフォを削除する関数である。
【００２６】
セマフォ獲得関数５０４は、各ＯＳがタスクを処理するために、各ＯＳのリソースを獲得しようとするときに実行する関数である。各ＯＳは、リソースに対応したセマフォカウンタの値を取得し、該セマフォカウンタの値が０のときはセマフォの待ち行列にタスクを格納し、１以上であればタスクの処理を続行し、セマフォカウンタの値を１減らす。
【００２７】
セマフォ解放関数５０５は、各ＯＳがタスクの処理のために獲得していたリソースを解放する関数である。各ＯＳは、セマフォの待ち行列に入っているタスクの数が１以上であるか否かを判定し、１以上であればセマフォの待ち行列に格納されているタスクの実行を再開させ、０であればセマフォカウンタの値を１増やす。
【００２８】
図６は本実施例における排他制御方法の概要を示したものである。本実施例では、ＲＡＭ４１の中に複数のコアがアクセスできるメモリ領域を有する。該メモリ領域をコア間共有メモリ領域６０１と呼称する。コア間共有メモリ領域６０１には、各コア間共有リソースに対応したコア間リソース管理情報６１０、コア間共有関数群６２０、コア間ＯＳ管理情報６３０が格納されている。
【００２９】
コア間リソース管理情報６１０は、複数のコア２１の間でのコア間共有リソースの獲得に関して排他制御するための管理情報である。コア間リソース管理情報６１０は、コア２１がコンピュータシステム１にあるコア間共有リソースごとに作成し、コア間共有メモリ領域６０１に格納する。コア２１がコア間リソース管理情報６１０を作成し、コア間共有メモリ領域６０１に格納する処理については、図１４を用いて後述する。
【００３０】
コア間リソース管理情報６１０は、コア間リソースカウンタ６１００、各ＯＳのセマフォ６１０１、コア番号待ち行列６１０２、コア間優先度情報６１０３、ロック変数６１０４から成り立っている。
【００３１】
コア間リソースカウンタ６１００は、コア間共有リソースの残数を記憶するものである。コア２１がコア間共有リソースを獲得しようとするとき、コア間リソースカウンタ６１００の値が１以上であればタスクの処理を続行し、０であればＯＳセマフォ６１０１にタスクを待ち状態にすることを要求する。
【００３２】
各ＯＳのセマフォ６１０１は、各ＯＳにおいてセマフォ生成関数５０３によって生成されたセマフォである。各ＯＳのセマフォ６１０１は、各コアにおいてそれぞれ処理されるタスクの管理を行う。図６では、各ＯＳのセマフォ６１０１がコア間共有リソースを管理するコア間リソース管理情報６１０に含まれているが、コア間リソース管理情報６１０と各ＯＳのセマフォ６１０１は独立して存在してもよいが、この場合、コア間リソース管理情報６１０が各ＯＳのセマフォ６１０１を管理できるように、各ＯＳのセマフォ６１０１へのポインタまたはＩＤをコア間リソース管理情報６１０の中に含める必要がある。
【００３３】
コア番号待ち行列６１０２は、リソースの獲得を要求したものの獲得できなかったタスクについて、そのタスクを処理するコア２１のコア番号を格納する行列である。コンピュータシステム１は、各ＯＳのセマフォ６１０１の待ち行列とコア番号待ち行列６１０２とを用いて、待ち状態にあるタスクを管理する。
【００３４】
コア番号待ち行列６１０２と各ＯＳのセマフォ６１０１の待ち行列の関係を図７に例示する。図７では、コア番号待ち行列６１０２の例７０１が示されている。また、ＯＳ１のセマフォの待ち行列の例７０２が示されている。同様にＯＳ２およびＯＳ３のセマフォの待ち行列の例７０３および７０４がそれぞれ示されている。コア番号待ち行列の例７０１の先頭にはコア番号「コアＣ１」が格納されている。一方、コア番号「コアＣ１」上で動作するＯＳ１のセマフォの待ち行列７０２の先頭には「タスク１Ａ」が格納されている。コア番号待ち行列の例７０１の先頭にあるコア番号「コアＣ１」は、ＯＳ１のセマフォの待ち行列７０２の「タスク１Ａ」に対応しており、コア番号待ち行列の例７０１の各コア番号も同様にＯＳ１〜３のセマフォの待ち行列の例７０２〜７０４と図７に図示したように対応している。
【００３５】
本実施例では、リソースが解放されたときにコア番号待ち行列６１０２の先頭に格納されているコア番号（「コアＣ１」）で動作する各ＯＳのセマフォ６１０１の待ち行列に格納されているタスク（「タスク１Ａ」）にリソースを獲得させる。
【００３６】
コア間共有リソースを解放するとき、コア番号待ち行列６１０２からコア間共有リソースを獲得するコア番号を取得できる。そして、取得したコア番号のコア上のタスクがコア間共有リソースを獲得する。その手順については図１６にて後述する。
【００３７】
コア間優先度情報６１０３は、各コアにそれぞれ優先順位を設定し、コア番号待ち行列６１０２の待ち順を制御するための情報である。
【００３８】
ロック変数６１０４は、コア間リソース管理情報６１０自身を複数コア２１間で排他制御するための変数である。ロック変数６１０４は、セット状態およびリセット状態という二つの状態を持つ。コア２１の内のあるコアがロック変数６１０４をセット状態にした場合、該コアがロック変数をリセット状態にするまで、他コアからは、コア間リソース管理情報６１０に対してはロック変数６１０４以外のアクセスが制限される。
【００３９】
コア間共有関数群６２０は、コア間共有リソースに関する排他制御などの処理を実行するために実行する関数の集まりである。コア間共有関数群６２０に含まれる関数は、コア間リソース管理情報６１０とコア間ＯＳ管理情報６３０を利用して排他制御などの処理を実行する。なお、コア間共有関数群６２０は、ＲＡＭ４１ではなく、ＲＯＭなどに予め記憶しておいてもよい。
【００４０】
コア間ＯＳ管理情報６３０は、コア間共有関数群６２０に含まれる関数においてＯＳシステムコールを実行するために、各ＯＳのシステムコールポインタ群６３１を格納するものである。なお、コア間ＯＳ管理情報６３０は、ＯＳシステムコールの登録において複数コアの登録待ちを行うためにウエイト変数６３２を更に含むものとする。
【００４１】
ウエイト変数６３２は、各コアが各ＯＳのＯＳシステムコールをコア間共有メモリ領域６０１に登録したかどうかの情報を格納できるものである。ウエイト変数６３２は、たとえばマルチコアプロセッサ２にＮ個のコアが含まれるとき、各コアにそれぞれ１ビットを割り当てたＮビットの２進数などにすればよい。
【００４２】
図８は本実施例における各ＯＳのシステムコールポインタ群６３１を示したものである。図５に示すＯＳシステムコールは、後述する図１３を用いた処理によりＲＡＭ４１上にあるコア間共有メモリ領域６０１に格納される。
【００４３】
各ＯＳのシステムコールポインタ群６３１には、図５に示すＯＳシステムコールが格納されているコア間共有メモリ領域６０１上のアドレスがそれぞれ含まれる。ＯＳセマフォ生成関数ポインタ８０１は、図５のセマフォ生成関数５０３をコア間共有メモリ領域６０１に格納したアドレスである。ＯＳセマフォ獲得関数ポインタ８０２は、図５のセマフォ獲得関数５０４をコア間共有メモリ領域６０１に格納したアドレスである。ＯＳセマフォ解放関数ポインタ８０３は、図５のセマフォ解放関数５０５をコア間共有メモリ領域６０１に格納したアドレスである。ＯＳセマフォ生成関数ポインタ８０４は、図５のセマフォ生成関数５０６をコア間共有メモリ領域６０１に格納したアドレスである。
【００４４】
図９は本実施例におけるコア間共有関数群６２０を示したものである。コア間共有関数群６２０には、各コアＯＳシステムコール登録関数９０１、リソース管理情報生成関数９０２、リソース獲得関数９０３、リソース解放関数９０４、リソース管理情報削除関数９０５などがある。
【００４５】
各コアＯＳシステムコール登録関数９０１は、各コア上のＯＳが提供するシステムコールポインタ群６３１をコア間ＯＳ管理情報６３０に登録するプログラム関数である。各コアＯＳシステムコール登録関数９０１の処理の詳細は、図１３を用いて後述する。
【００４６】
リソース管理情報生成関数９０２は、コア間リソース管理情報６１０をコア間共有メモリ領域６０１に生成するプログラム関数である。リソース管理情報生成関数９０２の処理の詳細は、図１４を用いて後述する。
【００４７】
リソース獲得関数９０３は、タスクがコア間リソース管理情報６１０を参照してコア間共有リソースを獲得するプログラム関数である。リソース獲得関数９０３の詳細は、図１５および図１７を用いて後述する。
【００４８】
リソース解放関数９０４は、タスクがコア間リソース管理情報６１０を参照してコア間共有リソースを解放するプログラム関数である。リソース解放関数９０４の詳細は、図１６を用いて後述する。
【００４９】
リソース管理情報削除関数９０５は、コア間リソース管理情報６１０をコア間共有メモリ領域６０１から削除するプログラム関数である。
【００５０】
図１０（ａ）は本実施例におけるコア番号待ち行列６１０２を示したものである。コア番号待ち行列６１０２は、リソース獲得要求を待っているコア番号をノードとして、前後関係をポインタで指し示すような連結リスト型構造となっている。また、コア番号待ち行列６１０２には、その先頭および末尾をそれぞれ指し示すポインタＨＥＡＤとＴＡＩＬが存在してもよい。ポインタＨＥＡＤおよびＴＡＩＬは、コア番号待ち行列６１０２が空行列のときはＮＵＬＬとすればよい。コア番号待ち行列６１０２では、優先順位に従ってコア番号を並び替えられるようにするため、コア番号と共に該コア番号の優先順位に関する情報を格納してもよい。各コア番号の優先順位は、どのコアがコア間共有リソースを優先的に獲得するかを示す。コア番号の優先順位に関する情報は、コア間優先度情報６１０３に基づいて決定される。
【００５１】
図９のリソース解放関数９０４によりコア間共有リソースが解放されるとき、解放されたコア間共有リソースを次に獲得するコア番号として、コア番号待ち行列６１０２における先頭のコア番号を取得する。図１０（ｂ）は、図１０（ａ）に示したコア番号待ち行列６１０２において先頭のコア番号が取得された後の状態を示している。図１０（ｂ）では、取得されたコア番号の値をコア番号待ち行列６１０２から削除する。たとえば、コア番号のノードにつながっているポインタＰ１およびＰ２を切り離し、コア番号のノードＮ１を削除する。そして削除されたコア番号のノードＮ１につながっていたコア番号のノードＮ２を待ち行列の先頭とする。
【００５２】
図１１は本実施例におけるコア間優先度情報６１０３の一例を示したものである。コア間優先度情報６１０３は、待ち順決定方法を示す値６１０３１、各コア番号の優先順位６１０３２、コア優先順位閾値６１０３３を含む。これらのコア間優先度情報６１０３を用いてコア番号待ち行列６１０２は優先順位の順番に並び替えることができる。
【００５３】
待ち順決定方法を示す値６１０３１は、コア番号待ち行列６１０２においてコア番号を並べる方法を決定するものである。待ち順決定方法には、先着順および優先順が含まれ、「コア番号の優先順位がコア優先順位閾値６１０３３以下であれば先着順でそれ以外は優先順」というものや、「コア番号の優先順位がコア優先順位閾値６１０３３より上であれば先着順でそれ以外は優先順」というものなど、先着順と優先順のハイブリッドにするものも想定する。コア優先順位閾値６１０３３は、待ち順決定方法を先着順と優先順のハイブリッドにする場合において、先着順と優先順の境目を示すコア番号の優先順位の閾値を示したものである。
【００５４】
図１２は本実施例においてコア間リソース管理情報６１０を生成するのに必要な初期化手順を示す処理フローの一例である。図１２では、マルチコアプロセッサ２において、メインとなるコア２１を予め設定し、各コア上で動くＯＳにおいて初期化を行うタスクを決めておく。図１２では、例として、コアＣ１をメインとするものとする。そして、図１２の処理を実行するタスクとして、コアＣ１ではタスク１、コアＣ２ではタスク２、コアＣＮではタスクＮが生成・起動されたものとする。
【００５５】
図１２のステップＳ１２０１では、メインとなるコアＣ１がタスク１により、各種初期化を行う。各種初期化の内容としては、ハードウェア割込みのクリアやマスキングなどハードウェアの初期化に必要なレジスタ設定や、コア間共有メモリ領域６０１のゼロクリアなどがある。
【００５６】
次にステップＳ１２０２では、タスク１、タスク２、タスクＮなど初期化を行うタスクは、各コアＯＳシステムコール登録関数９０１を実行し、コア間ＯＳ管理情報６３０に各ＯＳのシステムコールポインタ群６３１を登録し、コア間共通関数群６２０に格納されているリソース解放関数９０４などのコア間共通関数がＯＳシステムコールを使えるようにする。ステップＳ１２０２における処理の詳細については図１３を用いて後述する。
【００５７】
最後にステップＳ１２０３では、初期化を行うコアＣ１のタスク１およびコアＣ１以外の各コアの割込みハンドラがリソース管理情報生成関数９０２を実行することによりコア間リソース管理情報６１０を生成する。ステップＳ１２０３における処理の詳細については図１４を用いて後述する。コア間リソース管理情報６１０の生成が完了したら図１２の処理を終了する。
【００５８】
図１３は本実施例における各コアＯＳシステムコール登録関数９０１の処理フローの一例を示したものである。図１３に示す処理フローは、図１２のステップＳ１２０２などで実行される。各コアＯＳシステムコール登録関数９０１を実行する際、マルチコアプロセッサ２にあるコア２１の中から、メインとなるコアを予め設定しておく。図１３では、コアＣ１をメインとし、ＯＳシステムコールを登録するタスクとして、コアＣ１ではタスク１、コアＣ２ではタスク２、コアＣＮではタスクＮが生成・起動される。
【００５９】
図１３のステップＳ１３０１では、タスク１はコア間ＯＳ管理情報６３０のウエイト変数６３２をゼロクリアする。
【００６０】
次にステップＳ１３０２では、タスク１〜Ｎは、それぞれのＯＳのＯＳシステムコールをコア間共有メモリ領域６０１に格納し、各ＯＳシステムコールを格納したアドレスをシステムコールポインタ群６３１としてコア間ＯＳ管理情報６３０に登録する。
【００６１】
その後、ステップＳ１３０３では、ステップＳ１３０２においてシステムコールポインタ群の登録が完了したタスク１、タスク２、タスクＮがそれぞれ、ウエイト変数６３２の各コアに対応したビットに、ＯＳシステムコール登録完了を示す値、たとえば１を書き込む。
【００６２】
その後、ステップＳ１３０４では、タスク１、タスク２、タスクＮはウエイト変数６３２の全ビットが書き込まれたかどうかをチェックし、全ビットが全て書き込まれるまでループで待つ。もし全てのビットが書き込まれたらループを抜けて図１３の処理を終了する。
【００６３】
図１４は本実施例におけるリソース管理情報生成関数９０２のフローの一例を示したものである。リソース管理情報生成関数９０２を実行する際、マルチコアプロセッサ２にあるコア２１の中から、メインとなるコアを予め設定しておく。図１４では、コアＣ１をメインとし、リソース管理情報生成関数９０２を実行するタスクに関して、コアＣ１ではタスク１、コアＣ２ではタスク２、コアＣＮではタスクＮを設定する。
【００６４】
図１４のステップＳ１４０１では、タスク１はコア間リソース管理情報６１０を生成するメモリ領域をコア間共有メモリ領域６０１に確保する。
【００６５】
次にステップＳ１４０２では、コア間リソース管理情報６１０の初期値設定を行う。コア間リソース管理情報６１０の初期値設定の詳細については、図１９を用いて後述する。コア間リソース管理情報６１０の初期値設定を行なうとき、ロック変数６１０４はセットにしておく。これにより、コア間リソース管理情報６１０の初期値設定を行ったタスク１以外の他のタスクまたはコアからはコア間リソース管理情報６１０のロック変数６１０４以外にアクセスできなくなる。
【００６６】
次にステップＳ１４０３では、タスク１はコア間割込みを用いて、ＯＳセマフォ生成要求をＯＳ２やＯＳＮの割込みハンドラへ送信する。
【００６７】
次にステップＳ１４０４では、タスク１とＯＳ２からＯＳＮの割込みハンドラは、コア間共有メモリ６０１にＯＳセマフォ６１０１を生成する。なお、前述したとおり、ロック変数６１０４はＯＳセマフォに関してはアクセスを制限しない。このときＯＳセマフォ６１０１のカウンタ値を０にしておく。
【００６８】
ＯＳセマフォ６１０１を生成したＯＳ２やＯＳＮの割込みハンドラは処理を終了する。そのとき、ＯＳ２やＯＳＮは、タスク２やタスクＮに制御を移す。
【００６９】
その後、ステップＳ１４０５では、タスク１、タスク２、タスクＮは、全コアでＯＳセマフォ６１０１を生成したかどうかをチェックする。もしいずれかのコアでＯＳセマフォ６１０１が生成されていなければ、全コアでＯＳセマフォ６１０１が作成されるまでループで待つ。全コアでＯＳセマフォ６１０１が作成されたとき、ステップＳ１４０５におけるループを抜ける。そして、ステップＳ１４０６に進み、タスク１はコア間リソース管理情報６１０のロック変数６１０４をリセット状態にして処理を終了する。
【００７０】
図１５は本実施例におけるリソース獲得関数９０３のフローの一例を示したものである。図１５では、ＯＳ１上においてタスク１Ａおよびタスク１Ｂが起動しており、タスク１Ａが実行状態、タスク１Ｂが実行可能状態にあり、タスク１Ａがコア間共有リソースを獲得するものとする。
【００７１】
まず、図１５のステップＳ１５０１では、タスク１Ａはコア間リソースカウンタ６１００の値を取得する。そして、ステップＳ１５０２では、ステップＳ１５０１で取得したコア間リソースカウンタ６１００の値が１以上の場合、つまりコア間共有リソースが残っている場合、ステップＳ１５１３に遷移し、タスク１Ａはコア間リソースカウンタ６１００の値をデクリメントし、コア間共有リソースを獲得する。もしステップＳ１５０２において、コア間リソースカウンタ６１００の値が０である場合、コア間共有リソースが不足していると判断し、ステップＳ１５０３に遷移してタスク１Ａはコア番号待ち行列６１０２にコア番号を格納する。
【００７２】
ステップＳ１５０３にてコア番号待ち行列６１０２にコア番号を格納した後、ステップＳ１５０４に遷移し、タスク１ＡはＯＳ１へリソース獲得待ち処理を要求するため、ＯＳ１のＯＳセマフォ獲得関数ポインタ８０２を参照してセマフォ獲得関数５０４を実行する。
【００７３】
ステップＳ１５０５では、タスク１Ａは残数０のＯＳセマフォ６１０１を獲得しようとするため、実行状態から待ち状態へ移行する。そして、ＯＳ１はステップＳ１５０６に遷移する。
【００７４】
ステップＳ１５０６では、ＯＳ１は実行可能状態にあるタスク１Ｂを実行状態にする。
【００７５】
図１６は本実施例におけるリソース解放関数９０４の一例を示したものである。リソース解放関数９０４を実行する際、マルチコアプロセッサ２の中から、メインとなるコア２１を予め設定しておく。図１８では、コアＣ１をメインとし、リソース解放関数９０４を実行するタスクとして、コアＣ１のＯＳ１上ではタスク１Ａおよびタスク１Ｂが、コアＣＮのＯＳＮ上ではタスクＮがそれぞれ生成・起動されている。タスク１Ａは実行状態にあり既にコア間共有リソースを獲得しており、該コア間共有リソースを解放するものとする。また、タスク１ＢおよびタスクＮは、コア間共有リソースが獲得されていないため、待ち状態にある。そのため、コア番号待ち行列６１０２には、タスク１Ｂを処理しているコアＣ１のコア番号とタスクＮを処理しているコアＣＮのコア番号が格納されているものとする。
【００７６】
図１６のステップＳ１６０１では、タスク１Ａはコア番号待ち行列６１０２の状態を取得する。そして、ステップＳ１６０２に遷移し、取得したコア番号待ち行列６１０２の状態に基づいてコア番号待ち行列６１０２が空であるか否かを判定する。コア番号待ち行列６１０２の状態とは、たとえば、コア番号待ち行列６１０２の先頭を指すポインタＨＥＡＤなどでよく、ステップＳ１６０２ではポインタＨＥＡＤの参照先がＮＵＬＬか否かを判定すればよい。
【００７７】
ステップＳ１６０２において空であると判定された場合は、ステップＳ１６１３に遷移し、コア番号待ち行列６１０２が空でないと判定された場合はステップＳ１６０３に遷移する。
【００７８】
ステップＳ１６１３では、コア間共有リソースを解放し、該コア間共有リソースに対応するコア間リソースカウンタ６１００値をインクリメントして図１６の処理を終了する。
【００７９】
ステップＳ１６０３では、コア番号待ち行列６１０２の先頭にあるコア番号を取得する。先頭にあるコア番号の取得は、たとえば、ポインタＨＥＡＤを参照すればよい。コア番号待ち行列６１０２の先頭にあるコア番号がコアＣ１のものである場合は、コア番号「コアＣ１」を取得する。また同様にコア番号待ち行列６１０２の先頭にあるコア番号がコアＣＮのものである場合は、コア番号「コアＣＮ」を取得する。
【００８０】
ステップＳ１６０４では、ステップＳ１６０３で取得した待ち行列６１０２の先頭にあるコア番号が自コアのもの（この例ではコアＣ１）であるとき、ステップＳ１６１５に遷移する。一方、待ち行列６１０２の先頭にあるコア番号が他コアのもの（この例ではコアＣＮ）であるとき、ステップＳ１６０５に遷移する。
【００８１】
ステップＳ１６１５では、タスク１Ａは、ＯＳ１のセマフォ解放関数５０５を実行する。その結果、タスク１Ａは、獲得していたコア間共有リソースを解放する。そして、コアＣ１のＯＳ１は、ＯＳ１のセマフォの待ち行列に格納されているタスク１Ｂを待ち状態から実行状態へ遷移させることにより、実行を再開させる。
【００８２】
ステップＳ１６０５では、タスク１Ａがコア間割込みを用いて、ＯＳＮのセマフォ解放要求をＯＳＮの割込みハンドラへ送信し、タスク１Ａは、図１６の処理を終了する。
【００８３】
ステップＳ１６０６では、ＯＳＮの割込みハンドラがＯＳＮのセマフォ解放関数５０５を実行する。このとき、ＯＳＮのセマフォのセマフォカウンタが０であるので、セマフォ解放関数５０５の処理によりセマフォカウンタがインクリメントされる。そして、ＯＳＮは、ステップＳ１６０７に遷移し、セマフォカウンタが１となったため、コア間共有リソースを獲得し、タスクＮを待ち状態から実行状態へ遷移させる。これにより、タスクＮは実行を再開する。
【００８４】
図１７は、本実施例においてリソース獲得関数９０３を実行したときに、他に実行可能状態にあるタスクがない場合の動作を示した処理フローである。本処理フローでは、ＯＳ１上においてタスク１Ａおよびタスク１Ｂおよびタスク１Ｃが起動しており、タスク１Ａが実行状態、タスク１Ｂおよびタスク１Ｃは待ち状態にある。タスク１Ａは、リソース獲得関数９０３を実行することにより、コア間共有リソースを獲得しようとするものとする。
【００８５】
タスク１Ａは、ステップＳ１５０５までは図１５と同様に処理を進める。ステップＳ１５０５において、タスク１Ａが実行状態から待ち状態へ移行したとき、コアＣ１上では他に実行可能状態にあるタスクがないため、ＯＳ１は省電力機能４０５によりコアＣ１を省電力モードにして図１７の処理を完了する。
【００８６】
図１８は、コア間リソース管理情報６１０および複数のタスクの状態の遷移に関するタイムチャートを示したものである。本タイムチャートでは、少なくともコアＣ１上でＯＳ １が、コアＣＮ上でＯＳＮが動作しており、ＯＳ１上でタスク１Ａとタスク１Ｂが、ＯＳＮ上でタスクＮが、それぞれ動作しているものとする。また、コア間リソースカウンタ６１００が１であり、コア間共有リソースがどのタスクからも獲得されていない状態を初期状態とする。更に前述したとおり、各ＯＳのセマフォのセマフォカウンタは、初期状態において０である。更に前述したとおり、ＯＳ１セマフォは、ＯＳ１セマフォカウンタとＯＳ１セマフォ待ち行列とからなる。同様にＯＳ２セマフォは、ＯＳ２セマフォカウンタとＯＳ２セマフォ待ち行列とからなり、ＯＳＮセマフォは、ＯＳＮセマフォカウンタとＯＳＮセマフォ待ち行列とからなる。そして、各ＯＳのセマフォのセマフォカウンタは、初期状態において０である。
【００８７】
図１８では、タスク１Ａ、タスクＮ、タスク１Ｂの順にリソース獲得関数９０３を実行し、コア間共有リソースの獲得を要求する。そして、タスク１Ａ、タスクＮ、タスク１Ｂの順にリソース解放関数９０４を実行し、コア間共有リソースの解放を要求するものとする。
【００８８】
図１８の初期状態において、コア間リソースカウンタ６１００の値は１、ＯＳ１のセマフォカウンタは獲得状態、ＯＳＮセマフォカウンタは獲得状態、待ち行列は空である。
【００８９】
まず、タスク１Ａが実行状態になり、コア間共有リソースの獲得を要求したとき、コア間リソースカウンタ６１００の値が１であるため（図１５のステップＳ１５０２において「１以上」と判定）、タスク１Ａはコア間共有リソースを獲得し、そのコア間リソースカウンタ６１００の値をデクリメントし、０にする（図１５のステップＳ１５１３）。
【００９０】
次に、タスクＮが実行状態になり、コア間共有リソースの獲得を要求したとき、コア間リソースカウンタ６１００の値が０であるため（図１５のステップＳ１５０２において「０」と判定）、タスクＮはコア間共有リソースを獲得できず、リソース獲得待ちのために待ち状態に遷移し、コア番号待ち行列６１０２に格納される（図１５のステップＳ１５０３〜Ｓ１５０５）。このとき、コア番号待ち行列６１０２は［Ｎ］となる。また、ＯＳＮのセマフォの待ち行列には、タスクＮが入り、［Ｎ］となる。
【００９１】
次に、タスク１Ｂが実行状態になり、コア間共有リソースの獲得を要求したとき、コア間リソースカウンタ６１００の値が０であるため、タスクＮと同様にタスク１Ｂはリソース獲得待ちのために待ち状態に遷移し、コア番号待ち行列６１０２は［Ｎ, １］となる。また、ＯＳ１セマフォ待ち行列には、タスク１Ｂが入り、［１Ｂ］となる。
【００９２】
次に、実行状態であるタスク１Ａがコア間共有リソースの解放を要求したとき、タスク１Ａはコア間共有リソースを解放する。そして、コア番号待ち行列６１０２が空ではなく（図１６のステップＳ１６０２  ＮＯ判定）、コア番号待ち行列６１０２の先頭にあるコア番号がコアＣＮであって他コアであるので（図１６のステップＳ１６０４  「他コア」判定）、コアＣＮへＯＳＮのセマフォの解放要求を行う（図１６のステップＳ１６０５）。そして、ＯＳＮの割り込みハンドラによりＯＳＮのセマフォ解放関数５０５が実行され、ＯＳＮセマフォカウンタがインクリメントされ１となり（図１６のステップＳ１６０６）、ＯＳＮによりタスクＮがコア間共有リソースを獲得することでＯＳＮのセマフォはデクリメントされ０に戻る。そして、タスクＮはリソース獲得のための待ち状態から実行状態へ遷移し（図１６のステップＳ１６０７）、コア番号待ち行列６１０２は［１］となる。また、ＯＳＮセマフォ待ち行列は空となる。
【００９３】
次に、実行状態であるタスクＮがコア間共有リソースの解放を要求したとき、タスクＮはコア間共有リソースを解放する。そして、コア番号待ち行列６１０２が空ではなく（図１６のステップＳ１６０２  ＮＯ判定）、コア番号待ち行列６１０２の先頭にあるコア番号がコアＣ１であって他コアであるので（図１６のステップＳ１６０４  「他コア」判定）、ＯＳ１のセマフォカウンタがインクリメントされ１となり（図１６のステップＳ１６０６）、ＯＳ１によりタスク１Ｂがコア間共有リソースを獲得することでＯＳ１のセマフォはデクリメントされ０に戻る。タスク１Ｂはリソース獲得待ちのための待ち状態から実行状態へ遷移し（図１６のステップＳ１６０７）、コア番号待ち行列６１０２は空となる。また、ＯＳ１セマフォ待ち行列は空となる。
【００９４】
次に、実行状態であるタスク１Ｂがコア間共有リソースの解放を要求したとき、タスク１Ｂはコア間共有リソースを解放する。そして、そして、コア番号待ち行列６１０２が空であるので（図１６のステップＳ１６０２  ＹＥＳ判定）、コア間リソースカウンタ６１００の値は０から１へインクリメントされる（図１６のステップＳ１６１３）。
【００９５】
図１９は、図１４のステップＳ１４０２において実行されるコア間リソース管理情報６１０の初期値設定に関する処理フローを示したものである。図１９の処理フローを実行するタスクは、ＯＳ１により生成・起動され、それをタスク１とする。
【００９６】
まずタスク１は、ステップＳ１９０１において、ロック変数６１０４をセット状態にし、他のコアからコア間リソース管理情報６１０へのアクセスをできないようにする。
【００９７】
次にステップＳ１９０２に遷移し、コア間リソースカウンタ６１００の値をコア間共有リソースの残数（１以上）に設定する。
【００９８】
次にステップＳ１９０３に遷移し、コア番号待ち行列６１０２を空にする。
【００９９】
最後にステップＳ１９０４において、コア間優先度情報６１０３を設定する。
【０１００】
図２０は、図１９のステップＳ１９０４におけるコア間優先度情報６１０３の設定に関する処理フローについて一例を示したものである。図２０では、ＯＳ１がタスク１を生成・起動し、コア間優先度情報６１０３を図１１の形式に設定する。
【０１０１】
図２０のステップＳ２００１では、タスク１はまずマルチコアプロセッサ２に含まれるコアの数を読み出す。本実施例では、コアの数は予め定められており、タスク１に予め設定されているものとする。
【０１０２】
次にステップＳ２００２に遷移し、ステップＳ２００１で読み出したコアの数だけ、各コア番号に対してコア優先順位６１０３２を決定し、コア間リソース管理情報６１０のコア間優先度情報６１０３に格納する。本実施例では、各コアのコア優先順位６１０３２は、ＯＳ１において予め設定されているものとする。なお、コア優先順位６１０３２の設定値は、コア間共有リソースごとに異なる値であってもよい。
【０１０３】
次に、ステップＳ２００３に遷移し、待ち順決定方法６１０３１をコア間リソース管理情報６１０のコア間優先度情報６１０３に格納する。本実施例では、待ち順決定方法６１０３１はタスク１に予め設定されているものとする。
【０１０４】
次にステップＳ２００４に遷移し、ステップＳ２４０３でコア間優先度情報６１０３に格納した待ち順決定方法６１０３１がコア間優先順位閾値６１０３３を使うものであるか否かを判定する。たとえば、図１１のコア間優先度情報６１０３の場合は、待ち順決定方法６１０３１の値が２以上であれば、コア間優先度情報６１０３を利用する。コア間優先順位閾値６１０３３を使うと判定された場合は、ステップＳ２００５に遷移し、コア間優先順位閾値６１０３３を使わないと判定された場合は、図２０の処理を終了する。
【０１０５】
ステップＳ２００５では、コア間優先順位閾値６１０３３をコア間リソース管理情報６１０のコア間優先度情報６１０３に格納する。本実施例では、コア間優先順位閾値６１０３３はタスク１に予め設定されているものとする。
【０１０６】
図２１は図１５および図１７のステップＳ１５０１において、コア間リソースカウンタ６１００の値を取得する処理に関する処理フローを示したものである。図２１の説明では、ＯＳ１により生成・起動されたタスク１がコア間リソースカウンタ６１００の値を取得するものとする。
【０１０７】
図２１では、コア間リソースカウンタ６１００を取得する際、取得中にコア間リソースカウンタ６１００が変更されることを防ぐため、排他制御を行う。コア間リソースカウンタ６１００の取得にかかる処理時間が短いため、ロック変数６１０４を使ってコア間リソースカウンタ６１００値の取得をループで待つこととする。
【０１０８】
まず、ステップＳ２１０１では、タスク１はコア間リソース管理情報６１０のロック変数６１０４の状態を取得し、もしセット状態になっていればリセット状態になるまでループで待つ。ロック変数２１０４がリセット状態になったとき、ステップＳ２１０２に進み、タスク１はロック変数６１０４をセット状態に設定する。
【０１０９】
次にステップＳ２１０３に進み、コア間リソースカウンタ６１００の値を読み込む。読み込みが完了したらステップＳ２１０４に進み、ロック変数６１０４をリセット状態にし、図２１の処理を終了する。
【０１１０】
図２２は本実施例における、図１６のステップＳ１６０１において、コア番号待ち行列６１０２の状態を取得する処理に関する処理フローを示したものである。コア番号待ち行列６１０２の状態取得においてもロック変数６１０４を用いる。
【０１１１】
まず、ステップＳ２２０１では、タスク１はコア間リソース管理情報６１０のロック変数６１０４の状態を取得し、もしセット状態になっていればリセット状態になるまでループで待つ。ロック変数６１０４がリセット状態になったとき、ステップＳ２２０２に進み、タスク１はロック変数６１０４をセット状態に設定する。
【０１１２】
次にステップＳ２２０３に進み、コア番号待ち行列６１０２の状態を読み込む。読み込みが完了したらステップＳ２２０４に進み、ロック変数６１０４をリセット状態にし、図２２の処理を終了する。
【０１１３】
次に、図１５および図１７のステップＳ１５０３において、コア番号待ち行列にコア番号を格納する方法について、図２３〜図２８の例を用いて説明する。図２３は本実施例におけるコア番号待ち行列６１０２の例を示したものである。図２４は本実施例におけるコア間優先度情報６１０３の例を示したものである。
【０１１４】
図２５は、本実施例においてコア間優先度情報２４０３の待ち順決定方法２４１１の値が０（先着順）である場合に、コア番号待ち行列２３０２へ新たにコア番号「３」のノードＮ２５１を格納するときの処理を示したものである。コア間優先度情報２４０３の待ち順決定方法２４１１の値が０（先着順）である場合は、図２５のようにコア番号待ち行列２３０２の末尾にノードＮ２５１を格納する。
【０１１５】
図２６は、待ち順決定方法２４１１の値が２（コア優先順位閾値２４１３の値以下は先着順）である場合に、コア番号待ち行列２３０２へ新たにコア番号を追加するときの処理を示したものである。
【０１１６】
コア番号「３」のノードＮ２６１のようにコア優先順位がコア優先順位閾値２４１３以下であるコア番号を格納するときは、先着順と判断され、コア番号待ち行列２３０２の末尾にノードＮ２６１を格納する。
【０１１７】
一方、コア番号「５」のノードＮ２６２のようにコア優先順位がコア優先順位閾値２４１３より高いコア番号を格納するときは、コア番号待ち行列２３０２のコア優先順位に準拠して並んでいる部分へノードＮ２６２を格納する。
【０１１８】
図２７は本実施例においてコア間優先度情報２４０３の待ち順決定方法２４１１が１（コア優先順位に準拠）である場合に、コア番号待ち行列２３０２へ新たにコア番号「３」のノードＮ２７１を格納するときの処理を示したものである。図２４のコア優先順位２４１２によれば、コア番号「３」のコア優先順位は２である。コア優先順位が２であるコア番号「３」がコア間共有リソースの獲得待ちになったとき、図２７のようにコア優先順位３のコア番号「４」のノードとコア優先順位２のコア番号「３」のノードとの間に新たにコア番号「３」のノードＮ２７１を追加で格納する。
【０１１９】
図２８は本実施例においてコア間優先度情報２４０３の待ち順決定方法２４１１が３（コア優先順位閾値２４１３より上は先着順）である場合に、コア番号待ち行列２３０２へ新たにコア番号を追加するときの処理を示したものである。
【０１２０】
コア番号「３」のようにコア優先順位がコア優先順位閾値２４１３以下であるコア番号を格納するときは、コア番号待ち行列２３０２のコア優先順位に準拠して並んでいる部分へコア番号を格納する。
【０１２１】
一方、コア番号「５」のようにコア優先順位がコア優先順位閾値２４１３より高いコア番号を格納するときは、コア番号待ち行列２３０２の先着順に並んでいる部分の末尾へコア番号を格納する。
【０１２２】
図２９は、図１５および図１７のステップＳ１５０３において、コア番号待ち行列６１０２にリソース獲得関数９０３を実行したコアのコア番号（追加コア番号と呼称する）を格納する方法に関する処理フローを示したものである。
【０１２３】
図２９のステップＳ２９０１では、タスク１は、コア間優先度情報６１０３を取得する。
【０１２４】
ステップＳ２９０２では、コア間優先度情報６１０３に含まれる待ち順決定方法６１０３１が０（先着順）の場合、ステップＳ２９０３に進む。待ち順決定方法６１０３１が１（コア優先順位順）の場合は、ステップＳ２９１３に進む。待ち順決定方法６１０３１が２（コア優先順位がコア優先順位閾値以下は先着順）の場合は、ステップＳ２９２３に進む。待ち順決定方法６１０３１が３（コア優先順位がコア優先順位閾値より上は先着順）の場合は、ステップＳ２９３３に進む。
【０１２５】
ステップＳ２９０３では、タスク１はコア番号待ち行列６１０２の末尾にコア番号を格納する。その後、図２９の処理を終了する。
【０１２６】
ステップＳ２９１３では、タスク１はコア番号待ち行列６１０２の中でコア優先順位に準拠して並んでいる部分の要素（図２６〜２８）について、コア優先順位が追加コア番号のものより高いものを探索する。探索は、コア番号待ち行列６１０２の末尾から先頭に向かう方向に順番に行う。探索の結果、追加コア番号よりコア優先順位が高いコア番号が存在しなかった場合は、ステップＳ２９１５に進む。存在した場合は、ステップＳ２９１４に進む。
【０１２７】
ステップＳ２９１４では、タスク１はステップＳ２９１３で探索されたコア番号の直後の位置に追加コア番号を格納する。一方、ステップＳ２９１５では、コア優先順位に準拠して並んでいる部分の末尾に追加コア番号を追加する。
【０１２８】
ステップＳ２９２３では、タスク１は追加コア番号のコア優先順位がコア優先順位閾値６１０３３より低いか否かを判定する。コア優先順位閾値６１０３３より低い場合は、ステップＳ２９０３に進み、そうでない場合はステップＳ２９１３に遷移する。
【０１２９】
ステップＳ２９３３では、タスク１は追加コア番号のコア優先順位がコア優先順位閾値６１０３３より高いか否かを判定する。コア優先順位閾値６１０３３より高い場合は、ステップＳ２９３４に進み、そうでない場合はステップＳ２９１３に進む。
【０１３０】
ステップＳ２９３４では、タスク１は、コア番号待ち行列６１０２に含まれるコア番号のコア優先順位がコア優先順位閾値６１０３３より高いか否かを判定し、コア番号待ち行列６１０２において先着順に並んでいる部分の末尾を探索する。探索はコア番号待ち行列６１０２の末尾から先頭に向かう順番に実行する。ステップＳ２９３４において、コア番号のコア優先順位がコア優先順位閾値６１０３３より高いと判定されたらステップＳ２９１４に進む。一方、すべてのコア番号のコア優先順位がコア優先順位閾値６１０３３より低かった場合、コア番号待ち行列６１０２に先着順で格納されている要素がないため、ステップＳ２９３５に遷移し、コア番号待ち行列６１０２の先頭に格納する。
【０１３１】
［従来技術との対比と作用効果］
従来では、図３０に示したような構成によりコア間共有リソースに関する排他制御を行ってきた。図３０の構成による排他制御方法では、コア間共有メモリ領域３００１にロック変数としてコア間リソースカウンタ３０１０が格納されており、各タスクがこのロック変数を設定したり読み込んだりすることにより排他制御を行う。
【０１３２】
そして、従来では図３０の構成を用いて、図３１に示す処理フローによりリソース獲得を行っていた。図３１のステップＳ３１０１では、タスク１Ａがコア間リソースカウンタ３０１０の値を読み込む。そして、ステップＳ３１０２に遷移し、コア間リソースカウンタ３０１０の値が１以上であればステップＳ３１０３に遷移し、本実施例と同じくコア間リソースカウンタ３０１０値をデクリメントする。一方、コア間リソースカウンタ３０１０の値が０であればコア間リソースカウンタ３０１０の値が１になるまでループし、タスク１ＡはステップＳ３１０２で待つ。そのため、タスク１ＡがステップＳ３１０２で待っている間、実行可能状態にあるタスク１Ｂが実行状態に遷移しない。このように、コア間共有リソースを獲得するための処理においてコア間共有リソースの獲得待ちになると、従来ではループで待ち続けるため他のタスクが実行できない。
【０１３３】
それに対して、本実施例では、コア間共有リソースの残数を表すコア間リソースカウンタ６１００と、各ＯＳのセマフォ６１０１と、コア番号待ち行列６１０２とを含むコア間リソース管理情報６１０を備え、コア間リソースカウンタ６１００の値を取得し（図１５のステップＳ１５０１）、取得したコア間リソースカウンタ６１００の値に基づいてコア間共有リソースを獲得できるか否かを判定している（ステップＳ１５０２）。コア間共有リソースを獲得できると判定された場合は、コア間リソースカウンタ６１００の値をデクリメントし（ステップＳ１５１３）、獲得できないと判定された場合は、コア番号待ち行列６１０２にコア番号を格納し（ステップＳ１５０３）、タスクを待ち状態にしている（ステップＳ１５０４〜Ｓ１５０５）。このようにコア間共有リソースを獲得できなかったとき、コア間リソース管理情報６１０に基づいて即座に判断してＯＳがタスクを待ち状態にするため他のタスクが実行でき（図１５）、他の実行可能状態にあるタスクがない場合はコア２１を省電力モードにすることができる（図１７）。したがって本実施例では従来に比べてコンピュータ全体の処理効率が向上し、消費電力も低減できる。
【０１３４】
［変形例］
以上の実施形態は、以下のように変形して実施できる。
【０１３５】
以上の実施形態におけるコンピュータシステム１では、マルチコアプロセッサ２を用いたが、複数のプロセッサに分かれた形でもよい。図３２は本実施例におけるコンピュータシステムのハードウェア構成の別例を示したものである。図３２では、図１のマルチコアプロセッサ２の代わりにプロセッサ３２０１がシステムバスに複数個接続されている。このようにマルチコアプロセッサをマルチプロセッサに置き換えても、リソースであるＲＡＭ４１とＩ／Ｏ４２を各コア３２０１が共有するという意味でマルチコアプロセッサ自体が密結合マルチプロセッサの一集合であるため、コア間割込み機能の代わりにプロセッサ間割込み機能があれば本発明のコア間排他制御が実現可能である。
【０１３６】
図３３は本実施例におけるハードウェアおよびソフトウェアの階層の別例を示したものである。本実施例においてはＯＳが搭載され各ＯＳ上でそれぞれアプリが動作するコアもあれば、アプリがＯＳなしに動作するコア３２０１もあるものとする。図３２のように少なくとも一つのコア３２０１でＯＳが動作している場合においても、ＯＳの動くコア３２０１でコア間共有リソース獲得待ちを行う際に、ＯＳのタスク切り替え機能または省電力機能により、システム効率を向上させ消費電力を低減することが可能である。
【０１３７】
以上で説明した実施例は、たとえばナビゲーション装置に適用できる。たとえば、経路探索機能や、マップマッチング機能、２Ｄ／３Ｄ地図描画機能、車両誘導機能、施設検索機能などのナビゲーション装置の機能それぞれにコア２１を割り当て、それぞれがＲＡＭ４１や表示モニタなどのＩ／Ｏ４２を獲得する場合の排他制御に適用できる。
【０１３８】
以上で説明した各実施の形態や各種の変形例はあくまで一例であり、発明の特徴が損なわれない限り、本発明はこれらの内容に限定されない。
【符号の説明】
【０１３９】
１  コンピュータシステム
２  マルチコアプロセッサ
３  システムバス
２０  プロセッサ内バス
２１  コア
４１  ＲＡＭ（コア間共有リソース）
４２  Ｉ／Ｏ（コア間共有リソース）
６０１  コア間共有メモリ領域
６１０  コア間リソース管理情報
６１００  コア間リソースカウンタ
６１０１  ＯＳのセマフォ
６１０２  コア番号待ち行列
６１０３  コア間優先度情報
６１０４  ロック変数
６２０  コア間共有関数群
６３０  コア間ＯＳ管理情報
６３１  ＯＳのシステムコールポインタ群
【図１】
2011232956.tif 000003
【図２】
2011232956.tif 000004
【図３】
2011232956.tif 000005
【図４】
2011232956.tif 000006
【図５】
2011232956.tif 000007
【図６】
2011232956.tif 000008
【図７】
2011232956.tif 000009
【図８】
2011232956.tif 000010
【図９】
2011232956.tif 000011
【図１０】
2011232956.tif 000012
【図１１】
2011232956.tif 000013
【図１２】
2011232956.tif 000014
【図１３】
2011232956.tif 000015
【図１４】
2011232956.tif 000016
【図１５】
2011232956.tif 000017
【図１６】
2011232956.tif 000018
【図１７】
2011232956.tif 000019
【図１８】
2011232956.tif 000020
【図１９】
2011232956.tif 000021
【図２０】
2011232956.tif 000022
【図２１】
2011232956.tif 000023
【図２２】
2011232956.tif 000024
【図２３】
2011232956.tif 000025
【図２４】
2011232956.tif 000026
【図２５】
2011232956.tif 000027
【図２６】
2011232956.tif 000028
【図２７】
2011232956.tif 000029
【図２８】
2011232956.tif 000030
【図２９】
2011232956.tif 000031
【図３０】
2011232956.tif 000032
【図３１】
2011232956.tif 000033
【図３２】
2011232956.tif 000034
【図３３】
2011232956.tif 000035