BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

MacRuby放弃GIL,实现并发线程

| 作者 Werner Schuster 关注 9 他的粉丝 ,译者 杨晨 关注 0 他的粉丝 发布于 2009年7月6日. 估计阅读时间: 3 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT