星期四, 五月 31, 2007

Green Thread不比Native Thread差

在Ruby实现中,Ruby1.8采用的是Green thread,JRuby和XRuby采用的是Native thread,Rubinius既支持Green thread,也支持Native thread。Ruby1.9将由Green thread转向Native thread。Green thread有哪些不足呢?

在“Ruby Userspace Threads vs GUI tookits Roundup”中重点强调了Green Thread的一个不足:Blocking syscall将阻塞所有其余的线程,而且这个问题在GUI和网络开发中将随处碰到。另外,Green Thread不能有效挖掘多核和多CPU的性能。于是大家都把视线转向Native thread。我对Native thread不感冒,主要是因为shared state concurrency问题多多。具体有哪些,相信你看完“The problem with threads”就会很清楚了。

现在,Erlang很好的解决了Green Thread存在的问题。它没有采用m:1模式,而是采用了m:n模式。Erlang runtime以n个native thread运行,每个都有一个自己的调度器。而且,Erlang采用shared nothing concurrency,可以把Native Thread存在的问题都抛之脑后。

看来XRuby的thread实现可以好好借鉴一下Erlang的并发范式。在看了“The Futures of Ruby Threading”之后,更坚定了应该朝这方面努力。

4 条评论:

xue.yong.zhi 说...
此评论已被作者删除。
xue.yong.zhi 说...

我最近在看elang的东西也是想借鉴一下。现在看得资料还很不够。觉得concurrent这块大多数都是集中在库上。语言本身以及runtime里好像没有太多工作。可能我还没理解好。

xue.yong.zhi 说...

便提一下,最早java也是green thread,后来变成native thread了。

我工作中也维护一个类似green thread的系统。不能用阻塞函数这个限制是很麻烦的。大家都知道非阻塞用好了效率会更高,但是程序复杂性也大大提高。

feiyu 说...

你提到的阻塞问题,Erlang通过M:N模型进行了解决,不过细节不清楚。