Eri*_*tis 2 c erlang pid beam vm-implementation
如何更改Erlang VM以使用其中一个pid值的随机128位值?
我现在可以设置的最大值似乎是:
32> pid(1, 32767, 8191).
** exception error: bad argument
in function list_to_pid/1
called as list_to_pid("<1.32767.8191>")
in call from c:pid/3 (c.erl, line 419)
33> pid(0, 32767, 8191).
<0.32767.8191>
Run Code Online (Sandbox Code Playgroud)
看起来pid的产生归结为这样的事情erts/emulator/beam/erl_ptab.h:283:
ERTS_GLB_INLINE Eterm
erts_ptab_make_id(ErtsPTab *ptab, Eterm data, Eterm tag)
{
HUint huint;
Uint32 low_data = (Uint32) data;
low_data &= (1 << ERTS_PTAB_ID_DATA_SIZE) - 1;
low_data <<= ERTS_PTAB_ID_DATA_SHIFT;
huint.hval[ERTS_HUINT_HVAL_HIGH] = erts_ptab_data2pix(ptab, data);
huint.hval[ERTS_HUINT_HVAL_LOW] = low_data | ((Uint32) tag);
return (Eterm) huint.val;
}
Run Code Online (Sandbox Code Playgroud)
你为什么要这样做?创建一个pid并不能保证有一个带有该pid的进程,或者只是一个带有该pid的进程,只有一个返回来spawn确保它.阅读答案有人可以解释Erlang中Pid的结构吗?得到一个eplanation各个领域的意思.它将有助于解释为什么不能将其设置为任何值.
使用'+ P Number'选项启动erlang时,可以设置进程表的大小.这给出了第二个字段的最大值.
编辑:关于这个问题和下面的评论,还有一些评论.
请注意,pid,Process Identifier,只是对进程的引用,而不是进程本身.当你进行spawn一个过程时,你会得到一个新的过程和一个新的pid引用它.当你pid/3在shell中创建一个pid 或者使用list_to_pid/1你时只得到一个pid,它可能会或可能不会引用一个进程.
今天BEAM无法控制创建流程时获得的pid.如果您确实需要此功能,则必须在内部修改BEAM才能执行此操作.考虑到BEAM是内部结构化的(带有进程表)以及如何构建pid可能非常困难.例如,pid中的一个字段是进程表中进程的索引,因此使用具有相同表索引的不同pid是非法的.
难道不是更好的解决方案是创建一个标识符/ pid表吗?