Erlang 因能够支持许多轻量级进程而闻名;它可以做到这一点,因为这些不是传统意义上的进程,甚至不是像 P 线程那样的线程,而是完全在用户空间中的线程。
这很好(实际上很棒)。那么 Erlang 线程如何在多核/多处理器环境中并行执行呢?当然,它们必须以某种方式映射到内核线程才能在单独的内核上执行?
假设是这样的话,这是如何完成的?许多轻量级进程是否映射到单个内核线程?
或者有其他方法解决这个问题吗?
最佳答案
答案取决于所使用的虚拟机:
1) 非 SMP:有一个调度程序(操作系统线程),它执行从可运行进程池中获取的所有 Erlang 进程 strong>(即那些没有被 receive
等阻止的人)
2) SMP:有K个调度程序(操作系统线程,K通常是CPU核心数),它从共享进程执行Erlang进程队列。它是一个简单的 FIFO 队列(带有锁以允许多个操作系统线程同时访问)。
3) R13B 及更新版本中的 SMP:将有 K 个调度程序(和以前一样)从多个进程队列执行 Erlang 进程。每个调度程序都有自己的队列,因此将添加从一个调度程序到另一个调度程序的进程迁移逻辑。该解决方案将通过避免共享进程队列中的过度锁定来提高性能。
有关更多信息,请参阅this document由爱立信公司的 Kenneth Lundin 为 2008 年 11 月 13 日在斯德哥尔摩举办的 Erlang 用户大会准备。
关于multithreading - Erlang 进程如何(如果有的话)映射到内核线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/605183/