我已经开始研究Erlang,并发现BEAM运行时环境非常吸引人。通常声明在Erlang中,进程属于语言而不是OS(意味着运行时,在这种情况下意味着BEAM)。这些是Erlang以其着名的轻量级“绿色流程”。进一步说明(在this paper的第5页)BEAM使用每个CPU核心一(1)个OS线程进行调度,并为i / o使用另一个OS线程。所以我想知道:从实际执行Erlang代码所需的CPU周期来自哪个线程?
此外,如果我在双核机器上运行,我希望 - 根据我到目前为止所读到的 - 看到在BEAM进程下运行的三(3)个线程:两个调度程序(每个一个)核心)和一个I / O线程。但我看到10.有时11.有时它从13开始,和高质量的放大器一样,到11。
我很困惑。任何见解都将受到赞赏。
答案 0 :(得分:9)
按照@ user425720的建议,我问了关于erlang-questions LISTSERV的问题。它也可以Google Group的形式提供。 Trifork的Kresten Krab Thorup几乎立即回答了我。谢谢你出去Kreston。这是他的答案。 (括号内容和重点是我的。)
这是AFAIK,基本情景:
Erlang代码将在尽可能多的情况下运行 有绿色线索 流程;过程限制是 由+ P(命令行)标志控制。
绿色线程映射到S 线程,其中S是数字 核心/处理器。 这些事实 线程也称为调度程序 看起来有点儿 令人困惑,但从虚拟机的角度来看 他们是。 来自开发者的 从角度来看,他们是线程 运行你的erlang代码。该 数字S可以用 erl命令行的+ S选项。
此外,还有一些 所谓的“异步线程”。那是 I / O使用的线程池 在驱动程序中称为链接的进程 对选择/投票等做出反应 异步线程的数量是动态的, 但受到+ A旗帜的限制。
所以,你看到的11个线程 双核可能是2个调度程序,9 异步线程。例如。
详细了解旗帜here。
答案 1 :(得分:6)
Erlang进程不是“绿色”,因为java中的线程是绿色的。 Erlang进程是结构,不共享内存,它们由Erlang VM维护。
这可能听起来很奇怪但是这篇论文可能是“旧的”(即使是2007年的生物)。当我们获得运行时队列的全新处理(动态平衡和其他好东西)时,这一切都在R13发布时发生了变化。以下是Ulf Wiger关于它的一些介绍http://ulf.wiger.net/weblog/2009/01/23/erlang-programming-for-multicore/
总而言之,进程是完全透明的,您可以调整运行时队列和调度程序的数量,但OS实现并不完整。我不想推测为什么有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
EDIT2:关于erlang-question邮件列表的有趣讨论,关于许多VM与许多调度程序的优缺点。不幸的是,它也是从2008年开始的,并且可能无法在新OTP版本的巨大改进中有效。 http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:38165:200809:nbihpkepgjcfnffkoobf