Erlang - 将每个“erlang 进程”映射到新的内核线程

Posted

技术标签:

【中文标题】Erlang - 将每个“erlang 进程”映射到新的内核线程【英文标题】:Erlang - map each "erlang process" to new kernel thread 【发布时间】:2017-04-04 05:49:19 【问题描述】:

我正在研究一个基于 erlang 的系统,并试图分析系统中发生的事件顺序。每次调用“spawn”时,有没有办法强制 erlang 运行时或 elang vm 创建一个新的内核线程。这会使系统变慢,但会使研究变得容易得多。 我已经尝试过 +S 标志,并且已经启用了 smp,但我怀疑系统仍在将多个进程映射到一个内核线程或 erlang 调度程序。有没有我遗漏的输入/配置参数?

【问题讨论】:

Erlang 中的“进程”的生成规律与对象在顺序 OOP 语言中实例化的规律大致相同。不是一个完美的平行线,但最好这样想它们。 I wrote a thing about this a while back here on SO。范式的差异需要留下大量正常的编程知识和知识。 【参考方案1】:

不,这不是 Erlang VM 的工作方式。 BEAM 为每个核心生成线程并在那里运行调度程序。每个 Erlang 进程都可以在任何调度程序上运行,甚至可以从调度程序迁移到调度程序,从而使它们从一个线程迁移到另一个线程。默认情况下,这些调度程序甚至没有绑定到 CPU 内核,因此它们可以从内核迁移到内核。您可以使用-sbt 开关绑定它们。您还可以将 Erlang 进程绑定到未记录且强烈不推荐的特定调度程序。您不能从 Erlang 生成线程,而是从 NIF 或端口生成线程,但无论如何您都无法在此线程上运行 Erlang 进程。

【讨论】:

那么,Erlang 不允许动态创建内核线程吗?它们是否仅在运行时启动时创建?所以如果我传递一个+S 100:100 的参数,它将为调度程序创建100 个内核线程,并且所有用户线程都被Erlang 调度程序逻辑在这100 个内核线程中打乱? @mac93 是的,它们是在 VM 启动时创建的。没有用户线程,有 Erlang 进程在调度程序之间混洗,这些调度程序都有自己的内核线程。还有一些 IO 线程仅用于 IO 操作(和 IO 绑定的脏 NIF),还有一些实验性的脏线程用于 CPU 绑定的脏 NIF。

以上是关于Erlang - 将每个“erlang 进程”映射到新的内核线程的主要内容,如果未能解决你的问题,请参考以下文章

Erlang进程发送消息

你能溢出 Erlang 进程的消息队列吗?

Erlang:控制Erlang进程崩溃时如何使连接的外部OS进程自动死亡?

Erlang并发机制 –进程调度

Erlang并发机制 –进程调度

Erlang 作为后端进程