减少Erlang BEAM机器

时间:2015-07-31 17:20:07

标签: multithreading concurrency erlang scheduling vm-implementation

Erlang是一种着名的编程语言(除此之外) 因为它的轻量级线程。 Erlang通常使用BEAM machine实现。 Erlang BEAM机器的描述(H' 97)说

  

为了保证公平的安排,一个过程在修复后暂停    减少的数量,然后是队列中的第一个进程    恢复。

我对这种减少的概念很感兴趣。根据(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 _ 调用)不算作 减量。

问题。在此序言之后,我想知道这一点。

  1. 为什么减少用于线程之间的调度,而不是时间片?
  2. 为什么只有上述命令才能推进减少计数器?
  3. (H' 97)中的描述有点过时,当代Erlang如何处理调度?
  4. (H' 97)B。豪斯曼,The Erlang BEAM Virtual Machine Specification

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

我会尽力回答你的问题。

1)不使用时间片的主要原因是性能和可移植性。从操作系统读取单调时间值是非常昂贵的,如果我们必须为每个函数调用执行它,则开销变得非常大。不同操作系统的成本也有很大差异。然而,减少计数机制只需要机器擅长减少大多数机器的整数。

2)他们没有。正如你所说,那个清单已经过时了。从那时起,VM的大部分工作方式都被重写了。一般的经验法则;函数调用(不是返回)或任何可能花费未知时间的事物都会减少。这包括bifs,nifs,gc,发送/接收消息,以及我现在想不到的更多信息。

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