共有のデータ構造を他のプロセスが同時に使用しないことを保証する.
複数のプロセスのうち,1つのプロセスが代表してコーディネータとなる.
そして,各データにアクセスしているプロセスを管理する.
・あるデータにアクセスしているプロセスは「臨界領域(critical region)」に入れる. ・すでに臨界領域に入ろうとするプロセスがいたら,コーディネータは要求を待ち行列につなぐ. ・臨界領域に入っているプロセスがそこから出たら,排他制御からの開放をコーディネータに要求する. ・排他制御からの開放要求を受けると,待ち行列の最初の要求プロセスを臨界領域に入れる.
RicartとAgrawalaによるアルゴリズム.データ構造を利用する全てのプロセスで,各データの臨界領域の制御をする.
・臨界領域に入ろうとすると,要求メッセージを全てのほかのプロセスに送る. 要求メッセージ(臨界領域の名前,プロセス番号,現在時刻) ・プロセスが要求メッセージに対し,そのデータの臨界領域の情報と比較して返信する. ・すでに臨界領域が埋まっていれば,待ち行列につなぐ. ・埋まってなくて,同じデータに対しての要求メッセージが複数ある場合は時刻によって制御する早い者勝ち ・要求元のプロセスは要求メッセージを送った後,すべてのプロセスからの応答を待つ. ・臨界領域から出たら,待ち行列にいるプロセスにOKメッセージを送る.
プロセスに順序をつけて,その付与された番号順に並べることにより仮想的なリングを作る.
そして,そのリングの上を順々にトークン(権利)が受け渡されていくことにより,順番が回ってくる.
・リングを初期化したとき,プロセス0(番号0)にトークンが渡される ・トークンを持っているときだけ,臨界領域に入ることが出来る. ・臨界領域から出たときに,トークンを次のプロセスに渡す. ・トークンを受け取っても臨界領域に入る必要が無かったら次のプロセスに渡す.
複数のプロセスがあるときに,1つのプロセスに特別な役割(コーディネータなど)を割り当てる際のプロセスの選びかた.
初めから,すべてのプロセスに個々の番号が割り当てられている(プロセス番号)
このプロセス番号の1番大きい生きているプロセスを特定して指名する.
どんどん強いやつに座を受け渡していくやり方.
・プロセスは自分より大きいプロセス番号を持つプロセスに選挙メッセージを送る. ・どんどん大きなプロセス番号にメッセージが受け渡される ・最終的な最大番号のプロセスが選ばれる
・コーディネータがいないことに,あるプロセスが気づいたところから始まる. ・選挙メッセージを受け取ったプロセスは,生きていたら確認のためOKメッセージを返す. ・選ばれたらそのプロセスは,すべてのプロセスに選ばれたことを知らせる. ・元のコーディネータが復帰した場合は,その元コーディネータがまた選挙を始める.
プロセス間にすでにリングが張られていて,その順番を各プロセスは知っている.
順々に選挙メッセージをリング上を受け渡ししていき,1周すれば全部のプロセスの番号が分かるので一番大きい番号が選べる.
・コーディネータが死んでいることに気づいたプロセスから開始. ・1周したら自分の番号があることにプロセスが気づいて1周したことを認知する. ・2周目はコーディネータメッセージに付け替えてもう1周させる. ・2周目によって,各プロセスはリング上の他のプロセスの番号を知ることが出来る. ・プロセスメッセージの中で一番大きい番号のプロセスが次のコーディネータになる.
ひとまとまりの処理を,一括して扱うこと.(All or Nothing) 同期に関わる細かいところを意識することがなくなる.
アプリケーションプログラマに使いやすい同期のための概念.
・1つのプロセスが,グループにする他のプロセスに対して宣言する. ・プロセス間で情報のやり取りをし,処理を行う. ・最初のプロセスは,それらのプロセスに対してコミット(処理の完了)をするように要求する. ・すべてのプロセスがコミットしたら,完成. ・1つでもプロセスがコミットしなかったら,すべてのマシンは開始する前の状態に戻される.
・引き出し(金額,口座番号1) ・預け入れ(金額,口座番号2)の処理をするが,引き出しの時点で途切れたらお金がなくなってしまう.
・システムは独立したプロセスからなっているが,そのプロセスはクラッシュする可能性がある. ・通信エラーは起こらない.(OSが再送したりして保証される) ・安定な記憶装置がある.(2つのディスクで常に更新・比較確認)
・BEGIN_TRANSACTION:トランザクションの始まり ・END_TRANSACTION :トランザクションの終わり(コミット) ・ABORT_TRANSACTION:トランザクション処理を中止,更新した情報は元に戻す ・READ :情報を読む ・WRITE :情報を更新するBEGINとENDに挟まれた部分がトランザクションとなる.
トランザクションの4つの基本的な性質
トランザクションの中に,さらにサブトランザクションが含まれる.(ネストしたトランザクション)
・あるトランザクションが複数のサブトランザクションを並列して実行させる. ・1つのサブトランザクションが実行を完了しすると,その結果は親トランザクションが見られる. ・親トランザクションを中止すると,すべての状態が親トランザクションが始まる前まで戻る. (サブトランザクションがコミットした処理を元に戻す) ・各サブトランザクション毎に,すべての情報のプライベートなコピーを作っておけば実現できる.
・読むだけのオブジェクトはコピーしない ・オブジェクトを更新するときだけにコピーする ・オブジェクトのインデックスだけをコピーする
・オブジェクトのコピーを作る ・参照情報をインデックスに入れる ・そしてからオブジェクトの更新を行う
・どのトランンザクションか ・どのオブジェクトか ・オブジェクトの新旧の値
・ログに「コミット」が記録される ・オブジェクトはすでに更新済みとなっている
完了(コミット)処理を,複数のプロセスで協力して行う方法.1つのプロセスが代表となってコーディネータとなり,他の従属プロセスとやり取りを行う.
・コーディネータはログに「準備」を書き込む ・他の従属プロセスに「準備」メッセージを送る ・すべての従属プロセスがそれに同意し応答する ・コーディネータは「完了(コミット)」をログに書き込む. ・他の従属プロセスに「完了」メッセージを送信し,処理を完了させる.
安全な記憶装置を使うことで,プロセスが死んでもちゃんと回復できる.
異なるプロセスで,複数のトランザクションが同時に実行されているとき,うまく順序を制御してやるもの.トランザクションを1つずつ順番に実行するのと同じだという直列化可能性(serializability)を保証するメカニズム.
直列化可能性を保証する条件 ・共有データを使う前にロックをかけ,使い終わったらロックを開放する. ・コンパティビリティ(相互性)規則に従って,ロックの制御が行われる. ・トランザクションは,1つでもロックを開放した後は新たにロックを要求しない.
あるプロセスがトランザクションの一部としてファイルの読み取りまたは書き込みを必要とするときに,初めにロックを行う方法.ロックされてるデータにアクセスするときは,待たされることになる.
・BEGIN_TRANSACTION ・データの読み書きの前に該当するロックを取得する ・コミット ・すべてのロックを開放する ・END_TRANSACTION
いくつかの利点
・cascading abortが起こらない ・ロックの取得,開放をシステムでトランザクション実行の前後に自動的に行う. (トランザクションではロックを意識することはなくなる)
欠点 2つのプロセスが2つの共有データを逆の順序で同時にロックしようとすると,デッドロックが起こる.
各トランザクションの開始(BEGIN_TRANSACTION)を実行したときにタイムスタンプを割り当てる方法.それぞれ異なるタイムスタンプを用いる必要がある(Lamportのアルゴリズム)
競合はまれにしか発生しないという仮定のもとに,常にトランザクションを最後まで実行させる.
・本物のデータにはまず更新処理をしないで,ローカルなコピーに対して行う. ・もし他のと競合していなかったら本物のデータに上書きする. ・競合してたら中止する. ・競合のチェックのために,使用したデータに関する情報を保持しておいて,比較する.