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 函数(例如 TrC/TrCO)和调用内置函数(例如调用 Bif_0_) 不算作 减少。

问题。在这个序言之后,这是我想知道的。

  1. 为什么减少用于线程之间的调度,而不是时间片?
  2. 为什么只有上面的命令会递减计数器?
  3. (H'97) 中的描述有点过时,当代 Erlang 如何处理调度?

(H'97) B.豪斯曼,The Erlang BEAM Virtual Machine Specification.

我只知道第一个问题的答案:

  1. 时间片不一定在所有平台和操作系统上都准确;使用缩减确保所有环境中的统一行为

我会尽量回答你的问题。

1)不使用时间片的主要原因是性能和可移植性。从操作系统中读取单调时间值是非常昂贵的,如果我们必须为每个函数调用都这样做,开销会变得相当大。不同 OS 的成本也相差很大。然而,减少计数机制只要求机器擅长递减整数,大多数机器都是这样。

2) 他们没有。正如您所说,该列表非常过时。从那以后,VM 的大部分工作方式都被重写了。作为一般经验法则;函数调用(不是 return)或任何可能花费未知时间的调用都算作减少。这包括 bifs、nifs、gc、sending/receiving 消息,可能还有更多我现在想不起来的。

3) 调度和抢占是非常不同的事情。您可能想看看我几年前举办的关于如何安排日程的网络研讨会:https://www.youtube.com/watch?v=tBAM_N9qPno