我已经开始研究 Erlang,并发现 BEAM 运行时环境非常有趣。人们普遍认为,在 Erlang 中,进程属于语言而不是操作系统(指的是运行时,在本例中指的是 BEAM)。这些是 Erlang 闻名的轻量级“绿色进程”。进一步说明(在第 5 页 这张纸)BEAM 对每个 CPU 核心使用一 (1) 个操作系统线程进行调度,并使用另一个操作系统线程进行 I/O。所以我想知道:实际执行 Erlang 代码所需的 CPU 周期来自哪个线程?

此外,如果我在双核机器上运行,根据我目前所读到的内容,我预计会看到三 (3) 个线程在 BEAM 进程下运行:两个调度程序(每个核心一个)和一个 I/O 线程。但我看到了 10 个。有时11.有时它从 13 开始,像高质量放大器一样,达到 11。

我很困惑。任何见解将不胜感激。

有帮助吗?

解决方案

按照@user425720的建议,我在erlang-questions LISTSERV上提出了我的问题。它也可以作为 谷歌集团. 。Trifork 的 Kresten Krab Thorup 几乎立刻就回答了我。我感谢克雷斯顿。这是他的答案。(括号和强调是我的。)

这是 AFAIK,基本场景:

Erlang代码将与有进程一样多的“绿色线程”运行;过程限制由 +P(命令行)标志控制。

绿色线映射到S线程,其中S是核心/CPU的数量。事实是 这些线程也称为调度程序似乎有些令人困惑,但是从VMS的角度来看。 从开发人员的角度来看,它们是运行您的Erlang代码的线程. 。数字S可以使用ERL命令行的 +S选项控制。

此外,还有许多所谓的“异步线”。这是一个线程池,由I / O过程使用,称为链接中的链接,以对选择 /民意调查。异步线的数量是动态的,但受 +a标志的限制。

因此,您在双核上看到的11个线程可能是2个调度程序和9个异步线。例如。

了解有关标志的更多信息 这里.

其他提示

Erlang 进程并不像 java 中的线程那样“绿色”。Erlang进程是不共享内存的结构,它们由Erlang VM维护。

这听起来可能很奇怪,但这篇论文可能很“旧”(尽管 Bio 是 2007 年的)。当我们对运行时队列进行全新的处理(具有动态平衡功能和其他好处)时,这一切都在 R13 版本周围发生了变化。这是 Ulf Wiger 的一些演讲 http://ulf.wiger.net/weblog/2009/01/23/erlang-programming-for-multicore/

总而言之,进程是完全透明的,您可以调整运行时队列和调度程序的数量,但操作系统的实现并不完整。我不想猜测为什么有 11 个线程..

编辑:我对操作系统有点错误:

+S Schedulers:SchedulerOnline

设置启用 SMP 支持时要创建的调度程序线程数量以及要设置为联机的调度程序线程。

这两个值的有效范围均为 1-1024。如果Erlang运行时系统能够确定配置的逻辑处理器的数量和可用的逻辑处理器的数量,调度程序将默认配置逻辑处理器,并且 SchedulersOnline 将默认使用可用的逻辑处理器;否则,默认值为 1。调度程序可以被省略,如果 :SchedulerOnline 不是,反之亦然。在线调度程序的数量可以在运行时通过以下方式更改 erlang:system_flag(schedulers_online, SchedulersOnline).

...

如果仿真器没有启用 SMP 支持,则该标志将被忽略(请参阅 -smp 旗帜)。

从这里: http://www.erlang.org/doc/man/erl.html

编辑2:erlang-question 邮件列表上关于许多虚拟机与许多调度程序的优缺点的有趣讨论。不幸的是,它也是 2008 年的,随着新 OTP 版本的巨大改进,它可能不再有效。 http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:38165:200809:nbihpkepgjcfnffkoobf

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top