2013-05-29 7 views
2

Как я могу изменить Erlang VM, чтобы использовать случайное 128-битное значение для одного из его значений pid?Изменение Erlang VM 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> 

Похоже поколения ИЗОДРОМНЫХ сводится к тому, что-то вроде этого в 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; 
} 

ответ

5

Почему вы хотите это сделать? Создание pid не гарантирует, что есть процесс с этим pid, или это когда-либо будет процесс с этим pid, только возврат от spawn гарантирует это. Прочтите ответы на вопрос Can someone explain the structure of a Pid in Erlang?, чтобы получить эпланирование, что означают различные поля. Это поможет объяснить, почему вы не можете просто установить его на любое значение.

Вы можете установить размер таблицы процессов при запуске erlang с помощью опции «+ P Number». Это дает максимальное значение второго поля.

EDIT: Еще несколько комментариев по вопросу и комментариям ниже.

Обратите внимание, что идентификатор процесса, идентификатор процесса, является только ссылкой процессу, это не сам процесс. Когда вы выполните spawn процесс, вы получите как новый процесс, так и новый pid, ссылающийся на него. Когда вы создаете pid с pid/3 в оболочке или используете list_to_pid/1, вы получаете только pid, который может или не может ссылаться на процесс.

В BEAM не существует способа контролировать, какой pid вы получаете при создании процесса. Если вам действительно нужна эта функциональность, вам придется входить и модифицировать BEAM внутри, чтобы это сделать. Учитывая, что BEAM структурирован внутри (с таблицей процессов) и как структурирован pid, что может быть очень трудно сделать. Например, одно поле в pid является индексом процесса в таблице процессов, поэтому незаконно иметь разные pids с одним и тем же индексом таблицы.

Не лучше ли было бы создать таблицу indentifier/pid?

+0

Я хочу создать процесс с pid, содержащий случайное значение 128 бит. Так что я могу использовать его как возможность. http://en.wikipedia.org/wiki/Capability-based_security –

+0

@EricdesCourtis, когда вы создаете процесс, у вас нет контроля над тем, какой pid он имеет, система берет «следующий» бесплатный. Все, что вы можете быть уверены в том, что оно уникально. – rvirding

+0

Понял, но мой вопрос заключается в том, как изменить виртуальную виртуальную машину, чтобы получить это свойство. –

 Смежные вопросы

  • Нет связанных вопросов^_^