IT TIP

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

itqueen 2020. 11. 24. 20:46
반응형

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


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

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

'A'는 로컬 노드에서 항상 0 인 것처럼 보이지만 Pid의 소유자가 다른 노드에있을 때이 값이 변경됩니다.

Pid 만 사용하여 원격 노드에서 직접 메시지를 보낼 수 있습니까? 그런 것 : <4568.30.0>! 등록 된 프로세스의 이름과 노드 이름 ({proc_name, Node}! Message)을 명시 적으로 지정할 필요없이 메시지?


인쇄 된 프로세스 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가 재사용 될 때 증가하는 랩 카운터입니다.

얼랭 분포에서 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 % 정확하지 않을 수 있습니다.

하지만 그렇습니다. list_to_pid/1예를 들어 pid를 만들 수 있습니다.

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, MAXPROCS에 도달 할 때마다 증가하는 직렬.

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에 저장되도록 할 수 있습니다. Learn You Some Erlang 의이 섹션더 많은 정보가 있습니다.

참고 URL : https://stackoverflow.com/questions/243363/can-someone-explain-the-structure-of-a-pid-in-erlang

반응형