2

如何更改Erlang VM以将随机 128 位值用于其中一个 pid 值?

此时我可以设置的最大值似乎是:

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>

看起来 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;
}
4

1 回答 1

5

你为什么要这样做?创建 pid 并不能保证存在具有该 pid 的进程,或者将永远是具有该 pid 的进程,只有返回 fromspawn可以确保这一点。阅读答案有人可以解释 Erlang 中 Pid 的结构吗?了解各个领域的含义。这将有助于解释为什么您不能将其设置为任何值。

您可以在启动 erlang 时使用 '+P Number' 选项设置进程表的大小。这给出了第二个字段的最大值。

编辑:关于这个问题的更多评论和下面的评论。

请注意,pid(进程标识符)只是对进程的引用,而不是进程本身。当您spawn获得一个进程时,您会同时获得一个新进程和一个引用它的新 pid。pid/3当您在 shell 中或使用创建 pid 时,list_to_pid/1您只会得到一个 pid,它可能引用或不引用进程。

今天在 BEAM 中无法控制创建进程时获得的 pid。如果你真的需要这个功能,你将不得不在内部修改 BEAM 来做到这一点。考虑到 BEAM 是内部结构的(带有进程表)以及 pid 的结构方式,这可能很难做到。例如,pid 中的一个字段是进程表中进程的索引,因此具有相同表索引的不同 pid 是非法的。

不是更好的解决方案是创建一个标识符/pid 表吗?

于 2013-05-30T01:30:30.120 回答