erlang pid

¿Alguien puede explicar la estructura de un Pid en Erlang?



erlang spawn (5)

¿Alguien puede explicar la estructura de un Pid en Erlang?

Pids se ve así: <ABC> , por ejemplo <0.30.0>, pero me gustaría saber cuál es el significado de estos tres "bits": A, B y C.

''A'' parece ser siempre 0 en un nodo local, pero este valor cambia cuando el propietario de la Pid se encuentra en otro nodo.

¿Es posible enviar un mensaje directamente en un nodo remoto usando solo el Pid? Algo así: <4568.30.0>! Mensaje, sin tener que especificar explícitamente el nombre del proceso registrado y el nombre del nodo ({proc_name, Node}! Message)?


Además de lo que otros han dicho, es posible que este simple experimento sea útil para comprender lo que sucede internamente:

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>>

Por lo tanto, puede ver que el nombre del nodo se almacena internamente en el pid. Más información en esta sección de Learn You Some Erlang.


El PID se refiere a un proceso y una tabla de nodos. Por lo tanto, solo puede enviar un mensaje directamente a un PID si se lo conoce en el nodo desde el que realiza la llamada.

Es posible que esto funcione si el nodo del que usted hace la llamada ya sabe sobre el nodo en el que se está ejecutando el proceso.


La identificación del proceso <ABC> se compone de:

  • A, ID de nodo que no es arbitrario, sino el índice interno para ese nodo en dist_entry. (En realidad, es el número entero de ranura del átomo para el nombre del nodo).
  • B, índice de proceso que se refiere al índice interno en el proctab, (0 -> MAXPROCS).
  • C, serie que aumenta cada vez que se ha alcanzado MAXPROCS.

La etiqueta de creación de 2 bits no se muestra en el pid pero se usa internamente y aumenta cada vez que se reinicia el nodo.


Los identificadores de procesos impresos <ABC> están compuestos por 6 :

  • A, el número de nodo (0 es el nodo local, un número arbitrario para un nodo remoto)
  • B, los primeros 15 bits del número de proceso (un índice en la tabla de proceso) 7
  • C, bits 16-18 del número de proceso (el mismo número de proceso que B) 7

Internamente, el número de proceso es de 28 bits de ancho en el emulador de 32 bits. La extraña definición de B y C proviene de R9B y versiones anteriores de Erlang en las que B era un ID de proceso de 15 bits y C era un contador de envolvente incrementado cuando se alcanzaba la ID máxima del proceso y se reutilizaban identificadores inferiores.

En la distribución de erlang los PID son un poco más grandes ya que incluyen el átomo del nodo y otra información. ( Formato PID distribuido )

Cuando se envía un PID interno de un nodo a otro, se convierte automáticamente al formulario PID externo / distribuido, por lo que lo que podría ser <0.10.0> ( inet_db ) en un nodo podría terminar como <2265.10.0> cuando se envíe. a otro nodo Puede enviar estos PID de forma normal.

% 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()]).

Para obtener más información, consulte: Estructura PID interna , información de creación de nodo , interacción contador de creación de nodo con EPMD


Si recuerdo esto correctamente, el formato es <nodeid,serial,creation> . 0 es un nodo actual muy similar a una computadora siempre tiene el nombre de host "localhost" para referirse a sí mismo. Esto es por memoria antigua, por lo que podría no ser 100% correcto.

Pero si. Podría construir el pid con list_to_pid/1 por ejemplo.

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

Por supuesto. Simplemente usa el método que necesites para construir tu PidString. Probablemente escriba una función que la genere y la use en lugar de PidString como esta:

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