Think Stitch
PRINCIPIA  最近の更新


プロセスの動的生成 1

並行合成 par を使うと、実行時に動的にプロセスを生成するようなモデルを作ることができます。例えば次のプロセス P はイベント c を受け取ると2つのプロセス Q と R を生成します。プロセス P 自身は2つのプロセスの終了待ちになります。

(define-process P
  (! c
     (par '()
       Q
       R)))

(define-process Q
  (! a SKIP))

(define-process R
  (! b SKIP))

プロセス Q, R はそれぞれイベント a, b を生成したのち終了します。これらの間に同期はないので、実行順序は任意、つまりインターリーブになります。インターリーブであることは、計算木のダイアモンド形からわかります。両方のプロセスが終了すると、全体としてのプロセス P が終了します。

状態 0 から状態 1 に移るときに、子供のプロセス Q, R が生成されている様子がプロセス木からわかります。同様に、両方の子プロセスが終了した状態 5 からプロセス木がたたまれて全体が終了することがわかります。

親子プロセス

並行合成 par は、プロセスに親子関係があるという点で UNIX 系 OS が持つ fork に似ていますが、生成されるプロセスはすべて子プロセスで、親プロセスは必ず待ち状態になります。しかし、生成する子供の1つを親の制御の延長だと考えれば、fork と同じように考えて使うこともできます。

次の例では、プロセス P はイベント c を受けると子プロセス Q を生成します。もう1つの子プロセスを P の制御の延長であると考えます。これを P1 とします。

(define-process P
  (! c
     (par (list b)
       P1
       Q)))

プロセス Q は自分の仕事をした後、親プロセスに終了通知を出してから終了します。仕事をイベント a で、終了通知をイベント b で表します。

(define-process Q
  (! a (! b SKIP)))

プロセス P は子プロセス Q を生成して P1 に移ったら、Q からの終了通知イベント b を待ちます。イベント b を受け取ったら自分自身も終了します。終了通知イベント b は、同期するために並行合成 par の同期リストに指定しておきます。

(define-process P1
  (! b SKIP))

プロセス P の計算木は次のようになります。

2013/08/03
© 2013,2014,2015 PRINCIPIA Limited