Next: Up: Previous:

並列データ構造のための実装技法

 

並列データ構造を実装するための技法が提案されている. 共通のアイデアは複数の操作を投機的に実行し, 割り込まれた実行を再試行することである.

Lamport の並列読みだし/書き込み

Lamport [20] は通常のロード/ストア命令のみを仮定した状況下での リーダとライタの間の並列性を許す実装技法を提案している. オブジェクトはレコードによって表現され, リーダとライタは そのレコードに対して操作を行なう. リーダが操作を終えた後, リーダはその操作がライタによって割り込まれたかどうかを チェックする. もし割り込まれていたら, リーダは実行 全体を再試行する. この一貫性チェックはオブジェクトに つけられた二つのカウンタを比べることによってなされる. 複数のライタは相互に排他されなければならない.

Herlihy の方法

Herlihy はロックのいらない並列オブジェクト, つまりいかなる 排他制御も必要としないデータ構造を実装するための 方法論を提案している [12], [13]. 排他制御なしでのメソッドの原子性を保証するために それらはかわりにある形での原子的なロード/ストア命令 (かれの後の発表 [13] での compare & swap [12], および load-linked および store-conditional) および割り込まれたメソッド実行の再試行に依存している.

オブジェクトの表現については特別な注意が払われる. 並列オブジェクトはレコード(ここでは self record と呼ぶ) によって表現される. そのレコードの各要素はインスタンス変数の レコードへのポインタである. この間接性によってインスタンス変数の一貫した値を 原子的に得ることが可能になる. オブジェクトに対するメソッドは まず一つの load-linked 命令によってインスタンス変数のポインタを取得し, そのレコードをプロセッサの局所記憶にコピーし, そのコピーに 対して操作を行なう. メソッドの終了時には, そのプロセスはインスタンス変数の新しい値を 一つの store-conditional 命令によってインストールする. メソッドの実行が他のメソッドによって割り込まれていた場合, この命令は失敗する. その場合, そのプロセスはメソッド実行全体を 再試行する. ハードウェア的には, self record のポインタフィールドの キャッシュラインの有効性によって割り込みが検出される. いくつかの改良が [13] にあり, 訂正が [24], [25] に報告されている.

我々のオブジェクトモデルはこれらの研究に影響されている. しかし, 彼らの実装方式はいくつかの理由で並列オブジェクト 指向言語として即座に使うわけにはいかない.



Mitsubishi Research Institute,Inc.
Mon Feb 24 19:24:01 JST 1997