在Erlang的抽象机器BEAM中使用了哪些OS线程?

Ala*_*lan 15 erlang multithreading beam

我已经开始研究Erlang并发现BEAM运行时环境很吸引人.通常声明在Erlang中,进程属于语言而不是OS(意味着运行时,在这种情况下意味着BEAM).这些是Erlang以其着名的轻量级"绿色流程".它进一步指出(第5页的本文的是波束使用每个CPU核一(1)OS线程调度和另一个OS线程用于I/O).所以我想知道:从实际执行Erlang代码所需的CPU周期来自哪个线程?

此外,如果我在双核机器上运行,我希望 - 基于我到目前为止所读到的 - 看到在BEAM进程下运行的三(3)个线程:两个调度程序(每个核心一个)和一个I/O线程.但我看到10.有时11.有时它从13开始,和高质量的放大器一样,到11.

我糊涂了.任何见解将不胜感激.

Ala*_*lan 9

按照@ user425720的建议,我问了关于erlang-questions LISTSERV的问题.它也可以作为Google Group使用.Trifork的Kresten Krab Thorup几乎马上回答我.谢谢你出去Kreston.这是他的答案.(括号和重点是我的.)

这是AFAIK的基本场景:

Erlang代码将在与进程一样多的"绿色线程"中运行; 过程限制由+ P(命令行)标志控制.

绿色线程映射到S个线程,其中S是核心/ CPU的数量.这些线程也被称为调度程序这一事实 看起来有些令人困惑,但从虚拟机的角度来看它们是如此. 从开发人员的角度来看,它们是运行erlang代码的线程.可以使用erl命令行的+ S选项控制数字S.

此外,还有许多所谓的"异步线程".这是一个线程池,由驱动程序中称为链接的I/O进程使用,以响应select/poll等.异步线程的数量是动态的,但受+ A标志的限制.

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

阅读更多有关旗帜的信息.


use*_*720 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运行时系统能够确定配置的逻辑处理器数量和逻辑处理器可用,则Scheduler将默认配置为逻辑处理器,并且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