2

pid 値の 1 つにランダムな 128 ビット値を使用するようにErlang VMを変更するにはどうすればよいですか?

現時点で設定できる最大値は次のようです。

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 を持つプロセスになることは保証されませんspawnErlang で Pid の構造を説明できる人はいますか?の回答を読んでください。さまざまなフィールドが何を意味するのかを説明します。任意の値に設定できない理由を説明するのに役立ちます。

'+P Number' オプションを使用して erlang を起動すると、プロセス テーブルのサイズを設定できます。これにより、2 番目のフィールドの最大値が得られます。

編集:質問と以下のコメントについてのもう少しのコメント。

pid (プロセス識別子) はプロセスへの単なる参照であり、プロセス自体ではないことに注意してください。プロセスをspawn取得すると、新しいプロセスとそれを参照する新しい pid の両方が取得されます。pid/3シェル内または使用してpidを作成すると、プロセスをlist_to_pid/1参照する場合と参照しない場合があるpidのみが取得されます。

現在、プロセスを作成するときに取得する pid を BEAM で制御する方法はありません。この機能が本当に必要な場合は、そのために BEAM を内部で変更する必要があります。BEAM が内部で (プロセス テーブルを使用して) 構造化されていること、および pid がどのように構造化されているかを考慮すると、これを行うのは非常に困難な場合があります。たとえば、pid の 1 つのフィールドは、プロセス テーブル内のプロセスのインデックスであるため、同じテーブル インデックスを持つ異なる pid を持つことは違法です。

より良い解決策は、識別子/pid テーブルを作成することではないでしょうか?

于 2013-05-30T01:30:30.120 に答える