「ソフトウェアトランザクショナルメモリ」の版間の差分
削除された内容 追加された内容
m →概念的な利点と欠点: 節リンク修正 ライブロック |
m →不透明性 タグ: 差し戻し済み |
||
65行目:
== 不透明性 ==
楽観的な読み出しを伴うソフトウェアトランザクショナルメモリの実装には一つ問題がある。それは、実行中の(完了していない)トランザクションは、一貫性の破れた状態を読んでしまっていることがあるというものである(つまり、他のトランザクションによる更新の前の値と後の値を混ぜて読んでいることがある)。このようなトランザクションは、例え <code>atomic</code> ブロック内の終端まで処理が進んだとしても必ずアボートされる運命にあるので、トランザクションシステムによって強制される一貫性条件が破られるわけではない。しかし、この''仮の''矛盾した状態のために、[[セグメント方式|セグメンテーション]]フォールトやゼロ除算のような致命的な例外
{| class="wikitable" border="1" style="width:auto; margin:1em auto;"
90行目:
最初に関係 ''x=y'' が成り立っていたとすると、上記のどちらのトランザクションもこの関係を崩すことはない([[不変条件]]になっている)。しかし、トランザクション A の処理において、''x'' をトランザクションBによる更新前に読み、一方 ''y'' をトランザクションBによる更新後に読み、結果として無限ループに陥るということは起こり得る。これは既に致命的な状態に陥っているにも関わらずトランザクションが継続されるためゾンビトランザクションとも呼ばれる。この問題へ対策としては、致命的な例外を横取りし、それぞれのトランザクションが正常かどうかを定期的にチェックし、異常ならばトランザクションをアボートするという方法があるが、言語によっては実装も大掛かりになりがちである。
ゾンビトランザクションに対して定期チェックなどを行わず、そもそも''腐った''値を読み出さない保
不透明性を保障する方法として単純なものに
他にグローバルバージョンクロックを用いる手法もある。トランザクションが完了するごとにインクリメントされる共有カウンタを用意しておき、値を読み出す側がカウンタをチェックする事で他のトランザクションによる書き換えを検知する方法である。カウンタの値が増えている場合に
不透明性を保障しているソフトウェアトランザクショナルメモリはこれらの手法を用いる事で非一貫な値を読みそうになった時にアボートする。
|