THE BEAM
by fxmy wang
1. Code Dispatch特点
1.1. Directly Threaded
2. Scheduling
2.1. Non-preemptive
2.2. Reduction counting
2.2.1. 每个function call会消耗一个reduction
2.2.2. BEAM在function call之前会检查Reduction,<0时会把process调度出
2.2.3. 每个Reduction之间做的应该都是很小量的工作
2.2.4. 循环其实是递归,也消耗Reduction
2.2.5. process在等待receieve的时候也会被schedule out
2.2.6. 对于一些bif和你自己写的一些nif来说,尤其要注意把调度器噎着了的情况
2.2.7. 主动要求Schedule out
2.2.8. 在每次function call之前,BEAM会保证process的状态是合法的(in a known state)
3. Garbage Collection
3.1. "test_heap"检查是否有可用堆空间
3.2. 如有需要,指令会调用GC
3.3. GC可能会调用更底层的内存管理子系统来进行分配/回收内存
3.3.1. GC底层有十几种各有侧重的memory allocator
3.3.2. 有超多的flag可以调整
4. Virtual Machine
4.1. 由软件实现,而不是实在的硬件
4.2. BEAM目前没有正式的标准,现在唯一由Erlang/OTP的实现定义
5. Register Machine
5.1. Stack Machine优点
5.1.1. 易于编译目标代码
5.1.2. 易于实现
5.2. Register Machine优点
5.2.1. Stack Machine需要对内存进行push&pop操作
5.2.2. 需要操心栈内参数顺序(以及push&pop进行调整)
5.2.3. 参数存于寄存器内,操作数作为一个参数也在寄存器中
5.3. BEAM会把一些特定的Register映射到硬件上的Register上去
5.4. 两种寄存器:X和Y类
5.4.1. Y寄存器实际上是存在于栈上的
5.4.2. 特殊的X0寄存器
5.5. 其他特殊的寄存器
5.5.1. htop
5.5.2. stop
5.5.3. I
5.5.4. fcalls
5.5.5. floating point registers