Кто-то может объяснить структуру Pid в Erlang?

64
задан 5 revs, 3 users 89% 16 August 2010 в 20:52
поделиться

4 ответа

Печатные идентификаторы процесса < A.B.C> состоят из 6 :

  • А, число узла (0 локальный узел, произвольное число для удаленного узла)
  • B, первые 15 битов числа процесса (индекс в таблицу процессов) 7
  • C, биты 16-18 из числа процесса (то же число процесса как B) 7

Внутренне, число процесса 28 битов шириной на эмуляторе на 32 бита. Нечетное определение B и C прибывает из R9B и более ранних версий Erlang, в котором B был идентификатором процесса на 15 битов, и C был счетчиком обертки, увеличенным, когда макс. идентификатор процесса был достигнут, и более низкие идентификаторы были снова использованы.

В erlang распределении PIDs немного больше, поскольку они включают атом узла, а также другую информацию. ( Распределенный формат PID)

, Когда внутренний PID отправляется от одного узла до другого, это автоматически преобразовывается во внешнюю/распределенную форму PID, поэтому что могло бы быть <0.10.0> (inet_db) на одном узле, мог бы закончиться как <2265.10.0>, когда отправлено в другой узел. Можно просто отправить к этим PIDs как нормальные.

% 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

72
ответ дан 3 revs, 2 users 99% 24 November 2019 в 15:57
поделиться

Если я помню это правильно, формат <nodeid,serial,creation>. 0 текущий узел во многом как компьютер, всегда имеет имя узла "localhost", чтобы относиться к себе. Это старой памятью, таким образом, это не могли бы быть 100%, корректных жесткий.

, Но да. Вы могли создать изодромное с предварением с list_to_pid/1, например.

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

, Конечно. Вы просто используете любой метод, который необходимо использовать для создания PidString. Вероятно, запишите функцию, которая генерирует его, и используйте это вместо PidString как такой:

list_to_pid( make_pid_from_term({proc_name, Node}) ) ! message
13
ответ дан 2 revs, 2 users 95% 24 November 2019 в 15:57
поделиться

PID относится к процессу и таблице узла. Таким образом, можно только отправить сообщение непосредственно в PID, если это известно в узле, от которого Вы делаете вызов.

возможно, что это будет работать, если узел, от которого Вы уже делаете вызов , будет знать [приблизительно 110] узел, на котором работает процесс.

2
ответ дан Ruben 24 November 2019 в 15:57
поделиться

Идентификатор процесса состоит из:

  • A, идентификатор узла, который не является произвольным, но является внутренним индексом для этого узла в dist_entry. (На самом деле это целое число в слоте атома для имени узла.)
  • B, индекс процесса, который ссылается на внутренний индекс в proctab, (0 -> MAXPROCS).
  • C, последовательный номер, который увеличивается каждый раз, когда MAXPROCS имеет

Тег создания из 2 битов не отображается в pid, но используется внутри и увеличивается каждый раз, когда узел перезапускается.

8
ответ дан 24 November 2019 в 15:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: