Erlang虚拟机源码阅读笔录(四)虚拟机的进程创建
?
?
所有3参数的BIF入口branch都是lb_bif_3,其中address保存着该threaded-code错误处理的回调函数入口地址,bif保存了spawn函数在BIF export tables中的index,然后type标志了每个参数的类型。当执行调度的时候调度器首先通过Goto(*next)跳转到lb_i_gc_bif3_jIsId,然后通过I分析出BIF的入口地址,并跳转到对应的BIF中,erlang:spawn/3对应的BIF函数为spawn_3(),其定义位于otp_src_R15B01/erts/emulator/beam/bif.c。定义如下:
BIF_RETTYPE spawn_3(BIF_ALIST_3)
{
??? ErlSpawnOpts so;
??? Eterm pid;
?
??? so.flags = 0;
??? pid = erl_create_process(BIF_P, BIF_ARG_1, BIF_ARG_2, BIF_ARG_3, &so);
??? if (is_non_value(pid)) {
??? BIF_ERROR(BIF_P, so.error_code);
??? } else {
??? if (ERTS_USE_MODIFIED_TIMING()) {
??? ??? BIF_TRAP2(erts_delay_trap, BIF_P, pid, ERTS_MODIFIED_TIMING_DELAY);
??? }
??? BIF_RET(pid);
??? }
}
其主要核心是调用erl_create_process()函数,该函数的定义在otp_src_R15B01/erts/emulator/beam/erl_process.c中,而erl_create_process()函数的剖析这篇文章(Erlang并发机制 - 进程)已经说得很详细,不再赘述。
?
相关资料:
1.Erlang并发机制 - 进程
2.Erlang并发机制 –进程调度
3.Erlang并发机制 – 任务迁移算法
4.Characterizing the Scalability of Erlang VM on Many-core Processors
5. Erlang并发机制 – 消息传递
6.Erlang并发机制 – 垃圾回收
7. The Erlang BEAM Virtual Machine Specification