7

Erlang での優先受信は、次のように簡単に実装できます。

prio() -> 
  receive 
    {priority, X} -> X 
  after 0 -> 
    receive 
      X -> X 
    end 
  end.

私は、Nyström によるPriority Messaging made Easyという論文を読んでいます。そこでは、次の問題が説明されています。

[上記の] [コード] の例の主な問題は、内部ブロッキング受信から評価が再開されたときに、メールボックスに複数のメッセージがある可能性があることを考慮していないことです。最悪のシナリオでは、潜在的に膨大な数の要素のうち、最初の要素を除くすべてが優先メッセージになる可能性があります。このシナリオでは、実際には、意図したこととは正反対のことを達成したことになります。

私はこれを完全に理解していません。

質問 (1): 1 つのメッセージがメッセージ キューに到着するとすぐに、内部ブロッキング受信が「呼び出される」(つまり再開される) と仮定しますよね? 内部ブロッキング受信から再開するのにかかる短い時間内に、キューで待機している大量のメッセージが既にあると想定するのは現実的ですか?

質問 (2): また、最悪のシナリオは、1 つの通常のメッセージと多数の優先メッセージを持つキューとして説明されています。すべての receive 句は、最初にキュー内の最初のメッセージに対してチェックされ、次にキュー内の 2 番目のメッセージに対してチェックされるため、...(ソース: この、69 ~ 70 ページ) ではありません。キューの最後に優先メッセージがあるメッセージ?

4

4 に答える 4

5

(1) について: この仮定を立てることができるかどうかは、状況の詳細によって異なります。たとえば、他のすべてのプロセスは、メッセージを送信する前に何かが起こるのを待っていた可能性があります。

(2) について: 実際、最悪のケースは優先メッセージがないことだと私には思えます。

于 2009-06-07T04:36:31.973 に答える
2

erlang リファレンス マニュアルによると、 receive はメールボックスを時間順にトラバースします。メッセージが句の 1 つと一致するまでブロックします。

内部受信が一致するメッセージを受信するまでブロックするように聞こえることを考えると。このため、優先度の低いメッセージを待っている間に実際には優先度の高いメッセージを積み上げてしまう可能性があります。これは、希望とは逆です。

この苦境から抜け出すには、内部の receive で新しい after 句をスローする方法が多すぎます。または常に内側のレシーブで一致します。

彼らの機能を見ても、内側の句は常に一致するはずですが、これが彼らが話していたことだと思います。

于 2009-06-07T21:52:07.333 に答える