MacRuby放弃GIL,实现并发线程

Ruby的线程总是一个很烦人的东西。Ruby 1.8实现了具有用户空间的线程,但是存在一些性能问题,而且也和多核系统不兼容。

Ruby 1.9将每一个Ruby 线程映射到内核线程,改善了1.8线程的性能

这就是全局解释锁(GIL),有时候也叫做全局VM锁(GVL)。每一个Ruby线程需要在运行之前请求GIL。Ruby的这个实现细节和Python类似(在最近数年里面这个问题可以被分解实现)

在过去几年内,Ruby实现的替代品已经去掉了GIL:JRuby和IronRuby都没有GIL。

现在MacRuby也紧随其后,能够在没有GIL的情况下工作,Laurent Sansonetti这样解释说:

所有的MacRuby线程都是由操作系统内核调度,并且在工作之前会注册到Objective-C垃圾收集器(在单独线程中运行)。

MacRuby运行时现在不仅能够在线程之间共享状态,还能够同步访问这些线程结构,而不是只允许一个线程处于活跃状态。实现细节是这样的:

Core对象包含了一个锁,这个锁在每一次存取共享数据结构的时候都被用到。共享的数据结构有这些:LLVM缓存,多种stub缓存,BridgeSupport缓存等。

所有的东西都会迁移到VM类,这个类是完全无锁的。当且仅当每个线程希望访问运行时的时候,按需创建VM对象。VM对象包含了表示当前线程执行的数据结构,例如当前的块、绑定以及异常等。VM有时候也会调用Core(例如定义一个方法)请求Core锁,但是大多数时候它都是并行执行的。

新的线程系统现在已经在MacRuby代码库的实验性分支中可以找到,这个分支目标成为MacRuby下一个版本。这个分支同时也包含了一个MacRuby构建的(简单的)web服务器样例。

一旦下一个稳定的MacRuby版本和新的线程代码一起发布,这就有三个Ruby的实现,包含并行线程的实现,无任何GIL的实现以及Ruby 1.8(用户空间线程)和Ruby 1.9.x的实现。JRuby和MacRuby都支持Ruby 1.9.x语言和库。

Ruby 1.9.x也存在和Python一样的GIL问题,虽然Unladen Swallow项目承诺在2010年之前彻底移除GIL(是否可能以及提供的补丁是否可能会集成到官方Python版本是另一回事 - 删除GIL的补丁在最近十年内只是零星出现)。

最后的忠告:讨论Ruby或者Python中的GIL经常会引发关于这些语言是否能够通过线程得到并发操作的争论。另外一个争论的焦点是GIL是CPU边界代码的唯一问题 - I/O边界代码并不是问题,因为只要GIL使当地释放,允许其他的线程在I/O才做的时候运行。考虑到这些问题 - 你会怎么实现你的CPU边界代码,使得它能够在Ruby多核情况下使用?你关心过创建和管理多个OS进程吗?

查看英文原文:MacRuby Drops GIL, Gains Concurrent Threads

你可能感兴趣的:(MacRuby放弃GIL,实现并发线程)