在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”之后,更坚定了应该朝这方面努力。
订阅:
博文评论 (Atom)
4 条评论:
我最近在看elang的东西也是想借鉴一下。现在看得资料还很不够。觉得concurrent这块大多数都是集中在库上。语言本身以及runtime里好像没有太多工作。可能我还没理解好。
便提一下,最早java也是green thread,后来变成native thread了。
我工作中也维护一个类似green thread的系统。不能用阻塞函数这个限制是很麻烦的。大家都知道非阻塞用好了效率会更高,但是程序复杂性也大大提高。
你提到的阻塞问题,Erlang通过M:N模型进行了解决,不过细节不清楚。
发表评论