gpt4 book ai didi

c - 修改 Erlang VM Pid

转载 作者:行者123 更新时间:2023-12-02 05:02:35 25 4
gpt4 key购买 nike

如何更改 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;
}

最佳答案

你为什么要这样做?创建 pid 并不能保证存在具有该 pid 的进程,或者永远是具有该 pid 的进程,只有 spawn 的返回才能确保这一点。阅读 Can someone explain the structure of a Pid in Erlang? 的答案了解各个领域的含义。这将有助于解释为什么不能将其设置为任何值。

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

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

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

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

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

关于c - 修改 Erlang VM Pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16824523/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com