The layout of PID & PORT in the ERTS

本文详细解释了Erlang中PID和PORTID的底层整型表示如何转换为<A.B.C>和#Port<A.B>形式,通过分析erts/emulator/beam/erl_term.h文件提供的内部布局说明,提供了从整型到标识符的转换过程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明,来自:http://blog.youkuaiyun.com/skyman_2001

我在调试erts时发现PID和PORT ID在底层是个整型,但是在erlang层的表示是<A.B.C>和#Port<A.B>的格式,它们之间是怎么转换的呢?通过grep发现在erts/emulator/beam/erl_term.h里有关于PID和PORT的layout说明,这里只谈论本节点情况下的layout:

 *  PID layout (internal pids):
 
    |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1    |               |
    |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0|
    |               |               |               |               |
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    |n n n n n n n n n n n n n n n n n n n n n n n n n n n n|0 0|1 1|
    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
   n : number

 *  PORT layout (internal ports):
 
   |3 3 2 2 2 2 2 2|2 2 2 2 1 1 1 1|1 1 1 1 1 1    |               |
   |1 0 9 8 7 6 5 4|3 2 1 0 9 8 7 6|5 4 3 2 1 0 9 8|7 6 5 4 3 2 1 0|
   |               |               |               |               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |n n n n n n n n n n n n n n n n n n n n n n n n n n n n|0 1|1 1|
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 
   n : number

示例:
1. pid为3683,二进制表示为111001100011,去掉tag,则为11100110,换算成十进制则为230,则外部表示则为<0.230.0>;
2. port id为61111,二进制表示为1110111010110111,去掉tag,则为111011101011,换算成十进制则为3819,则外部表示则为#Port<0.3819>。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值