next up previous contents index
Next: 共有変数の具体化 Up: 処理系の構成 Previous: 局所領域と共有領域

ゴールの投げだし

KLIC の共有メモリ並列拡張では、ゴールの 分配をプラグマとして記述し、それにより指定されたノードにゴールの投げ る方式をとっている。

下記のようなコードを例とし、実際にどのようにゴールとして 投げだされるかを説明する。

    p(X) :- ... | ... , q(X,foo(Y))@node(4), ... .

最初にゴール q を局所ヒープに生成する。 実行時ルーチンによりそれは共有ヒープに コピーされる。これは、逐次版にも存在するenqueue_throw_goal()関数の中で、 行われ、 共有ヒープにコピーされる以降、これから述べる処理は 共有メモリ版特有のthrow_goal_routine()関数(runtime/shm_throw.c) により実装されている。

コピーは、(1) CONS や FUNCTOR 構造はその構成要素を再帰的にコ ピーしていき、(2) 変数は共有メモリ上に(ジェネリックオブジェクトである)共有 メモリ変数を生成し、局所メモリの変数はそれへのポインタに置き換える。 (3) 共有メモリへのポインタであった場合にはそれ以上のコピーは必要ない。

ある場合にはもう少し処理しなければならない。(A) フックされた変数を共有メモ リに移す場合には、中断情報も共有メモリに移さなければならない。コピーされた 中断情報は間接テーブルを通じて局所ヒープ内のゴールへポインタ付けされること になる。 (B) 現在のアクセス面より古い面のデータであった場合には現在の面にコピーしな ければならない。また (C) ゴールを投げようとするノードが新しい面を参照して いた場合には、新しい面にコピーして渡さなければならない。このようにしないと、 新面に移ったノードが旧面を参照してしまうことになる。

ゴールをコピーし終えたら、投げようとするノードの外部受け入れキューに 登録する。投げようとするノードの実行中の優先度を検査して、投げるゴールの 優先度の方が高ければ、割り込みフラッグを立てて、直ちに処理されることを要 求する。 それ以外の場合には投げだし先のノードには割り込まない。各ノードは低い優先 度処理に移るときに外部受け入れキューを調べ、それらをスケジューリングして 処理を再開する(この外部ノードーへの外部受入キューに登録以降の処理は、 throw_goal_routine()内の、shm_goal_stack()で行われる)。



Sekita Daigo
1998-05-18