本発明は、共有資源へのアクセスを制御する排他制御方法、および排他制御プログラムに関する。
マルチコアプロセッサシステムもしくはマルチタスクOS(Operating System)を搭載したシングルプロセッサシステムでは複数のプロセスまたはスレッドが同時に動作することができる。
ここで、たとえば、スレッド#0とスレッド#1の二つのスレッドが同時にメモリ上の変数xに1を足そうとする。変数xに1を足すという処理は、CPU(Central Processing Unit)のオペレーションのレベルではメモリから変数xの値を読み込んで、読み込んだ値に1を足して、足した結果をメモリ上の変数xに書き込むという3ステップで行われる。
図14は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。マルチコアプロセッサシステムにおいて、たとえば、スレッド#0とスレッド#1がそれぞれCPU#0とCPU#1で同時に実行されているとする。時刻t1でスレッド#0がメモリから変数xの値をLoad命令で読み込んだ時点では変数xの値は0とする。読み込まれた変数xの値はCPU内のレジスタR1に格納されて時刻t2でレジスタR1に1が足され、足された結果がレジスタR1に格納される。時刻t2でCPU#1ではスレッド#1が実行されていて、スレッド#1で同じくLoad命令で変数xの値を読み込む。変数xの値は0であるので、CPU#1のレジスタR2には0が格納される。
・時刻t1:R1=x=0
・時刻t2:R1=R1+1=1、R2=x=0
時刻t3でスレッド#0がレジスタR1の値をメモリの変数xに書き込む。さらに、時刻t4でスレッド#1がR2に1を足した結果を書き込むが、該足した結果は1のため、変数xには再度1が書き込まれる。
・時刻t3:x=R1=1、R2=R2+1=1
・時刻t4:x=R2=1
このように、スレッド#0が変数xに1を足した結果を書き込む前にスレッド#1が変数xの値をメモリから読み込んでしまうと、変数xに2回1を足したにも関わらず、結果として変数xの値が1しか増えていないことになる問題が生じる。シングルプロセッサシステムでも、マルチタスクOSの場合は複数のプロセスもしくはスレッドが時分割的に実行されるため、同様の問題が生じる。
そのため、共有するメモリ上のデータやDMA(Direct Memory Access)等のハードウェアデバイスといった共有資源を複数のプロセスもしくはスレッドで利用する場合は排他制御を行わなければならない。排他制御ではメモリ上に置かれた排他フラグをCPUが提供するスワップや排他ロードストアといった特殊命令を利用して更新することで、排他フラグに関連付けられた共有資源が利用中であるか否かを管理する。
特殊命令で書き込みを行った場合は複数のCPUが同時に同じフラグに値を書き込もうとした場合に、一つのCPUしか書き込みを成功させることができない。特殊命令でフラグに書き込みを行った後で、特殊命令の結果を確認して排他フラグに利用中を示す値を書き込んだスレッドのみが対象の共有資源へのアクセス権を獲得出来たことになる。もしくは、シングルプロセッサシステムであればOSに排他フラグの更新を行わせることで特殊命令を利用しなくても排他制御が可能になる。アクセス権を獲得したスレッドは共有資源の利用が終了したら時刻t2で排他フラグに開放を示す値を書き込むことで共有資源の利用終了を宣言する。
アクセス権を獲得出来なかったスレッドは、アクセス権を獲得したスレッドが共有資源の利用を終了してアクセス権を開放するまで待たなければならない。ここで、アクセス権を獲得できなかったスレッドが、アクセス権を開放するまで待つ方式として、スピンロックとトライロックの2つの方式が知られている。
図15は、スピンロックの一例を示す説明図である。図15で示すように、スピンロックでは、アクセス権を獲得できなかったスレッドが、排他フラグの値が開放を示す値になるまで排他獲得処理を繰り返す。スピンロックでは、排他制御によりアクセス権を獲得したスレッドは、共有資源の利用が完了したら排他フラグに開放中を示す値を書き込むことで共有資源の利用完了を宣言する。
図15では、スレッド#1が時刻t1で先に排他権を獲得したため、スレッド#0は時刻t2で排他権の獲得に失敗し、排他権の獲得の試行を繰り返す。時刻t3でスレッド#1が排他権を開放するため、スレッド#0では時刻t4での直後の排他権の獲得試行で成功することができる。
図16は、トライロックの一例を示す説明図である。図16で示すように、トライロックでは、アクセス権が開放されるまで、アクセス権を獲得できなかったスレッドの実行が停止される。トライロックの場合は、共有資源の利用が完了したら排他フラグを開放中に変更すると共にOSにアクセス権の開放を通知する。アクセス権が開放されたらOSは停止していたスレッドの実行を再開する。
図16では、時刻t1でスレッド#0が排他権の獲得を試みるが、既にスレッド#1により排他フラグが利用中になっていたとすると、OSによりスレッド#0は待ち状態に変更されて代わりに別のスレッド(ここではスレッド#1)に実行権が移る。その後、スレッド#1がこのフラグを開放すると、また、OSによりスレッド#0が実行可能な状態に変更される。
スピンロックでは、共有資源が開放されるまで繰り返し排他フラグを確認するため、共有資源が長時間開放されない場合はCPUの処理能力を無駄遣いする恐れがある。トライロックの場合は共有資源が開放されるまでスレッドの実行を停止するため、該スレッドの実行が停止されている間に他のスレッドを実行したり、実行可能なスレッドが無ければCPUを停止したりするといったことでCPUの処理能力を無駄遣いすることは無い。しかしながら、OSによるスレッドの停止/再開処理のためにオーバーヘッドが発生し、複数スレッドが動作している場合、動作再開後即座にスレッドが実行可能となる保障もないため、共有資源が利用可能になってから実際に利用を開始するまでにオーバーヘッドが発生することになる。
したがって、短時間で開放される共有資源に対してはスピンロックで排他制御処理を行い、開放までに時間がかかる共有資源に対してはトライロックで排他制御処理を行うのがよい。しかしながら、共有資源の開放までの待ち時間は資源の状態や利用しているスレッド数などによっても変わってくるため、一意に決めることは難しい。
そこで、排他解除までの待ち時間を統計情報として記録して実行時に適した排他方式に切り替える技術が知られている(たとえば、下記特許文献1参照。)。また、実行時に排他解除までの統計情報を記録し(たとえば、下記特許文献2参照。)、実行時に排他方式を切り替える(たとえば、下記特許文献3参照。)技術が知られている。
特開2001−84235号公報
特開平10−312294号公報
特開平11−85574号公報
しかしながら、従来技術では排他制御でOSを利用する際の呼び出しコストについては考慮されていないという問題点がある。スピンロックで単純に排他フラグを確認するだけの処理は通常は数命令程度で実現でき、メモリアクセスのコストを考慮しても数十〜数百[ナノ秒]程度で一回の排他フラグの確認を行うことができる。
しかしながら、排他フラグの更新をOSで行う場合は排他フラグを確認するためにOSを呼び出さなければならない。アプリケーションプログラムからOSの処理を呼び出すためには割り込みを使ってCPUを特権モードに遷移させるなどの処理が行われるため、数十[μ秒]〜数百[μ秒]とフラグの確認処理よりも遙かに多くの時間がかかる。
図17は、OSの利用による呼び出しコストを示す説明図である。図17のように、スレッドが排他フラグを確認した直後(時刻t1)、別のCPUによりフラグが開放された場合、OSの機能を利用しない場合(左側の図の場合)にはスレッドが時刻t2でフラグを獲得して共有資源を使った処理を開始できる。しかしながら、OSの機能を利用した場合(右側の図の場合)は、OSが割り込みの復帰を行ってからスレッドの処理に戻る。そして、スレッドからの再度排他獲得要求によりOSに処理が移って、OSが排他権を獲得して、またスレッドの処理に戻るなど、OSとスレッドの処理実行を行き来することになり、時刻t2’になるまでスレッドが共有資源を利用した処理を開始できない。
たとえば、従来技術のように、トライロックによる排他制御処理とスピンロックによる排他制御処理をOSが切り替えると、OSとスレッドの実行を行き来するために、OSによるオーバーヘッドが生じる問題点があった。
本発明は、上述した従来技術による問題点を解消するため、OSによるオーバーヘッドを削減することができる排他制御方法、および排他制御プログラムを提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明の一の側面によれば、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行し、複数のスレッドのうちいずれかのスレッドにより、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記複数のスレッドのうち前記いずれかのスレッド以外の前記排他対象スレッドとなる残余のスレッドにより、前記共有資源へのアクセスの試行回数を計数し、計数された試行回数を前記残余のスレッドにより、前記記憶領域に格納する排他制御方法、および排他制御プログラムが提案される。
本発明の一の側面によれば、OSによるオーバーヘッドを削減することができるという効果を奏する。
図1は、本発明の一例を示す説明図である。
図2は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。
図3は、マルチコアプロセッサシステム200の機能例を示すブロック図である。
図4は、排他フラグの生成例を示す説明図である。
図5は、スレッドが共有資源に関する処理を実行する例を示す説明図である。
図6は、タイマ割り込みの発生時の例を示す説明図である。
図7は、トライロックされる例を示す説明図である。
図8は、スレッド231_1の排他処理の終了例を示す説明図である。
図9は、スレッド231_2による排他処理の開始例を示す説明図である。
図10は、OSとスレッドによる排他生成手順の一例を示すフローチャートである。
図11は、OSとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。
図12は、OSとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。
図13は、OSによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。
図14は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。
図15は、スピンロックの一例を示す説明図である。
図16は、トライロックの一例を示す説明図である。
図17は、OSの利用による呼び出しコストを示す説明図である。
以下に添付図面を参照して、本発明にかかる排他制御方法、および排他制御プログラムの実施の形態を詳細に説明する。
図1は、本発明の一例を示す説明図である。スレッドAとスレッドBとが変数xを共有している。ここでは、排他フラグの状態が空きであり、排他方式フラグがスピンロックを示していることとする。
たとえば、スレッドAが、(1)変数xへアクセスするために排他フラグを利用中に設定すると、スレッドAから変数xへのアクセスが許可される。スレッドBが、変数xへアクセスするために排他フラグを取得すると、すでに利用中に変更されているため、変数xへのアクセスが禁止される。すなわち、スレッドBがスピンロックによる排他制御処理を実行する。スレッドBが、(2)変数xへのアクセスが許可されるまで排他フラグの取得を繰り返し、アクセス可能か否かを試行する。スレッドBが、たとえば、試行する都度、(3)試行回数を計数し、(4)スピンロックカウンタに試行回数を格納する。
たとえば、OSが、一定のタイミングで、(5)スピンロックカウンタの値を検出する。たとえば、OSが、(6)スピンロックカウンタの値が所定回数以上であるか否かを判断する。たとえば、OSが、スピンロックカウンタの値が所定回数以上である場合、(7)スレッドBを停止させることにより、スレッドBからのアクセスの試行を禁止する。
本排他制御装置はシングルコアシステムであってもマルチコアプロセッサシステムであってもよいが、本実施の形態ではマルチコアプロセッサシステムを例に挙げて説明する。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
(マルチコアプロセッサシステムのハードウェア例)
図2は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。マルチコアプロセッサシステム200は、CPU201_1と、CPU201_2と、CPU201_3と、ディスプレイ202と、キーボード203と、I/F204(InterFace)と、RAM206(Random Access Memory)と、ROM207(Read Only Memory)と、を有している。マルチコアプロセッサシステム200は、フラッシュROM208と、フラッシュROMコントローラ209と、フラッシュROM210と、を有している。
CPU201_1〜201_3と、ディスプレイ202と、キーボード203と、I/F204と、RAM206と、ROM207と、フラッシュROM208と、フラッシュROMコントローラ209とは、バス211を介して接続されている。
ここで、CPU201_1〜201_3は、それぞれレジスタとコアとキャッシュを有している。コアは、演算機能を有している。各CPU内のレジスタは、PC(Program Counter)やリセットレジスタを有している。
CPU201_1はマスタCPUであり、マルチコアプロセッサシステム200の全体の制御を司り、OS221_1を実行する。OS221_1はマスタOSであり、CPU201_1に割り当てられたスレッドを実行する。OS221_1はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのCPUに割り当てるかを制御する機能を有している。スケジューラはCPU201_1に割り当てられたアプリケーションの実行順序を制御する機能を有する。
CPU201_2とCPU201_3はスレーブCPUであり、それぞれOS221_2とOS221_3を実行する。OS221_2とOS221_3はスレーブOSであり、それぞれCPU201_2とCPU201_3に割り当てられたスレッドを実行する。OS221_2はスケジューラを有し、スケジューラはCPU201_2に割り当てられたアプリケーションの実行順序を制御する機能を有する。OS221_3はスケジューラを有し、スケジューラはCPU201_3に割り当てられたアプリケーションの実行順序を制御する機能を有する。スレッド231_1〜231_3はアプリAに関するスレッドであり、同一の変数を共有することとする。スレッド231_1はCPU201_1に割り当てられ、スレッド231_2はCPU201_2に割り当てられ、スレッド231_3はCPU201_3に割り当てられている。
ディスプレイ202は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ202は、たとえば、TFT液晶ディスプレイなどを採用することができる。キーボード203は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード203は、タッチパネル式の入力パッドやテンキーなどであってもよい。
I/F204は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク205に接続され、ネットワーク205を介して他の装置に接続される。そして、I/F204は、ネットワーク205と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F204には、たとえばモデムやLANアダプタなどを採用することができる。
ROM207は、ブートプログラムなどのプログラムを記憶している。RAM206は、各CPUのワークエリアとして使用される。フラッシュROM208は、OS221_1〜221_3などのシステムソフトウェアやアプリケーションのプログラムを記憶している。RAM206はフラッシュROM208よりも各CPUからのアクセス速度が速い。各OSがアプリケーションのプログラムをフラッシュROM208からRAM206へロードすることにより、該アプリケーションのコンテキスト情報がRAM206内に展開される。
フラッシュROMコントローラ209は、各CPUの制御に従ってフラッシュROM210に対するデータのリード/ライトを制御する。フラッシュROM210は、フラッシュROMコントローラ209の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム200を使用するユーザがI/F204を通して取得した画像データ、映像データなどである。フラッシュROM210は、たとえば、メモリカード、SDカードなどを採用することができる。
(マルチコアプロセッサシステム200の機能例)
図3は、マルチコアプロセッサシステム200の機能例を示すブロック図である。マルチコアプロセッサシステム200は、スレッド231_m(m=1〜3)と、OS221_n(n=1〜3)と、を有している。スレッド231_mは、計数部301と格納部302とを有している。OS221_nは、検出部311と、算出部312と、判断部313と、実行部314と、判断部315と、変更部316と、を有している。
計数部301と格納部302はスレッド231_mにコーディングされており、スレッド231_mはフラッシュROM208などの記憶装置に記憶されている。CPU201_1〜201_3のいずれかのCPUが記憶装置からスレッド231_mを読み出し、コーディングされている処理を実行することにより、計数部301と格納部302が実行される。検出部311から変更部316はOS221_nにコーディングされており、OS221_nはフラッシュROM208などの記憶装置に記憶されている。CPU201_1〜201_3が記憶装置からそれぞれOS221_1〜221_3を読み出し、コーディングされている処理を実行することにより、検出部311から変更部316が実行される。
まず、複数のスレッドのうちいずれかのスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる第2の排他制御処理を実行した場合である。計数部301は、複数のスレッドのうち、いずれかのスレッド以外の排他対象スレッドとなる残余のスレッドが共有資源へのアクセスの試行回数を計数する。
ここで、共有資源としては、たとえば、複数のCPUで共有するRAM206、バス211やアプリケーションで共有する変数が挙げられる。ここで、第2の排他制御処理は、たとえば、スピンロックによる排他制御処理である。格納部302は、計数部301によって計数された試行回数をOSが参照可能な記憶領域に格納する。
検出部311は、記憶領域に格納された排他対象スレッドの共有資源へのアクセスの試行回数を検出する。判断部313は、検出部311によって検出された試行回数が所定回数以上であるか否かを判断する。算出部312は、残余のスレッドが複数ある場合、検出部311によって検出された残余のスレッドごとの共有資源へのアクセスの試行回数の平均値を算出する。格納部302は、算出部312によって算出された平均値を残余のスレッドが記憶領域に格納する。
実行部314は、判断部313によって試行回数が所定回数以上であると判断された場合、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第1の排他制御処理を実行する。
また、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第1の排他制御処理を実行した場合において説明する。判断部315は、排他対象スレッドのアクセス開始からの経過時間が所定時間以上であるか否かを判断する。
変更部316は、判断部315によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を解除する。変更部316は、判断部315によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を継続する。以上を踏まえて詳細に説明する。
図4は、排他フラグの生成例を示す説明図である。まず、具体的には、たとえば、スレッド231_1が、(1)排他フラグ403の領域と排他方式フラグ404との領域をRAM206上のプロセスデータ領域410に確保する。ここで、RAM206上はOSデータ領域411とプロセスデータ領域410とを有している。各OSが取り扱うデータがOSデータ領域411に格納され、各スレッドが取り扱うデータがプロセスデータ領域410に格納される。各スレッドはプロセスデータ領域410にアクセスできない。
たとえば、スレッド231_1が、(2)スレッド231_1が属するアプリケーションの起動予定を含めた総スレッド数をテーブル400から取得する。テーブル400は、アプリ名、総スレッド数のフィールドを有する。アプリ名にはアプリケーションの識別情報が登録され、総スレッド数には、アプリ名に登録された識別情報のアプリケーションの総スレッド数が登録されている。ここでは、スレッド231_1はアプリAに属するスレッドであるため、総スレッド数として3が取得される。
たとえば、スレッド231_1が、(3)取得した総スレッド数分の待ち開始時刻レジスタの領域と総スレッド数分のSC(スピンロックカウンタ)の領域をRAM206上のプロセスデータ領域410に確保する。図4では、SC401_1〜401_3と、待ち開始時刻レジスタ402_1〜402_3がプロセスデータ領域410内に確保されている。
たとえば、スレッド231_1が、(4)排他フラグ403を0(開放状態)に設定し、排他方式フラグ404を0(スピンロック方式)に設定する。たとえば、スレッド231_1が、(5)SC401_1〜401_3に0を設定する。たとえば、スレッド231_1が、(6)確保したすべての領域の参照情報405をOS221_1に通知する。ここで、参照情報405とはOS221_1からプロセスデータ領域410に確保された領域を参照するための情報であり、参照情報405には、該確保された領域にスレッドがアクセスする際に用いる確保された領域の先頭アドレスが記述されている。
たとえば、OS221_1が、スレッド231_1から参照情報405を受け付けると、参照情報405に対応する排他の識別情報を生成する。排他の識別情報は、スレッド231_1が領域を確保した排他に関する情報を識別するための情報である。本実施の形態では1つの排他制御処理のみに着目しているが、実際には複数の排他制御処理があるため、各排他に関する情報に識別するための情報が付される。たとえば、OS221_1が、(7)排他の識別情報と参照情報405とを関連付けてOSデータ領域411に登録する。たとえば、OS221_1が、いずれかのスレッドから排他の識別情報を受け付けると、受け付けた排他の識別情報に基づいて参照情報405を参照する。たとえば、OS221_1が、参照情報405に記述されている先頭アドレスに応じてプロセスデータ領域410内の確保された領域に記憶されているデータにアクセスすることができる。つぎに、たとえば、OS221_1が、排他の識別情報をスレッド231_1に通知する。たとえば、スレッド231_1が、OS221_1から排他の識別情報を受け付けると、排他の識別情報を、確保された領域と関連付けて記録する。
図5は、スレッドが共有資源に関する処理を実行する例を示す説明図である。たとえば、スレッド231_1が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が0であるため、たとえば、スレッド231_1が、排他フラグ403を0(開放状態)から1(利用中)に変更する。たとえば、スレッド231_1が、SC401_1に0を設定する。
たとえば、スレッド231_2が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_2が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が0(スピンロック)であるため、スレッド231_2が、SC401_2をインクリメントする。これにより、SCの値が1となる。そして、スレッド231_2が、排他フラグ403のチェックと排他方式フラグ404のチェックを繰り返す。排他フラグ403のチェックが1(利用中)であり、排他方式フラグ404が0(スピンロック)である間、スレッド231_2がSC401_2のインクリメントを繰り返す。
たとえば、スレッド231_3が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_3が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が0(スピンロック)であるため、スレッド231_3が、SC401_3をインクリメントする。これにより、SCの値が1となる。そして、スレッド231_3が、排他フラグ403のチェックと排他方式フラグ404のチェックを繰り返す。排他フラグ403のチェックが1(利用中)であり、排他方式フラグ404が0(スピンロック)である間、スレッド231_3がSC401_3のインクリメントを繰り返す。
図6は、タイマ割り込みの発生時の例を示す説明図である。OS221_1が、タイマ割り込みを受け付けると、たとえば、複数の排他の識別情報から、一の排他の識別情報を選択する。たとえば、OS221_1が、(1)選択した一の排他の識別情報の参照情報405に基づいて排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。たとえば、排他フラグ403が1(利用中)であるため、OS221_1が、(2)排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。
たとえば、排他方式フラグ404が0(スピンロック)であるため、OS221_1が、全スピンロックカウンタの値を検出する。OS221_1が、(3)値が0以外のカウンタの値の平均値を算出する。ここでは、SC401_1の値は0であり、SC401_2の値は300であり、SC401_3の値は296であるため、平均値が298である。たとえば、OS221_1が、(4)算出した平均値が所定回数以上であるか否かを判断する。ここでは、所定回数を280とする。算出された平均値が所定回数以上であるため、たとえば、OS221_1が、(5)排他方式フラグ404を0(スピンロック)から1(トライロック)に変更する。ここでは、平均値が所定回数以上であると判断しているが、これに限らず、たとえば、中央値が所定回数以上であるか判断してもよいし、所定回数以上のカウンタの値が複数個以上あるかなどの多数決であってもよい。
図7は、トライロックされる例を示す説明図である。たとえば、スレッド231_2が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_2が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が1(トライロック)であるため、スレッド231_2が、排他の識別情報を指定してトライロックをOS221_2に依頼する。
OS221_2が、スレッド231_2から受け付けた排他の識別情報に対応するフラグ待ちキュー406にスレッド231_2の識別情報を登録する。OS221_2が、現在時刻を取得し、スレッド231_2の待ち開始時刻レジスタ402_2に現在時刻を設定する。待ち開始時刻レジスタ402_2は、15:00:10となる。OS221_2が、再スケジューリングを行う。ここでは、CPU201_2にはスレッド231_2のみが割り当てられているため、CPU201_2は待ち状態となる。
たとえば、スレッド231_3が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_3が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が1(トライロック)であるため、スレッド231_3が、排他の識別情報を指定してトライロックをOS221_3に依頼する。
OS221_3が、スレッド231_3から受け付けた識別情報に対応するフラグ待ちキュー406にスレッド231_3の識別情報を登録する。OS221_3が、現在時刻を取得し、スレッド231_3の待ち開始時刻レジスタ402_3に現在時刻を設定する。待ち開始時刻レジスタ402_3は15:00:11である。OS221_3が、再スケジューリングを行う。ここでは、CPU201_3にはスレッド231_3のみが割り当てられているため、CPU201_3は待ち状態となる。
図8は、スレッド231_1の排他処理の終了例を示す説明図である。たとえば、スレッド231_1が、排他方式フラグ404の状態を取得することにより、(1)排他フラグ403をチェックする。ここでは、排他方式フラグ404がトライロックであるため、たとえば、スレッド231_1が、(2)排他の識別情報を指定してOS221_1に開放依頼を通知する。たとえば、OS221_1が、開放依頼通知を受け付けると、現在時刻を取得する。たとえば、OS221_1が、(3)フラグ待ちキュー406に登録されているスレッドの識別情報を取得する。ここでは、スレッド231_2とスレッド231_3のそれぞれの識別情報が取得される。
たとえば、OS221_1が、取得したスレッドの識別情報が示すスレッドの待ち開始時刻レジスタから時刻を検出する。たとえば、OS221_1が、(4)現在時刻と取得したそれぞれの時刻との差分値(待ち時間)を算出する。たとえば、OS221_1が、取得した時刻ごとの差分値に基づいて平均待ち時間を算出する。現在時刻が15:10:20である。待ち開始時刻レジスタ402_2の値は15:10:10であり、待ち開始時刻レジスタ402_3の値は15:10:11である。平均待ち時間は、9.5[秒]である。
たとえば、OS221_1が、(5)算出した平均待ち時間が所定時間以下であるか否かを判断する。ここでは、所定時間を3[秒]とする。算出した平均待ち時間が所定時間以下でないため、トライロックのままとなる。ここでは、平均待ち時間が所定時間以下であるか否かを判断しているが、これに限らず、待ち時間の中央値が所定時間以下であるか否かを判断してもよいし、待ち時間が所定時間以下である数が何個であるかの多数決で判断してもよい。また、ここでは例示していないが、算出した平均待ち時間が所定時間以下ある場合、トライロックからスピンロックに変更される。
たとえば、OS221_1が、(6)排他フラグ403を1(利用中)から0(開放状態)に変更する。たとえば、OS221_1が、(7)フラグ待ちキューの先頭に識別情報が登録されているスレッド231_2の実行を再開させる。
図9は、スレッド231_2による排他処理の開始例を示す説明図である。たとえば、スレッド231_2が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_2が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が1(トライロック)であるため、スレッド231_2が、排他の識別情報を指定してトライロックをOS221_2に依頼する。
(OSとスレッドによる排他制御処理手順)
図10は、OSとスレッドによる排他生成手順の一例を示すフローチャートである。スレッドが、排他フラグ、排他方式フラグ領域を確保し(ステップS1001)、起動予定を含めた総スレッド数を取得し(ステップS1002)、総スレッド数分のスピンロックカウンタと待ち開始時刻レジスタ領域を確保する(ステップS1003)。
スレッドが、排他フラグを開放状態に設定し(ステップS1004)、排他方式フラグをスピンロックに設定する(ステップS1005)。ここでは、スピンロックに設定しているが、トライロックに設定しておいてもよい。スレッドが、すべてのスピンロックカウンタに0を設定し(ステップS1006)、確保したすべての領域の参照情報をOSに通知する(ステップS1007)。
OSが、参照情報を受け付けると、参照情報に関する排他の識別情報を生成し(ステップS1008)、排他の識別情報と参照情報を記録し(ステップS1009)、排他の識別情報を参照情報の通知元のスレッドへ通知する(ステップS1010)。スレッドが、排他の識別情報を受け付けると、識別情報を記録し(ステップS1011)、一連の処理を終了する。
図11は、OSとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。スレッドが、共有資源へアクセスを行う、または待ち状態から復帰するか否かを判断する(ステップS1101)。スレッドが、共有資源へのアクセスを開始していない、および待ち状態から復帰していないと判断した場合(ステップS1101:No)、ステップS1101へ戻る。
スレッドが、共有資源へのアクセスを行うまたは待ち状態から復帰したと判断した場合(ステップS1101:Yes)、排他フラグの状態を取得し(ステップS1102)、排他フラグの状態が利用中であるか否かを判断する(ステップS1103)。スレッドが、排他フラグの状態が利用中でないと判断した場合(ステップS1103:No)、特殊命令により排他フラグを利用中に変更する(ステップS1104)。スレッドが、変更成功したか否かを判断し(ステップS1105)、変更成功したと判断した場合(ステップS1105:Yes)、スピンロックカウンタに0を設定する(ステップS1106)。
スレッドが、排他フラグの状態が利用中であると判断した場合(ステップS1103:Yes)、または変更成功していないと判断した場合(ステップS1105:No)、排他方式フラグの状態を取得する(ステップS1107)。スレッドが、排他方式がスピンロックであるか否かを判断する(ステップS1108)。スレッドが、排他方式がスピンロックであると判断した場合(ステップS1108:Yes)、スピンロックカウンタをインクリメントし(ステップS1110)、ステップS1101へ戻る。スレッドが、排他方式がスピンロックでないと判断した場合(ステップS1108:No)、排他の識別情報を指定してトライロック依頼を通知する(ステップS1109)。
ステップS1109のつぎに、OSが、スレッドからのトライロック依頼を受け付けると、依頼元スレッドの識別情報を排他の識別情報に対応するフラグ待ちキューに登録する(ステップS1111)。OSが、現在時刻を取得し(ステップS1112)、待ち開始時刻レジスタに現在時刻を記録する(ステップS1113)。OSが、再スケジューリングし(ステップS1114)、実行スレッド切り替え処理を実行する(ステップS1115)。
図12は、OSとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。まず、スレッドが、排他方式フラグの状態を取得し(ステップS1201)、排他方式がスピンロックであるか否かを判断する(ステップS1202)。スレッドが、排他方式がスピンロックであると判断した場合(ステップS1202:Yes)、排他フラグを空き状態に変更し(ステップS1203)、一連の処理を終了する。
スレッドが、排他方式がスピンロックでないと判断した場合(ステップS1202:No)、排他の識別情報を指定して開放依頼をOSへ通知する(ステップS1204)。OSが、スレッドから開放依頼を受け付けると、現在時刻を取得する(ステップS1205)。OSが、排他の識別情報に対応するフラグ待ちキューからスレッドの識別情報をすべて取得する(ステップS1206)。
OSが、フラグ待ちキューに登録されている識別情報で示されるスレッドの待ち開始時刻を取得し(ステップS1207)、平均待ち時間を算出し(ステップS1208)、平均待ち時間が所定時間以下であるか否かを判断する(ステップS1209)。OSが、平均待ち時間が所定時間以下であると判断した場合(ステップS1209:Yes)、排他方式フラグの状態をスピンロックに変更する(ステップS1210)。
OSが、排他フラグを空き状態に変更し(ステップS1211)、フラグ待ちキューに登録されている識別情報で示されるスレッドをすべて再開させ(ステップS1212)、一連の処理を終了する。OSが、平均待ち時間が所定時間以下でないと判断した場合(ステップS1209:No)、排他フラグを開放状態に変更する(ステップS1213)。OSが、フラグ待ちキューの先頭に登録されている識別情報で示されるスレッドを再開させ(ステップS1214)、一連の処理を終了する。
図13は、OSによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。まず、OSが、タイマ割り込みを受け付けたか否かを判断する(ステップS1301)。OSが、タイマ割り込みを受け付けていないと判断した場合(ステップS1301:No)、ステップS1301へ戻る。OSが、タイマ割り込みを受け付けたと判断した場合(ステップS1301:Yes)、登録されている排他情報から未選択の1つを選択する(ステップS1302)。OSが、選択可能な排他情報が無いか否かを判断する(ステップS1303)。
OSが、選択可能な排他情報が無いと判断しなかった場合(ステップS1303:No)、排他フラグの状態を取得する(ステップS1304)。OSが、排他フラグの状態が利用中であるか否かを判断し(ステップS1305)、利用中でないと判断した場合(ステップS1305:No)、ステップS1302へ戻る。
OSが、排他フラグの状態が利用中であると判断した場合(ステップS1305:Yes)、排他方式フラグの状態を取得し(ステップS1306)、排他方式がスピンロックであるか否かを判断する(ステップS1307)。OSが、排他方式がスピンロックでないと判断した場合(ステップS1307:No)、ステップS1302へ戻る。
OSが、排他方式がスピンロックであると判断した場合(ステップS1307:Yes)、すべてのスピンロックカウンタの値を取得する(ステップS1308)。OSが、値が0以外のスピンロックカウンタの平均値を算出し(ステップS1309)、平均値が所定回数以上であるか否かを判断する(ステップS1310)。
OSが、平均値が所定回数以上でないと判断した場合(ステップS1310:No)、ステップS1302へ戻る。OSが、平均値が所定回数以上であると判断した場合(ステップS1310:Yes)、排他方式フラグにトライロックを設定し(ステップS1311)、ステップS1302へ移行する。
ステップS1303において、OSが、選択可能な排他情報が無いと判断した場合(ステップS1303:Yes)、一連の処理を終了する。また、排他制御に関する処理は終了するが、OSは通常のタイマ割り込み処理を行う。
以上説明したように、排他制御方法、および排他制御プログラムによれば、排他対象スレッドによるスピンロックでの排他制御処理が実行され、共有資源へのアクセスの試行回数が所定回数以上であれば、OSによるトライロックでの排他制御処理が実行される。スピンロックをOSの機能を利用せずに実現することにより、共有資源が開放されてから獲得までのオーバーヘッドを削減することができる。また、スピンロック時にOSを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
また、OSが、排他対象スレッドがアクセス可能な記録領域に試行回数を記憶させる記憶領域を確保することで、OSを呼び出さずにスピンロックを行うことができる。
また、各排他対象スレッドがスピンロックとトライロックのうちいずれの方式で排他制御処理を利用しているかを、排他方式フラグにより管理することで、方式の切り替えを容易に行うことができる。また、OSが、排他対象スレッドがアクセス可能な記録領域に排他方式フラグを記憶させる記憶領域を確保することで、排他対象スレッドがOSを呼び出さずにスピンロックを行うことができる。
また、排他対象スレッドが複数ある場合、共有資源へのアクセスの試行回数の平均値が、所定回数以上であるか否かによって、OSによるトライロックに切り替えるか否かを判断する。排他対象スレッドがどの程度試行しているかを相対的に判断することができる。
また、OSによるトライロックでの排他制御処理が実行され、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間未満であれば、スレッドによるスピンロックでの排他制御処理が実行される。共有資源の排他権の開放が短時間の場合、共有資源に対してスピンロックでの排他制御処理を行うことができる。さらに、スピンロックをOSの機能を利用せずに実現することにより、共有資源が開放されてから他のスレッドによる排他権の獲得までのオーバーヘッドを短くすることができる。また、スピンロック時にOSを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
また、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間以上であれば、OSによるトライロックでの排他制御処理が継続して実行される。これにより、共有資源の排他権の開放までに時間がかかる場合、共有資源に対してトライロックでの排他制御処理を行うことができる。
なお、本実施の形態で説明した排他制御方法は、予め用意された排他制御プログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本排他制御プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本排他制御プログラムは、インターネット等のネットワークを介して配布してもよい。
221_1〜221_3 OS
231_1〜231_3 スレッド
410 プロセスデータ領域
401_1〜401_3 SC
本発明は、共有資源へのアクセスを制御する排他制御方法、および排他制御プログラムに関する。
マルチコアプロセッサシステムもしくはマルチタスクOS(Operating System)を搭載したシングルプロセッサシステムでは複数のプロセスまたはスレッドが同時に動作することができる。
ここで、たとえば、スレッド#0とスレッド#1の二つのスレッドが同時にメモリ上の変数xに1を足そうとする。変数xに1を足すという処理は、CPU(Central Processing Unit)のオペレーションのレベルではメモリから変数xの値を読み込んで、読み込んだ値に1を足して、足した結果をメモリ上の変数xに書き込むという3ステップで行われる。
図14は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。マルチコアプロセッサシステムにおいて、たとえば、スレッド#0とスレッド#1がそれぞれCPU#0とCPU#1で同時に実行されているとする。時刻t1でスレッド#0がメモリから変数xの値をLoad命令で読み込んだ時点では変数xの値は0とする。読み込まれた変数xの値はCPU内のレジスタR1に格納されて時刻t2でレジスタR1に1が足され、足された結果がレジスタR1に格納される。時刻t2でCPU#1ではスレッド#1が実行されていて、スレッド#1で同じくLoad命令で変数xの値を読み込む。変数xの値は0であるので、CPU#1のレジスタR2には0が格納される。
・時刻t1:R1=x=0
・時刻t2:R1=R1+1=1、R2=x=0
時刻t3でスレッド#0がレジスタR1の値をメモリの変数xに書き込む。さらに、時刻t4でスレッド#1がR2に1を足した結果を書き込むが、該足した結果は1のため、変数xには再度1が書き込まれる。
・時刻t3:x=R1=1、R2=R2+1=1
・時刻t4:x=R2=1
このように、スレッド#0が変数xに1を足した結果を書き込む前にスレッド#1が変数xの値をメモリから読み込んでしまうと、変数xに2回1を足したにも関わらず、結果として変数xの値が1しか増えていないことになる問題が生じる。シングルプロセッサシステムでも、マルチタスクOSの場合は複数のプロセスもしくはスレッドが時分割的に実行されるため、同様の問題が生じる。
そのため、共有するメモリ上のデータやDMA(Direct Memory Access)等のハードウェアデバイスといった共有資源を複数のプロセスもしくはスレッドで利用する場合は排他制御を行わなければならない。排他制御ではメモリ上に置かれた排他フラグをCPUが提供するスワップや排他ロードストアといった特殊命令を利用して更新することで、排他フラグに関連付けられた共有資源が利用中であるか否かを管理する。
特殊命令で書き込みを行った場合は複数のCPUが同時に同じフラグに値を書き込もうとした場合に、一つのCPUしか書き込みを成功させることができない。特殊命令でフラグに書き込みを行った後で、特殊命令の結果を確認して排他フラグに利用中を示す値を書き込んだスレッドのみが対象の共有資源へのアクセス権を獲得出来たことになる。もしくは、シングルプロセッサシステムであればOSに排他フラグの更新を行わせることで特殊命令を利用しなくても排他制御が可能になる。アクセス権を獲得したスレッドは共有資源の利用が終了したら時刻t2で排他フラグに開放を示す値を書き込むことで共有資源の利用終了を宣言する。
アクセス権を獲得出来なかったスレッドは、アクセス権を獲得したスレッドが共有資源の利用を終了してアクセス権を開放するまで待たなければならない。ここで、アクセス権を獲得できなかったスレッドが、アクセス権を開放するまで待つ方式として、スピンロックとトライロックの2つの方式が知られている。
図15は、スピンロックの一例を示す説明図である。図15で示すように、スピンロックでは、アクセス権を獲得できなかったスレッドが、排他フラグの値が開放を示す値になるまで排他獲得処理を繰り返す。スピンロックでは、排他制御によりアクセス権を獲得したスレッドは、共有資源の利用が完了したら排他フラグに開放中を示す値を書き込むことで共有資源の利用完了を宣言する。
図15では、スレッド#1が時刻t1で先に排他権を獲得したため、スレッド#0は時刻t2で排他権の獲得に失敗し、排他権の獲得の試行を繰り返す。時刻t3でスレッド#1が排他権を開放するため、スレッド#0では時刻t4での直後の排他権の獲得試行で成功することができる。
図16は、トライロックの一例を示す説明図である。図16で示すように、トライロックでは、アクセス権が開放されるまで、アクセス権を獲得できなかったスレッドの実行が停止される。トライロックの場合は、共有資源の利用が完了したら排他フラグを開放中に変更すると共にOSにアクセス権の開放を通知する。アクセス権が開放されたらOSは停止していたスレッドの実行を再開する。
図16では、時刻t1でスレッド#0が排他権の獲得を試みるが、既にスレッド#1により排他フラグが利用中になっていたとすると、OSによりスレッド#0は待ち状態に変更されて代わりに別のスレッド(ここではスレッド#1)に実行権が移る。その後、スレッド#1がこのフラグを開放すると、また、OSによりスレッド#0が実行可能な状態に変更される。
スピンロックでは、共有資源が開放されるまで繰り返し排他フラグを確認するため、共有資源が長時間開放されない場合はCPUの処理能力を無駄遣いする恐れがある。トライロックの場合は共有資源が開放されるまでスレッドの実行を停止するため、該スレッドの実行が停止されている間に他のスレッドを実行したり、実行可能なスレッドが無ければCPUを停止したりするといったことでCPUの処理能力を無駄遣いすることは無い。しかしながら、OSによるスレッドの停止/再開処理のためにオーバーヘッドが発生し、複数スレッドが動作している場合、動作再開後即座にスレッドが実行可能となる保障もないため、共有資源が利用可能になってから実際に利用を開始するまでにオーバーヘッドが発生することになる。
したがって、短時間で開放される共有資源に対してはスピンロックで排他制御処理を行い、開放までに時間がかかる共有資源に対してはトライロックで排他制御処理を行うのがよい。しかしながら、共有資源の開放までの待ち時間は資源の状態や利用しているスレッド数などによっても変わってくるため、一意に決めることは難しい。
そこで、排他解除までの待ち時間を統計情報として記録して実行時に適した排他方式に切り替える技術が知られている(たとえば、下記特許文献1参照。)。また、実行時に排他解除までの統計情報を記録し(たとえば、下記特許文献2参照。)、実行時に排他方式を切り替える(たとえば、下記特許文献3参照。)技術が知られている。
特開2001−84235号公報
特開平10−312294号公報
特開平11−85574号公報
しかしながら、従来技術では排他制御でOSを利用する際の呼び出しコストについては考慮されていないという問題点がある。スピンロックで単純に排他フラグを確認するだけの処理は通常は数命令程度で実現でき、メモリアクセスのコストを考慮しても数十〜数百[ナノ秒]程度で一回の排他フラグの確認を行うことができる。
しかしながら、排他フラグの更新をOSで行う場合は排他フラグを確認するためにOSを呼び出さなければならない。アプリケーションプログラムからOSの処理を呼び出すためには割り込みを使ってCPUを特権モードに遷移させるなどの処理が行われるため、数十[μ秒]〜数百[μ秒]とフラグの確認処理よりも遙かに多くの時間がかかる。
図17は、OSの利用による呼び出しコストを示す説明図である。図17のように、スレッドが排他フラグを確認した直後(時刻t1)、別のCPUによりフラグが開放された場合、OSの機能を利用しない場合(左側の図の場合)にはスレッドが時刻t2でフラグを獲得して共有資源を使った処理を開始できる。しかしながら、OSの機能を利用した場合(右側の図の場合)は、OSが割り込みの復帰を行ってからスレッドの処理に戻る。そして、スレッドからの再度排他獲得要求によりOSに処理が移って、OSが排他権を獲得して、またスレッドの処理に戻るなど、OSとスレッドの処理実行を行き来することになり、時刻t2’になるまでスレッドが共有資源を利用した処理を開始できない。
たとえば、従来技術のように、トライロックによる排他制御処理とスピンロックによる排他制御処理をOSが切り替えると、OSとスレッドの実行を行き来するために、OSによるオーバーヘッドが生じる問題点があった。
本発明は、上述した従来技術による問題点を解消するため、OSによるオーバーヘッドを削減することができる排他制御方法、および排他制御プログラムを提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明の一の側面によれば、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行し、複数のスレッドのうちいずれかのスレッドにより、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記複数のスレッドのうち前記いずれかのスレッド以外の前記排他対象スレッドとなる残余のスレッドにより、前記共有資源へのアクセスの試行回数を計数し、計数された試行回数を前記残余のスレッドにより、前記記憶領域に格納する排他制御方法、および排他制御プログラムが提案される。
本発明の一の側面によれば、OSによるオーバーヘッドを削減することができるという効果を奏する。
図1は、本発明の一例を示す説明図である。
図2は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。
図3は、マルチコアプロセッサシステム200の機能例を示すブロック図である。
図4は、排他フラグの生成例を示す説明図である。
図5は、スレッドが共有資源に関する処理を実行する例を示す説明図である。
図6は、タイマ割り込みの発生時の例を示す説明図である。
図7は、トライロックされる例を示す説明図である。
図8は、スレッド231_1の排他処理の終了例を示す説明図である。
図9は、スレッド231_2による排他処理の開始例を示す説明図である。
図10は、OSとスレッドによる排他生成手順の一例を示すフローチャートである。
図11は、OSとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。
図12は、OSとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。
図13は、OSによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。
図14は、マルチコアプロセッサシステムでの共有資源へのアクセス例を示す説明図である。
図15は、スピンロックの一例を示す説明図である。
図16は、トライロックの一例を示す説明図である。
図17は、OSの利用による呼び出しコストを示す説明図である。
以下に添付図面を参照して、本発明にかかる排他制御方法、および排他制御プログラムの実施の形態を詳細に説明する。
図1は、本発明の一例を示す説明図である。スレッドAとスレッドBとが変数xを共有している。ここでは、排他フラグの状態が空きであり、排他方式フラグがスピンロックを示していることとする。
たとえば、スレッドAが、(1)変数xへアクセスするために排他フラグを利用中に設定すると、スレッドAから変数xへのアクセスが許可される。スレッドBが、変数xへアクセスするために排他フラグを取得すると、すでに利用中に変更されているため、変数xへのアクセスが禁止される。すなわち、スレッドBがスピンロックによる排他制御処理を実行する。スレッドBが、(2)変数xへのアクセスが許可されるまで排他フラグの取得を繰り返し、アクセス可能か否かを試行する。スレッドBが、たとえば、試行する都度、(3)試行回数を計数し、(4)スピンロックカウンタに試行回数を格納する。
たとえば、OSが、一定のタイミングで、(5)スピンロックカウンタの値を検出する。たとえば、OSが、(6)スピンロックカウンタの値が所定回数以上であるか否かを判断する。たとえば、OSが、スピンロックカウンタの値が所定回数以上である場合、(7)スレッドBを停止させることにより、スレッドBからのアクセスの試行を禁止する。
本排他制御装置はシングルコアシステムであってもマルチコアプロセッサシステムであってもよいが、本実施の形態ではマルチコアプロセッサシステムを例に挙げて説明する。ここで、マルチコアプロセッサシステムにおいて、マルチコアプロセッサとは、コアが複数搭載されたプロセッサである。コアが複数搭載されていれば、複数のコアが搭載された単一のプロセッサでもよく、シングルコアのプロセッサが並列されているプロセッサ群でもよい。なお、本実施の形態では、説明を単純化するため、シングルコアのプロセッサが並列されているプロセッサ群を例に挙げて説明する。
(マルチコアプロセッサシステムのハードウェア例)
図2は、実施の形態にかかるマルチコアプロセッサシステムのハードウェア例を示すブロック図である。マルチコアプロセッサシステム200は、CPU201_1と、CPU201_2と、CPU201_3と、ディスプレイ202と、キーボード203と、I/F204(InterFace)と、RAM206(Random Access Memory)と、ROM207(Read Only Memory)と、を有している。マルチコアプロセッサシステム200は、フラッシュROM208と、フラッシュROMコントローラ209と、フラッシュROM210と、を有している。
CPU201_1〜201_3と、ディスプレイ202と、キーボード203と、I/F204と、RAM206と、ROM207と、フラッシュROM208と、フラッシュROMコントローラ209とは、バス211を介して接続されている。
ここで、CPU201_1〜201_3は、それぞれレジスタとコアとキャッシュを有している。コアは、演算機能を有している。各CPU内のレジスタは、PC(Program Counter)やリセットレジスタを有している。
CPU201_1はマスタCPUであり、マルチコアプロセッサシステム200の全体の制御を司り、OS221_1を実行する。OS221_1はマスタOSであり、CPU201_1に割り当てられたスレッドを実行する。OS221_1はスケジューラを有し、スケジューラは起動指示を受け付けたアプリケーションをマルチコアプロセッサのうちのいずれのCPUに割り当てるかを制御する機能を有している。スケジューラはCPU201_1に割り当てられたアプリケーションの実行順序を制御する機能を有する。
CPU201_2とCPU201_3はスレーブCPUであり、それぞれOS221_2とOS221_3を実行する。OS221_2とOS221_3はスレーブOSであり、それぞれCPU201_2とCPU201_3に割り当てられたスレッドを実行する。OS221_2はスケジューラを有し、スケジューラはCPU201_2に割り当てられたアプリケーションの実行順序を制御する機能を有する。OS221_3はスケジューラを有し、スケジューラはCPU201_3に割り当てられたアプリケーションの実行順序を制御する機能を有する。スレッド231_1〜231_3はアプリAに関するスレッドであり、同一の変数を共有することとする。スレッド231_1はCPU201_1に割り当てられ、スレッド231_2はCPU201_2に割り当てられ、スレッド231_3はCPU201_3に割り当てられている。
ディスプレイ202は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。ディスプレイ202は、たとえば、TFT液晶ディスプレイなどを採用することができる。キーボード203は、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード203は、タッチパネル式の入力パッドやテンキーなどであってもよい。
I/F204は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク205に接続され、ネットワーク205を介して他の装置に接続される。そして、I/F204は、ネットワーク205と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F204には、たとえばモデムやLANアダプタなどを採用することができる。
ROM207は、ブートプログラムなどのプログラムを記憶している。RAM206は、各CPUのワークエリアとして使用される。フラッシュROM208は、OS221_1〜221_3などのシステムソフトウェアやアプリケーションのプログラムを記憶している。RAM206はフラッシュROM208よりも各CPUからのアクセス速度が速い。各OSがアプリケーションのプログラムをフラッシュROM208からRAM206へロードすることにより、該アプリケーションのコンテキスト情報がRAM206内に展開される。
フラッシュROMコントローラ209は、各CPUの制御に従ってフラッシュROM210に対するデータのリード/ライトを制御する。フラッシュROM210は、フラッシュROMコントローラ209の制御で書き込まれたデータを記憶する。データの具体例としては、マルチコアプロセッサシステム200を使用するユーザがI/F204を通して取得した画像データ、映像データなどである。フラッシュROM210は、たとえば、メモリカード、SDカードなどを採用することができる。
(マルチコアプロセッサシステム200の機能例)
図3は、マルチコアプロセッサシステム200の機能例を示すブロック図である。マルチコアプロセッサシステム200は、スレッド231_m(m=1〜3)と、OS221_n(n=1〜3)と、を有している。スレッド231_mは、計数部301と格納部302とを有している。OS221_nは、検出部311と、算出部312と、判断部313と、実行部314と、判断部315と、変更部316と、を有している。
計数部301と格納部302はスレッド231_mにコーディングされており、スレッド231_mはフラッシュROM208などの記憶装置に記憶されている。CPU201_1〜201_3のいずれかのCPUが記憶装置からスレッド231_mを読み出し、コーディングされている処理を実行することにより、計数部301と格納部302が実行される。検出部311から変更部316はOS221_nにコーディングされており、OS221_nはフラッシュROM208などの記憶装置に記憶されている。CPU201_1〜201_3が記憶装置からそれぞれOS221_1〜221_3を読み出し、コーディングされている処理を実行することにより、検出部311から変更部316が実行される。
まず、複数のスレッドのうちいずれかのスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる第2の排他制御処理を実行した場合である。計数部301は、複数のスレッドのうち、いずれかのスレッド以外の排他対象スレッドとなる残余のスレッドが共有資源へのアクセスの試行回数を計数する。
ここで、共有資源としては、たとえば、複数のCPUで共有するRAM206、バス211やアプリケーションで共有する変数が挙げられる。ここで、第2の排他制御処理は、たとえば、スピンロックによる排他制御処理である。格納部302は、計数部301によって計数された試行回数をOSが参照可能な記憶領域に格納する。
検出部311は、記憶領域に格納された排他対象スレッドの共有資源へのアクセスの試行回数を検出する。判断部313は、検出部311によって検出された試行回数が所定回数以上であるか否かを判断する。算出部312は、残余のスレッドが複数ある場合、検出部311によって検出された残余のスレッドごとの共有資源へのアクセスの試行回数の平均値を算出する。格納部302は、算出部312によって算出された平均値を残余のスレッドが記憶領域に格納する。
実行部314は、判断部313によって試行回数が所定回数以上であると判断された場合、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第1の排他制御処理を実行する。
また、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで排他対象スレッドの共有資源へのアクセスの試行を禁止する第1の排他制御処理を実行した場合において説明する。判断部315は、排他対象スレッドのアクセス開始からの経過時間が所定時間以上であるか否かを判断する。
変更部316は、判断部315によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を解除する。変更部316は、判断部315によって経過時間が所定時間以上でないと判断された場合、排他対象スレッドの共有資源へのアクセスの試行の禁止を継続する。以上を踏まえて詳細に説明する。
図4は、排他フラグの生成例を示す説明図である。まず、具体的には、たとえば、スレッド231_1が、(1)排他フラグ403の領域と排他方式フラグ404との領域をRAM206上のプロセスデータ領域410に確保する。ここで、RAM206上はOSデータ領域411とプロセスデータ領域410とを有している。各OSが取り扱うデータがOSデータ領域411に格納され、各スレッドが取り扱うデータがプロセスデータ領域410に格納される。各スレッドはプロセスデータ領域410にアクセスできない。
たとえば、スレッド231_1が、(2)スレッド231_1が属するアプリケーションの起動予定を含めた総スレッド数をテーブル400から取得する。テーブル400は、アプリ名、総スレッド数のフィールドを有する。アプリ名にはアプリケーションの識別情報が登録され、総スレッド数には、アプリ名に登録された識別情報のアプリケーションの総スレッド数が登録されている。ここでは、スレッド231_1はアプリAに属するスレッドであるため、総スレッド数として3が取得される。
たとえば、スレッド231_1が、(3)取得した総スレッド数分の待ち開始時刻レジスタの領域と総スレッド数分のSC(スピンロックカウンタ)の領域をRAM206上のプロセスデータ領域410に確保する。図4では、SC401_1〜401_3と、待ち開始時刻レジスタ402_1〜402_3がプロセスデータ領域410内に確保されている。
たとえば、スレッド231_1が、(4)排他フラグ403を0(開放状態)に設定し、排他方式フラグ404を0(スピンロック方式)に設定する。たとえば、スレッド231_1が、(5)SC401_1〜401_3に0を設定する。たとえば、スレッド231_1が、(6)確保したすべての領域の参照情報405をOS221_1に通知する。ここで、参照情報405とはOS221_1からプロセスデータ領域410に確保された領域を参照するための情報であり、参照情報405には、該確保された領域にスレッドがアクセスする際に用いる確保された領域の先頭アドレスが記述されている。
たとえば、OS221_1が、スレッド231_1から参照情報405を受け付けると、参照情報405に対応する排他の識別情報を生成する。排他の識別情報は、スレッド231_1が領域を確保した排他に関する情報を識別するための情報である。本実施の形態では1つの排他制御処理のみに着目しているが、実際には複数の排他制御処理があるため、各排他に関する情報に識別するための情報が付される。たとえば、OS221_1が、(7)排他の識別情報と参照情報405とを関連付けてOSデータ領域411に登録する。たとえば、OS221_1が、いずれかのスレッドから排他の識別情報を受け付けると、受け付けた排他の識別情報に基づいて参照情報405を参照する。たとえば、OS221_1が、参照情報405に記述されている先頭アドレスに応じてプロセスデータ領域410内の確保された領域に記憶されているデータにアクセスすることができる。つぎに、たとえば、OS221_1が、排他の識別情報をスレッド231_1に通知する。たとえば、スレッド231_1が、OS221_1から排他の識別情報を受け付けると、排他の識別情報を、確保された領域と関連付けて記録する。
図5は、スレッドが共有資源に関する処理を実行する例を示す説明図である。たとえば、スレッド231_1が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が0であるため、たとえば、スレッド231_1が、排他フラグ403を0(開放状態)から1(利用中)に変更する。たとえば、スレッド231_1が、SC401_1に0を設定する。
たとえば、スレッド231_2が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_2が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が0(スピンロック)であるため、スレッド231_2が、SC401_2をインクリメントする。これにより、SCの値が1となる。そして、スレッド231_2が、排他フラグ403のチェックと排他方式フラグ404のチェックを繰り返す。排他フラグ403のチェックが1(利用中)であり、排他方式フラグ404が0(スピンロック)である間、スレッド231_2がSC401_2のインクリメントを繰り返す。
たとえば、スレッド231_3が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_3が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が0(スピンロック)であるため、スレッド231_3が、SC401_3をインクリメントする。これにより、SCの値が1となる。そして、スレッド231_3が、排他フラグ403のチェックと排他方式フラグ404のチェックを繰り返す。排他フラグ403のチェックが1(利用中)であり、排他方式フラグ404が0(スピンロック)である間、スレッド231_3がSC401_3のインクリメントを繰り返す。
図6は、タイマ割り込みの発生時の例を示す説明図である。OS221_1が、タイマ割り込みを受け付けると、たとえば、複数の排他の識別情報から、一の排他の識別情報を選択する。たとえば、OS221_1が、(1)選択した一の排他の識別情報の参照情報405に基づいて排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。たとえば、排他フラグ403が1(利用中)であるため、OS221_1が、(2)排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。
たとえば、排他方式フラグ404が0(スピンロック)であるため、OS221_1が、全スピンロックカウンタの値を検出する。OS221_1が、(3)値が0以外のカウンタの値の平均値を算出する。ここでは、SC401_1の値は0であり、SC401_2の値は300であり、SC401_3の値は296であるため、平均値が298である。たとえば、OS221_1が、(4)算出した平均値が所定回数以上であるか否かを判断する。ここでは、所定回数を280とする。算出された平均値が所定回数以上であるため、たとえば、OS221_1が、(5)排他方式フラグ404を0(スピンロック)から1(トライロック)に変更する。ここでは、平均値が所定回数以上であると判断しているが、これに限らず、たとえば、中央値が所定回数以上であるか判断してもよいし、所定回数以上のカウンタの値が複数個以上あるかなどの多数決であってもよい。
図7は、トライロックされる例を示す説明図である。たとえば、スレッド231_2が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_2が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が1(トライロック)であるため、スレッド231_2が、排他の識別情報を指定してトライロックをOS221_2に依頼する。
OS221_2が、スレッド231_2から受け付けた排他の識別情報に対応するフラグ待ちキュー406にスレッド231_2の識別情報を登録する。OS221_2が、現在時刻を取得し、スレッド231_2の待ち開始時刻レジスタ402_2に現在時刻を設定する。待ち開始時刻レジスタ402_2は、15:00:10となる。OS221_2が、再スケジューリングを行う。ここでは、CPU201_2にはスレッド231_2のみが割り当てられているため、CPU201_2は待ち状態となる。
たとえば、スレッド231_3が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_3が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が1(トライロック)であるため、スレッド231_3が、排他の識別情報を指定してトライロックをOS221_3に依頼する。
OS221_3が、スレッド231_3から受け付けた識別情報に対応するフラグ待ちキュー406にスレッド231_3の識別情報を登録する。OS221_3が、現在時刻を取得し、スレッド231_3の待ち開始時刻レジスタ402_3に現在時刻を設定する。待ち開始時刻レジスタ402_3は15:00:11である。OS221_3が、再スケジューリングを行う。ここでは、CPU201_3にはスレッド231_3のみが割り当てられているため、CPU201_3は待ち状態となる。
図8は、スレッド231_1の排他処理の終了例を示す説明図である。たとえば、スレッド231_1が、排他方式フラグ404の状態を取得することにより、(1)排他フラグ403をチェックする。ここでは、排他方式フラグ404がトライロックであるため、たとえば、スレッド231_1が、(2)排他の識別情報を指定してOS221_1に開放依頼を通知する。たとえば、OS221_1が、開放依頼通知を受け付けると、現在時刻を取得する。たとえば、OS221_1が、(3)フラグ待ちキュー406に登録されているスレッドの識別情報を取得する。ここでは、スレッド231_2とスレッド231_3のそれぞれの識別情報が取得される。
たとえば、OS221_1が、取得したスレッドの識別情報が示すスレッドの待ち開始時刻レジスタから時刻を検出する。たとえば、OS221_1が、(4)現在時刻と取得したそれぞれの時刻との差分値(待ち時間)を算出する。たとえば、OS221_1が、取得した時刻ごとの差分値に基づいて平均待ち時間を算出する。現在時刻が15:10:20である。待ち開始時刻レジスタ402_2の値は15:10:10であり、待ち開始時刻レジスタ402_3の値は15:10:11である。平均待ち時間は、9.5[秒]である。
たとえば、OS221_1が、(5)算出した平均待ち時間が所定時間以下であるか否かを判断する。ここでは、所定時間を3[秒]とする。算出した平均待ち時間が所定時間以下でないため、トライロックのままとなる。ここでは、平均待ち時間が所定時間以下であるか否かを判断しているが、これに限らず、待ち時間の中央値が所定時間以下であるか否かを判断してもよいし、待ち時間が所定時間以下である数が何個であるかの多数決で判断してもよい。また、ここでは例示していないが、算出した平均待ち時間が所定時間以下ある場合、トライロックからスピンロックに変更される。
たとえば、OS221_1が、(6)排他フラグ403を1(利用中)から0(開放状態)に変更する。たとえば、OS221_1が、(7)フラグ待ちキューの先頭に識別情報が登録されているスレッド231_2の実行を再開させる。
図9は、スレッド231_2による排他処理の開始例を示す説明図である。たとえば、スレッド231_2が、排他フラグ403の状態を取得することにより、排他フラグ403をチェックする。ここでは、排他フラグ403が1(利用中)であるため、スレッド231_2が、排他方式フラグ404の状態を取得することにより、排他方式フラグ404をチェックする。ここでは、排他方式フラグ404が1(トライロック)であるため、スレッド231_2が、排他の識別情報を指定してトライロックをOS221_2に依頼する。
(OSとスレッドによる排他制御処理手順)
図10は、OSとスレッドによる排他生成手順の一例を示すフローチャートである。スレッドが、排他フラグ、排他方式フラグ領域を確保し(ステップS1001)、起動予定を含めた総スレッド数を取得し(ステップS1002)、総スレッド数分のスピンロックカウンタと待ち開始時刻レジスタ領域を確保する(ステップS1003)。
スレッドが、排他フラグを開放状態に設定し(ステップS1004)、排他方式フラグをスピンロックに設定する(ステップS1005)。ここでは、スピンロックに設定しているが、トライロックに設定しておいてもよい。スレッドが、すべてのスピンロックカウンタに0を設定し(ステップS1006)、確保したすべての領域の参照情報をOSに通知する(ステップS1007)。
OSが、参照情報を受け付けると、参照情報に関する排他の識別情報を生成し(ステップS1008)、排他の識別情報と参照情報を記録し(ステップS1009)、排他の識別情報を参照情報の通知元のスレッドへ通知する(ステップS1010)。スレッドが、排他の識別情報を受け付けると、識別情報を記録し(ステップS1011)、一連の処理を終了する。
図11は、OSとスレッドによる排他制御開始時の処理手順の一例を示すフローチャートである。スレッドが、共有資源へアクセスを行う、または待ち状態から復帰するか否かを判断する(ステップS1101)。スレッドが、共有資源へのアクセスを開始していない、および待ち状態から復帰していないと判断した場合(ステップS1101:No)、ステップS1101へ戻る。
スレッドが、共有資源へのアクセスを行うまたは待ち状態から復帰したと判断した場合(ステップS1101:Yes)、排他フラグの状態を取得し(ステップS1102)、排他フラグの状態が利用中であるか否かを判断する(ステップS1103)。スレッドが、排他フラグの状態が利用中でないと判断した場合(ステップS1103:No)、特殊命令により排他フラグを利用中に変更する(ステップS1104)。スレッドが、変更成功したか否かを判断し(ステップS1105)、変更成功したと判断した場合(ステップS1105:Yes)、スピンロックカウンタに0を設定する(ステップS1106)。
スレッドが、排他フラグの状態が利用中であると判断した場合(ステップS1103:Yes)、または変更成功していないと判断した場合(ステップS1105:No)、排他方式フラグの状態を取得する(ステップS1107)。スレッドが、排他方式がスピンロックであるか否かを判断する(ステップS1108)。スレッドが、排他方式がスピンロックであると判断した場合(ステップS1108:Yes)、スピンロックカウンタをインクリメントし(ステップS1110)、ステップS1101へ戻る。スレッドが、排他方式がスピンロックでないと判断した場合(ステップS1108:No)、排他の識別情報を指定してトライロック依頼を通知する(ステップS1109)。
ステップS1109のつぎに、OSが、スレッドからのトライロック依頼を受け付けると、依頼元スレッドの識別情報を排他の識別情報に対応するフラグ待ちキューに登録する(ステップS1111)。OSが、現在時刻を取得し(ステップS1112)、待ち開始時刻レジスタに現在時刻を記録する(ステップS1113)。OSが、再スケジューリングし(ステップS1114)、実行スレッド切り替え処理を実行する(ステップS1115)。
図12は、OSとスレッドによる排他権の解放時の処理手順の一例を示すフローチャートである。まず、スレッドが、排他方式フラグの状態を取得し(ステップS1201)、排他方式がスピンロックであるか否かを判断する(ステップS1202)。スレッドが、排他方式がスピンロックであると判断した場合(ステップS1202:Yes)、排他フラグを空き状態に変更し(ステップS1203)、一連の処理を終了する。
スレッドが、排他方式がスピンロックでないと判断した場合(ステップS1202:No)、排他の識別情報を指定して開放依頼をOSへ通知する(ステップS1204)。OSが、スレッドから開放依頼を受け付けると、現在時刻を取得する(ステップS1205)。OSが、排他の識別情報に対応するフラグ待ちキューからスレッドの識別情報をすべて取得する(ステップS1206)。
OSが、フラグ待ちキューに登録されている識別情報で示されるスレッドの待ち開始時刻を取得し(ステップS1207)、平均待ち時間を算出し(ステップS1208)、平均待ち時間が所定時間以下であるか否かを判断する(ステップS1209)。OSが、平均待ち時間が所定時間以下であると判断した場合(ステップS1209:Yes)、排他方式フラグの状態をスピンロックに変更する(ステップS1210)。
OSが、排他フラグを空き状態に変更し(ステップS1211)、フラグ待ちキューに登録されている識別情報で示されるスレッドをすべて再開させ(ステップS1212)、一連の処理を終了する。OSが、平均待ち時間が所定時間以下でないと判断した場合(ステップS1209:No)、排他フラグを開放状態に変更する(ステップS1213)。OSが、フラグ待ちキューの先頭に登録されている識別情報で示されるスレッドを再開させ(ステップS1214)、一連の処理を終了する。
図13は、OSによるタイマ割り込み発生時の排他制御処理手順の一例を示すフローチャートである。まず、OSが、タイマ割り込みを受け付けたか否かを判断する(ステップS1301)。OSが、タイマ割り込みを受け付けていないと判断した場合(ステップS1301:No)、ステップS1301へ戻る。OSが、タイマ割り込みを受け付けたと判断した場合(ステップS1301:Yes)、登録されている排他情報から未選択の1つを選択する(ステップS1302)。OSが、選択可能な排他情報が無いか否かを判断する(ステップS1303)。
OSが、選択可能な排他情報が無いと判断しなかった場合(ステップS1303:No)、排他フラグの状態を取得する(ステップS1304)。OSが、排他フラグの状態が利用中であるか否かを判断し(ステップS1305)、利用中でないと判断した場合(ステップS1305:No)、ステップS1302へ戻る。
OSが、排他フラグの状態が利用中であると判断した場合(ステップS1305:Yes)、排他方式フラグの状態を取得し(ステップS1306)、排他方式がスピンロックであるか否かを判断する(ステップS1307)。OSが、排他方式がスピンロックでないと判断した場合(ステップS1307:No)、ステップS1302へ戻る。
OSが、排他方式がスピンロックであると判断した場合(ステップS1307:Yes)、すべてのスピンロックカウンタの値を取得する(ステップS1308)。OSが、値が0以外のスピンロックカウンタの平均値を算出し(ステップS1309)、平均値が所定回数以上であるか否かを判断する(ステップS1310)。
OSが、平均値が所定回数以上でないと判断した場合(ステップS1310:No)、ステップS1302へ戻る。OSが、平均値が所定回数以上であると判断した場合(ステップS1310:Yes)、排他方式フラグにトライロックを設定し(ステップS1311)、ステップS1302へ移行する。
ステップS1303において、OSが、選択可能な排他情報が無いと判断した場合(ステップS1303:Yes)、一連の処理を終了する。また、排他制御に関する処理は終了するが、OSは通常のタイマ割り込み処理を行う。
以上説明したように、排他制御方法、および排他制御プログラムによれば、排他対象スレッドによるスピンロックでの排他制御処理が実行され、共有資源へのアクセスの試行回数が所定回数以上であれば、OSによるトライロックでの排他制御処理が実行される。スピンロックをOSの機能を利用せずに実現することにより、共有資源が開放されてから獲得までのオーバーヘッドを削減することができる。また、スピンロック時にOSを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
また、OSが、排他対象スレッドがアクセス可能な記録領域に試行回数を記憶させる記憶領域を確保することで、OSを呼び出さずにスピンロックを行うことができる。
また、各排他対象スレッドがスピンロックとトライロックのうちいずれの方式で排他制御処理を利用しているかを、排他方式フラグにより管理することで、方式の切り替えを容易に行うことができる。また、OSが、排他対象スレッドがアクセス可能な記録領域に排他方式フラグを記憶させる記憶領域を確保することで、排他対象スレッドがOSを呼び出さずにスピンロックを行うことができる。
また、排他対象スレッドが複数ある場合、共有資源へのアクセスの試行回数の平均値が、所定回数以上であるか否かによって、OSによるトライロックに切り替えるか否かを判断する。排他対象スレッドがどの程度試行しているかを相対的に判断することができる。
また、OSによるトライロックでの排他制御処理が実行され、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間未満であれば、スレッドによるスピンロックでの排他制御処理が実行される。共有資源の排他権の開放が短時間の場合、共有資源に対してスピンロックでの排他制御処理を行うことができる。さらに、スピンロックをOSの機能を利用せずに実現することにより、共有資源が開放されてから他のスレッドによる排他権の獲得までのオーバーヘッドを短くすることができる。また、スピンロック時にOSを呼び出さないことで、キャッシュ内のデータのスワップ数を減らすことができる。
また、排他対象スレッドが共有資源へアクセスするアクセス開始時刻からの経過時間が所定時間以上であれば、OSによるトライロックでの排他制御処理が継続して実行される。これにより、共有資源の排他権の開放までに時間がかかる場合、共有資源に対してトライロックでの排他制御処理を行うことができる。
なお、本実施の形態で説明した排他制御方法は、予め用意された排他制御プログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本排他制御プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本排他制御プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータが、
複数のスレッドのうちの第1のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第1のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第2のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第2のスレッドが、前記記憶領域に格納する格納処理と、
を実行することを特徴とする排他制御方法。
(付記2)前記第2のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする付記1に記載の排他制御方法。
(付記3)前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記1または2に記載の排他制御方法。
(付記4)複数のスレッドのうちの第1のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第1のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第2のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータが、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行することを特徴とする排他制御方法。
(付記5)前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする付記4に記載の排他制御方法。
(付記6)前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記4または5に記載の排他制御方法。
(付記7)前記オペレーティングシステムが、前記第2のスレッドが複数ある場合、前記検出処理によって検出された前記第2のスレッドごとの前記試行回数の平均値を算出する算出処理を実行し、
前記判断処理は、前記算出処理によって算出された平均値が前記所定回数以上であるか否かを判断し、
前記実行処理は、前記判断処理によって前記平均値が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行することを特徴とする付記4〜6のいずれか一つに記載の排他制御方法。
(付記8)排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を、前記排他対象スレッドから前記共有資源へのアクセス開始からの経過時間に応じて、複数のスレッドのうちの第1のスレッドが実行するコンピュータが、
オペレーティングシステムが、排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行した場合、前記経過時間が所定時間以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記経過時間が前記所定時間以上でないと判断された場合、前記排他対象スレッドの前記共有資源へのアクセスの試行の禁止を解除する変更処理と、
を実行することを特徴とする排他制御方法。
(付記9)前記オペレーティングシステムが、前記判断処理によって前記経過時間が前記所定時間より長いと判断する場合、前記排他対象スレッドの前記共有資源へのアクセスの試行の禁止を継続すること、
を特徴とする付記8に記載の排他制御方法。
(付記10)排他対象スレッドが共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を、記憶領域に格納された前記排他対象スレッドの前記共有資源へのアクセスの試行回数に応じて、オペレーティングシステムが実行するコンピュータに、
複数のスレッドのうちの第1のスレッドが、前記排他対象スレッドに前記共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第1のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第2のスレッドが、前記共有資源へのアクセスの試行回数を計数する計数処理と、
前記計数処理によって計数された試行回数を前記第2のスレッドが、前記記憶領域に格納する格納処理と、
を実行させることを特徴とする排他制御プログラム。
(付記11)前記第2のスレッドは、前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報、または、前記共有資源へのアクセスが許可されるまで試行させる排他制御処理に関する情報を参照すること、
を特徴とする付記10に記載の排他制御プログラム。
(付記12)前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記10または11に記載の排他制御プログラム。
(付記13)複数のスレッドのうちの第1のスレッドが、排他対象スレッドに共有資源へのアクセスが許可されるまで試行させる排他制御処理を実行した場合、前記第1のスレッド以外の前記排他対象スレッドを含む少なくとも一以上の第2のスレッドが前記共有資源へのアクセスの試行回数を記憶領域に格納する処理を実行するコンピュータに、
オペレーティングシステムが、前記記憶領域に格納された前記スレッドの前記共有資源へのアクセスの試行回数を検出する検出処理と、
前記オペレーティングシステムが、前記検出処理によって検出された試行回数が所定回数以上であるか否かを判断する判断処理と、
前記オペレーティングシステムが、前記判断処理によって前記試行回数が前記所定回数以上であると判断された場合、前記排他対象スレッドが前記共有資源へアクセスすると排他制御が解除されるまで前記排他対象スレッドの前記共有資源へのアクセスの試行を禁止する排他制御処理を実行する実行処理と、
を実行させることを特徴とする排他制御プログラム。
(付記14)前記オペレーティングシステムは、前記共有資源へのアクセスの試行を禁止する排他制御処理に関する情報を前記複数のスレッドがアクセス可能な領域に設定すること、
を特徴とする付記13に記載の排他制御プログラム。
(付記15)前記排他対象スレッドが前記共有資源へのアクセスが許可されるまで試行する排他制御処理は前記オペレーティングシステムを介することなく試行されること、
を特徴とする付記13または14に記載の排他制御プログラム。
221_1〜221_3 OS
231_1〜231_3 スレッド
410 プロセスデータ領域
401_1〜401_3 SC