3

私の occam-pi アプリケーションには、次のように定義された実行時間の長いプロデューサープロセスがあります。

PROC producer (VAL INT start, step, CHAN OF INT c!)
  INT count:
  SEQ
    count := start
    WHILE TRUE
      SEQ
        c ! count
        count := count + step
:

cから増加するチャンネルの値を送信しstartますstep。完全な例はこちらから入手できます。

これはうまく機能し、無限ループはCSP では慣用的であると信じるようになりました。問題は、消費アルゴリズムが終了したときに発生します。このでは、コンシューマが終了するとデッドロックが発生します。

ここで説明するTAGGED.INTプロトコルは、プロセスのネットワークをシャットダウンする問題を解決しようとしますが、私の現在の理解では、主な仕事がチャネルで送信しているプロデューサーを終了する簡単な方法はありません。プロデューサーを停止させる唯一の方法は、ある種のコントロール チャネルと出力のブラック ホールを使用することだと思われます。

PROTOCOL CONTROL
  CASE
    poison
:

PROTOCOL TAGGED.INT
  CASE
    normal; INT
    poison
:

PROC producer (VAL INT start, step, CHAN OF TAGGED.INT c!, CHAN OF CONTROL control?)
  INT count:
  INITIAL BOOL running IS TRUE:
  SEQ
    count := start
    WHILE running
      SEQ
        PRI ALT
          control ? poison
            SEQ
              running := FALSE
              c ! poison      -- necessary, only to kill the black hole process 
          SKIP
            SEQ
              c ! normal; count
              count := count + step
:

完全な動作例はこちらから入手できます。これの問題は、コードがはるかに読みにくいことです-主観的であることは知っていますが、ソフトウェアエンジニアリングにとって重要です-元の意図は元の意図に比べて複雑です。オッカムの剃刀とは相反するようだ!

JCSP 、C++CSP2、およびpython-cspを使用すると、プロセスのネットワークをシャットダウンするためにチャネルを明示的にポイズニングできます何らかの理由で、これを行うために occam を論争させると、コードがシャットダウン ロジックで汚染され、非論理的に見えます。

問題は、例のcontrolように明示的なチャネルを使用せずにプロデューサー プロセスを終了する方法があるかどうかです。

編集:

このメーリング リスト アーカイブ ( Poison ) には、このトピックに関するより多くの情報が含まれている可能性があります。これはかなり古いものです (> 10 年)。それ以来、何か変わったことはありますか、それともこれがoccam-piで「プロセスの終了」を達成するための最良の方法ですか?

4

1 に答える 1

2

問題は、例のように明示的な制御チャネルを使用せずにプロデューサー プロセスを終了する方法があるかどうかです。

終了の決定がプロデューサー プロセスの外部から発生する限り、(制御) チャネルを使用する以外に方法はありません。これは、分散メモリ モデルでは、メッセージを介して情報を伝達する必要があるためです。

とはいえ、ご指摘の中毒方法は一般的な方法であり、この場合にも機能させることができます。ソリューションを汚染する理由は、元の (終了しない) プロデューサー プロセスがメッセージを送信するだけで、何も受信しないためです。ポイズニング手法が機能するためには、プロデューサーはメッセージを受け入れる準備ができている必要があり、さらに不便なことに、コンシューマーは遅いプロデューサーに対処する準備ができている必要があります。

問題を解決するために別の手法を使用することを検討します。プロデューサーは、各メッセージが送信された後に、コンシューマーが続行するかどうかに関係なくシグナルを受け取ります。これにより、トラフィックが増加しますが、ソリューションの構造はより明確になります。

オッカム 2.1 コード:

PROC producer( VAL INT start, step, CHAN INT data, CHAN BOOL control)
  BOOL running:
  INT  count:
  SEQ
    count, running := start, TRUE
    WHILE running
      SEQ
        data    ! count
        control ? running
        count := count + step
: -- producer

PROC main( CHAN BYTE inp, out, err)
  CHAN INT data:
  CHAN BOOL control:
  VAL INT amount IS 10:
  INT val:
  PAR
    producer( 0, 4, data, control)
    SEQ n= 1 FOR amount
      SEQ
        data    ? val
        control ! n < amount
        out.int( val, 0, out)
        out.string( "*n", 0, out)
: -- main
于 2014-05-19T10:00:09.567 に答える