Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Erlang’;是抽象机器吗,梁?_Multithreading_Erlang_Beam - Fatal编程技术网

Multithreading Erlang’;是抽象机器吗,梁?

Multithreading Erlang’;是抽象机器吗,梁?,multithreading,erlang,beam,Multithreading,Erlang,Beam,我已经开始研究Erlang,发现BEAM运行时环境非常迷人。通常说,在Erlang中,进程属于语言而不是操作系统(在本例中是指运行时,是指BEAM)。这些都是Erlang逐渐出名的轻量级“绿色流程”。进一步说明(在的第5页),BEAM使用每个CPU核一(1)个OS线程进行调度,另一个OS线程进行i/o。所以我想知道:实际执行Erlang代码所需的CPU周期来自哪个线程 此外,如果我在一台双核机器上运行,根据我到目前为止阅读的内容,我希望看到三(3)个线程在BEAM进程下运行:两个调度程序(每个核

我已经开始研究Erlang,发现BEAM运行时环境非常迷人。通常说,在Erlang中,进程属于语言而不是操作系统(在本例中是指运行时,是指BEAM)。这些都是Erlang逐渐出名的轻量级“绿色流程”。进一步说明(在的第5页),BEAM使用每个CPU核一(1)个OS线程进行调度,另一个OS线程进行i/o。所以我想知道:实际执行Erlang代码所需的CPU周期来自哪个线程

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


我很困惑。任何洞察都将不胜感激。

Erlang进程不是“绿色”的,因为java中的线程是绿色的。Erlang进程是不共享内存的结构,由Erlang VM维护

这听起来可能很奇怪,但这篇论文可能是“老的”(尽管是2007年的生物版)。在R13发布前后,一切都发生了变化,我们对运行时队列进行了全新的处理(使用了动态平衡功能和其他功能)。下面是Ulf Wiger对此的一些介绍

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

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

+S调度器:SchedulerOnline
设置启用SMP支持后要创建的调度程序线程数和要联机设置的调度程序线程数

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

如果emulator未启用SMP支持,则此标志将被忽略(请参阅标志)

从这里开始:


EDIT2:关于erlang问题邮件列表的有趣讨论,讨论了许多VM与许多调度器的优缺点。不幸的是,它也是从2008年开始的,并且随着新OTP版本的巨大改进,它可能不再有效

根据@user425720的建议,我在erlang问题列表服务上提出了我的问题。它也可以作为一个。Trifork的Kresten Krab Thorup几乎立刻回答了我。谢谢你到克雷斯顿去。这是他的答案。(插入语和强调语是我的。)

下面是一个基本场景:

Erlang代码将以尽可能多的方式运行 “绿色线程”的存在 过程;过程限制为 由+P(命令行)标志控制

绿色线程映射到S 线程数,其中S是 核心/CPU。事实是,这些 线程也称为调度程序 似乎有点 令人困惑,但从虚拟机的角度来看 我认为他们是来自开发人员的 从这个角度来看,它们是线程 运行您的erlang代码的。这个 数字S可以通过 erl命令行的+S选项

除此之外,还有一些 所谓的“异步线程”。那是 I/O使用的线程池 在驱动程序中称为链接的进程 对选择/投票等做出反应 异步线程的数量是动态的, 但受到+A标志的限制

那么,你在一张纸上看到的11条线 双核可以是2个调度器和9个 异步线程。比如说

阅读更多关于旗帜的信息


@user425720-感谢您的回复和这些链接。我认为调度程序的数量(默认情况下)与内核的数量有关的部分是正确的。但和你一样,我仍然无法推测为什么在我的双核机器示例中有11个线程。仍然很吸引人…@Alan继续向erlang问题邮件列表提问。OTP团队和核心虚拟机开发人员经常阅读@user425720-好主意。我不知道那个名单。这是我第一次问一个让堆栈溢出用户感到困惑的问题。我将报告来自erlang问题列表的结果。