문제

누군가 Erlang에서 PID의 구조를 설명 할 수 있습니까?

PIDS는 다음과 같습니다. <A.B.C> , 예를 들어 <0.30.0>이지만,이 세 가지 "비트"의 의미가 무엇인지 알고 싶습니다 : A, B 및 C.

'A'는 로컬 노드에서 항상 0 인 것 같습니다. 그러나 PID 소유자가 다른 노드에있을 때이 값이 변경됩니다.

PID 만 사용하여 원격 노드에서 메시지를 직접 보낼 수 있습니까? 그런 것 : <4568.30.0>! 메시지, 등록 된 프로세스의 이름과 노드 이름 ({proc_name, node}! 메시지)을 설명하지 않고 메시지?

도움이 되었습니까?

해결책

인쇄 된 프로세스 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 분포에서 PID는 노드 원자와 다른 정보를 포함하므로 약간 더 큽니다. (분산 된 PID 형식)

내부 PID가 한 노드에서 다른 노드로 전송되면 자동으로 외부/분산 PID 양식으로 변환되므로 <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 구조, 노드 생성 정보, EPMD와의 노드 생성 카운터 상호 작용

다른 팁

내가 이것을 정확하게 기억한다면 형식은입니다 <nodeid,serial,creation>. 0은 컴퓨터가 항상 호스트 이름 "localhost"를 가지고있는 것처럼 현재 노드입니다. 이것은 오래된 메모리에 의한 것이므로 100% 올바른 힘이 아닐 수도 있습니다.

그러나 그렇습니다. PID를 만들 수 있습니다 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

프로세스 ID <ABC>는 다음으로 구성됩니다.

  • A, 노드 ID는 임의적이지 않고 Dist_Entry의 해당 노드의 내부 인덱스입니다. (실제로 노드 이름의 원자 슬롯 정수입니다.)
  • B, ProcTab의 내부 색인을 나타내는 프로세스 인덱스 (0-> maxprocs).
  • C, MaxProc에 도달 할 때마다 증가하는 직렬.

2 비트의 생성 태그는 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>>

따라서 노드 이름이 PID에 내부적으로 저장되어 있음을 알 수 있습니다. 더 많은 정보 이번 장 erlang을 배우십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top