74

誰か Erlang の Pid の構造を説明できますか?

Pids は次のようになります: <A.B.C>, たとえば<0.30.0>, しかし、これらの 3 つの「ビット」の意味を知りたい: A,BおよびC.

Aは常に0ローカル ノード上にあるように見えますが、Pid の所有者が別のノードにいる場合、この値は変化します。

Pid のみを使用してリモート ノードにメッセージを直接送信することは可能ですか? そのようなもの: <4568.30.0> ! Message、登録されたプロセスの名前とノード名 ( ) を明示的に指定する必要はあり {proc_name, Node} ! Messageませんか?

4

5 に答える 5

83

印刷されたプロセス ID < ABC > は6で構成されています。

  • A、ノード番号 (0 はローカル ノード、リモート ノードの任意の番号)
  • B、プロセス番号の最初の 15 ビット (プロセス テーブルへのインデックス) 7
  • C、プロセス番号のビット 16 ~ 18 (B と同じプロセス番号) 7

内部的には、プロセス番号は 32 ビット エミュレータで 28 ビット幅です。B と C の奇妙な定義は、R9B とそれ以前のバージョンの Erlang に由来します。B は 15 ビットのプロセス ID であり、C は最大プロセス ID に達したときにインクリメントされるラップ カウンターであり、より低い ID が再利用されました。

erlang ディストリビューションでは、ノード アトムとその他の情報が含まれているため、PID は少し大きくなっています。(分散PID形式)

内部 PID が 1 つのノードから別のノードに送信されると、自動的に外部/分散 PID 形式に変換されるため、 1 つのノードで<0.10.0>( inet_db) になっているものは<2265.10.0>、別のノードに送信されたときと同じになる可能性があります。通常どおりこれらの PID に送信できます。

% get the PID of the user server on OtherNode
RemoteUser = rpc:call(OtherNode, erlang,whereis,[user]), 

true = is_pid(RemoteUser),

% send message to remote PID
RemoteUser ! ignore_this, 

% print "Hello from <nodename>\n" on the remote node's console.
io:format(RemoteUser, "Hello from ~p~n", [node()]). 

詳細については、内部 PID 構造ノード作成情報EPMD とのノード作成カウンターの相互作用を参照してください。

于 2008-11-04T15:29:26.680 に答える
13

これを正しく覚えていれば、形式は<nodeid,serial,creation>. 0 は現在のノードであり、コンピューターが自身を参照するために常にホスト名 "localhost" を持っているのと同じです。古い記憶なので、100%正しいタフではないかもしれません。

でも、はい。list_to_pid/1たとえば、pidを構築できます。

PidString = "<0.39.0>",
list_to_pid(PidString) ! message.

もちろん。PidString を構築するために必要なメソッドを使用するだけです。おそらく、それを生成する関数を作成し、次のように PidString の代わりに使用します。

list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message
于 2008-10-28T15:09:17.977 に答える
8

プロセス ID < ABC > は以下で構成されています。

  • A、ノード ID は任意ではありませんが、dist_entry 内のそのノードの内部インデックスです。(実際には、ノード名のアトム スロット整数です。)
  • B、proctab の内部インデックスを参照するプロセス インデックス (0 -> MAXPROCS)。
  • C、MAXPROCS に達するたびに増加するシリアル。

2 ビットの作成タグは pid には表示されませんが、内部で使用され、ノードが再起動するたびに増加します。

于 2009-04-30T23:17:12.320 に答える
3

PID は、プロセスとノード テーブルを参照します。したがって、呼び出し元のノードで PID が認識されている場合にのみ、PID に直接メッセージを送信できます。

呼び出し元のノードが、プロセスが実行されているノードをすでに認識している場合、これが機能する可能性があります。

于 2008-10-28T14:24:20.830 に答える