代码之家  ›  专栏  ›  技术社区  ›  Alan

在Erlang_墠的抽象机beam中使用了哪些操作系统线程?

  •  14
  • Alan  · 技术社区  · 14 年前

    我已经开始研究Erlang,发现Beam运行时环境非常迷人。它通常表示,在Erlang中,进程属于语言而不是操作系统(即运行时,在本例中是beam)。这些是Erlang著名的轻量级、绿色工艺。进一步说明(第5页,共页) this paper )该beam使用每个CPU核心一(1)个OS线程进行调度,使用另一个OS线程进行I/O。因此我想知道:实际执行Erlang代码所需的CPU周期来自哪个线程?

    此外,如果我运行在双核机器上,我希望看到三(3)个线程在beam进程下运行:两个调度程序(每个内核一个)和一个I/O线程,这是基于我迄今为止所读到的内容。但我看到了10。有时11。有时它从13开始,像高质量放大器一样,到11。

    我很困惑。任何见解都将受到赞赏。

    2 回复  |  直到 9 年前
        1
  •  8
  •   Alan    14 年前

    按照@user425720的建议,我在erlang question s listserv上问了我的问题。它也可以作为 Google Group . 特里福克的克瑞斯滕·克拉布·索洛普几乎立刻回答了我。我感谢你去克瑞斯顿。这是他的答案。(括号和重点是我的。)

    以下是Afaik,基本场景:

    Erlang代码将以相同数量运行 有“绿色线”吗? 流程;流程限制为 由+P(命令行)标志控制。

    绿色线程被映射到 线程,其中s是 核心/ CPU。事实是 这些 线程也称为调度程序 似乎有点 令人困惑,但从vms的角度 他们是这样看待的。 从开发商那里 从观点上看,它们是线程 运行你的二郎代码 . 这个 数字S可以通过 erl命令行的+s选项。

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

    所以,你看到的11条线 双核可以是2个调度程序,9个调度程序 异步线程。例如。

    阅读有关标志的更多信息 here .

        2
  •  6
  •   Alex Shroyer    9 年前

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

    这听起来可能很奇怪,但这篇论文可能是“老的”(即使是2007年的《生物》)。当我们对运行时队列进行全新的处理(使用动态平衡工具和其他功能)时,在R13发布前后,一切都发生了变化。这是乌尔夫·维格的一些介绍 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

    edit2:关于erlang问题邮件列表的有趣讨论,讨论了许多虚拟机与许多调度程序的优缺点。不幸的是,它也是从2008年开始的,可能在新的OTP版本的巨大改进中无效。 http://www.erlang.org/cgi-bin/ezmlm-cgi?4:mss:38165:200809:nbihpkepgjcfnffkoobf

    推荐文章