次に、本発明の実施形態について図面を参照して説明する。
なお、各図面は、本発明の実施形態を説明するものである。そのため、本発明は、各図面の記載に限られるわけではない。また、各図面の同様の構成には、同じ番号を付し、その繰り返しの説明は、省略する場合がある。
(第1の実施形態)
図1は、本発明おける第1の実施形態に係る情報処理装置10の構成の一例を示すブロック図である。なお、図1において、本実施形態の説明に関係しない構成(例えば、入出力部)は、省略した。
情報処理装置10は、プロセッサ20aと、プロセッサ20bと、資源制御部30とを含む。
プロセッサ20aとプロセッサ20bとをまとめて、プロセッサ20と言う。
プロセッサ20は、資源制御部30を用いて、図示しない共有リソースを使用する。
より詳細な動作は、後ほど説明するが、プロセッサ20は、資源制御部30を、次のように用いる。
プロセッサ20は、共有リソースを更新(例えば、データを更新)する場合、資源制御部30が含む情報(以下、「制御情報30a」と言う)を更新して変更処理を進める。つまり、プロセッサ20は、制御情報30aの変化に基づいて、共有リソースの更新を検出できる。
なお、図1において、プロセッサ20a及びプロセッサ20bを2つ示した例示である。情報処理装置10は、3つ以上のプロセッサ20を含んでも良い。
また、プロセッサ20は、情報処理装置10の処理の単位の一例である。プロセッサ20は、CPUのように単独のプロセッサでもよく、CPUとROM(Read Only Memory)とRAM(Random Access Memory)と記憶装置と含むコンピュータのような装置でもよく、CPU上で実行されるプロセス、スレッド又はタスクでもよい。そのため、プロセッサ20は、「処理部」と言うこともできる。
資源制御部30は、共有リソースに対応する制御情報30aを保持する。既に説明しているが、制御情報30aは、共有リソースの更新の状態を示す情報である。なお、制御情報30aは、更新を示す情報として変数(制御用の変数)を含む。
なお、情報処理装置10は、共有資源(リソース)毎に資源制御部30を含んでも良い。あるいは、資源制御部30は、複数の共有リソースに対応しても良い。
ただし、以下では、説明を明確にするため、資源制御部30及び対象となる共有リソースを1つとして説明する。
次に、本実施形態の情報処理装置10の動作について説明する。
本実施形態の資源制御部30の制御情報30aが含む制御用の変数に特に制限はない。ただし、本実施形態は、図2に示すように、制御情報30aとして開始変数31と終了変数32とを含むとして説明する。
共有リソースを更新するプロセッサ20は、更新処理の開始時に開始変数31を更新する。
また、共有リソースを更新するプロセッサ20は、更新処理の終了時に終了変数32を更新する。
なお、開始変数31及び終了変数32の更新内容は、予め、情報処理装置10において、共有リソースを参照するプロセッサ20が判別できるように決めておけば特に制限はない。本実施形態の説明では、一例として、開始変数31及び終了変数32の初期値をどちらも「0」とし、更新を「1加算」として説明する。つまり、開始変数31と終了変数32は、更新中ではない場合、同じ値となり、更新中の場合、異なる値となる。
また、共有リソースの変更及び参照は、いずれのプロセッサ20が行っても良い。ただし、以下、説明の便宜のため、特に断らない限り、プロセッサ20aが共有リソースを更新し、プロセッサ20bが共有リソースを参照する。
まず、共有リソースの更新動作について説明する。
プロセッサ20aは、共有リソースを更新する場合、共有リソースが他のプロセッサから更新されることを防ぐため、排他機構を用いて占有する。この占有は、特に制限はない。例えば、プロセッサ20aは、資源制御部30を占有(ロック設定)しても良い。あるいは、プロセッサ20aは、一般的な排他機構(例えば、共有リソースのロック機構)を用いてもよい。そのため、共有リソースの占有についての詳細な説明は、省略する。
そして、プロセッサ20aは、共有リソースを更新するときに、次に説明する動作を行う。
図3は、本実施形態の情報処理装置10の更新動作の一例を示すフローチャートである。
プロセッサ20aは、開始変数31を更新(1加算)する(ステップ101)。
次に、プロセッサ20aは、共有リソースの仕様を基に更新に必要な保護機構を設定する(ステップ102)。プロセッサ20aは、この動作を、共有リソースの仕様に従って行う。例えば、共有リソースがメモリの場合、プロセッサ20aは、メモリの順序性を保障するメモリバリア(メモリフェンス)を設定する。なお、既にプロセッサ20aが、共有リソースを占有しているため、更なる保護機構が不要な場合、プロセッサ20aは、ステップ102を省略しても良い。
保護を設定後、プロセッサ20aは、共有リソースを更新する(ステップ103)。
更新後、プロセッサ20aは、保護機構を解除する(ステップ104)。なお、ステップ102を省略した場合、プロセッサ20aは、ステップ104を省略する。
その後、プロセッサ20aは、終了変数32を更新(1加算)する(ステップ105)。
全ての更新が終了すると、プロセッサ20aは、共有リソースの占有を解除(ロック解除)する。
図4は、情報処理装置10の更新動作の一例のシーケンス図である。図4において、共有リソースの保護機能についての動作を省略した。
プロセッサ20aは、開始変数31を更新する(1001)。
そして、プロセッサ20aは、共有リソースを更新する(1002)。
その後、プロセッサ20aは、終了変数32を更新する(1003)。
このような動作を基に、情報処理装置10は、共有リソースの更新に関して、次の状態を実現する。
(1)更新中、開始変数31の値と終了変数32の値とが異なる。
(2)更新の後の開始変数31及び終了変数32の値が、更新前の開始変数31及び終了変数32の値と異なる。
このように、共有リソースを更新するプロセッサ20aは、更新の前に開始変数31を更新し、更新終了後に終了変数32を更新する。
なお、図4には、参考として、プロセッサ20bが、共有リソースを更新する場合のシーケンス(1004−1006)も示している。プロセッサ20bは、プロセッサ20aのロック解除後、共有リソースのロックを設定してから、図4に示す動作を実行する。
次に、本実施形態の情報処理装置10が、共有リソースを参照する場合の動作について説明する。
図5は、情報処理装置10の参照動作の一例を示すフローチャートである。
共有リソースを参照するプロセッサ20bは、参照の前に開始変数31と終了変数32(以下、合わせて「両変数」と言う)を読み出す(ステップ201)。以下、ステップ201で読み出した変数を「第1の変数」と言う。
プロセッサ20bは、第1の開始変数31と第1の終了変数32との値を確認する(ステップ202)。具体的には、プロセッサ20bは、第1の開始変数31と第1の終了変数32とが同じか否かを判定する。この判定は、上記のとおり、共有リソースが更新中であるか否かの判定である。
第1の開始変数31と第1の終了変数32とが異なる、つまり、更新中の場合(ステップ202でNO)、プロセッサ20bは、ステップ201に戻り、更新が終了するまで待つ。プロセッサ20bは、この待ちを、ステップ201と202との繰り返し(スピンロック)として待つ。ただし、本実施形態の情報処理装置10は、スピンロックに限る必要はない。例えば、プロセッサ20bは、図示しないウェイト管理機構を備え、ウェイト状態として再開を待っても良い。
第1の開始変数31と第1の終了変数32とが一致、つまり更新中でない場合(ステップ202でYES)、プロセッサ20bは、共有データを参照、例えば、データを読み出す(ステップ203)。
参照が終了すると、プロセッサ20bは、両変数を読み出す(ステップ204)。ステップ204で読み出した変数を「第2の変数」と言う。
次に、プロセッサ20bは、第1の終了変数32と第2の終了変数32とを確認する(ステップ205)。具体的には、プロセッサ20bは、第1の終了変数32と第2の終了変数32とが同じか否かを判定する。この判定は、第1の両変数を読み出した後、終了した更新処理が発生したか否かの判定である。
第1の終了変数32と第2の終了変数32が異なる、つまり、終了した更新が発生した場合(ステップ205でNO)、プロセッサ20bは、ステップ201に戻り、最初から参照動作を始める。ステップ201に戻るのは、共有リソースが更新されているため、ステップ203での参照が無効の可能性があるためである。
第1の終了変数32と第2の終了変数32とが同じ場合(ステップ205でYES)、プロセッサ20bは、第2の開始変数31と第2の終了変数32とを確認する(ステップ206)。具体的には、プロセッサ20bは、第2の開始変数31と第2の終了変数32が同じか否かを判定する。この判定は、新しい更新動作中であるか否かの判定である。
第2の開始変数31と第2の終了変数32とが異なる、つまり、更新中の場合(ステップ206でNO)、プロセッサ20bは、ステップ201に戻り、最初から参照動作を始める。ステップ201に戻るのは、共有リソースの更新が開始されているため、ステップ203での参照が無効の可能性があるためである。
第2の開始変数31と第2の終了変数32とが同じ場合(ステップ206でYES)、プロセッサ20bは、参照動作を終了する。その後、プロセッサ20bは、適宜、次の動作に移る。
なお、ステップ205とステップ206は、どちらも変数の判定の動作である。そのため、情報処理装置10は、この動作を分けず、1つの判定動作としても良い。
このように、共有リソースを参照するプロセッサ20bは、共有リソースに排他機構を設定されているか否かに係わらず、開始変数31と終了変数32とを基に、共有リソースを参照できる。
次に、情報処理装置10が、適切に共有リソースを参照できることを、図6−図9を参照して説明する。なお、図面の煩雑さを避けるため、図6−図9において、図5のステップ205とステップ206との判断は、1つの判断として示す。
まず、共有リソースの更新動作と参照動作とが重ならない場合について説明する。
図6は、プロセッサ20aが共有リソースの更新後に、プロセッサ20bが参照動作を開始した場合のシーケンス図である。
プロセッサ20bは、第1の両変数を読み出す(2001)。この場合、第1の開始変数31及び終了変数32は、同じ値(図6では「01」)となる。
そのため、第1の開始変数31と第1の終了変数32との判定(図5のステップ202)は、YESとなる(2002)。
そして、プロセッサ20bは、共有リソースを参照する(2003)。
参照後、プロセッサ20bは、第2の両変数を読み出す(2004)。この場合、第2の開始変数31及び終了変数32は、第1の開始変数31及び終了変数32と同じ値(図6では「01」)となる。
そのため、ステップ205及び206に対応する変数の判定は、どちらもYESとなる(2005)。
その結果、プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
次に、プロセッサ20aが更新動作中に、プロセッサ20bが参照動作を開始した場合について説明する。
図7は、プロセッサ20aが更新動作中に、プロセッサ20bが参照動作を開始した場合のシーケンス図である。
プロセッサ20bは、第1の両変数を読み出す(3001)。この場合、プロセッサ20aは、更新中である。そのため、第1の開始変数31及び第1の終了変数32は、異なる値(図7では、開始変数31が「01」、終了変数32が「00」)となる。
そのため、第1の開始変数31と第1の終了変数32との判定(図5のステップ202)は、NOとなる(3002)。
プロセッサ20aの更新動作が終了するまで、第1の開始変数31と終了変数32とが異なる。そのため、プロセッサ20bは、図5のステップ201−202(図7では、3001−3002)を繰り返す。
プロセッサ20aが更新動作を終了すると、第1の開始変数31と終了変数32とが同じ値となる。
その後、プロセッサ20bが、第1の両変数を読み出す(3003)と、第1の開始変数31及び第1の終了変数32は、同じ値(図7では「01」)である。
そのため、第1の開始変数31と第1の終了変数32との判定(図5のステップ202)は、YESとなる(3004)。
これ以降、プロセッサ20bは、図6の2003−2005と同様に動作する。
つまり、プロセッサ20bは、共有リソースを参照する(3005)。
参照後、プロセッサ20bは、第2の両変数を読み出す(3006)。この場合、第2の開始変数31及び終了変数32は、第1の開始変数31及び終了変数32と同じ値(図7では「01」)である。
そのため、ステップ205及び206に対応する変数の判定は、どちらもYESとなる(3007)。
その結果、プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
次に、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始した場合について説明する。まず、プロセッサ20bの第2の変数の確認前に、プロセッサ20aの更新動作が終了した場合について説明する。
図8は、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始し、プロセッサ20bの第2の変数の確認前に、プロセッサ20aの更新動作が終了した場合のシーケンス図である。
プロセッサ20bは、第1の両変数を読み込む(4001)。この場合、第1の開始変数31及び終了変数32は、同じ値(図8では「00」)である。
そのため、第1の開始変数31と第1の終了変数32との判定(図5のステップ202)は、YESとなる(4002)。
プロセッサ20bは、共有リソースを参照する(4003)。
ただし、プロセッサ20aは、プロセッサ20bが共有リソースを参照中に、共有リソースを更新する。そのため、開始変数31及び終了変数32は、どちらも更新(図8ではどちらも「01」)される。
参照後、プロセッサ20bは、第2の両変数を読み出す(4004)。上記のとおり、第2の両変数は、更新された後のため、第1の両変数とは異なる。
そのため、プロセッサ20bの変数の判定、具体的には、図5のステップ205の判定がNOとなる(4005)。
その結果、プロセッサ20bは、参照動作の最初(図5のステップ201)に戻り、参照動作をやり直す。つまり、プロセッサ20bは、図6の2001−2005に相当する図8の4006−4010を実行する。
具体的に説明すると次のとおりである。
プロセッサ20bは、第1の両変数を読み出す(4006)。第1の開始変数31及び終了変数32は、同じ値(図8では、「01」)となる。
プロセッサ20bは、第1の開始変数31と終了変数32を判定する(4007)。
第1の両変数が同じため、プロセッサ20bは、共有リソースを参照する(4008)。
参照後、プロセッサ20bは、第2の両変数を読み出す(4009)。この場合、第2の両変数は、第1の両変数と同じ値(図8では「01」)である。
そのため、プロセッサ20bの変数の判定は、YESとなる(4010)。
プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
続いて、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始し、プロセッサ20bの第2の変数の確認時に、プロセッサ20aの更新動作が終了していない場合について説明する。
図9は、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始し、プロセッサ20bの第2の変数の確認時に、プロセッサ20aの更新動作が終了していない場合のシーケンス図である。
プロセッサ20bは、第1の両変数を読み出す(5001)。この場合、第1の開始変数31及び終了変数32は、同じ値(図9では「00」)である。
そのため、第1の開始変数31と第1の終了変数32との判定(図5のステップ202)は、YESとなる(5002)。
プロセッサ20bは、共有リソースを参照する(5003)。
ただし、プロセッサ20aは、プロセッサ20bが共有リソースを参照中に、共有リソースの更新を開始している。そのため、開始変数31は、更新(図9では「01」)されている。
参照後、プロセッサ20bは、第2の両変数を読み出す(5004)。上記のとおり、第2の開始変数31は、更新されたため、第2の終了変数32と異なる。
そのため、プロセッサ20bの変数の判定、具体的には、図5のステップ206の判定がNOとなる(5005)。
そのため、プロセッサ20bは、参照動作の最初(図5のステップ201)に戻り、参照動作をやり直す。
これ以降の動作は、図7と同様の動作になる。
つまり、プロセッサ20bは、第1の開始変数31と終了変数32が一致するまで、両変数の読み出しと判定を繰り返す。
プロセッサ20aが、更新を終了すると、開始変数31と終了変数32とが同じ値(図9では「01」)となる。
その後、プロセッサ20bが、第1の両変数を読み出す(5006)と、第1の開始変数31及び終了変数32は、同じ値(図9では、「01」)である。
プロセッサ20bは、第1の開始変数31と終了変数32を判定する(5007)。
第1の変数が同じため、プロセッサ20bは、共有リソースを参照する(5008)。
参照後、プロセッサ20bは、第2の両変数を読み出す(5009)。この場合、第2の両変数は、第1の両変数と同じ値(図9では「01」)である。
そのため、プロセッサ20bの変数の判定は、YESとなる(5010)。
プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
このように構成された第1の実施形態の情報処理装置10は、特別な命令を用いずに、性能の低下を削減した排他制御を実現する効果を得ることができる。
その理由は、次のとおりである。
情報処理装置10は、制御情報30aとして開始変数31及び終了変数32を含む。
そして、共有リソースを更新するプロセッサ20aは、占有している共有リソースの更新を開始するときに開始変数31を更新し、更新を終了したときに終了変数32を更新する。
プロセッサ20bに基づく共有リソースの参照は、共有リソースに影響を与えない。そのため、プロセッサ20bは、いつでも共有リソースを参照できる。さらに、プロセッサ20bは、開始変数31及び終了変数32を基に、共有リソースが更新中であるか否か、及び、参照中に更新が発生したか否かを判定できる。
つまり、プロセッサ20bは、更新が発生していない場合、常に共有リソースを参照できる。そして、更新中の場合、プロセッサ20bは、更新終了後に共有リソースを参照できる。また、参照中に更新が発生した場合、プロセッサ20bは、参照後に、更新の発生を検出できるため、再度参照し、更新後の共有リソースを参照できる。
このように、共有リソースを参照するプロセッサ20bは、共有リソースが更新するプロセッサ20aに占有されている場合でも、共有リソースを参照できる。
つまり、本実施形態の情報処理装置10の共有リソースを参照するプロセッサ20bは、共有リソースを占有しているプロセッサ20aの占有解除を待たなくても、共有リソースを参照できる。
このため、本実施形態の情報処理装置10は、共有リソースの参照において、占有の解除の待ち時間を削減できる。その結果、情報処理装置10は、占有解除の待ち時間に基づく性能低下を削減できる。
また、本実施形態の情報処理装置10の共有リソースを参照するプロセッサ20bは、開始変数31及び終了変数32を用い、ロック設定及び解除せずに共有リソースを参照できる。
そのため、共有リソースを参照するプロセッサ20bは、ロックの取得や解除などの処理を必要としない。そのため、情報処理装置10は、さらに、性能低下の低減できる。また、情報処理装置10は、ロックの競合を低減できる。
さらに、共有リソースを参照するプロセッサ20bは、ロック取得が必要ないため、並列処理が可能である。その結果、情報処理装置10の処理性能が、さらに向上できるためである。
なお、本実施形態の情報処理装置10の構成は、これまでの説明に限らない。情報処理装置10は、複数の構成を1つの構成としても良い。あるいは、情報処理装置10は、1つの構成を複数の構成に分けても良い。また、情報処理装置10は、CPU(Central Processing Unit)と、ROM(Read Only Memory)と、RAM(Random Access Memory)とを含むコンピュータとして実現しても良い。
図10は、本実施形態の別の構成である情報処理装置60の構成の一例を示す図である。
情報処理装置60は、CPU610aと、CPU610bと、ROM620と、RAM630と、IO(Input/Output)640と、内部記憶装置650と、キーボード660と、マウス670と、ディスプレイ680と、NIC690とを含み、コンピュータを構成している。
CPU610a及びCPU610bは、ROM620、又は、IO640を介して内部記憶装置650からプログラムを読み込む。そして、CPU610a及びCPU610bは、読み込んだプログラムに基づいて、既に説明した本実施形態の情報処理装置10のプロセッサ20として各機能を実現する。CPU610a及びCPU610bは、各機能を実現する際に、RAM630及び内部記憶装置650を一時記憶として使用する。また、CPU610a及びCPU610bは、資源制御部30としてRAM630又は内部記憶装置650を用いる。また、CPU610a及びCPU610bは、NIC690を介して、図示しない他の処理装置と情報をやり取りする。さらに、CPU610a及びCPU610bは、IO640を介して、キーボード660及びマウス670から入力データを受信し、ディスプレイ680に表示データを表示する。
なお、CPU610a又はCPU610bは、コンピュータで読み取り可能にプログラムを記憶した記憶媒体700が含むプログラムを、図示しない記憶媒体読み取り装置を用いて読み込んでも良い。あるいは、CPU610a又はCPU610bは、NIC690を介してネットワークに接続された図示しない外部記憶装置からプログラムを読み込んでも良い。
ROM620は、CPU610a及びCPU610bが実行するプログラム、及び、固定的なデータを記憶する。ROM620は、例えば、P−ROM(Programmable-ROM)やフラッシュROMである。
RAM630は、CPU610a及びCPU610bが実行するプログラムやデータを一時的に記憶する。RAM630は、資源制御部30として動作しても良い。RAM630は、例えば、D−RAM(Dynamic-RAM)である。
IO640は、内部記憶装置650やキーボード660などとCPU610a及びCPU610bとのデータを仲介する。IO640は、例えば、IOインターフェースカードである。
内部記憶装置650は、情報処理装置60の長期的に保存するデータやプログラムを保存する。また、内部記憶装置650は、資源制御部30として動作してもよい。さらに、内部記憶装置650は、CPU610a及びCPU610bの一時記憶装置として動作しても良い。内部記憶装置650は、例えば、ハードディスク装置、光磁気ディスク装置、SSD(Solid State Drive)、又は、ディスクアレイ装置である。
キーボード660及びマウス670は、情報処理装置60の操作者からの入力指示を受信する入力部である。キーボード660及びマウス670は、受信した入力指示のデータをCPU610a又はCPU610bに送信する。
ディスプレイ680は、情報処理装置60の表示部である。CPU610a又はCPU610bは、操作者に必要な情報を、ディスプレイ680に表示する。
NIC690は、ネットワークを介した他の装置との情報のやり取りを中継する。NIC690は、例えば、LANカードである。
このように構成された情報処理装置60は、情報処理装置10と同様の効果を得ることができる。
その理由は、情報処理装置60のCPU610a及びCPU610bが、プログラムに基づいて情報処理装置10のプロセッサ20と同様の動作を実現できるためである。
(変形例1)
第1の実施形態の情報処理装置10は、開始変数31と終了変数32とを基に、共有リソースの更新を検出する。ただし、本実施形態の情報処理装置10の参照動作は、図5を用いた説明の動作に限らない。
図11は、第1の実施形態に係る情報処理装置10の参照動作の別の動作の一例を示すフローチャートである。
図11において、図5との差は、図5のステップ205とステップ206を、ステップ305に変更した点である。そのため、ステップ305について説明し、他の説明は省略する。
図5に示した参照動作において、プロセッサ20bは、次を確認した。
ステップ205において、プロセッサ20bは、第1の終了変数32と第2の終了変数32が一致する否か、つまり、参照開始時に終了した更新と、参照終了後に終了した更新とが、一致するか否かを判定する。
ステップ206において、プロセッサ20bは、第2の開始変数31と第2の終了変数32が一致するか否か、つまり、参照終了時に更新中か否かを判定する。
しかし、プロセッサ20bは、ステップ202において、更新中でないことを確認してから参照動作を開始している。
そのため、プロセッサ20bは、参照終了時に、参照中に更新が発生したか否かを判定しても良い。
そのため、本変形例のプロセッサ20bは、ステップ305において、第1の開始変数31と第2の開始変数31が一致する否か、つまり、参照終了時に、更新が発生したか否かを判定する。
更新が発生した場合(ステップ305のNO)、プロセッサ20bは、ステップ201に戻り、参照動作を最初から再開する。
更新が発生していない場合(ステップ305でYES)、プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
変形例1の情報処理装置10は、第1の実施形態の情報処理装置10と同様の効果を得ることができる。
その理由は、変形例1の情報処理装置10は、第1の実施形態の情報処理装置10と同様に、共有リソースの参照中に発生した更新を検出でき、更新が発生した場合に、再度、参照動作が可能なためである。
(第2の実施形態)
本実施形態の情報処理装置10の制御情報30aは、図2に示す開始変数31及び終了変数32に限らない。
第2の実施形態に係る情報処理装置10の資源制御部30は、図12に示すように、制御情報30bとして制御変数33を含む。その他の構成は、第1の実施形態の同様のため、詳細な説明は省略し、制御変数33に関係する構成について説明する。
制御変数33は、共有リソースの更新状態を示す。なお、制御変数33は、初期値として特に制限はないが、以下の説明では、初期値を0(偶数)として説明する。なお、初期値を奇数とした場合、以下の説明において、偶数と奇数を入れ替えればよい。
共有リソースを更新するプロセッサ20aは、共有リソースの更新の開始時と終了時に制御変数33を更新(例えば、1加算)する。
共有リソースを参照するプロセッサ20bは、共有リソースの参照前と参照後の制御変数33の値を基に、更新中、及び、参照中の更新の発生の有無を判定する。
第2の実施形態の情報処理装置10の動作について図を参照して説明する。
図13は、第2の実施形態の情報処理装置10の更新動作の一例を示すフローチャートである。
プロセッサ20aの更新における排他制御は、第1の実施形態の同様のため、詳細な説明は省略する。
プロセッサ20aは、制御変数33を更新(1加算)する(ステップ401)。つまり、制御変数33は、奇数になる。
次に、プロセッサ20aは、必要に応じて共有リソースに保護機構を設定する(ステップ402)。
保護を設定後、プロセッサ20aは、共有リソースを更新する(ステップ403)。
更新後、プロセッサ20aは、保護機構を解除する(ステップ404)。
その後、プロセッサ20aは、制御変数33を更新(1加算)する(ステップ405)。つまり、制御変数33は、偶数に戻る。
図14は、第2の実施形態の情報処理装置10の更新動作の一例のシーケンス図である。図14においても、共有リソースの保護機能についての動作は、省略した。
プロセッサ20aは、制御変数33を(奇数に)更新する(1007)。
そして、プロセッサ20aは、共有リソースを更新する(1008)。
その後、プロセッサ20aは、制御変数33を(偶数に)更新する(1009)。
このような動作を基に、情報処理装置10は、共有リソースの更新に関して、次の状態を実現する。
(1)更新中、制御変数33は、奇数である。
(2)更新の前後において、制御変数33は、偶数であるが、値が異なる。
なお、図14には、参考として、他のプロセッサ20の例として、プロセッサ20bが、共有リソースを更新する場合のシーケンス(1010−1012)も示している。
このように、共有リソースを更新するプロセッサ20aは、更新の前後において、制御変数33を更新する。
次に、本実施形態の情報処理装置10が、共有リソースを参照する場合の動作について説明する。
図15は、第2の実施形態の情報処理装置10の参照動作の一例を示すフローチャートである。
共有リソースを参照するプロセッサ20bは、参照の前に制御変数33を読み出す(ステップ501)。以下、ステップ501で読み出した変数を「第1の制御変数33」と言う。
プロセッサ20bは、第1の制御変数33の値を確認する(ステップ502)。具体的には、プロセッサ20bは、第1の制御変数33が偶数か否かを判定する。この判定は、上記のとおり、共有リソースが更新中であるか否かの判定である。
第1の制御変数33が偶数でない(奇数の)場合(ステップ502でNO)、プロセッサ20bは、ステップ501に戻る。プロセッサ20bは、第1の制御変数33が偶数になるまで、待つ。この動作は、第1の実施形態と同様に、ステップ501と502との繰り返しでよいし、ウェイト状態を用いても良い。
第1の制御変数33が偶数、つまり更新中でない場合(ステップ502でYES)、プロセッサ20bは、共有データを参照する(ステップ503)。
参照後、プロセッサ20bは、制御変数33を読み出す(ステップ504)。ステップ504で読み出した変数を「第2の制御変数33」と言う。
次に、プロセッサ20bは、第1の制御変数33と第2の制御変数33とを確認する(ステップ505)。具体的には、プロセッサ20bは、第1の制御変数33と第2の制御変数33とが同じか否かを判定する。この判定は、第1の制御変数33を読み出した後、終了した更新処理が発生したか否かの判定である。
第1の制御変数33と第2の制御変数33が異なる、つまり、終了した更新が発生した場合(ステップ505でNO)、プロセッサ20bは、ステップ501に戻り、最初から参照動作を始める。ステップ501に戻るのは、共有リソースが更新されているため、ステップ503での参照が無効の可能性があるためである。
第1の制御変数33と第2の制御変数33が同じ値の場合(ステップ505でYES)、プロセッサ20bは、第2の制御変数33の値を確認する(ステップ506)。具体的には、プロセッサ20bは、第2の制御変数33が偶数か否かを判定する。この判定は、更新動作中か否かの判定である。
第2の制御変数33が奇数、つまり、更新中の場合(ステップ506でNO)、プロセッサ20bは、ステップ501に戻り、最初から参照動作を始める。ステップ501に戻るのは、共有リソースの更新が開始されているため、ステップ503での参照が無効の可能性があるためである。
第2の制御変数33が偶数の場合(ステップ506でYES)、プロセッサ20bは、参照動作を終了する。プロセッサ20bは、適宜、次の動作に移る。
なお、ステップ505とステップ506は、どちらも変数の判定の動作である。そのため、情報処理装置10は、この動作を分けずに、1つの判定動作として実行しても良い。
また、プロセッサ20bは、ステップ502で制御変数33が偶数である場合に処理を進めている。つまり、第1の制御変数33は、偶数である。更新中の制御変数33は、奇数となる。奇数と偶数は、異なる値である。つまり、更新中の場合も、プロセッサ20bは、ステップ505の判定がNOとなる。したがって、プロセッサ20bは、ステップ506を省略しても良い。
このように、共有リソースを参照するプロセッサ20bは、共有リソースに排他機構を設定されているか否かに係わらず、制御変数33を基に共有リソースを参照できる。
次に、情報処理装置10が、適切に共有リソースを参照できることを、図16−19を参照して説明する。なお、図面の煩雑さを避けるため、図16−図19において、図15のステップ505とステップ506との判断は、1つの判断として示す。
まず、共有リソースの更新動作と参照動作とが重ならない場合について説明する。
図16は、プロセッサ20aが共有リソースの更新を終了後、プロセッサ20bが参照動作を開始した場合のシーケンス図である。
プロセッサ20bは、第1の制御変数33を読み出す(6001)。この場合、第1の制御変数33は、偶数(図16では「02」)となる。
そのため、第1の制御変数33の判定(図15のステップ502)は、YESとなる(6002)。
そして、プロセッサ20bは、共有リソースを参照する(6003)。
プロセッサ20bは、第2の制御変数33を読み出す(6004)。この場合、第2の制御変数33は、第1の制御変数33と同じ値(図16では「02」)となる。
そのため、ステップ505及び506に対応する変数の判定は、どちらもYESとなる(6005)。
その結果、プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
次に、プロセッサ20aが更新動作中に、プロセッサ20bが参照動作を開始した場合について説明する。
図17は、プロセッサ20aが更新動作中に、プロセッサ20bが参照動作を開始した場合のシーケンス図である。
プロセッサ20bは、第1の制御変数33を読み出す(7001)。この場合、プロセッサ20aは、更新中である。そのため、第1の制御変数33は、奇数(図17では、「01」)となる。
そのため、第1の制御変数33の判定(図15のステップ502)は、NOとなる(7002)。
プロセッサ20aの更新動作が終了するまで、第1の制御変数33は、奇数である。そのため、プロセッサ20bは、図15のステップ501−502(図17では、7001−7002)を繰り返す。
プロセッサ20aが更新動作を終了すると、第1の制御変数33は、偶数になる。
その後、プロセッサ20bが、第1の制御変数33を読み出す(7003)と、第1の制御変数33は、偶数(図17では「02」)となる。
そのため、第1の制御変数33の判定(図15のステップ502)は、YESとなる(7004)。
これ以降、プロセッサ20bは、図16の6003−6005と同様に動作する。
つまり、プロセッサ20bは、共有リソースを参照する(7005)。
プロセッサ20bは、第2の制御変数33を読み出す(7006)。この場合、第2の制御変数33は、第1の制御変数33と同じ値(図17では「02」)である。
そのため、ステップ505及び506に対応する変数の判定は、どちらもYESとなる(7007)。
その結果、プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
次に、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始した場合について説明する。まず、プロセッサ20bの第2の制御変数33の確認前に、プロセッサ20aの更新動作が終了した場合について説明する。
図18は、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始し、プロセッサ20bの第2の制御変数33の確認前に、プロセッサ20aの更新動作が終了した場合のシーケンス図である。
プロセッサ20bは、第1の制御変数33を読み込む(8001)。この場合、第1の制御変数33は、偶数(図18では「00」)である。
そのため、第1の制御変数33の判定(図15のステップ502)は、YESとなる(8002)。
プロセッサ20bは、共有リソースを参照する(8003)。
ただし、プロセッサ20aは、プロセッサ20bが共有リソースを参照中に、共有リソースを更新している。そのため、制御変数33は、更新(図18では「02」)されている。
プロセッサ20bは、第2の制御変数33を読み出す(8004)。上記のとおり、第2の制御変数33は、更新された後のため、第1の制御変数33とは異なる。
そのため、プロセッサ20bの変数の判定、具体的には、図15のステップ505の判定がNOとなる(8005)。
そのため、プロセッサ20bは、参照動作の最初(図15のステップ501)に戻り、参照動作をやり直す。つまり、プロセッサ20bは、図16の6001−6005に相当する図18の8006−8010を実行する。
具体的に説明すると次のとおりである。
プロセッサ20bは、第1の制御変数33を読み出す(8006)。第1の制御変数33は、偶数(図18では、「02」)である。
プロセッサ20bは、第1の制御変数33を判定する(8007)。
第1の制御変数33が偶数のため、プロセッサ20bは、共有リソースを参照する(8008)。
プロセッサ20bは、第2の制御変数33を読み出す(8009)。この場合、第2の制御変数33は、第1の制御変数33と同じ偶数の値(図18では「02」)である。
そのため、プロセッサ20bの変数の判定は、YESとなる(8010)。
プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
続いて、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始し、プロセッサ20bの第2の制御変数33の確認時に、プロセッサ20aの更新動作が終了していない場合について説明する。
図19は、プロセッサ20bが参照動作を開始してから、プロセッサ20aが更新動作を開始し、プロセッサ20bの第2の制御変数33の確認時に、プロセッサ20aの更新動作が終了していない場合のシーケンス図である。
プロセッサ20bは、第1の制御変数33を読み出す(9001)。この場合、第1の制御変数33は、偶数(図19では「00」)である。
そのため、第1の制御変数33の判定(図15のステップ502)は、YESとなる(9002)。
プロセッサ20bは、共有リソースを参照する(9003)。
ただし、プロセッサ20aは、プロセッサ20bが共有リソースを参照中に、共有リソースの更新を開始している。そのため、制御変数33は、更新(図19では「01」)されている。
プロセッサ20bは、第2の制御変数33を読み出す(9004)。上記のとおり、第2の制御変数33は、更新されたため、第1の制御変数33とは異なる。
そのため、プロセッサ20bの制御変数33の判定、具体的には、図15のステップ505の判定がNOとなる(5005)。
そのため、プロセッサ20bは、参照動作の最初(図15のステップ501)に戻り、参照動作をやり直す。
これ以降の動作は、図17と同様の動作になる。
つまり、プロセッサ20bは、第1の制御変数33が偶数になるまで、制御変数33の読み出しと判定を繰り返す。
プロセッサ20aが、更新を終了すると、制御変数33が偶数(図19では「02」)となる。
その後、プロセッサ20bが、第1の制御変数33を読み出す(9006)と、第1の制御変数33は、偶数(図19では、「02」)である。
プロセッサ20bは、第1の制御変数33を判定する(9007)。
第1の制御変数33が偶数のため、プロセッサ20bは、共有リソースを参照する(9008)。
プロセッサ20bは、第2の制御変数33を読み出す(9009)。この場合、第2の制御変数33は、第1の制御変数33と同じ偶数(図19では「02」)である。
そのため、プロセッサ20bの変数の判定は、YESとなる(9010)。
プロセッサ20bは、参照した共有リソースが有効として、参照動作を終了する。
このように構成された第2の実施形態の情報処理装置10は、第1の実施形態の情報処理装置10と同様の効果を得ることができる。
その理由は、第2の実施形態の情報処理装置10は、制御変数33を用いて、開始変数31と終了変数32とを用いる第1の実施形態の情報処理装置10と同様に動作できるためである。
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。