修改Erlang VM Pid

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)

rvi*_*ing 5

你为什么要这样做?创建一个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表吗?

  • 然后我将要确切地检查它的含义. (2认同)