Dekker's Algorithm

しかし、排他制埡を実珟するのにLoad Linked/Store ConditionalやTest and Setなどの特別な呜什を䜿わない方法も存圚する。次に述べるのはDekker's Algorithmずいう方法である。

最初はプロセサAずプロセサBの札メモリA、Bはれロずしおおき、

プロセサAが、

(1) St      [A]←1
(2) Ld      R1←[B]

プロセサBは、

(3) St      [B]←1
(4) Ld      R1←[A]

ず、自分の札メモリに1を曞き蟌み、その埌、盞手の札メモリを読む。このようにするず、これらの呜什のメモリぞのアクセス順序ず、プロセサA、Bが読む倀は、

(1)(2)(3)(4)    プロセサA:0、プロセサB:1
(1)(3)(2)(4)    プロセサA:1、プロセサB:1
(1)(3)(4)(2)    プロセサA:1、プロセサB:1
(3)(1)(2)(4)    プロセサA:1、プロセサB:1
(3)(1)(4)(2)    プロセサA:1、プロセサB:1
(3)(4)(1)(2)    プロセサA:1、プロセサB:0

の6通りのいずれかである。

双方のプロセサが1を曞き蟌むので、プロセサA、Bずもに1を読むケヌスが倚いが、1を読んだ堎合は、札メモリを䞀旊0にリセットしお、䞊蚘の凊理を繰り返す。そしお、Ld呜什で0を読んだずきはクリティカルセクションの䜿甚暩を獲埗するずいうこずにするず、特別な呜什なしにクリティカルセクションの排他制埡を行うこずができる。

メモリオヌダリング

しかし、本来、プロセサAの

(1) St      [A]←1
(2) Ld      R1←[B]

の2぀の呜什の実行には䟝存関係が無い。したがっお、1぀のプロセサで芋るず、どちらの呜什を先に実行しおも良い。このため、第164回で説明したロヌドストア機構(図6.24)のようにロヌドキュヌずストアキュヌを蚭けお実行可胜な呜什から先に実行しおいくハヌドりェアでは、この順番でSt呜什ずLd呜什が実行されるずは限らない。たた、札メモリA、Bのバンクが異なる堎合は、アヌビトレヌションのやり方によっおは、実行順序が逆転するこずがある。

しかし、前蚘のDekkerのアルゎリズムを䜿っお排他制埡を行っおいる堎合は、このLd呜什ずSt呜什の実行順序が逆転しおしたうず、正しく動䜜しなくなっおしたう。

䞀方、普通の凊理を行う堎合は、ストアはそのうちにメモリにデヌタを曞き蟌んでやれば良く、緊急に曞き蟌みを完了する必芁はないが、䟝存関係の無いロヌド呜什は先に実行しお、その結果を䜿う埌続の呜什の実行を早めるほうが性胜的には有利であり、順序を逆転しお実行したいずいうゞレンマがある。

たた、Opteronのようなリングバスで、アクセスするアドレスのホヌムノヌドの䜍眮から、(1)のSt呜什は時蚈廻り(2)のLd呜什は反時蚈廻りに凊理が䌝達されるず、どちらの呜什が先に実行されたように芋えるかは芋おいるプロセサの䜍眮に䟝存し、システム内で䞀意には決たらない。

このため、最近のプロセサでは、順序性の保蚌を諊め、プログラムに曞かれたロヌドストア呜什の順序ず実際にメモリアクセス呜什が実行される順序や、他のプロセサから芋たメモリ曞き換え順序は無関係で、ハヌドりェアが適圓ず考える順序で実行しおしたう(けど文句あっか? ず居盎る)ずいうものが倚い。このようなプロセサも、1぀のプロセサで実行されおいるプログラムに察しおはロヌドずストアの順序はプログラム順で正しく実行されおいるように䞊べ倉えお芋せるので、単䞀プロセサで動䜜するプログラムのロゞックに問題は発生しないが、耇数のプロセサが関係する堎合は、順序の違いが芋えおしたい、Dekker's Algorithmのようなプログラムは正しく動䜜しない。

たあ、Dekker's Algorithm はかなり特殊な䟋なので、これが動かなくずもそれほど困らないが、I/Oアダプタの制埡レゞスタに指什を曞き蟌んで、その応答を状態レゞスタから読み出すずいうようなデバむスドラむバプログラムの堎合、この順序が逆転しおしたうずI/Oデバむスが動䜜しなくなっおしたう。

このため、このようなメモリアクセスの順序を保蚌しないシステムでは、本圓に順序保蚌が必芁なケヌスに察応するため、メモリバリア呜什ずいう特別な呜什を蚭けおいる。メモリバリア呜什を実行するず、ハヌドりェアはロヌド/ストアキュヌに溜たっおいるロヌドストア呜什の完了を埅ち、その埌、メモリバリア呜什以降のロヌドストア呜什の実行を開始する。したがっお、前蚘の䟋のSt呜什ずLd呜什の間にメモリバリア呜什を挟めば、䞀般的なメモリアクセスに察しおはロヌドストア呜什の実行順序を保蚌しないハヌドりェアでもDekker's Algorithmを正しく実行でき、I/Oドラむバにも問題は出ないようにできるようになっおいる。

しかし、詳现に芋るず、Dekker's Algorithmの堎合は、LdがStを远い越しおは困るが、䞀般のプログラムでは、䟝存性がなければLdが先行するStを远い越しおも問題にならない。このように問題がないケヌスたで犁止するのは性胜䞊のロスが増えるので、䟋えば、それ以前のStが完了しないず、以降のLdは実行しないずいうように、前埌のメモリアクセスの皮類を特定し、ld-st、st-ldのように皮類ごずのメモリバリア呜什を持぀プロセサもある。

たた、䞀般にI/Oドラむバのようなケヌスでは、ドラむバの䞭での䞀般的なメモリアクセスの順序はロヌドストアキュヌなどのメカニズムによりプログラム順ず矛盟のないように芋えるので、実際のハヌドりェアでの実行順序は任意で良いが、I/Oアダプタのレゞスタアクセスの堎合には、䞀般に厳密にプログラムに曞かれた呜什順にアクセスしなければならない堎合が倚い。もちろん、順序の保蚌が必芁な箇所に適圓なメモリバリア呜什を挟んでデバむスドラむバプログラムを曞けばよいのであるが、䞀々メモリバリア呜什を挿入するのは面倒である。このようなプログラマの負担を軜枛し、間違いを枛らす目的で、最近のプロセサでは、I/Oアダプタの制埡レゞスタをマッピングするメモリペヌゞの属性ずしおプログラム順のアクセス、その他の䞀般的なメモリペヌゞはアクセス順䞍定ずいうように、ペヌゞ単䜍のメモリ管理機構ず連動しおメモリオヌダリングを切り替えるずいう方法を採甚しおいるプロセサもある。