Erlang BEAM 机器的归约
Reductions in the Erlang BEAM machine
Erlang 是一种著名的编程语言(除其他外)
因为它是轻量级线程。 Erlang 通常用 BEAM machine 来实现。
Erlang BEAM 机器的描述 (H'97) 说
To guarantee a fair scheduling a process is suspended after a fixed
number of reductions and then the first process from the queue is
resumed.
我对这种减少的概念很感兴趣。根据 (H'97) 只有以下 BEAM 命令算作减少:
- C/CO/ResC: 调用 local/resident 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.豪斯曼,The Erlang BEAM Virtual Machine Specification.
我只知道第一个问题的答案:
- 时间片不一定在所有平台和操作系统上都准确;使用缩减确保所有环境中的统一行为
我会尽量回答你的问题。
1)不使用时间片的主要原因是性能和可移植性。从操作系统中读取单调时间值是非常昂贵的,如果我们必须为每个函数调用都这样做,开销会变得相当大。不同 OS 的成本也相差很大。然而,减少计数机制只要求机器擅长递减整数,大多数机器都是这样。
2) 他们没有。正如您所说,该列表非常过时。从那以后,VM 的大部分工作方式都被重写了。作为一般经验法则;函数调用(不是 return)或任何可能花费未知时间的调用都算作减少。这包括 bifs、nifs、gc、sending/receiving 消息,可能还有更多我现在想不起来的。
3) 调度和抢占是非常不同的事情。您可能想看看我几年前举办的关于如何安排日程的网络研讨会:https://www.youtube.com/watch?v=tBAM_N9qPno
Erlang 是一种著名的编程语言(除其他外) 因为它是轻量级线程。 Erlang 通常用 BEAM machine 来实现。 Erlang BEAM 机器的描述 (H'97) 说
To guarantee a fair scheduling a process is suspended after a fixed number of reductions and then the first process from the queue is resumed.
我对这种减少的概念很感兴趣。根据 (H'97) 只有以下 BEAM 命令算作减少:
- C/CO/ResC: 调用 local/resident 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.豪斯曼,The Erlang BEAM Virtual Machine Specification.
我只知道第一个问题的答案:
- 时间片不一定在所有平台和操作系统上都准确;使用缩减确保所有环境中的统一行为
我会尽量回答你的问题。
1)不使用时间片的主要原因是性能和可移植性。从操作系统中读取单调时间值是非常昂贵的,如果我们必须为每个函数调用都这样做,开销会变得相当大。不同 OS 的成本也相差很大。然而,减少计数机制只要求机器擅长递减整数,大多数机器都是这样。
2) 他们没有。正如您所说,该列表非常过时。从那以后,VM 的大部分工作方式都被重写了。作为一般经验法则;函数调用(不是 return)或任何可能花费未知时间的调用都算作减少。这包括 bifs、nifs、gc、sending/receiving 消息,可能还有更多我现在想不起来的。
3) 调度和抢占是非常不同的事情。您可能想看看我几年前举办的关于如何安排日程的网络研讨会:https://www.youtube.com/watch?v=tBAM_N9qPno