访问次数
我的另一个总结性博客: todototry 大米粒

Matz, Koichi访谈(三):多线程

Matz, Koichi访谈(三):多线程

问:让我们谈谈多线程吧,这可以算是新版本比较大的改动了,你们分别谈谈1.8和1.9中的线程模型吗?

Matz:老的线程模型属于绿色线程模型(最早出现于Java语言中,指线程不是由操作系统,而是由虚拟机进行调度,详细请参看维基百科 ),不管运行于那个平台,它都只提供一个全局唯一的线程,在14年前我开始开发Ruby时,这是一个正确的决定,但是随着时间的推移,这个决定变得不再合 适,因为大部分平台上都已经提供了诸如pthread或者是类似的线程库实现,pth库(一个使用setjmp实现pthread API的线程库)还提供了一个绿色线程实现。

Koichi决定在YARV中使用原生线程,我尊重他的决定,不过唯一的遗憾是,新版本中将无法继续支持使用了原有线程模型内部数据结构的程序,尽管koichi告诉我,继续支持原有线程模型也不是完全不可能,但这在1.9的开发中肯定属于低优先级的任务。

Ko1:Matz解释了原有的模型,那我就来解释下新的吧!

就像你了解的,YARV支持原生线程,也就是说你现在可以同步的运行多个Ruby线程了。

但这并不意味着Ruby线程可以被并行执行,因为YARV使用了一个全局的VM锁,同一时间只有一个Ruby线程可以得到它,之所以这样做,主要是考虑到兼容为以前版本所编写的C扩展(这些C扩展不需要做任何修改就可以运行在新版本上)。

问:那为什么要做这个改变呢?以前的绿色线程有什么问题吗?

Matz:因为绿色线程不能很好的支持那些需要使用原生线程的库,比如Ruby/TK就在Pthread方面花费了大量的时间。

Ko1:Ruby的绿色线程在线程切换时需要拷贝整个线程上下文,因此,效率是一个问题,当然更重要的是,我发现很难在YARV上实现绿色线程。

问:那么原生线程实现会不会也有些副作用呢?

Matz:我认为最主要的问题就是它不能同老版本保持兼容,同时它还无法实现真正的并发,不过,koichi目前正在试图通过多VM的方法来解决并发的问题。

Ko1:是的,原生线程确实存在一些问题:首先是效率问题,我们都知道,创建原生线程十分昂贵,因此如果你需要创建大量线程,那么最好使用线程池,还有就是目前主干中的多线程部分还没有经过充分的测试,因此可能还隐含着一些未知的Bug。

第二就是可移植性,如果你的系统支持pthread,但是同其它系统的pthread实现有些差异的化,这可能会引发问题。

第三个问题是缺少命名支持,有些人可能用到了绿色线程的命名功能。

最后,目前的原生线程还存在一些问题,比如在MaxOS上,如果同时存在其它线程的话,执行exec()会导致异常(一个移植性问题),因此,如果我们发现原生线程的确存在一些较严重的问题的话,我将在YARV中提供绿色线程支持。

问:那么你们是否有计划在未来支持别的线程模型?

Matz:其它线程模型?还是不要了,win32和pthread已经够我们忙活的了,不过未来我们可能会考虑加入并行化支持,就像Erlang中的轻量级进程。

Ko1:我目前最关心的就是如何让Ruby支持并行计算,有好多种实现方法可供选择,但是如果要让多个Ruby线程在一个进程中并行执行,那么恐怕许多C扩展都将因为同步问题而无法工作。

不过,就像Matz说的,我们可以考虑在一个进程中运行多个VM实例,这些VM可以并行执行,这个主题将成为我未来的主要研究方向。

另外,就像我在上一个问题所说的,如果原生线程的问题实在是太多太多,那我将考虑重新实现绿色线程,就像你了解的,绿色线程有许多优势(比如轻量级的线程 创建等等),实际上,我的毕业论文就是关于如何在一个特定的SMT CPU上实现用户空间的线程库的,所以我想这对我来说会是个很有趣的过程。

posted @ 2011-08-04 22:10  fandyst  阅读(388)  评论(0编辑  收藏  举报