multithreading - Erlang BEAM 机器的减少

标签 multithreading concurrency erlang scheduling vm-implementation

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 : 调用本地/常驻 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 - Erlang BEAM 机器的减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31751766/

    相关文章:

    erlang - 在 Erlang 集群中的所有节点上运行 gen_server 的最佳方法是什么?

    java - 使用多线程同时向 Kafka 分区发布多条消息以进行测试以检查性能

    android - Handler.sendMessageDelayed(msg, delay) 无法正常工作

    multithreading - 为什么工作线程从 CANCELED 过渡到 SCHEDULED 并跳过 READY? (JavaFX2)

    java - 如何在写入文件之前锁定java中的文件夹?

    module - 列出来自 erlang 模块的所有调用

    java - Java-ExecutorService : How to re run “wait state” thread

    java - 尝试在 JTextArea 中使用 BufferedWriter 时发生并发冲突

    javascript - 关于node.js中的MySQL模块以及与mySQL数据库的并发连接

    sockets - 在 Erlang 中确定传入 TCP/IP 连接的 IP 地址和端口