论坛首页 综合技术论坛

[Erlang] 轻量级进程是如何被调度的?

浏览 3491 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-09-25  
FP
在问题版,没人回答,在此请教一下......

一般来说,对于任何一种 Coroutine 技术而言,除非当前 Coroutine 代码主动释放给调度器(yield)否则会一直独占 CPU,这也是为什么 Coroutine 会比线程开销小的重要基础(无需加锁,对所有内存的访问只要不跨越 yield 语句就可以认为不受干扰),Erlang 的轻量级进程的效率非常高,我原以为一定是基于 Coroutine 或者类似的机制实现的(比如当 receive 的时候 yield 给调度器),但是我看到下面一段文字时有一点疑惑

“并发性——语言必须提供一种轻量化的机制来创建并行进程,以及在进程间发送消息。进程的上下文切换、消息传递必须非常高效。并行进程还必须以一种合理的方式来分享 CPU 时间,以便当前使用 CPU的进程不至于垄断 CPU,而其他的进程处于“准备好”状态而得不到处理。”-- 摘自Joe Armstrong《面对软件错误构建可靠的分布式系统 》(段先德译)

这句话似乎不保证进程的执行在 receive 之间是不受干扰的?我不知道这里的“合理的方式”到底是什么,哪位大侠能解释一下?Erlang 是否会在 receive 语句之间进行切换?
   发表时间:2008-09-25  
Erlang的进程切基本上就是preemptive process而不是oroutine,coroutine无法满足soft real time.进程在进行lambda reduction的时候进行计数,达到一定的reduction就让出调度器或者在运行到receive的时候自动让出调度器.本质上和操作系统的process没有多大区别.

0 请登录后投票
   发表时间:2008-09-25  
呵呵,谢谢 T1 老师。

我其实在发贴后就有点明白了:如何调度其实并不重要,因为 ERLANG 的 FP 特征决定了在一个进程内部的资源,是不会泄露到进程外的,所以这种调度不会因为竞争引入额外的开销(锁、信号量),仅仅是切换栈上下文,所以调度成本呢应该会比较低。这一点是不同于 Coroutine 机制的,Coroutine 机制是通过程序自己控制切换点来避免资源竞争的。

我刚才又考虑了一下,这两种方式其实各有优势:ERLANG 的轻量级进程方式完全忽略线程的影响,所以写出的代码可以直接从 SMP/CLUSTER 中受益,而 Coroutine 本质上是线程内部的玩意,所以在一个线程内部来说开销会更小(轻量级进程中必须的消息传递在同一个线程下可以通过无成本的资源共享而避免),但对写程序的人而言,线程内外是不透明的,必须区别处理。换一个角度来说,ERLANG 这种方式放弃了程序自己来控制调度的可能性(当然有它的理由),从效率而言,并非最理想(存在不必要的开销),如果说希望完全理想,似乎应这样设计:每一个 CPU(内核)上跑一个操作系统线程,每一个操作系统线程上承载一个轻量级进程,轻量级进程间是 Share Nothing 的,而在轻量级进程内有多个 Coroutine,依靠程序自己来控制执行栈的切换。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics