(57)【要約】  スレッド（Ａ）が（１）変数ｘへアクセスするために排他フラグを利用中に設定すると、スレッド（Ａ）から変数ｘへのアクセスが許可される。スレッド（Ｂ）が、変数ｘへアクセスするために排他フラグを取得すると、すでに利用中に変更されているため、変数ｘへのアクセスが禁止される。スレッド（Ｂ）が、（２）変数ｘへのアクセスが許可されるまで排他フラグの取得を繰り返し、アクセス可能か否かを試行する都度、（３）試行回数を計数し、（４）スピンロックカウンタに試行回数を格納する。ＯＳが、一定のタイミングで、（５）スピンロックカウンタの値を検出する。ＯＳが、（６）スピンロックカウンタの値が所定回数以上であるか否かを判断する。ＯＳが、スピンロックカウンタの値が所定回数以上である場合、排他方式フラグをトライロックに変更し、（７）スレッド（Ｂ）を停止させることにより、スレッド（Ｂ）からのアクセスの試行を禁止する。
2012132017.tif 000002
【特許請求の範囲】
【請求項１】
排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータが、
複数のスレッドのうちの第１のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第２のスレッドが、前記記憶領域に格納する格納処理と、
を実行することを特徴とする排他制御方法。
【請求項２】
前記第２のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする請求項１に記載の排他制御方法。
【請求項３】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項１または請求項２に記載の排他制御方法。
【請求項４】
複数のスレッドのうちの第１のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータが、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行することを特徴とする排他制御方法。
【請求項５】
前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする請求項４に記載の排他制御方法。
【請求項６】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項４または請求項５に記載の排他制御方法。
【請求項７】
前記オペレーティングシステムが、前記第２のスレッドが複数ある場合、前記検出処理によって検出された前記第２のスレッドごとの前記試行回数の平均値を算出する算出処理を実行し、
前記判断処理は、前記算出処理によって算出された平均値が前記所定回数以上であるか否かを判断し、
前記実行処理は、前記判断処理によって前記平均値が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行することを特徴とする請求項４〜６のいずれか一つに記載の排他制御方法。
【請求項８】
排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を、前記排他対象スレッドから前記共有資源へのアクセス開始からの経過時間に応じて、複数のスレッドのうちの第１のスレッドが実行するコンピュータが、
オペレーティングシステムが、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行した場合、前記経過時間が所定時間以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記経過時間が前記所定時間以上でないと判断された場合、前記排他対象スレッドの前記共有資源へのアクセスの試行の禁止を解除する変更処理と、
を実行することを特徴とする排他制御方法。
【請求項９】
前記オペレーティングシステムが、前記判断処理によって前記経過時間が前記所定時間より長いと判断する場合、前記排他対象スレッドの前記共有資源へのアクセスの試行の禁止を継続すること、
を特徴とする請求項８に記載の排他制御方法。
【請求項１０】
排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータに、
複数のスレッドのうちの第１のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第２のスレッドが、前記記憶領域に格納する格納処理と、
を実行させることを特徴とする排他制御プログラム。
【請求項１１】
前記第２のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする請求項１０に記載の排他制御プログラム。
【請求項１２】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項１０または請求項１１に記載の排他制御プログラム。
【請求項１３】
複数のスレッドのうちの第１のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータに、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行させることを特徴とする排他制御プログラム。
【請求項１４】
前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする請求項１３に記載の排他制御プログラム。
【請求項１５】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項１３または請求項１４に記載の排他制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共有資源へのアクセスを制御する排他制御方法、および排他制御プログラムに関する。
【背景技術】
【０００２】
マルチコアプロセッサシステムもしくはマルチタスクＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）を搭載したシングルプロセッサシステムでは複数のプロセスまたはスレッドが同時に動作することができる。【０００３】
ここで、たとえば、スレッド＃０とスレッド＃１の二つのスレッドが同時にメモリ上の変数ｘに１を足そうとする。変数ｘに１を足すという処理は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）のオペレーションのレベルではメモリから変数ｘの値を読み込んで、読み込んだ値に１を足して、足した結果をメモリ上の変数ｘに書き込むという３ステップで行われる。【０００４】
図１４は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。マルチコアプロセッサシステムにおいて、たとえば、スレッド＃０とスレッド＃１がそれぞれＣＰＵ＃０とＣＰＵ＃１で同時に実行されているとする。時刻ｔ１でスレッド＃０がメモリから変数ｘの値をＬｏａｄ命令で読み込んだ時点では変数ｘの値は０とする。読み込まれた変数ｘの値はＣＰＵ内のレジスタＲ１に格納されて時刻ｔ２でレジスタＲ１に１が足され、足された結果がレジスタＲ１に格納される。時刻ｔ２でＣＰＵ＃１ではスレッド＃１が実行されていて、スレッド＃１で同じくＬｏａｄ命令で変数ｘの値を読み込む。変数ｘの値は０であるので、ＣＰＵ＃１のレジスタＲ２には０が格納される。【０００５】
・時刻ｔ１：Ｒ１＝ｘ＝０
・時刻ｔ２：Ｒ１＝Ｒ１＋１＝１、Ｒ２＝ｘ＝０【０００６】
時刻ｔ３でスレッド＃０がレジスタＲ１の値をメモリの変数ｘに書き込む。さらに、時刻ｔ４でスレッド＃１がＲ２に１を足した結果を書き込むが、該足した結果は１のため、変数ｘには再度１が書き込まれる。【０００７】
・時刻ｔ３：ｘ＝Ｒ１＝１、Ｒ２＝Ｒ２＋１＝１
・時刻ｔ４：ｘ＝Ｒ２＝１【０００８】
このように、スレッド＃０が変数ｘに１を足した結果を書き込む前にスレッド＃１が変数ｘの値をメモリから読み込んでしまうと、変数ｘに２回１を足したにも関わらず、結果として変数ｘの値が１しか増えていないことになる問題が生じる。シングルプロセッサシステムでも、マルチタスクＯＳの場合は複数のプロセスもしくはスレッドが時分割的に実行されるため、同様の問題が生じる。【０００９】
そのため、共有するメモリ上のデータやＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）等のハードウェアデバイスといった共有資源を複数のプロセスもしくはスレッドで利用する場合は排他制御を行わなければならない。排他制御ではメモリ上に置かれた排他フラグをＣＰＵが提供するスワップや排他ロードストアといった特殊命令を利用して更新することで、排他フラグに関連付けられた共有資源が利用中であるか否かを管理する。【００１０】
特殊命令で書き込みを行った場合は複数のＣＰＵが同時に同じフラグに値を書き込もうとした場合に、一つのＣＰＵしか書き込みを成功させることができない。特殊命令でフラグに書き込みを行った後で、特殊命令の結果を確認して排他フラグに利用中を示す値を書き込んだスレッドのみが対象の共有資源へのアクセス権を獲得出来たことになる。もしくは、シングルプロセッサシステムであればＯＳに排他フラグの更新を行わせることで特殊命令を利用しなくても排他制御が可能になる。アクセス権を獲得したスレッドは共有資源の利用が終了したら時刻ｔ２で排他フラグに開放を示す値を書き込むことで共有資源の利用終了を宣言する。【００１１】
アクセス権を獲得出来なかったスレッドは、アクセス権を獲得したスレッドが共有資源の利用を終了してアクセス権を開放するまで待たなければならない。ここで、アクセス権を獲得できなかったスレッドが、アクセス権を開放するまで待つ方式として、スピンロックとトライロックの２つの方式が知られている。【００１２】
図１５は、スピンロックの一例を示す説明図である。図１５で示すように、スピンロックでは、アクセス権を獲得できなかったスレッドが、排他フラグの値が開放を示す値になるまで排他獲得処理を繰り返す。スピンロックでは、排他制御によりアクセス権を獲得したスレッドは、共有資源の利用が完了したら排他フラグに開放中を示す値を書き込むことで共有資源の利用完了を宣言する。【００１３】
図１５では、スレッド＃１が時刻ｔ１で先に排他権を獲得したため、スレッド＃０は時刻ｔ２で排他権の獲得に失敗し、排他権の獲得の試行を繰り返す。時刻ｔ３でスレッド＃１が排他権を開放するため、スレッド＃０では時刻ｔ４での直後の排他権の獲得試行で成功することができる。【００１４】
図１６は、トライロックの一例を示す説明図である。図１６で示すように、トライロックでは、アクセス権が開放されるまで、アクセス権を獲得できなかったスレッドの実行が停止される。トライロックの場合は、共有資源の利用が完了したら排他フラグを開放中に変更すると共にＯＳにアクセス権の開放を通知する。アクセス権が開放されたらＯＳは停止していたスレッドの実行を再開する。【００１５】
図１６では、時刻ｔ１でスレッド＃０が排他権の獲得を試みるが、既にスレッド＃１により排他フラグが利用中になっていたとすると、ＯＳによりスレッド＃０は待ち状態に変更されて代わりに別のスレッド（ここではスレッド＃１）に実行権が移る。その後、スレッド＃１がこのフラグを開放すると、また、ＯＳによりスレッド＃０が実行可能な状態に変更される。【００１６】
スピンロックでは、共有資源が開放されるまで繰り返し排他フラグを確認するため、共有資源が長時間開放されない場合はＣＰＵの処理能力を無駄遣いする恐れがある。トライロックの場合は共有資源が開放されるまでスレッドの実行を停止するため、該スレッドの実行が停止されている間に他のスレッドを実行したり、実行可能なスレッドが無ければＣＰＵを停止したりするといったことでＣＰＵの処理能力を無駄遣いすることは無い。しかしながら、ＯＳによるスレッドの停止／再開処理のためにオーバーヘッドが発生し、複数スレッドが動作している場合、動作再開後即座にスレッドが実行可能となる保障もないため、共有資源が利用可能になってから実際に利用を開始するまでにオーバーヘッドが発生することになる。【００１７】
したがって、短時間で開放される共有資源に対してはスピンロックで排他制御処理を行い、開放までに時間がかかる共有資源に対してはトライロックで排他制御処理を行うのがよい。しかしながら、共有資源の開放までの待ち時間は資源の状態や利用しているスレッド数などによっても変わってくるため、一意に決めることは難しい。【００１８】
そこで、排他解除までの待ち時間を統計情報として記録して実行時に適した排他方式に切り替える技術が知られている（たとえば、下記特許文献１参照。）。また、実行時に排他解除までの統計情報を記録し（たとえば、下記特許文献２参照。）、実行時に排他方式を切り替える（たとえば、下記特許文献３参照。）技術が知られている。
【先行技術文献】
【特許文献】
【００１９】
【特許文献１】特開２００１−８４２３５号公報
【特許文献２】特開平１０−３１２２９４号公報
【特許文献３】特開平１１−８５５７４号公報
【発明の概要】
【発明が解決しようとする課題】
【００２０】
しかしながら、従来技術では排他制御でＯＳを利用する際の呼び出しコストについては考慮されていないという問題点がある。スピンロックで単純に排他フラグを確認するだけの処理は通常は数命令程度で実現でき、メモリアクセスのコストを考慮しても数十〜数百［ナノ秒］程度で一回の排他フラグの確認を行うことができる。【００２１】
しかしながら、排他フラグの更新をＯＳで行う場合は排他フラグを確認するためにＯＳを呼び出さなければならない。アプリケーションプログラムからＯＳの処理を呼び出すためには割り込みを使ってＣＰＵを特権モードに遷移させるなどの処理が行われるため、数十［μ秒］〜数百［μ秒］とフラグの確認処理よりも遙かに多くの時間がかかる。【００２２】
図１７は、ＯＳの利用による呼び出しコストを示す説明図である。図１７のように、スレッドが排他フラグを確認した直後（時刻ｔ１）、別のＣＰＵによりフラグが開放された場合、ＯＳの機能を利用しない場合（左側の図の場合）にはスレッドが時刻ｔ２でフラグを獲得して共有資源を使った処理を開始できる。しかしながら、ＯＳの機能を利用した場合（右側の図の場合）は、ＯＳが割り込みの復帰を行ってからスレッドの処理に戻る。そして、スレッドからの再度排他獲得要求によりＯＳに処理が移って、ＯＳが排他権を獲得して、またスレッドの処理に戻るなど、ＯＳとスレッドの処理実行を行き来することになり、時刻ｔ２’になるまでスレッドが共有資源を利用した処理を開始できない。【００２３】
たとえば、従来技術のように、トライロックによる排他制御処理とスピンロックによる排他制御処理をＯＳが切り替えると、ＯＳとスレッドの実行を行き来するために、ＯＳによるオーバーヘッドが生じる問題点があった。【００２４】
本発明は、上述した従来技術による問題点を解消するため、ＯＳによるオーバーヘッドを削減することができる排他制御方法、および排他制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【００２５】
上述した課題を解決し、目的を達成するため、本発明の一の側面によれば、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行し、複数のスレッドのうちいずれかのスレッドにより、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記複数のスレッドのうち前記いずれかのスレッド以外の前記排他対象スレッドとなる残余のスレッドにより、前記共有資源へのアクセスの試行回数を計数し、計数された試行回数を前記残余のスレッドにより、前記記憶領域に格納する排他制御方法、および排他制御プログラムが提案される。
【発明の効果】
【００２６】
本発明の一の側面によれば、ＯＳによるオーバーヘッドを削減することができるという効果を奏する。
【図面の簡単な説明】
【００２７】
【図１】図１は、本発明の一例を示す説明図である。
【図２】図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。
【図３】図３は、マルチコアプロセッサシステム２００の機能例を示すブロック図である。
【図４】図４は、排他フラグの生成例を示す説明図である。
【図５】図５は、スレッドが共有資源に関する処理を実行する例を示す説明図である。
【図６】図６は、タイマ割り込みの発生時の例を示す説明図である。
【図７】図７は、トライロックされる例を示す説明図である。
【図８】図８は、スレッド２３１＿１の排他処理の終了例を示す説明図である。
【図９】図９は、スレッド２３１＿２による排他処理の開始例を示す説明図である。
【図１０】図１０は、ＯＳとスレッドによる排他生成手順の一例を示すフローチャートである。
【図１１】図１１は、ＯＳとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。
【図１２】図１２は、ＯＳとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。
【図１３】図１３は、ＯＳによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。
【図１４】図１４は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。
【図１５】図１５は、スピンロックの一例を示す説明図である。
【図１６】図１６は、トライロックの一例を示す説明図である。
【図１７】図１７は、ＯＳの利用による呼び出しコストを示す説明図である。
【発明を実施するための形態】
【００２８】
以下に添付図面を参照して、本発明にかかる排他制御方法、および排他制御プログラムの実施の形態を詳細に説明する。
【００２９】
図１は、本発明の一例を示す説明図である。スレッドＡとスレッドＢとが変数ｘを共有している。ここでは、排他フラグの状態が空きであり、排他方式フラグがスピンロックを示していることとする。
【００３０】
たとえば、スレッドＡが、（１）変数ｘへアクセスするために排他フラグを利用中に設定すると、スレッドＡから変数ｘへのアクセスが許可される。スレッドＢが、変数ｘへアクセスするために排他フラグを取得すると、すでに利用中に変更されているため、変数ｘへのアクセスが禁止される。すなわち、スレッドＢがスピンロックによる排他制御処理を実行する。スレッドＢが、（２）変数ｘへのアクセスが許可されるまで排他フラグの取得を繰り返し、アクセス可能か否かを試行する。スレッドＢが、たとえば、試行する都度、（３）試行回数を計数し、（４）スピンロックカウンタに試行回数を格納する。
【００３１】
たとえば、ＯＳが、一定のタイミングで、（５）スピンロックカウンタの値を検出する。たとえば、ＯＳが、（６）スピンロックカウンタの値が所定回数以上であるか否かを判断する。たとえば、ＯＳが、スピンロックカウンタの値が所定回数以上である場合、（７）スレッドＢを停止させることにより、スレッドＢからのアクセスの試行を禁止する。
【００３２】
本排他制御装置はシングルコアシステムであってもマルチコアプロセッサシステムであってもよいが、本実施の形態ではマルチコアプロセッサシステムを例に挙げて説明する。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００３３】
（マルチコアプロセッサシステムのハードウェア例）
図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。マルチコアプロセッサシステム２００は、ＣＰＵ２０１＿１と、ＣＰＵ２０１＿２と、ＣＰＵ２０１＿３と、ディスプレイ２０２と、キーボード２０３と、Ｉ／Ｆ２０４（ＩｎｔｅｒＦａｃｅ）と、ＲＡＭ２０６（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、ＲＯＭ２０７（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、を有している。マルチコアプロセッサシステム２００は、フラッシュＲＯＭ２０８と、フラッシュＲＯＭコントローラ２０９と、フラッシュＲＯＭ２１０と、を有している。
【００３４】
ＣＰＵ２０１＿１〜２０１＿３と、ディスプレイ２０２と、キーボード２０３と、Ｉ／Ｆ２０４と、ＲＡＭ２０６と、ＲＯＭ２０７と、フラッシュＲＯＭ２０８と、フラッシュＲＯＭコントローラ２０９とは、バス２１１を介して接続されている。
【００３５】
ここで、ＣＰＵ２０１＿１〜２０１＿３は、それぞれレジスタとコアとキャッシュを有している。コアは、演算機能を有している。各ＣＰＵ内のレジスタは、ＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）やリセットレジスタを有している。
【００３６】
ＣＰＵ２０１＿１はマスタＣＰＵであり、マルチコアプロセッサシステム２００の全体の制御を司り、ＯＳ２２１＿１を実行する。ＯＳ２２１＿１はマスタＯＳであり、ＣＰＵ２０１＿１に割り当てられたスレッドを実行する。ＯＳ２２１＿１はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのＣＰＵに割り当てるかを制御する機能を有している。スケジューラはＣＰＵ２０１＿１に割り当てられたアプリケーションの実行順序を制御する機能を有する。
【００３７】
ＣＰＵ２０１＿２とＣＰＵ２０１＿３はスレーブＣＰＵであり、それぞれＯＳ２２１＿２とＯＳ２２１＿３を実行する。ＯＳ２２１＿２とＯＳ２２１＿３はスレーブＯＳであり、それぞれＣＰＵ２０１＿２とＣＰＵ２０１＿３に割り当てられたスレッドを実行する。ＯＳ２２１＿２はスケジューラを有し、スケジューラはＣＰＵ２０１＿２に割り当てられたアプリケーションの実行順序を制御する機能を有する。ＯＳ２２１＿３はスケジューラを有し、スケジューラはＣＰＵ２０１＿３に割り当てられたアプリケーションの実行順序を制御する機能を有する。スレッド２３１＿１〜２３１＿３はアプリＡに関するスレッドであり、同一の変数を共有することとする。スレッド２３１＿１はＣＰＵ２０１＿１に割り当てられ、スレッド２３１＿２はＣＰＵ２０１＿２に割り当てられ、スレッド２３１＿３はＣＰＵ２０１＿３に割り当てられている。
【００３８】
ディスプレイ２０２は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０２は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。キーボード２０３は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０３は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３９】
Ｉ／Ｆ２０４は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２０５に接続され、ネットワーク２０５を介して他の装置に接続される。そして、Ｉ／Ｆ２０４は、ネットワーク２０５と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０４には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００４０】
ＲＯＭ２０７は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０６は、各ＣＰＵのワークエリアとして使用される。フラッシュＲＯＭ２０８は、ＯＳ２２１＿１〜２２１＿３などのシステムソフトウェアやアプリケーションのプログラムを記憶している。ＲＡＭ２０６はフラッシュＲＯＭ２０８よりも各ＣＰＵからのアクセス速度が速い。各ＯＳがアプリケーションのプログラムをフラッシュＲＯＭ２０８からＲＡＭ２０６へロードすることにより、該アプリケーションのコンテキスト情報がＲＡＭ２０６内に展開される。
【００４１】
フラッシュＲＯＭコントローラ２０９は、各ＣＰＵの制御に従ってフラッシュＲＯＭ２１０に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２１０は、フラッシュＲＯＭコントローラ２０９の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム２００を使用するユーザがＩ／Ｆ２０４を通して取得した画像データ、映像データなどである。フラッシュＲＯＭ２１０は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００４２】
（マルチコアプロセッサシステム２００の機能例）
図３は、マルチコアプロセッサシステム２００の機能例を示すブロック図である。マルチコアプロセッサシステム２００は、スレッド２３１＿ｍ（ｍ＝１〜３）と、ＯＳ２２１＿ｎ（ｎ＝１〜３）と、を有している。スレッド２３１＿ｍは、計数部３０１と格納部３０２とを有している。ＯＳ２２１＿ｎは、検出部３１１と、算出部３１２と、判断部３１３と、実行部３１４と、判断部３１５と、変更部３１６と、を有している。
【００４３】
計数部３０１と格納部３０２はスレッド２３１＿ｍにコーディングされており、スレッド２３１＿ｍはフラッシュＲＯＭ２０８などの記憶装置に記憶されている。ＣＰＵ２０１＿１〜２０１＿３のいずれかのＣＰＵが記憶装置からスレッド２３１＿ｍを読み出し、コーディングされている処理を実行することにより、計数部３０１と格納部３０２が実行される。検出部３１１から変更部３１６はＯＳ２２１＿ｎにコーディングされており、ＯＳ２２１＿ｎはフラッシュＲＯＭ２０８などの記憶装置に記憶されている。ＣＰＵ２０１＿１〜２０１＿３が記憶装置からそれぞれＯＳ２２１＿１〜２２１＿３を読み出し、コーディングされている処理を実行することにより、検出部３１１から変更部３１６が実行される。
【００４４】
まず、複数のスレッドのうちいずれかのスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる第２の排他制御処理を実行した場合である。計数部３０１は、複数のスレッドのうち、いずれかのスレッド以外の排他対象スレッドとなる残余のスレッドが共有資源へのアクセスの試行回数を計数する。
【００４５】
ここで、共有資源としては、たとえば、複数のＣＰＵで共有するＲＡＭ２０６、バス２１１やアプリケーションで共有する変数が挙げられる。ここで、第２の排他制御処理は、たとえば、スピンロックによる排他制御処理である。格納部３０２は、計数部３０１によって計数された試行回数をＯＳが参照可能な記憶領域に格納する。
【００４６】
検出部３１１は、記憶領域に格納された排他対象スレッドの共有資源へのアクセスの試行回数を検出する。判断部３１３は、検出部３１１によって検出された試行回数が所定回数以上であるか否かを判断する。算出部３１２は、残余のスレッドが複数ある場合、検出部３１１によって検出された残余のスレッドごとの共有資源へのアクセスの試行回数の平均値を算出する。格納部３０２は、算出部３１２によって算出された平均値を残余のスレッドが記憶領域に格納する。
【００４７】
実行部３１４は、判断部３１３によって試行回数が所定回数以上であると判断された場合、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第１の排他制御処理を実行する。
【００４８】
また、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第１の排他制御処理を実行した場合において説明する。判断部３１５は、排他対象スレッドのアクセス開始からの経過時間が所定時間以上であるか否かを判断する。
【００４９】
変更部３１６は、判断部３１５によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を解除する。変更部３１６は、判断部３１５によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を継続する。以上を踏まえて詳細に説明する。
【００５０】
図４は、排他フラグの生成例を示す説明図である。まず、具体的には、たとえば、スレッド２３１＿１が、（１）排他フラグ４０３の領域と排他方式フラグ４０４との領域をＲＡＭ２０６上のプロセスデータ領域４１０に確保する。ここで、ＲＡＭ２０６上はＯＳデータ領域４１１とプロセスデータ領域４１０とを有している。各ＯＳが取り扱うデータがＯＳデータ領域４１１に格納され、各スレッドが取り扱うデータがプロセスデータ領域４１０に格納される。各スレッドはプロセスデータ領域４１０にアクセスできない。
【００５１】
たとえば、スレッド２３１＿１が、（２）スレッド２３１＿１が属するアプリケーションの起動予定を含めた総スレッド数をテーブル４００から取得する。テーブル４００は、アプリ名、総スレッド数のフィールドを有する。アプリ名にはアプリケーションの識別情報が登録され、総スレッド数には、アプリ名に登録された識別情報のアプリケーションの総スレッド数が登録されている。ここでは、スレッド２３１＿１はアプリＡに属するスレッドであるため、総スレッド数として３が取得される。
【００５２】
たとえば、スレッド２３１＿１が、（３）取得した総スレッド数分の待ち開始時刻レジスタの領域と総スレッド数分のＳＣ（スピンロックカウンタ）の領域をＲＡＭ２０６上のプロセスデータ領域４１０に確保する。図４では、ＳＣ４０１＿１〜４０１＿３と、待ち開始時刻レジスタ４０２＿１〜４０２＿３がプロセスデータ領域４１０内に確保されている。
【００５３】
たとえば、スレッド２３１＿１が、（４）排他フラグ４０３を０（開放状態）に設定し、排他方式フラグ４０４を０（スピンロック方式）に設定する。たとえば、スレッド２３１＿１が、（５）ＳＣ４０１＿１〜４０１＿３に０を設定する。たとえば、スレッド２３１＿１が、（６）確保したすべての領域の参照情報４０５をＯＳ２２１＿１に通知する。ここで、参照情報４０５とはＯＳ２２１＿１からプロセスデータ領域４１０に確保された領域を参照するための情報であり、参照情報４０５には、該確保された領域にスレッドがアクセスする際に用いる確保された領域の先頭アドレスが記述されている。
【００５４】
たとえば、ＯＳ２２１＿１が、スレッド２３１＿１から参照情報４０５を受け付けると、参照情報４０５に対応する排他の識別情報を生成する。排他の識別情報は、スレッド２３１＿１が領域を確保した排他に関する情報を識別するための情報である。本実施の形態では１つの排他制御処理のみに着目しているが、実際には複数の排他制御処理があるため、各排他に関する情報に識別するための情報が付される。たとえば、ＯＳ２２１＿１が、（７）排他の識別情報と参照情報４０５とを関連付けてＯＳデータ領域４１１に登録する。たとえば、ＯＳ２２１＿１が、いずれかのスレッドから排他の識別情報を受け付けると、受け付けた排他の識別情報に基づいて参照情報４０５を参照する。たとえば、ＯＳ２２１＿１が、参照情報４０５に記述されている先頭アドレスに応じてプロセスデータ領域４１０内の確保された領域に記憶されているデータにアクセスすることができる。つぎに、たとえば、ＯＳ２２１＿１が、排他の識別情報をスレッド２３１＿１に通知する。たとえば、スレッド２３１＿１が、ＯＳ２２１＿１から排他の識別情報を受け付けると、排他の識別情報を、確保された領域と関連付けて記録する。
【００５５】
図５は、スレッドが共有資源に関する処理を実行する例を示す説明図である。たとえば、スレッド２３１＿１が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が０であるため、たとえば、スレッド２３１＿１が、排他フラグ４０３を０（開放状態）から１（利用中）に変更する。たとえば、スレッド２３１＿１が、ＳＣ４０１＿１に０を設定する。
【００５６】
たとえば、スレッド２３１＿２が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿２が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が０（スピンロック）であるため、スレッド２３１＿２が、ＳＣ４０１＿２をインクリメントする。これにより、ＳＣの値が１となる。そして、スレッド２３１＿２が、排他フラグ４０３のチェックと排他方式フラグ４０４のチェックを繰り返す。排他フラグ４０３のチェックが１（利用中）であり、排他方式フラグ４０４が０（スピンロック）である間、スレッド２３１＿２がＳＣ４０１＿２のインクリメントを繰り返す。
【００５７】
たとえば、スレッド２３１＿３が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿３が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が０（スピンロック）であるため、スレッド２３１＿３が、ＳＣ４０１＿３をインクリメントする。これにより、ＳＣの値が１となる。そして、スレッド２３１＿３が、排他フラグ４０３のチェックと排他方式フラグ４０４のチェックを繰り返す。排他フラグ４０３のチェックが１（利用中）であり、排他方式フラグ４０４が０（スピンロック）である間、スレッド２３１＿３がＳＣ４０１＿３のインクリメントを繰り返す。
【００５８】
図６は、タイマ割り込みの発生時の例を示す説明図である。ＯＳ２２１＿１が、タイマ割り込みを受け付けると、たとえば、複数の排他の識別情報から、一の排他の識別情報を選択する。たとえば、ＯＳ２２１＿１が、（１）選択した一の排他の識別情報の参照情報４０５に基づいて排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。たとえば、排他フラグ４０３が１（利用中）であるため、ＯＳ２２１＿１が、（２）排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。
【００５９】
たとえば、排他方式フラグ４０４が０（スピンロック）であるため、ＯＳ２２１＿１が、全スピンロックカウンタの値を検出する。ＯＳ２２１＿１が、（３）値が０以外のカウンタの値の平均値を算出する。ここでは、ＳＣ４０１＿１の値は０であり、ＳＣ４０１＿２の値は３００であり、ＳＣ４０１＿３の値は２９６であるため、平均値が２９８である。たとえば、ＯＳ２２１＿１が、（４）算出した平均値が所定回数以上であるか否かを判断する。ここでは、所定回数を２８０とする。算出された平均値が所定回数以上であるため、たとえば、ＯＳ２２１＿１が、（５）排他方式フラグ４０４を０（スピンロック）から１（トライロック）に変更する。ここでは、平均値が所定回数以上であると判断しているが、これに限らず、たとえば、中央値が所定回数以上であるか判断してもよいし、所定回数以上のカウンタの値が複数個以上あるかなどの多数決であってもよい。
【００６０】
図７は、トライロックされる例を示す説明図である。たとえば、スレッド２３１＿２が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿２が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が１（トライロック）であるため、スレッド２３１＿２が、排他の識別情報を指定してトライロックをＯＳ２２１＿２に依頼する。
【００６１】
ＯＳ２２１＿２が、スレッド２３１＿２から受け付けた排他の識別情報に対応するフラグ待ちキュー４０６にスレッド２３１＿２の識別情報を登録する。ＯＳ２２１＿２が、現在時刻を取得し、スレッド２３１＿２の待ち開始時刻レジスタ４０２＿２に現在時刻を設定する。待ち開始時刻レジスタ４０２＿２は、１５：００：１０となる。ＯＳ２２１＿２が、再スケジューリングを行う。ここでは、ＣＰＵ２０１＿２にはスレッド２３１＿２のみが割り当てられているため、ＣＰＵ２０１＿２は待ち状態となる。
【００６２】
たとえば、スレッド２３１＿３が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿３が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が１（トライロック）であるため、スレッド２３１＿３が、排他の識別情報を指定してトライロックをＯＳ２２１＿３に依頼する。
【００６３】
ＯＳ２２１＿３が、スレッド２３１＿３から受け付けた識別情報に対応するフラグ待ちキュー４０６にスレッド２３１＿３の識別情報を登録する。ＯＳ２２１＿３が、現在時刻を取得し、スレッド２３１＿３の待ち開始時刻レジスタ４０２＿３に現在時刻を設定する。待ち開始時刻レジスタ４０２＿３は１５：００：１１である。ＯＳ２２１＿３が、再スケジューリングを行う。ここでは、ＣＰＵ２０１＿３にはスレッド２３１＿３のみが割り当てられているため、ＣＰＵ２０１＿３は待ち状態となる。
【００６４】
図８は、スレッド２３１＿１の排他処理の終了例を示す説明図である。たとえば、スレッド２３１＿１が、排他方式フラグ４０４の状態を取得することにより、（１）排他フラグ４０３をチェックする。ここでは、排他方式フラグ４０４がトライロックであるため、たとえば、スレッド２３１＿１が、（２）排他の識別情報を指定してＯＳ２２１＿１に開放依頼を通知する。たとえば、ＯＳ２２１＿１が、開放依頼通知を受け付けると、現在時刻を取得する。たとえば、ＯＳ２２１＿１が、（３）フラグ待ちキュー４０６に登録されているスレッドの識別情報を取得する。ここでは、スレッド２３１＿２とスレッド２３１＿３のそれぞれの識別情報が取得される。
【００６５】
たとえば、ＯＳ２２１＿１が、取得したスレッドの識別情報が示すスレッドの待ち開始時刻レジスタから時刻を検出する。たとえば、ＯＳ２２１＿１が、（４）現在時刻と取得したそれぞれの時刻との差分値（待ち時間）を算出する。たとえば、ＯＳ２２１＿１が、取得した時刻ごとの差分値に基づいて平均待ち時間を算出する。現在時刻が１５：１０：２０である。待ち開始時刻レジスタ４０２＿２の値は１５：１０：１０であり、待ち開始時刻レジスタ４０２＿３の値は１５：１０：１１である。平均待ち時間は、９．５［秒］である。
【００６６】
たとえば、ＯＳ２２１＿１が、（５）算出した平均待ち時間が所定時間以下であるか否かを判断する。ここでは、所定時間を３［秒］とする。算出した平均待ち時間が所定時間以下でないため、トライロックのままとなる。ここでは、平均待ち時間が所定時間以下であるか否かを判断しているが、これに限らず、待ち時間の中央値が所定時間以下であるか否かを判断してもよいし、待ち時間が所定時間以下である数が何個であるかの多数決で判断してもよい。また、ここでは例示していないが、算出した平均待ち時間が所定時間以下ある場合、トライロックからスピンロックに変更される。
【００６７】
たとえば、ＯＳ２２１＿１が、（６）排他フラグ４０３を１（利用中）から０（開放状態）に変更する。たとえば、ＯＳ２２１＿１が、（７）フラグ待ちキューの先頭に識別情報が登録されているスレッド２３１＿２の実行を再開させる。
【００６８】
図９は、スレッド２３１＿２による排他処理の開始例を示す説明図である。たとえば、スレッド２３１＿２が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿２が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が１（トライロック）であるため、スレッド２３１＿２が、排他の識別情報を指定してトライロックをＯＳ２２１＿２に依頼する。
【００６９】
（ＯＳとスレッドによる排他制御処理手順）
図１０は、ＯＳとスレッドによる排他生成手順の一例を示すフローチャートである。スレッドが、排他フラグ、排他方式フラグ領域を確保し（ステップＳ１００１）、起動予定を含めた総スレッド数を取得し（ステップＳ１００２）、総スレッド数分のスピンロックカウンタと待ち開始時刻レジスタ領域を確保する（ステップＳ１００３）。
【００７０】
スレッドが、排他フラグを開放状態に設定し（ステップＳ１００４）、排他方式フラグをスピンロックに設定する（ステップＳ１００５）。ここでは、スピンロックに設定しているが、トライロックに設定しておいてもよい。スレッドが、すべてのスピンロックカウンタに０を設定し（ステップＳ１００６）、確保したすべての領域の参照情報をＯＳに通知する（ステップＳ１００７）。
【００７１】
ＯＳが、参照情報を受け付けると、参照情報に関する排他の識別情報を生成し（ステップＳ１００８）、排他の識別情報と参照情報を記録し（ステップＳ１００９）、排他の識別情報を参照情報の通知元のスレッドへ通知する（ステップＳ１０１０）。スレッドが、排他の識別情報を受け付けると、識別情報を記録し（ステップＳ１０１１）、一連の処理を終了する。
【００７２】
図１１は、ＯＳとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。スレッドが、共有資源へアクセスを行う、または待ち状態から復帰するか否かを判断する（ステップＳ１１０１）。スレッドが、共有資源へのアクセスを開始していない、および待ち状態から復帰していないと判断した場合（ステップＳ１１０１：Ｎｏ）、ステップＳ１１０１へ戻る。
【００７３】
スレッドが、共有資源へのアクセスを行うまたは待ち状態から復帰したと判断した場合（ステップＳ１１０１：Ｙｅｓ）、排他フラグの状態を取得し（ステップＳ１１０２）、排他フラグの状態が利用中であるか否かを判断する（ステップＳ１１０３）。スレッドが、排他フラグの状態が利用中でないと判断した場合（ステップＳ１１０３：Ｎｏ）、特殊命令により排他フラグを利用中に変更する（ステップＳ１１０４）。スレッドが、変更成功したか否かを判断し（ステップＳ１１０５）、変更成功したと判断した場合（ステップＳ１１０５：Ｙｅｓ）、スピンロックカウンタに０を設定する（ステップＳ１１０６）。
【００７４】
スレッドが、排他フラグの状態が利用中であると判断した場合（ステップＳ１１０３：Ｙｅｓ）、または変更成功していないと判断した場合（ステップＳ１１０５：Ｎｏ）、排他方式フラグの状態を取得する（ステップＳ１１０７）。スレッドが、排他方式がスピンロックであるか否かを判断する（ステップＳ１１０８）。スレッドが、排他方式がスピンロックであると判断した場合（ステップＳ１１０８：Ｙｅｓ）、スピンロックカウンタをインクリメントし（ステップＳ１１１０）、ステップＳ１１０１へ戻る。スレッドが、排他方式がスピンロックでないと判断した場合（ステップＳ１１０８：Ｎｏ）、排他の識別情報を指定してトライロック依頼を通知する（ステップＳ１１０９）。
【００７５】
ステップＳ１１０９のつぎに、ＯＳが、スレッドからのトライロック依頼を受け付けると、依頼元スレッドの識別情報を排他の識別情報に対応するフラグ待ちキューに登録する（ステップＳ１１１１）。ＯＳが、現在時刻を取得し（ステップＳ１１１２）、待ち開始時刻レジスタに現在時刻を記録する（ステップＳ１１１３）。ＯＳが、再スケジューリングし（ステップＳ１１１４）、実行スレッド切り替え処理を実行する（ステップＳ１１１５）。
【００７６】
図１２は、ＯＳとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。まず、スレッドが、排他方式フラグの状態を取得し（ステップＳ１２０１）、排他方式がスピンロックであるか否かを判断する（ステップＳ１２０２）。スレッドが、排他方式がスピンロックであると判断した場合（ステップＳ１２０２：Ｙｅｓ）、排他フラグを空き状態に変更し（ステップＳ１２０３）、一連の処理を終了する。
【００７７】
スレッドが、排他方式がスピンロックでないと判断した場合（ステップＳ１２０２：Ｎｏ）、排他の識別情報を指定して開放依頼をＯＳへ通知する（ステップＳ１２０４）。ＯＳが、スレッドから開放依頼を受け付けると、現在時刻を取得する（ステップＳ１２０５）。ＯＳが、排他の識別情報に対応するフラグ待ちキューからスレッドの識別情報をすべて取得する（ステップＳ１２０６）。
【００７８】
ＯＳが、フラグ待ちキューに登録されている識別情報で示されるスレッドの待ち開始時刻を取得し（ステップＳ１２０７）、平均待ち時間を算出し（ステップＳ１２０８）、平均待ち時間が所定時間以下であるか否かを判断する（ステップＳ１２０９）。ＯＳが、平均待ち時間が所定時間以下であると判断した場合（ステップＳ１２０９：Ｙｅｓ）、排他方式フラグの状態をスピンロックに変更する（ステップＳ１２１０）。
【００７９】
ＯＳが、排他フラグを空き状態に変更し（ステップＳ１２１１）、フラグ待ちキューに登録されている識別情報で示されるスレッドをすべて再開させ（ステップＳ１２１２）、一連の処理を終了する。ＯＳが、平均待ち時間が所定時間以下でないと判断した場合（ステップＳ１２０９：Ｎｏ）、排他フラグを開放状態に変更する（ステップＳ１２１３）。ＯＳが、フラグ待ちキューの先頭に登録されている識別情報で示されるスレッドを再開させ（ステップＳ１２１４）、一連の処理を終了する。
【００８０】
図１３は、ＯＳによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。まず、ＯＳが、タイマ割り込みを受け付けたか否かを判断する（ステップＳ１３０１）。ＯＳが、タイマ割り込みを受け付けていないと判断した場合（ステップＳ１３０１：Ｎｏ）、ステップＳ１３０１へ戻る。ＯＳが、タイマ割り込みを受け付けたと判断した場合（ステップＳ１３０１：Ｙｅｓ）、登録されている排他情報から未選択の１つを選択する（ステップＳ１３０２）。ＯＳが、選択可能な排他情報が無いか否かを判断する（ステップＳ１３０３）。
【００８１】
ＯＳが、選択可能な排他情報が無いと判断しなかった場合（ステップＳ１３０３：Ｎｏ）、排他フラグの状態を取得する（ステップＳ１３０４）。ＯＳが、排他フラグの状態が利用中であるか否かを判断し（ステップＳ１３０５）、利用中でないと判断した場合（ステップＳ１３０５：Ｎｏ）、ステップＳ１３０２へ戻る。
【００８２】
ＯＳが、排他フラグの状態が利用中であると判断した場合（ステップＳ１３０５：Ｙｅｓ）、排他方式フラグの状態を取得し（ステップＳ１３０６）、排他方式がスピンロックであるか否かを判断する（ステップＳ１３０７）。ＯＳが、排他方式がスピンロックでないと判断した場合（ステップＳ１３０７：Ｎｏ）、ステップＳ１３０２へ戻る。
【００８３】
ＯＳが、排他方式がスピンロックであると判断した場合（ステップＳ１３０７：Ｙｅｓ）、すべてのスピンロックカウンタの値を取得する（ステップＳ１３０８）。ＯＳが、値が０以外のスピンロックカウンタの平均値を算出し（ステップＳ１３０９）、平均値が所定回数以上であるか否かを判断する（ステップＳ１３１０）。
【００８４】
ＯＳが、平均値が所定回数以上でないと判断した場合（ステップＳ１３１０：Ｎｏ）、ステップＳ１３０２へ戻る。ＯＳが、平均値が所定回数以上であると判断した場合（ステップＳ１３１０：Ｙｅｓ）、排他方式フラグにトライロックを設定し（ステップＳ１３１１）、ステップＳ１３０２へ移行する。
【００８５】
ステップＳ１３０３において、ＯＳが、選択可能な排他情報が無いと判断した場合（ステップＳ１３０３：Ｙｅｓ）、一連の処理を終了する。また、排他制御に関する処理は終了するが、ＯＳは通常のタイマ割り込み処理を行う。
【００８６】
以上説明したように、排他制御方法、および排他制御プログラムによれば、排他対象スレッドによるスピンロックでの排他制御処理が実行され、共有資源へのアクセスの試行回数が所定回数以上であれば、ＯＳによるトライロックでの排他制御処理が実行される。スピンロックをＯＳの機能を利用せずに実現することにより、共有資源が開放されてから獲得までのオーバーヘッドを削減することができる。また、スピンロック時にＯＳを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
【００８７】
また、ＯＳが、排他対象スレッドがアクセス可能な記録領域に試行回数を記憶させる記憶領域を確保することで、ＯＳを呼び出さずにスピンロックを行うことができる。
【００８８】
また、各排他対象スレッドがスピンロックとトライロックのうちいずれの方式で排他制御処理を利用しているかを、排他方式フラグにより管理することで、方式の切り替えを容易に行うことができる。また、ＯＳが、排他対象スレッドがアクセス可能な記録領域に排他方式フラグを記憶させる記憶領域を確保することで、排他対象スレッドがＯＳを呼び出さずにスピンロックを行うことができる。
【００８９】
また、排他対象スレッドが複数ある場合、共有資源へのアクセスの試行回数の平均値が、所定回数以上であるか否かによって、ＯＳによるトライロックに切り替えるか否かを判断する。排他対象スレッドがどの程度試行しているかを相対的に判断することができる。
【００９０】
また、ＯＳによるトライロックでの排他制御処理が実行され、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間未満であれば、スレッドによるスピンロックでの排他制御処理が実行される。共有資源の排他権の開放が短時間の場合、共有資源に対してスピンロックでの排他制御処理を行うことができる。さらに、スピンロックをＯＳの機能を利用せずに実現することにより、共有資源が開放されてから他のスレッドによる排他権の獲得までのオーバーヘッドを短くすることができる。また、スピンロック時にＯＳを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
【００９１】
また、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間以上であれば、ＯＳによるトライロックでの排他制御処理が継続して実行される。これにより、共有資源の排他権の開放までに時間がかかる場合、共有資源に対してトライロックでの排他制御処理を行うことができる。
【００９２】
なお、本実施の形態で説明した排他制御方法は、予め用意された排他制御プログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本排他制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本排他制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【００９３】
２２１＿１〜２２１＿３  ＯＳ
２３１＿１〜２３１＿３  スレッド
４１０  プロセスデータ領域
４０１＿１〜４０１＿３  ＳＣ
【図１】
2012132017.tif 000003
【図２】
2012132017.tif 000004
【図３】
2012132017.tif 000005
【図４】
2012132017.tif 000006
【図５】
2012132017.tif 000007
【図６】
2012132017.tif 000008
【図７】
2012132017.tif 000009
【図８】
2012132017.tif 000010
【図９】
2012132017.tif 000011
【図１０】
2012132017.tif 000012
【図１１】
2012132017.tif 000013
【図１２】
2012132017.tif 000014
【図１３】
2012132017.tif 000015
【図１４】
2012132017.tif 000016
【図１５】
2012132017.tif 000017
【図１６】
2012132017.tif 000018
【図１７】
2012132017.tif 000019
【手続補正書】
【提出日】平成25年9月25日(2013.9.25)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータが、
複数のスレッドのうちの第１のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第２のスレッドが、前記記憶領域に格納する格納処理と、
を実行することを特徴とする排他制御方法。
【請求項２】
前記第２のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする請求項１に記載の排他制御方法。
【請求項３】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項１または請求項２に記載の排他制御方法。
【請求項４】
複数のスレッドのうちの第１のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータが、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行することを特徴とする排他制御方法。
【請求項５】
前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする請求項４に記載の排他制御方法。
【請求項６】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項４または５に記載の排他制御方法。
【請求項７】
前記オペレーティングシステムが、前記第２のスレッドが複数ある場合、前記検出処理によって検出された前記第２のスレッドごとの前記試行回数の平均値を算出する算出処理を実行し、
前記判断処理は、前記算出処理によって算出された平均値が前記所定回数以上であるか否かを判断し、
前記実行処理は、前記判断処理によって前記平均値が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行することを特徴とする請求項４〜６のいずれか一つに記載の排他制御方法。
【請求項８】
排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータに、
複数のスレッドのうちの第１のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第２のスレッドが、前記記憶領域に格納する格納処理と、
を実行させることを特徴とする排他制御プログラム。
【請求項９】
前記第２のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする請求項８に記載の排他制御プログラム。
【請求項１０】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項８または９に記載の排他制御プログラム。
【請求項１１】
複数のスレッドのうちの第１のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータに、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行させることを特徴とする排他制御プログラム。
【請求項１２】
前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする請求項１１に記載の排他制御プログラム。
【請求項１３】
前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする請求項１１または１２に記載の排他制御プログラム。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、共有資源へのアクセスを制御する排他制御方法、および排他制御プログラムに関する。
【背景技術】
【０００２】
マルチコアプロセッサシステムもしくはマルチタスクＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）を搭載したシングルプロセッサシステムでは複数のプロセスまたはスレッドが同時に動作することができる。
【０００３】
ここで、たとえば、スレッド＃０とスレッド＃１の二つのスレッドが同時にメモリ上の変数ｘに１を足そうとする。変数ｘに１を足すという処理は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）のオペレーションのレベルではメモリから変数ｘの値を読み込んで、読み込んだ値に１を足して、足した結果をメモリ上の変数ｘに書き込むという３ステップで行われる。
【０００４】
図１４は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。マルチコアプロセッサシステムにおいて、たとえば、スレッド＃０とスレッド＃１がそれぞれＣＰＵ＃０とＣＰＵ＃１で同時に実行されているとする。時刻ｔ１でスレッド＃０がメモリから変数ｘの値をＬｏａｄ命令で読み込んだ時点では変数ｘの値は０とする。読み込まれた変数ｘの値はＣＰＵ内のレジスタＲ１に格納されて時刻ｔ２でレジスタＲ１に１が足され、足された結果がレジスタＲ１に格納される。時刻ｔ２でＣＰＵ＃１ではスレッド＃１が実行されていて、スレッド＃１で同じくＬｏａｄ命令で変数ｘの値を読み込む。変数ｘの値は０であるので、ＣＰＵ＃１のレジスタＲ２には０が格納される。
【０００５】
・時刻ｔ１：Ｒ１＝ｘ＝０
・時刻ｔ２：Ｒ１＝Ｒ１＋１＝１、Ｒ２＝ｘ＝０
【０００６】
時刻ｔ３でスレッド＃０がレジスタＲ１の値をメモリの変数ｘに書き込む。さらに、時刻ｔ４でスレッド＃１がＲ２に１を足した結果を書き込むが、該足した結果は１のため、変数ｘには再度１が書き込まれる。
【０００７】
・時刻ｔ３：ｘ＝Ｒ１＝１、Ｒ２＝Ｒ２＋１＝１
・時刻ｔ４：ｘ＝Ｒ２＝１
【０００８】
このように、スレッド＃０が変数ｘに１を足した結果を書き込む前にスレッド＃１が変数ｘの値をメモリから読み込んでしまうと、変数ｘに２回１を足したにも関わらず、結果として変数ｘの値が１しか増えていないことになる問題が生じる。シングルプロセッサシステムでも、マルチタスクＯＳの場合は複数のプロセスもしくはスレッドが時分割的に実行されるため、同様の問題が生じる。
【０００９】
そのため、共有するメモリ上のデータやＤＭＡ（Ｄｉｒｅｃｔ  Ｍｅｍｏｒｙ  Ａｃｃｅｓｓ）等のハードウェアデバイスといった共有資源を複数のプロセスもしくはスレッドで利用する場合は排他制御を行わなければならない。排他制御ではメモリ上に置かれた排他フラグをＣＰＵが提供するスワップや排他ロードストアといった特殊命令を利用して更新することで、排他フラグに関連付けられた共有資源が利用中であるか否かを管理する。
【００１０】
特殊命令で書き込みを行った場合は複数のＣＰＵが同時に同じフラグに値を書き込もうとした場合に、一つのＣＰＵしか書き込みを成功させることができない。特殊命令でフラグに書き込みを行った後で、特殊命令の結果を確認して排他フラグに利用中を示す値を書き込んだスレッドのみが対象の共有資源へのアクセス権を獲得出来たことになる。もしくは、シングルプロセッサシステムであればＯＳに排他フラグの更新を行わせることで特殊命令を利用しなくても排他制御が可能になる。アクセス権を獲得したスレッドは共有資源の利用が終了したら時刻ｔ２で排他フラグに開放を示す値を書き込むことで共有資源の利用終了を宣言する。
【００１１】
アクセス権を獲得出来なかったスレッドは、アクセス権を獲得したスレッドが共有資源の利用を終了してアクセス権を開放するまで待たなければならない。ここで、アクセス権を獲得できなかったスレッドが、アクセス権を開放するまで待つ方式として、スピンロックとトライロックの２つの方式が知られている。
【００１２】
図１５は、スピンロックの一例を示す説明図である。図１５で示すように、スピンロックでは、アクセス権を獲得できなかったスレッドが、排他フラグの値が開放を示す値になるまで排他獲得処理を繰り返す。スピンロックでは、排他制御によりアクセス権を獲得したスレッドは、共有資源の利用が完了したら排他フラグに開放中を示す値を書き込むことで共有資源の利用完了を宣言する。
【００１３】
図１５では、スレッド＃１が時刻ｔ１で先に排他権を獲得したため、スレッド＃０は時刻ｔ２で排他権の獲得に失敗し、排他権の獲得の試行を繰り返す。時刻ｔ３でスレッド＃１が排他権を開放するため、スレッド＃０では時刻ｔ４での直後の排他権の獲得試行で成功することができる。
【００１４】
図１６は、トライロックの一例を示す説明図である。図１６で示すように、トライロックでは、アクセス権が開放されるまで、アクセス権を獲得できなかったスレッドの実行が停止される。トライロックの場合は、共有資源の利用が完了したら排他フラグを開放中に変更すると共にＯＳにアクセス権の開放を通知する。アクセス権が開放されたらＯＳは停止していたスレッドの実行を再開する。
【００１５】
図１６では、時刻ｔ１でスレッド＃０が排他権の獲得を試みるが、既にスレッド＃１により排他フラグが利用中になっていたとすると、ＯＳによりスレッド＃０は待ち状態に変更されて代わりに別のスレッド（ここではスレッド＃１）に実行権が移る。その後、スレッド＃１がこのフラグを開放すると、また、ＯＳによりスレッド＃０が実行可能な状態に変更される。
【００１６】
スピンロックでは、共有資源が開放されるまで繰り返し排他フラグを確認するため、共有資源が長時間開放されない場合はＣＰＵの処理能力を無駄遣いする恐れがある。トライロックの場合は共有資源が開放されるまでスレッドの実行を停止するため、該スレッドの実行が停止されている間に他のスレッドを実行したり、実行可能なスレッドが無ければＣＰＵを停止したりするといったことでＣＰＵの処理能力を無駄遣いすることは無い。しかしながら、ＯＳによるスレッドの停止／再開処理のためにオーバーヘッドが発生し、複数スレッドが動作している場合、動作再開後即座にスレッドが実行可能となる保障もないため、共有資源が利用可能になってから実際に利用を開始するまでにオーバーヘッドが発生することになる。
【００１７】
したがって、短時間で開放される共有資源に対してはスピンロックで排他制御処理を行い、開放までに時間がかかる共有資源に対してはトライロックで排他制御処理を行うのがよい。しかしながら、共有資源の開放までの待ち時間は資源の状態や利用しているスレッド数などによっても変わってくるため、一意に決めることは難しい。
【００１８】
そこで、排他解除までの待ち時間を統計情報として記録して実行時に適した排他方式に切り替える技術が知られている（たとえば、下記特許文献１参照。）。また、実行時に排他解除までの統計情報を記録し（たとえば、下記特許文献２参照。）、実行時に排他方式を切り替える（たとえば、下記特許文献３参照。）技術が知られている。
【先行技術文献】
【特許文献】
【００１９】
【特許文献１】特開２００１−８４２３５号公報
【特許文献２】特開平１０−３１２２９４号公報
【特許文献３】特開平１１−８５５７４号公報
【発明の概要】
【発明が解決しようとする課題】
【００２０】
しかしながら、従来技術では排他制御でＯＳを利用する際の呼び出しコストについては考慮されていないという問題点がある。スピンロックで単純に排他フラグを確認するだけの処理は通常は数命令程度で実現でき、メモリアクセスのコストを考慮しても数十〜数百［ナノ秒］程度で一回の排他フラグの確認を行うことができる。
【００２１】
しかしながら、排他フラグの更新をＯＳで行う場合は排他フラグを確認するためにＯＳを呼び出さなければならない。アプリケーションプログラムからＯＳの処理を呼び出すためには割り込みを使ってＣＰＵを特権モードに遷移させるなどの処理が行われるため、数十［μ秒］〜数百［μ秒］とフラグの確認処理よりも遙かに多くの時間がかかる。
【００２２】
図１７は、ＯＳの利用による呼び出しコストを示す説明図である。図１７のように、スレッドが排他フラグを確認した直後（時刻ｔ１）、別のＣＰＵによりフラグが開放された場合、ＯＳの機能を利用しない場合（左側の図の場合）にはスレッドが時刻ｔ２でフラグを獲得して共有資源を使った処理を開始できる。しかしながら、ＯＳの機能を利用した場合（右側の図の場合）は、ＯＳが割り込みの復帰を行ってからスレッドの処理に戻る。そして、スレッドからの再度排他獲得要求によりＯＳに処理が移って、ＯＳが排他権を獲得して、またスレッドの処理に戻るなど、ＯＳとスレッドの処理実行を行き来することになり、時刻ｔ２’になるまでスレッドが共有資源を利用した処理を開始できない。
【００２３】
たとえば、従来技術のように、トライロックによる排他制御処理とスピンロックによる排他制御処理をＯＳが切り替えると、ＯＳとスレッドの実行を行き来するために、ＯＳによるオーバーヘッドが生じる問題点があった。
【００２４】
本発明は、上述した従来技術による問題点を解消するため、ＯＳによるオーバーヘッドを削減することができる排他制御方法、および排他制御プログラムを提供することを目的とする。
【課題を解決するための手段】
【００２５】
上述した課題を解決し、目的を達成するため、本発明の一の側面によれば、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行し、複数のスレッドのうちいずれかのスレッドにより、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記複数のスレッドのうち前記いずれかのスレッド以外の前記排他対象スレッドとなる残余のスレッドにより、前記共有資源へのアクセスの試行回数を計数し、計数された試行回数を前記残余のスレッドにより、前記記憶領域に格納する排他制御方法、および排他制御プログラムが提案される。
【発明の効果】
【００２６】
本発明の一の側面によれば、ＯＳによるオーバーヘッドを削減することができるという効果を奏する。
【図面の簡単な説明】
【００２７】
【図１】図１は、本発明の一例を示す説明図である。
【図２】図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。
【図３】図３は、マルチコアプロセッサシステム２００の機能例を示すブロック図である。
【図４】図４は、排他フラグの生成例を示す説明図である。
【図５】図５は、スレッドが共有資源に関する処理を実行する例を示す説明図である。
【図６】図６は、タイマ割り込みの発生時の例を示す説明図である。
【図７】図７は、トライロックされる例を示す説明図である。
【図８】図８は、スレッド２３１＿１の排他処理の終了例を示す説明図である。
【図９】図９は、スレッド２３１＿２による排他処理の開始例を示す説明図である。
【図１０】図１０は、ＯＳとスレッドによる排他生成手順の一例を示すフローチャートである。
【図１１】図１１は、ＯＳとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。
【図１２】図１２は、ＯＳとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。
【図１３】図１３は、ＯＳによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。
【図１４】図１４は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。
【図１５】図１５は、スピンロックの一例を示す説明図である。
【図１６】図１６は、トライロックの一例を示す説明図である。
【図１７】図１７は、ＯＳの利用による呼び出しコストを示す説明図である。
【発明を実施するための形態】
【００２８】
以下に添付図面を参照して、本発明にかかる排他制御方法、および排他制御プログラムの実施の形態を詳細に説明する。
【００２９】
図１は、本発明の一例を示す説明図である。スレッドＡとスレッドＢとが変数ｘを共有している。ここでは、排他フラグの状態が空きであり、排他方式フラグがスピンロックを示していることとする。
【００３０】
たとえば、スレッドＡが、（１）変数ｘへアクセスするために排他フラグを利用中に設定すると、スレッドＡから変数ｘへのアクセスが許可される。スレッドＢが、変数ｘへアクセスするために排他フラグを取得すると、すでに利用中に変更されているため、変数ｘへのアクセスが禁止される。すなわち、スレッドＢがスピンロックによる排他制御処理を実行する。スレッドＢが、（２）変数ｘへのアクセスが許可されるまで排他フラグの取得を繰り返し、アクセス可能か否かを試行する。スレッドＢが、たとえば、試行する都度、（３）試行回数を計数し、（４）スピンロックカウンタに試行回数を格納する。
【００３１】
たとえば、ＯＳが、一定のタイミングで、（５）スピンロックカウンタの値を検出する。たとえば、ＯＳが、（６）スピンロックカウンタの値が所定回数以上であるか否かを判断する。たとえば、ＯＳが、スピンロックカウンタの値が所定回数以上である場合、（７）スレッドＢを停止させることにより、スレッドＢからのアクセスの試行を禁止する。
【００３２】
本排他制御装置はシングルコアシステムであってもマルチコアプロセッサシステムであってもよいが、本実施の形態ではマルチコアプロセッサシステムを例に挙げて説明する。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
【００３３】
（マルチコアプロセッサシステムのハードウェア例）
図２は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。マルチコアプロセッサシステム２００は、ＣＰＵ２０１＿１と、ＣＰＵ２０１＿２と、ＣＰＵ２０１＿３と、ディスプレイ２０２と、キーボード２０３と、Ｉ／Ｆ２０４（ＩｎｔｅｒＦａｃｅ）と、ＲＡＭ２０６（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、ＲＯＭ２０７（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）と、を有している。マルチコアプロセッサシステム２００は、フラッシュＲＯＭ２０８と、フラッシュＲＯＭコントローラ２０９と、フラッシュＲＯＭ２１０と、を有している。
【００３４】
ＣＰＵ２０１＿１〜２０１＿３と、ディスプレイ２０２と、キーボード２０３と、Ｉ／Ｆ２０４と、ＲＡＭ２０６と、ＲＯＭ２０７と、フラッシュＲＯＭ２０８と、フラッシュＲＯＭコントローラ２０９とは、バス２１１を介して接続されている。
【００３５】
ここで、ＣＰＵ２０１＿１〜２０１＿３は、それぞれレジスタとコアとキャッシュを有している。コアは、演算機能を有している。各ＣＰＵ内のレジスタは、ＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）やリセットレジスタを有している。
【００３６】
ＣＰＵ２０１＿１はマスタＣＰＵであり、マルチコアプロセッサシステム２００の全体の制御を司り、ＯＳ２２１＿１を実行する。ＯＳ２２１＿１はマスタＯＳであり、ＣＰＵ２０１＿１に割り当てられたスレッドを実行する。ＯＳ２２１＿１はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのＣＰＵに割り当てるかを制御する機能を有している。スケジューラはＣＰＵ２０１＿１に割り当てられたアプリケーションの実行順序を制御する機能を有する。
【００３７】
ＣＰＵ２０１＿２とＣＰＵ２０１＿３はスレーブＣＰＵであり、それぞれＯＳ２２１＿２とＯＳ２２１＿３を実行する。ＯＳ２２１＿２とＯＳ２２１＿３はスレーブＯＳであり、それぞれＣＰＵ２０１＿２とＣＰＵ２０１＿３に割り当てられたスレッドを実行する。ＯＳ２２１＿２はスケジューラを有し、スケジューラはＣＰＵ２０１＿２に割り当てられたアプリケーションの実行順序を制御する機能を有する。ＯＳ２２１＿３はスケジューラを有し、スケジューラはＣＰＵ２０１＿３に割り当てられたアプリケーションの実行順序を制御する機能を有する。スレッド２３１＿１〜２３１＿３はアプリＡに関するスレッドであり、同一の変数を共有することとする。スレッド２３１＿１はＣＰＵ２０１＿１に割り当てられ、スレッド２３１＿２はＣＰＵ２０１＿２に割り当てられ、スレッド２３１＿３はＣＰＵ２０１＿３に割り当てられている。
【００３８】
ディスプレイ２０２は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ２０２は、たとえば、ＴＦＴ液晶ディスプレイなどを採用することができる。キーボード２０３は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード２０３は、タッチパネル式の入力パッドやテンキーなどであってもよい。
【００３９】
Ｉ／Ｆ２０４は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワーク２０５に接続され、ネットワーク２０５を介して他の装置に接続される。そして、Ｉ／Ｆ２０４は、ネットワーク２０５と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０４には、たとえばモデムやＬＡＮアダプタなどを採用することができる。
【００４０】
ＲＯＭ２０７は、ブートプログラムなどのプログラムを記憶している。ＲＡＭ２０６は、各ＣＰＵのワークエリアとして使用される。フラッシュＲＯＭ２０８は、ＯＳ２２１＿１〜２２１＿３などのシステムソフトウェアやアプリケーションのプログラムを記憶している。ＲＡＭ２０６はフラッシュＲＯＭ２０８よりも各ＣＰＵからのアクセス速度が速い。各ＯＳがアプリケーションのプログラムをフラッシュＲＯＭ２０８からＲＡＭ２０６へロードすることにより、該アプリケーションのコンテキスト情報がＲＡＭ２０６内に展開される。
【００４１】
フラッシュＲＯＭコントローラ２０９は、各ＣＰＵの制御に従ってフラッシュＲＯＭ２１０に対するデータのリード／ライトを制御する。フラッシュＲＯＭ２１０は、フラッシュＲＯＭコントローラ２０９の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム２００を使用するユーザがＩ／Ｆ２０４を通して取得した画像データ、映像データなどである。フラッシュＲＯＭ２１０は、たとえば、メモリカード、ＳＤカードなどを採用することができる。
【００４２】
（マルチコアプロセッサシステム２００の機能例）
図３は、マルチコアプロセッサシステム２００の機能例を示すブロック図である。マルチコアプロセッサシステム２００は、スレッド２３１＿ｍ（ｍ＝１〜３）と、ＯＳ２２１＿ｎ（ｎ＝１〜３）と、を有している。スレッド２３１＿ｍは、計数部３０１と格納部３０２とを有している。ＯＳ２２１＿ｎは、検出部３１１と、算出部３１２と、判断部３１３と、実行部３１４と、判断部３１５と、変更部３１６と、を有している。
【００４３】
計数部３０１と格納部３０２はスレッド２３１＿ｍにコーディングされており、スレッド２３１＿ｍはフラッシュＲＯＭ２０８などの記憶装置に記憶されている。ＣＰＵ２０１＿１〜２０１＿３のいずれかのＣＰＵが記憶装置からスレッド２３１＿ｍを読み出し、コーディングされている処理を実行することにより、計数部３０１と格納部３０２が実行される。検出部３１１から変更部３１６はＯＳ２２１＿ｎにコーディングされており、ＯＳ２２１＿ｎはフラッシュＲＯＭ２０８などの記憶装置に記憶されている。ＣＰＵ２０１＿１〜２０１＿３が記憶装置からそれぞれＯＳ２２１＿１〜２２１＿３を読み出し、コーディングされている処理を実行することにより、検出部３１１から変更部３１６が実行される。
【００４４】
まず、複数のスレッドのうちいずれかのスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる第２の排他制御処理を実行した場合である。計数部３０１は、複数のスレッドのうち、いずれかのスレッド以外の排他対象スレッドとなる残余のスレッドが共有資源へのアクセスの試行回数を計数する。
【００４５】
ここで、共有資源としては、たとえば、複数のＣＰＵで共有するＲＡＭ２０６、バス２１１やアプリケーションで共有する変数が挙げられる。ここで、第２の排他制御処理は、たとえば、スピンロックによる排他制御処理である。格納部３０２は、計数部３０１によって計数された試行回数をＯＳが参照可能な記憶領域に格納する。
【００４６】
検出部３１１は、記憶領域に格納された排他対象スレッドの共有資源へのアクセスの試行回数を検出する。判断部３１３は、検出部３１１によって検出された試行回数が所定回数以上であるか否かを判断する。算出部３１２は、残余のスレッドが複数ある場合、検出部３１１によって検出された残余のスレッドごとの共有資源へのアクセスの試行回数の平均値を算出する。格納部３０２は、算出部３１２によって算出された平均値を残余のスレッドが記憶領域に格納する。
【００４７】
実行部３１４は、判断部３１３によって試行回数が所定回数以上であると判断された場合、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第１の排他制御処理を実行する。
【００４８】
また、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第１の排他制御処理を実行した場合において説明する。判断部３１５は、排他対象スレッドのアクセス開始からの経過時間が所定時間以上であるか否かを判断する。
【００４９】
変更部３１６は、判断部３１５によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を解除する。変更部３１６は、判断部３１５によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を継続する。以上を踏まえて詳細に説明する。
【００５０】
図４は、排他フラグの生成例を示す説明図である。まず、具体的には、たとえば、スレッド２３１＿１が、（１）排他フラグ４０３の領域と排他方式フラグ４０４との領域をＲＡＭ２０６上のプロセスデータ領域４１０に確保する。ここで、ＲＡＭ２０６上はＯＳデータ領域４１１とプロセスデータ領域４１０とを有している。各ＯＳが取り扱うデータがＯＳデータ領域４１１に格納され、各スレッドが取り扱うデータがプロセスデータ領域４１０に格納される。各スレッドはプロセスデータ領域４１０にアクセスできない。
【００５１】
たとえば、スレッド２３１＿１が、（２）スレッド２３１＿１が属するアプリケーションの起動予定を含めた総スレッド数をテーブル４００から取得する。テーブル４００は、アプリ名、総スレッド数のフィールドを有する。アプリ名にはアプリケーションの識別情報が登録され、総スレッド数には、アプリ名に登録された識別情報のアプリケーションの総スレッド数が登録されている。ここでは、スレッド２３１＿１はアプリＡに属するスレッドであるため、総スレッド数として３が取得される。
【００５２】
たとえば、スレッド２３１＿１が、（３）取得した総スレッド数分の待ち開始時刻レジスタの領域と総スレッド数分のＳＣ（スピンロックカウンタ）の領域をＲＡＭ２０６上のプロセスデータ領域４１０に確保する。図４では、ＳＣ４０１＿１〜４０１＿３と、待ち開始時刻レジスタ４０２＿１〜４０２＿３がプロセスデータ領域４１０内に確保されている。
【００５３】
たとえば、スレッド２３１＿１が、（４）排他フラグ４０３を０（開放状態）に設定し、排他方式フラグ４０４を０（スピンロック方式）に設定する。たとえば、スレッド２３１＿１が、（５）ＳＣ４０１＿１〜４０１＿３に０を設定する。たとえば、スレッド２３１＿１が、（６）確保したすべての領域の参照情報４０５をＯＳ２２１＿１に通知する。ここで、参照情報４０５とはＯＳ２２１＿１からプロセスデータ領域４１０に確保された領域を参照するための情報であり、参照情報４０５には、該確保された領域にスレッドがアクセスする際に用いる確保された領域の先頭アドレスが記述されている。
【００５４】
たとえば、ＯＳ２２１＿１が、スレッド２３１＿１から参照情報４０５を受け付けると、参照情報４０５に対応する排他の識別情報を生成する。排他の識別情報は、スレッド２３１＿１が領域を確保した排他に関する情報を識別するための情報である。本実施の形態では１つの排他制御処理のみに着目しているが、実際には複数の排他制御処理があるため、各排他に関する情報に識別するための情報が付される。たとえば、ＯＳ２２１＿１が、（７）排他の識別情報と参照情報４０５とを関連付けてＯＳデータ領域４１１に登録する。たとえば、ＯＳ２２１＿１が、いずれかのスレッドから排他の識別情報を受け付けると、受け付けた排他の識別情報に基づいて参照情報４０５を参照する。たとえば、ＯＳ２２１＿１が、参照情報４０５に記述されている先頭アドレスに応じてプロセスデータ領域４１０内の確保された領域に記憶されているデータにアクセスすることができる。つぎに、たとえば、ＯＳ２２１＿１が、排他の識別情報をスレッド２３１＿１に通知する。たとえば、スレッド２３１＿１が、ＯＳ２２１＿１から排他の識別情報を受け付けると、排他の識別情報を、確保された領域と関連付けて記録する。
【００５５】
図５は、スレッドが共有資源に関する処理を実行する例を示す説明図である。たとえば、スレッド２３１＿１が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が０であるため、たとえば、スレッド２３１＿１が、排他フラグ４０３を０（開放状態）から１（利用中）に変更する。たとえば、スレッド２３１＿１が、ＳＣ４０１＿１に０を設定する。
【００５６】
たとえば、スレッド２３１＿２が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿２が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が０（スピンロック）であるため、スレッド２３１＿２が、ＳＣ４０１＿２をインクリメントする。これにより、ＳＣの値が１となる。そして、スレッド２３１＿２が、排他フラグ４０３のチェックと排他方式フラグ４０４のチェックを繰り返す。排他フラグ４０３のチェックが１（利用中）であり、排他方式フラグ４０４が０（スピンロック）である間、スレッド２３１＿２がＳＣ４０１＿２のインクリメントを繰り返す。
【００５７】
たとえば、スレッド２３１＿３が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿３が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が０（スピンロック）であるため、スレッド２３１＿３が、ＳＣ４０１＿３をインクリメントする。これにより、ＳＣの値が１となる。そして、スレッド２３１＿３が、排他フラグ４０３のチェックと排他方式フラグ４０４のチェックを繰り返す。排他フラグ４０３のチェックが１（利用中）であり、排他方式フラグ４０４が０（スピンロック）である間、スレッド２３１＿３がＳＣ４０１＿３のインクリメントを繰り返す。
【００５８】
図６は、タイマ割り込みの発生時の例を示す説明図である。ＯＳ２２１＿１が、タイマ割り込みを受け付けると、たとえば、複数の排他の識別情報から、一の排他の識別情報を選択する。たとえば、ＯＳ２２１＿１が、（１）選択した一の排他の識別情報の参照情報４０５に基づいて排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。たとえば、排他フラグ４０３が１（利用中）であるため、ＯＳ２２１＿１が、（２）排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。
【００５９】
たとえば、排他方式フラグ４０４が０（スピンロック）であるため、ＯＳ２２１＿１が、全スピンロックカウンタの値を検出する。ＯＳ２２１＿１が、（３）値が０以外のカウンタの値の平均値を算出する。ここでは、ＳＣ４０１＿１の値は０であり、ＳＣ４０１＿２の値は３００であり、ＳＣ４０１＿３の値は２９６であるため、平均値が２９８である。たとえば、ＯＳ２２１＿１が、（４）算出した平均値が所定回数以上であるか否かを判断する。ここでは、所定回数を２８０とする。算出された平均値が所定回数以上であるため、たとえば、ＯＳ２２１＿１が、（５）排他方式フラグ４０４を０（スピンロック）から１（トライロック）に変更する。ここでは、平均値が所定回数以上であると判断しているが、これに限らず、たとえば、中央値が所定回数以上であるか判断してもよいし、所定回数以上のカウンタの値が複数個以上あるかなどの多数決であってもよい。
【００６０】
図７は、トライロックされる例を示す説明図である。たとえば、スレッド２３１＿２が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿２が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が１（トライロック）であるため、スレッド２３１＿２が、排他の識別情報を指定してトライロックをＯＳ２２１＿２に依頼する。
【００６１】
ＯＳ２２１＿２が、スレッド２３１＿２から受け付けた排他の識別情報に対応するフラグ待ちキュー４０６にスレッド２３１＿２の識別情報を登録する。ＯＳ２２１＿２が、現在時刻を取得し、スレッド２３１＿２の待ち開始時刻レジスタ４０２＿２に現在時刻を設定する。待ち開始時刻レジスタ４０２＿２は、１５：００：１０となる。ＯＳ２２１＿２が、再スケジューリングを行う。ここでは、ＣＰＵ２０１＿２にはスレッド２３１＿２のみが割り当てられているため、ＣＰＵ２０１＿２は待ち状態となる。
【００６２】
たとえば、スレッド２３１＿３が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿３が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が１（トライロック）であるため、スレッド２３１＿３が、排他の識別情報を指定してトライロックをＯＳ２２１＿３に依頼する。
【００６３】
ＯＳ２２１＿３が、スレッド２３１＿３から受け付けた識別情報に対応するフラグ待ちキュー４０６にスレッド２３１＿３の識別情報を登録する。ＯＳ２２１＿３が、現在時刻を取得し、スレッド２３１＿３の待ち開始時刻レジスタ４０２＿３に現在時刻を設定する。待ち開始時刻レジスタ４０２＿３は１５：００：１１である。ＯＳ２２１＿３が、再スケジューリングを行う。ここでは、ＣＰＵ２０１＿３にはスレッド２３１＿３のみが割り当てられているため、ＣＰＵ２０１＿３は待ち状態となる。
【００６４】
図８は、スレッド２３１＿１の排他処理の終了例を示す説明図である。たとえば、スレッド２３１＿１が、排他方式フラグ４０４の状態を取得することにより、（１）排他フラグ４０３をチェックする。ここでは、排他方式フラグ４０４がトライロックであるため、たとえば、スレッド２３１＿１が、（２）排他の識別情報を指定してＯＳ２２１＿１に開放依頼を通知する。たとえば、ＯＳ２２１＿１が、開放依頼通知を受け付けると、現在時刻を取得する。たとえば、ＯＳ２２１＿１が、（３）フラグ待ちキュー４０６に登録されているスレッドの識別情報を取得する。ここでは、スレッド２３１＿２とスレッド２３１＿３のそれぞれの識別情報が取得される。
【００６５】
たとえば、ＯＳ２２１＿１が、取得したスレッドの識別情報が示すスレッドの待ち開始時刻レジスタから時刻を検出する。たとえば、ＯＳ２２１＿１が、（４）現在時刻と取得したそれぞれの時刻との差分値（待ち時間）を算出する。たとえば、ＯＳ２２１＿１が、取得した時刻ごとの差分値に基づいて平均待ち時間を算出する。現在時刻が１５：１０：２０である。待ち開始時刻レジスタ４０２＿２の値は１５：１０：１０であり、待ち開始時刻レジスタ４０２＿３の値は１５：１０：１１である。平均待ち時間は、９．５［秒］である。
【００６６】
たとえば、ＯＳ２２１＿１が、（５）算出した平均待ち時間が所定時間以下であるか否かを判断する。ここでは、所定時間を３［秒］とする。算出した平均待ち時間が所定時間以下でないため、トライロックのままとなる。ここでは、平均待ち時間が所定時間以下であるか否かを判断しているが、これに限らず、待ち時間の中央値が所定時間以下であるか否かを判断してもよいし、待ち時間が所定時間以下である数が何個であるかの多数決で判断してもよい。また、ここでは例示していないが、算出した平均待ち時間が所定時間以下ある場合、トライロックからスピンロックに変更される。
【００６７】
たとえば、ＯＳ２２１＿１が、（６）排他フラグ４０３を１（利用中）から０（開放状態）に変更する。たとえば、ＯＳ２２１＿１が、（７）フラグ待ちキューの先頭に識別情報が登録されているスレッド２３１＿２の実行を再開させる。
【００６８】
図９は、スレッド２３１＿２による排他処理の開始例を示す説明図である。たとえば、スレッド２３１＿２が、排他フラグ４０３の状態を取得することにより、排他フラグ４０３をチェックする。ここでは、排他フラグ４０３が１（利用中）であるため、スレッド２３１＿２が、排他方式フラグ４０４の状態を取得することにより、排他方式フラグ４０４をチェックする。ここでは、排他方式フラグ４０４が１（トライロック）であるため、スレッド２３１＿２が、排他の識別情報を指定してトライロックをＯＳ２２１＿２に依頼する。
【００６９】
（ＯＳとスレッドによる排他制御処理手順）
図１０は、ＯＳとスレッドによる排他生成手順の一例を示すフローチャートである。スレッドが、排他フラグ、排他方式フラグ領域を確保し（ステップＳ１００１）、起動予定を含めた総スレッド数を取得し（ステップＳ１００２）、総スレッド数分のスピンロックカウンタと待ち開始時刻レジスタ領域を確保する（ステップＳ１００３）。
【００７０】
スレッドが、排他フラグを開放状態に設定し（ステップＳ１００４）、排他方式フラグをスピンロックに設定する（ステップＳ１００５）。ここでは、スピンロックに設定しているが、トライロックに設定しておいてもよい。スレッドが、すべてのスピンロックカウンタに０を設定し（ステップＳ１００６）、確保したすべての領域の参照情報をＯＳに通知する（ステップＳ１００７）。
【００７１】
ＯＳが、参照情報を受け付けると、参照情報に関する排他の識別情報を生成し（ステップＳ１００８）、排他の識別情報と参照情報を記録し（ステップＳ１００９）、排他の識別情報を参照情報の通知元のスレッドへ通知する（ステップＳ１０１０）。スレッドが、排他の識別情報を受け付けると、識別情報を記録し（ステップＳ１０１１）、一連の処理を終了する。
【００７２】
図１１は、ＯＳとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。スレッドが、共有資源へアクセスを行う、または待ち状態から復帰するか否かを判断する（ステップＳ１１０１）。スレッドが、共有資源へのアクセスを開始していない、および待ち状態から復帰していないと判断した場合（ステップＳ１１０１：Ｎｏ）、ステップＳ１１０１へ戻る。
【００７３】
スレッドが、共有資源へのアクセスを行うまたは待ち状態から復帰したと判断した場合（ステップＳ１１０１：Ｙｅｓ）、排他フラグの状態を取得し（ステップＳ１１０２）、排他フラグの状態が利用中であるか否かを判断する（ステップＳ１１０３）。スレッドが、排他フラグの状態が利用中でないと判断した場合（ステップＳ１１０３：Ｎｏ）、特殊命令により排他フラグを利用中に変更する（ステップＳ１１０４）。スレッドが、変更成功したか否かを判断し（ステップＳ１１０５）、変更成功したと判断した場合（ステップＳ１１０５：Ｙｅｓ）、スピンロックカウンタに０を設定する（ステップＳ１１０６）。
【００７４】
スレッドが、排他フラグの状態が利用中であると判断した場合（ステップＳ１１０３：Ｙｅｓ）、または変更成功していないと判断した場合（ステップＳ１１０５：Ｎｏ）、排他方式フラグの状態を取得する（ステップＳ１１０７）。スレッドが、排他方式がスピンロックであるか否かを判断する（ステップＳ１１０８）。スレッドが、排他方式がスピンロックであると判断した場合（ステップＳ１１０８：Ｙｅｓ）、スピンロックカウンタをインクリメントし（ステップＳ１１１０）、ステップＳ１１０１へ戻る。スレッドが、排他方式がスピンロックでないと判断した場合（ステップＳ１１０８：Ｎｏ）、排他の識別情報を指定してトライロック依頼を通知する（ステップＳ１１０９）。
【００７５】
ステップＳ１１０９のつぎに、ＯＳが、スレッドからのトライロック依頼を受け付けると、依頼元スレッドの識別情報を排他の識別情報に対応するフラグ待ちキューに登録する（ステップＳ１１１１）。ＯＳが、現在時刻を取得し（ステップＳ１１１２）、待ち開始時刻レジスタに現在時刻を記録する（ステップＳ１１１３）。ＯＳが、再スケジューリングし（ステップＳ１１１４）、実行スレッド切り替え処理を実行する（ステップＳ１１１５）。
【００７６】
図１２は、ＯＳとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。まず、スレッドが、排他方式フラグの状態を取得し（ステップＳ１２０１）、排他方式がスピンロックであるか否かを判断する（ステップＳ１２０２）。スレッドが、排他方式がスピンロックであると判断した場合（ステップＳ１２０２：Ｙｅｓ）、排他フラグを空き状態に変更し（ステップＳ１２０３）、一連の処理を終了する。
【００７７】
スレッドが、排他方式がスピンロックでないと判断した場合（ステップＳ１２０２：Ｎｏ）、排他の識別情報を指定して開放依頼をＯＳへ通知する（ステップＳ１２０４）。ＯＳが、スレッドから開放依頼を受け付けると、現在時刻を取得する（ステップＳ１２０５）。ＯＳが、排他の識別情報に対応するフラグ待ちキューからスレッドの識別情報をすべて取得する（ステップＳ１２０６）。
【００７８】
ＯＳが、フラグ待ちキューに登録されている識別情報で示されるスレッドの待ち開始時刻を取得し（ステップＳ１２０７）、平均待ち時間を算出し（ステップＳ１２０８）、平均待ち時間が所定時間以下であるか否かを判断する（ステップＳ１２０９）。ＯＳが、平均待ち時間が所定時間以下であると判断した場合（ステップＳ１２０９：Ｙｅｓ）、排他方式フラグの状態をスピンロックに変更する（ステップＳ１２１０）。
【００７９】
ＯＳが、排他フラグを空き状態に変更し（ステップＳ１２１１）、フラグ待ちキューに登録されている識別情報で示されるスレッドをすべて再開させ（ステップＳ１２１２）、一連の処理を終了する。ＯＳが、平均待ち時間が所定時間以下でないと判断した場合（ステップＳ１２０９：Ｎｏ）、排他フラグを開放状態に変更する（ステップＳ１２１３）。ＯＳが、フラグ待ちキューの先頭に登録されている識別情報で示されるスレッドを再開させ（ステップＳ１２１４）、一連の処理を終了する。
【００８０】
図１３は、ＯＳによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。まず、ＯＳが、タイマ割り込みを受け付けたか否かを判断する（ステップＳ１３０１）。ＯＳが、タイマ割り込みを受け付けていないと判断した場合（ステップＳ１３０１：Ｎｏ）、ステップＳ１３０１へ戻る。ＯＳが、タイマ割り込みを受け付けたと判断した場合（ステップＳ１３０１：Ｙｅｓ）、登録されている排他情報から未選択の１つを選択する（ステップＳ１３０２）。ＯＳが、選択可能な排他情報が無いか否かを判断する（ステップＳ１３０３）。
【００８１】
ＯＳが、選択可能な排他情報が無いと判断しなかった場合（ステップＳ１３０３：Ｎｏ）、排他フラグの状態を取得する（ステップＳ１３０４）。ＯＳが、排他フラグの状態が利用中であるか否かを判断し（ステップＳ１３０５）、利用中でないと判断した場合（ステップＳ１３０５：Ｎｏ）、ステップＳ１３０２へ戻る。
【００８２】
ＯＳが、排他フラグの状態が利用中であると判断した場合（ステップＳ１３０５：Ｙｅｓ）、排他方式フラグの状態を取得し（ステップＳ１３０６）、排他方式がスピンロックであるか否かを判断する（ステップＳ１３０７）。ＯＳが、排他方式がスピンロックでないと判断した場合（ステップＳ１３０７：Ｎｏ）、ステップＳ１３０２へ戻る。
【００８３】
ＯＳが、排他方式がスピンロックであると判断した場合（ステップＳ１３０７：Ｙｅｓ）、すべてのスピンロックカウンタの値を取得する（ステップＳ１３０８）。ＯＳが、値が０以外のスピンロックカウンタの平均値を算出し（ステップＳ１３０９）、平均値が所定回数以上であるか否かを判断する（ステップＳ１３１０）。
【００８４】
ＯＳが、平均値が所定回数以上でないと判断した場合（ステップＳ１３１０：Ｎｏ）、ステップＳ１３０２へ戻る。ＯＳが、平均値が所定回数以上であると判断した場合（ステップＳ１３１０：Ｙｅｓ）、排他方式フラグにトライロックを設定し（ステップＳ１３１１）、ステップＳ１３０２へ移行する。
【００８５】
ステップＳ１３０３において、ＯＳが、選択可能な排他情報が無いと判断した場合（ステップＳ１３０３：Ｙｅｓ）、一連の処理を終了する。また、排他制御に関する処理は終了するが、ＯＳは通常のタイマ割り込み処理を行う。
【００８６】
以上説明したように、排他制御方法、および排他制御プログラムによれば、排他対象スレッドによるスピンロックでの排他制御処理が実行され、共有資源へのアクセスの試行回数が所定回数以上であれば、ＯＳによるトライロックでの排他制御処理が実行される。スピンロックをＯＳの機能を利用せずに実現することにより、共有資源が開放されてから獲得までのオーバーヘッドを削減することができる。また、スピンロック時にＯＳを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
【００８７】
また、ＯＳが、排他対象スレッドがアクセス可能な記録領域に試行回数を記憶させる記憶領域を確保することで、ＯＳを呼び出さずにスピンロックを行うことができる。
【００８８】
また、各排他対象スレッドがスピンロックとトライロックのうちいずれの方式で排他制御処理を利用しているかを、排他方式フラグにより管理することで、方式の切り替えを容易に行うことができる。また、ＯＳが、排他対象スレッドがアクセス可能な記録領域に排他方式フラグを記憶させる記憶領域を確保することで、排他対象スレッドがＯＳを呼び出さずにスピンロックを行うことができる。
【００８９】
また、排他対象スレッドが複数ある場合、共有資源へのアクセスの試行回数の平均値が、所定回数以上であるか否かによって、ＯＳによるトライロックに切り替えるか否かを判断する。排他対象スレッドがどの程度試行しているかを相対的に判断することができる。
【００９０】
また、ＯＳによるトライロックでの排他制御処理が実行され、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間未満であれば、スレッドによるスピンロックでの排他制御処理が実行される。共有資源の排他権の開放が短時間の場合、共有資源に対してスピンロックでの排他制御処理を行うことができる。さらに、スピンロックをＯＳの機能を利用せずに実現することにより、共有資源が開放されてから他のスレッドによる排他権の獲得までのオーバーヘッドを短くすることができる。また、スピンロック時にＯＳを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
【００９１】
また、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間以上であれば、ＯＳによるトライロックでの排他制御処理が継続して実行される。これにより、共有資源の排他権の開放までに時間がかかる場合、共有資源に対してトライロックでの排他制御処理を行うことができる。
【００９２】
なお、本実施の形態で説明した排他制御方法は、予め用意された排他制御プログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本排他制御プログラムは、ハードディスク、フレキシブルディスク、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤ等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本排他制御プログラムは、インターネット等のネットワークを介して配布してもよい。
【００９３】
上述した実施の形態に関し、さらに以下の付記を開示する。
【００９４】
（付記１）排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータが、
複数のスレッドのうちの第１のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第２のスレッドが、前記記憶領域に格納する格納処理と、
を実行することを特徴とする排他制御方法。
【００９５】
（付記２）前記第２のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする付記１に記載の排他制御方法。
【００９６】
（付記３）前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記１または２に記載の排他制御方法。
【００９７】
（付記４）複数のスレッドのうちの第１のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータが、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行することを特徴とする排他制御方法。
【００９８】
（付記５）前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする付記４に記載の排他制御方法。
【００９９】
（付記６）前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記４または５に記載の排他制御方法。
【０１００】
（付記７）前記オペレーティングシステムが、前記第２のスレッドが複数ある場合、前記検出処理によって検出された前記第２のスレッドごとの前記試行回数の平均値を算出する算出処理を実行し、
前記判断処理は、前記算出処理によって算出された平均値が前記所定回数以上であるか否かを判断し、
前記実行処理は、前記判断処理によって前記平均値が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行することを特徴とする付記４〜６のいずれか一つに記載の排他制御方法。
【０１０１】
（付記８）排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を、前記排他対象スレッドから前記共有資源へのアクセス開始からの経過時間に応じて、複数のスレッドのうちの第１のスレッドが実行するコンピュータが、
オペレーティングシステムが、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行した場合、前記経過時間が所定時間以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記経過時間が前記所定時間以上でないと判断された場合、前記排他対象スレッドの前記共有資源へのアクセスの試行の禁止を解除する変更処理と、
を実行することを特徴とする排他制御方法。
【０１０２】
（付記９）前記オペレーティングシステムが、前記判断処理によって前記経過時間が前記所定時間より長いと判断する場合、前記排他対象スレッドの前記共有資源へのアクセスの試行の禁止を継続すること、
を特徴とする付記８に記載の排他制御方法。
【０１０３】
（付記１０）排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータに、
複数のスレッドのうちの第１のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第２のスレッドが、前記記憶領域に格納する格納処理と、
を実行させることを特徴とする排他制御プログラム。
【０１０４】
（付記１１）前記第２のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする付記１０に記載の排他制御プログラム。
【０１０５】
（付記１２）前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記１０または１１に記載の排他制御プログラム。
【０１０６】
（付記１３）複数のスレッドのうちの第１のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第１のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第２のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータに、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行させることを特徴とする排他制御プログラム。
【０１０７】
（付記１４）前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする付記１３に記載の排他制御プログラム。
【０１０８】
（付記１５）前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記１３または１４に記載の排他制御プログラム。
【符号の説明】
【０１０９】
２２１＿１〜２２１＿３  ＯＳ
２３１＿１〜２３１＿３  スレッド
４１０  プロセスデータ領域
４０１＿１〜４０１＿３  ＳＣ
【国際調査報告】
2012132017.tif 000020
2012132017.tif 000021
2012132017.tif 000022
2012132017.tif 000023