GOOGLE ADS

Sonntag, 17. April 2022

Kann jemand den Aufbau einer Pid (Process Identifier) ​​in Erlang erklären?

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

Pids sieht so aus: <A.B.C>, zB <0.30.0>, aber ich würde gerne wissen, was diese drei "Bits" bedeuten: A, Bund C.

Ascheint sich immer 0auf einem lokalen Knoten zu befinden, aber dieser Wert ändert sich, wenn sich der Besitzer der Pid auf einem anderen Knoten befindet.

Ist es möglich, nur mit der Pid eine Nachricht direkt an einen Remote-Knoten zu senden? Etwa so: <4568.30.0>! Message, ohne den Namen des registrierten Prozesses und den Knotennamen ( {proc_name, Node}! Message) explizit angeben zu müssen?


Lösung des Problems

Gedruckte Prozess-IDs < ABC > 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 (die gleiche 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, als die maximale Prozess-ID erreicht wurde und niedrigere IDs wiederverwendet 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 die externe/verteilte PID-Form konvertiert, sodass das, was auf einem Knoten <0.10.0>( inet_db) sein könnte, möglicherweise so endet, als würde <2265.10.0>es an einen anderen Knoten gesendet. Sie können ganz normal an diese PIDs 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,
Knotenerstellungsinformationen,
Interaktion des Knotenerstellungszählers mit EPMD

Keine Kommentare:

Kommentar veröffentlichen

Warum werden SCHED_FIFO-Threads derselben physischen CPU zugewiesen, obwohl CPUs im Leerlauf verfügbar sind?

Lösung des Problems Wenn ich das richtig verstehe, versuchen Sie, SCHED_FIFO mit aktiviertem Hyperthreading ("HT") zu verwenden, ...