【发布时间】:2025-11-27 07:10:01
【问题描述】:
Erlang 是一种著名的编程语言(除其他外) 因为它是轻量级线程。 Erlang 通常使用BEAM machine 实现。 Erlang BEAM 机器的描述(H'97)说
为了保证公平调度,一个进程在一个固定的时间后被挂起 reductions 的次数,然后队列中的第一个进程是 已恢复。
我对这种减少的概念很感兴趣。根据 (H'97),只有以下 BEAM 命令算作减少:
- C/CO/ResC:调用本地/常驻Erlang函数
- CL:丢弃当前堆栈帧。调用本地 Erlang 函数。
- CEx/TrCEx:调用外部 Erlang 函数(跟踪或其他方式)。
- CExL/TrCExL:丢弃当前堆栈帧并调用外部 Erlang 函数(跟踪或其他方式)。
- M_C_r:加载参数寄存器 x(0)。调用常驻 Erlang 函数。
- M_CL_r:加载参数寄存器 x(0)。丢弃当前堆栈帧。调用本地 Erlang 函数。
所有这些都涉及函数调用。 相反,对 C 函数的调用(例如 TrC/TrCO)和对内置函数的调用(例如由 Bif_0_ 调用)不算作 减少。
问题。在这个序言之后,这是我想知道的。
- 为什么线程之间的调度使用缩减而不是时间片?
- 为什么只有上述命令会推进减少计数器?
- (H'97) 中的描述有点过时,当代 Erlang 是如何处理调度的?
(H'97)B. Hausman,The Erlang BEAM Virtual Machine Specification。
【问题讨论】:
标签: multithreading concurrency erlang scheduling vm-implementation