1. ホーム
  2. erlang

誰かErlangのPid (Process Identifier)の構造を説明してください。

2023-10-02 17:05:06

質問

誰かErlangのPidの構造を説明してください。

Pidは以下のような感じです。 <A.B.C> のようになります。 <0.30.0> という3つのビットがありますが、この3つのビットの意味を教えてください。 A , BC .

A は、常に 0 であるように見えますが、Pid のオーナーが他のノードにいる場合、この値は変化します。

Pidだけを使って、リモートノードに直接メッセージを送ることは可能でしょうか?そのようなものです。 <4568.30.0> ! Message のように、登録されたプロセスの名前とノード名を明示的に指定することなく ( {proc_name, Node} ! Message )?

どのように解決するのですか?

印刷されたプロセスID < A.B.C > は、次のように構成されています。 6 :

  • A, ノード番号(0はローカルノード、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があるノードから他のノードに送信されるとき、それは自動的に外部/分散PID形式に変換されるので、次のようなものがあります。 <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とのノード生成カウンターの相互作用