Multithreading Erlang梁机的简化

Multithreading Erlang梁机的简化,multithreading,concurrency,erlang,scheduling,vm-implementation,Multithreading,Concurrency,Erlang,Scheduling,Vm Implementation,是一种著名的编程语言(除其他外) 因为它是轻量级线程。Erlang通常使用实现。 Erlang光束机的描述(H'97)显示 为了保证公平的调度,进程在固定时间后暂停 减少次数,然后队列中的第一个进程 接着说 我对减量这个概念很感兴趣。根据(H'97),只有以下光束命令算作减少: C/CO/ResC:调用本地/常驻Erlang函数 CL:放弃当前堆栈帧。调用本地Erlang函数 CEx/TrCEx:调用外部Erlang函数(跟踪或其他) CExL/TrCExL:放弃当前堆栈帧并调用外部Erlan

是一种著名的编程语言(除其他外) 因为它是轻量级线程。Erlang通常使用实现。 Erlang光束机的描述(H'97)显示

为了保证公平的调度,进程在固定时间后暂停 减少次数,然后队列中的第一个进程 接着说

我对减量这个概念很感兴趣。根据(H'97),只有以下光束命令算作减少:

  • 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\u 0\uu)不算作 减少

问题。在本序言之后,我想知道以下内容

  • 为什么减少用于线程之间的调度,而不是时间片
  • 为什么只有上述命令才能使还原计数器前进
  • (H'97)中的描述有点过时,现代Erlang如何处理调度


  • (H'97)B.豪斯曼,.

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

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

  • 我会尽力回答你们的问题

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

    2) 他们没有。正如你所说,这份清单已经过时了。从那时起,虚拟机的大部分工作方式都被重写了。作为一般经验法则;函数调用(而不是返回)或任何可能需要未知时间的操作都会减少计数。这包括bifs、nifs、gc、发送/接收消息,可能还有我现在想不到的更多


    3) 计划和先发制人是完全不同的事情。您可能想看看我几年前举办的关于如何安排日程的网络研讨会:

    谢谢。在什么意义上,还原步骤是精确的?毕竟,被算作缩减的命令在不同的平台上有不同的持续时间。它们在相对而言和成本上是相等的。@Lucas,谢谢。这是非常有益的。我想知道是否有办法编写占用CPU的(长的、直线的)Erlang程序,因为它们不涉及减少缩减计数器的代码。是的,但由于Erlang中除了函数调用之外没有循环构造,这只是一个理论问题。@Lucas是的,但即使你稍微展开一个函数,比如说4次递归解绑,与原始函数相比,CPU上的时间应该多出大约4倍。并不是说这在实践中是个问题。