it-swarm.com.de

Kann jemand die Struktur eines Pid in Erlang erklären?

Kann jemand die Struktur eines Pid in Erlang erklären?

Pids sieht folgendermaßen aus:<A.B.C>, z. <0.30.0>, aber ich würde gerne wissen, was diese drei "Bits" bedeuten: A, B und C.

'A' scheint auf einem lokalen Knoten immer 0 zu sein, aber dieser Wert ändert sich, wenn sich der Pid-Besitzer auf einem anderen Knoten befindet.

Ist es möglich, eine Nachricht direkt auf einem Remote-Knoten zu senden, indem nur die Pid verwendet wird? So etwas in der Art: <4568.30.0>! Nachricht, ohne den Namen des registrierten Prozesses und den Knotennamen ({proc_name, Node}! Nachricht) explizit angeben zu müssen?

63
jideel

Die gedruckten Prozess-IDs <A.B.C> bestehen aus 6 :

  • A, die Knotennummer (0 ist der lokale Knoten, eine beliebige Nummer für einen entfernten Knoten) 
  • B die ersten 15 Bits der Prozessnummer (ein Index in der Prozesstabelle) 7
  • C, Bits 16-18 der Prozessnummer (dieselbe Prozessnummer wie B) 7

Intern ist die Prozessnummer im 32-Bit-Emulator 28 Bit breit. Die ungerade Definition von B und C stammt von R9B und früheren Versionen von Erlang, in denen B eine 15-Bit-Prozess-ID und C ein Wrap-Zähler war, der inkrementiert wurde, wenn die maximale Prozess-ID erreicht wurde und niedrigere IDs erneut verwendet wurden.

In der Erlang-Verteilung sind PIDs etwas größer, da sie das Knotenatom sowie die anderen Informationen enthalten. ( verteiltes PID-Format )

Wenn eine interne PID von einem Knoten zum anderen gesendet wird, wird sie automatisch in das externe/verteilte PID-Formular konvertiert. Daher könnte <0.10.0> (inet_db) auf einem Knoten <2265.10.0> sein, wenn er an einen anderen Knoten gesendet wird. Sie können diese PIDs ganz normal senden.

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

Weitere Informationen finden Sie unter: Interne PID-Struktur , Informationen zur Knotenerstellung , Knoteninteraktionswechselwirkung mit EPMD

69
archaelus

Wenn ich mich richtig erinnere, ist das Format <nodeid,serial,creation>. 0 ist ein aktueller Knoten, ähnlich wie ein Computer immer den Hostnamen "localhost" hat, um auf sich selbst zu verweisen. Dies ist aus dem alten Speicher, so dass es möglicherweise nicht zu 100% korrekt ist.

Aber ja. Sie können die PID beispielsweise mit list_to_pid/1 erstellen.

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

Na sicher. Sie verwenden nur die Methode, die Sie zum Erstellen Ihres PidString verwenden müssen. Schreiben Sie wahrscheinlich eine Funktion, die sie generiert, und verwenden Sie diese anstelle von PidString wie folgt:

list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message
13
Jon Gretar

Die Prozess-ID <A.B.C> besteht aus:

  • Eine Knoten-ID, die nicht willkürlich ist, sondern der interne Index für diesen Knoten in dist_entry. (Es ist tatsächlich die Atom-Slot-Ganzzahl für den Knotennamen.)
  • B, Prozessindex, der sich auf den internen Index in der Proctab bezieht, (0 -> MAXPROCS).
  • C, Seriennummer, die bei jedem Erreichen von MAXPROCS zunimmt.

Das Erstellungskennzeichen von 2 Bits wird nicht in der PID angezeigt, sondern wird intern verwendet und steigt bei jedem Neustart des Knotens.

8
psyeugenic

Die PID bezieht sich auf eine Prozess- und eine Knotentabelle. Sie können eine Nachricht also nur direkt an eine PID senden, wenn sie in dem Knoten bekannt ist, von dem aus Sie den Anruf tätigen.

Es ist möglich, dass dies funktioniert, wenn der Knoten, von dem aus Sie den Aufruf ausführen, bereits kennt den Knoten, auf dem der Prozess ausgeführt wird. 

2
Ruben

Abgesehen von dem, was andere gesagt haben, können Sie dieses einfache Experiment nützlich finden, um zu verstehen, was intern vor sich geht:

1> node().
[email protected]
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>>

Sie können also sehen, dass der Knotenname intern in der PID gespeichert ist. Weitere Informationen in diesem Abschnitt von Learn You Some Erlang.

0
nacmartin