【问题标题】:Erlang - map each "erlang process" to new kernel threadErlang - 将每个“erlang 进程”映射到新的内核线程
【发布时间】: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。范式的差异需要留下大量正常的编程知识和知识。

标签: multithreading erlang lightweight-processes


【解决方案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。
猜你喜欢
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2016-11-17
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多