有人可以解释Erlang的Pid结构吗?

有人可以解释Erlang的Pid结构吗?

Pids看起来像这样: <ABC> ,例如<0.30.0>,但是我想知道这三个“比特”是什么意思:A,B和C.

在本地节点上,“A”似乎总是0,但是当Pid的所有者位于另一个节点上时,该值会改变。

是否可以直接使用Pid在远程节点上发送消息? 就是这样的:<4568.30.0>! 消息,而不必明确指定注册过程的名称和节点名称({proc_name,Node}!Message)?

印刷过程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分布中,PIDs有点大,因为它们包含了节点primefaces以及其他信息。 ( 分布式PID格式 )

当内部PID从一个节点发送到另一个节点时,它会自动转换为外部/分布式PIDforms,因此一个节点上可能<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结构 , 节点创build信息 , 节点创build计数器与EPMD的交互

如果我正确记得这个格式是<nodeid,serial,creation> 。 0是当前节点,就像一台计算机总是有主机名“localhost”来引用它自己。 这是由旧的记忆,所以它可能不是100%正确的强硬。

但是,是的。 例如,您可以使用list_to_pid/1来构buildpid。

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

当然。 您只需使用您需要的任何方法来构build您的PidString。 大概写一个生成它的函数,并使用它来代替PidString,如下所示:

 list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message 

进程ID <ABC>由以下部分组成:

  • A,节点ID不是任意的,而是dist_entry中该节点的内部索引。 (它实际上是节点名称的primefaces槽整数。)
  • B,指直接内部索引的进程索引,(0-> MAXPROCS)。
  • C,每次达到MAXPROCS时都会增加串口。

2位的创build标签不显示在pid中,而是在内部使用,每当节点重新启动时都会增加。

PID是指一个进程和一个节点表。 因此,如果您在进行呼叫的节点中已知,则只能将消息直接发送到PID。

如果您进行调用的节点已经知道正在运行进程的节点,则可能会发生这种情况。

除了别人所说的之外,你可能会发现这个简单的实验有助于理解内部发生的事情:

 1> node(). nonode@nohost 2> term_to_binary(node()). <<131,100,0,13,110,111,110,111,100,101,64,110,111,104,111, 115,116>> 3> self(). <0.32.0> 4> term_to_binary(self()). <<131,103,100,0,13,110,111,110,111,100,101,64,110,111,104, 111,115,116,0,0,0,32,0,0,0,0,0>> 

所以,你可以select节点名是内部存储在PID中。 了解更多关于Erlang的信息。