(57)【特許請求の範囲】
【請求項１】
２以上の非同期プロセッサとプロセッサの数をnとしたときに初期値を真とし、真か偽の値を記憶する共有２値変数配列xと
プロセッサ各々でそのプロセッサの識別子を１以上n以下の整数iとしたとき、識別子iと領域y[i][1]が１対１に対応する、初期値を偽とする真か偽の値を記憶する領域y[i][1]により構成されている共有２値変数配列群y[1...n][1]とプロセッサ各々でそのプロセッサの識別子を１以上n以下の整数iとしたとき，識別子i と領域y[i][2]が１対１に対応する，領域y[i][2]により構成されている共有２値変数配列群y[1...n][2]なる共有オブジェクトを備える非同期共有オブジェクトシステムの
プロセッサにより利用される合意解決手法であって、
外部より受け取った入力値を当該プロセッサの識別子で１以上n以下の整数iに対応する前記共有２値変数配列群y[1...n][2]の領域y[i][2]へ書き込むステップと、
前記共有２値変数配列xの値を読み出し、その結果が真である場合のみ当該プロセッサの前記識別子iに対応する前記共有２値変数配列群y[1...n][1]の領域y[i][1]に真の値を書き込むという動作を単一ステップ時間で行うステップと、
前記共有２値変数配列xに偽の値を書き込むステップと、
前記共有２値変数配列群y[1...n][1]の中の各識別子jに対応する領域y[j][1]を識別子１から識別子の値の増加順に読み出し、前記領域y[j][1]の値が真である最も小さな識別子jminを求めるステップと、前記共有２値変数配列群y[1...n][2]の中の前記識別子jminに対応する領域y[jmin][2]の値を読み出し決定候補値とするステップと、
前記決定候補値を出力するステップとを
有することを特徴とする合意解決手法。
【請求項２】
２以上の非同期プロセッサと共有オブジェクトで構成される非同期共有オブジェクトシステムであって、
プロセッサの数をnとしたときに初期値を真とし、真か偽の値を記憶する共有２値変数配列xとプロセッサ各々でそのプロセッサの識別子を１以上n以下の整数iとしたとき、識別子iと領域y[i][1]が１対１に対応する、初期値を偽とする真か偽の値を記憶する領域y[i][1]により構成されている共有２値変数配列群y[1...n][1]とプロセッサ各々でそのプロセッサの識別子を１以上n以下の整数iとしたとき，識別子i と領域y[i][2]が１対１に対応する、領域y[i][2]により構成されている共有２値変数配列群y[1...n][2]なる共有オブジェクトを備え、
各プロセッサが外部より受け取った入力値を当該プロセッサの識別子で１以上n以下の整数iに対応する前記共有２値変数配列群y[1...n][2]の領域y[i][2]へ書き込む手段と、
前記共有２値変数配列ｘの値を読み出し、その結果が真である場合のみ当該プロセッサの識別子iに対応する前記共有２値変数配列群y[1...n][1]の領域y[i][1]に真の値を書き込むという動作を１命令ステップで行うread-and-write(x,y[i][1],1)命令を実行する手段と、
前記共有２値変数配列ｘに偽の値を書き込む手段と、前記共有２値変数配列群y[1...n][1]の中の各識別子jに対応する領域y[j][1]を識別子１から識別子の値の増加順に読み出し、領域y[j][1]の値が真である最も小さな識別子jminを求める手段と、
前記共有２値変数配列群y[1...n][2]の中の前記識別子jminに対応する領域y[jmin][2]の値を読み出し決定候補値とする手段と、
前記決定候補値を出力する手段とを
有することを特徴とし、請求項１の手法を実施可能な非同期共有オブジェクトシステム。
【請求項３】
前記read-and-write(x,y[i][1],1)命令を実行する手段は、
前記識別子iをもつ当該プロセッサが前記共有２値変数配列群y[1...n][1]の前記領域y[i][1]に前記共有２値変数配列xの値が真の場合のみ真の値を書き込み、
前記共有２値変数配列群y[1...n][1]の前記領域y[i][1]を前記共有２値変数配列xの読み出し開始から前記領域y[i][1]の書き込み終了までの間前記識別子i以外の識別子をもつプロセッサが読み書きできないようロックする、
しかし、
前記共有２値変数配列xの排他的制御を行わず、前記識別子iをもつプロセッサ以外のプロセッサによる読み出し、真の値の書き込みを許す
ことを特徴とする請求項２に記載の非同期共有オブジェクトシステム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
共有オブジェクトを通じて情報を伝達する複数の非同期プロセッサからなる共有オブジェクトシステムにおいて、
故障していないプロセッサの全てが故障により停止したプロセッサの影響を受けることなく有限ステップ後に合意を得る手法、耐故障性をもつ非同期共有オブジェクトシステムにおける合意問題を解く手法、および、それらの実現機構。
【０００２】
【従来の技術】
複数のプロセッサからなる共有オブジェクトシステムにおいて、
故障して停止しているプロセッサに関わらず、故障していないプロセッサの全てが１つの値に合意する非同期共有オブジェクトシステムにおける耐故障合意問題は非同期システムにおける同期化およびプロセッサの故障検出に有効な応用をもつ。
非同期共有オブジェクトシステムは複数のプロセッサと有限個の共有２値変数配列の集合である共有オブジェクトからなる。
プロセッサは共有２値変数配列を介して通信する。
各プロセッサは入力動作や出力動作を行い外部と対話するためのポートをもつ。
Vをある値の集合とし、1からnまでの自然数でラベル付けされたn個のプロセッサと共有２値変数の集合Xからなる共有オブジェクトシステムを考える。
各プロセッサへの外部入力をinit(v)とする。
ここで、vは集合Vの要素である。また、各プロセッサはdecide(v) の形で外部に出力する。
【０００３】
各プロセッサは特別な入力 Stop をもつ可能性がある。
Stop信号は特定できない外部からの入力で、プロセスのStop信号受信後は動作を停止する。
共有オブジェクトシステムが以下の３つの条件を満たすとき合意に達する。
（１） 任意のプロセッサに対して、そのプロセッサのinitとdecideとの時間的系列は列init(v)、 decide(w)のある接頭辞である。
つまり、何もないか、init(v) のみであるか、init(v)、 decide(w)の2つの動作の列である。
（２） 全ての決定値は同じ値である。(Agreement条件)  （３） 決定値はあるプロセッサの入力値である。(Validity条件)
【０００４】
共有オブジェクトシステムで１からn-1までの任意の個数のプロセッサがStop信号を受信して停止した場合でも、残りの停止していないプロセッサの全てが合意するとき、システムが耐故障合意に達する。
【０００５】
この耐故障合意を共有オブジェクトの各２値変数配列を適用可能な操作でタイプ分けした場合、どのような手法が存在するかを示す。
従来、共有オブジェクトの２値変数配列は1命令中に読み出しまたは書き込みのみを許すread-write ２値変数配列と書き込みと読み出しの両方を1命令中に実行可能な read-modify-write ２値変数配列に大別される。
非同期共有オブジェクトシステムでは、read-write ２値変数配列のみでは耐故障合意が得られない。
初期値unknownである共有２値変数配列xを用いる合意手法の具体例を示す。
【０００６】
外部からの入力値をkとする。
次に、read(x)命令により共有２値変数配列xの値を戻り値vとして受け取る。
もし、値vが初期値unknownのままであれば、write(x、k)命令により共有２値変数配列xにkの値を代入しdecide(k)で値kに合意する。そうでなければ、decide(v)で値vに合意する。
この場合共有オブジェクトの内容を読み込んで、プロセッサがその内容に従って書き込みを行う前に共有オブジェクトの内容が変化してしまうことで不合意を導いてしまう。
【０００７】
そこで、読み出しと書き込みの両方を1命令で行うread-modify-write により耐故障性をもつ合意手法が考えられる。
read-modify-write命令の1つであるcompare-and-swap命令について説明する。
共有２値変数配列xと値v、 値kにおいてcompare-and-swap(x、v、k)命令は共有２値変数配列xの値wがvと一致するなら共有２値変数配列xに値kを書き込み値wを戻り値として返す。そうでなければ何もせず、値wを戻り値として返す。この手続きを１命令ステップ中に実行する。
【０００８】
compare-and-swap命令による耐故障合意を得る手法の例を示す。
初期値がunknownである共有２値変数配列xにおいて、始めに外部からの入力値をkとする。
次に、compare-and-swap(x、unknown、k)命令により共有２値変数配列xの値wがunknownならxにkを書き込み戻り値としてunknownを受け取る。そうでなければ、wを戻り値として受け取る。compare-and-swap命令の戻り値vがunknownなら、decide(k)により値kに合意する。
そうでなければ、decide(v)により値vに合意する。
【０００９】
共有２値変数配列内容の多重書き込みを許さない単一書き込みのみ可能な２値配列変数xの場合、read-modify-write命令を実行中、変数xはロックされ、変数xに対する他の全ての命令が実行不能となる。
【００１０】
複数のプロセッサが同時に変数xに対するread-modify-write命令を発行した場合、プロセッサ数の長さをもつロックの連なりができてしまう。
この状況を競合と呼ぶ。また、１つの命令に対してできる可能性のあるロックの連なりに属しているロックの最大個数、つまり、長さを競合のコストとする。
【００１１】
【発明が解決しようとしている課題】
上記従来手法のread-modify-write 命令では競合コストはシステム内のプロセッサ数に比例して大きくなる。
理論的にはread-modify-write 命令を用いる任意の耐故障合意手法の競合コストがプロセッサ数に比例して大きくなることが示されている。
この競合コストの削減を目的にread命令とwrite命令だけで合意が失敗する確率を保証する手法も存在する。
この場合、競合のコストはプロセス数に依存しないが、手法の実行ステップ数はプロセッサ数の二乗ないし三乗に比例する。
本発明は競合のコストがプロセッサ数に依存しない耐故障性をもち、特にほとんど同期してプロセッサが動作する場合に効率よく合意を得る手法とその実現機構を提案する。
【００１２】
【課題を解決するための手段】
上記の目的を達成するため、
本発明の共有オブジェクトシステムでは全てのプロセッサが同時に書き込み、読み出しができる多重読み出し多重書き込み可能な共有２値変数配列xと各プロセッサごとにそのプロセッサのみが書き込みができ他の全てのプロセッサが同時に読み出しができる単一書き込み多重読み出し可能な２値変数配列を設定する。
【００１３】
さらに、本発明の共有オブジェクトシステムでは新たな命令read-and-write(x、y、k)を備えもつ。
read-and-write命令は共有２値変数配列xの読み込みと共有２値変数配列yの書き込みを１ステップで行う命令であり、
命令開始から終了まで書き込む変数yがロックされ、他のプロセッサが読み書きできない。しかし、読み出しの対象である変数xは排他的制御を必要としない、つまり、多重読み出し、書き込みを許す。
具体的には変数xが1ならば変数yにkを書き込み１を返し、変数xが1でなければ何もせずに０を返すという以下の手続きを１命令ステップで実行する。
【００１４】
【発明の実施の形態】
このとき、共有オブジェクトシステムは全ての多重書き込み多重読み出し可能な２値配列xと単一書き込み、多重読み出し可能なレジスタをプロセッサnの２倍であるn×２個の２次元２値変数配列y[n][2]を備えもつ。
各プロセッサiは配列yではi行目の要素であるy[i][1]とy[i][2]のみを書き込むことが可能である。
初期設定x=1、 y[n][2]の全ての2n個の要素をNULLとして、各プロセッサiにおいて以下のプロトコルを実行する。
【００１５】
始めに入力値をｋとする。write(y[i][2]、k)命令により共有２値変数配列y[i][2]に値kを書き込む。次に、read-and-write(x、 y[i][1]、1)命令により共有２値変数配列ｘの値が１ならば共有変数配列y[i][1]に値１を書き込む、そうでなければなにもしない。次にwrite(x、0)命令によって共有２値変数配列ｘに０を書き込む。
その後、局所変数jによりインデックス付けされたループ内においてread(y[i][1])命令による戻り値が１となるインデックスjを見つけるまでjを１からｎまで１ずつ増加する。ループを抜けた後，read(y[j][2])命令を実行して共有２値変数配列y[j][2]の値をｖとする。最後にdecide(v)により値vに合意する。
共有２値変数配列ｘと共有２値変数配列群の各プロセッサiに割り当てられた領域y[i][1],y[i][2]の合意手法における役割は以下である。共有２値変数配列ｘでは、その真偽により共有２値変数配列を１回でも書き込んだプロセスが存在するか否かを示す。一方、共有２値変数配列群の値y[i][2]は合意の対象として各プロセスiが提示する入力値を示し、y[i][1]はその真偽により他のプロセスに値y[i][2]が合意の候補であるかどうかを示す。
【００１６】
【発明の効果】
発明合意プロトコルではシステム中に故障したプロセッサが存在しても、故障していないプロセッサはプロトコルを終了することができる。
発明合意プロトコルにおいて発明機構を用いた場合、各プロセッサはwrite命令でy[i][2]を、read-and-write命令でy[i][1]のみをロックする。
xに対するwrite命令は多重書き込み読み出しが可能であるためロックを必要としない。
よって、各命令に対するロックの連なりの長さは高々１であり、発明合意プロトコルの競合コストは１である。
つまり、競合コストはシステム中のプロセス数に依存しない。特にほとんど同期したシステム中ではどんなにプロセス数が大きくともプロトコルの終了はほとんど同時に小さいステップ数で終了する。
【図面の簡単な説明】
【図１】共有オブジェクトシステムの実施例を示す図である。
【図２】共有２値変数配列の実施例を示す図である。
【図１】
0004923288.tif 000002
【図２】
0004923288.tif 000003