写点什么

MacRuby 放弃 GIL,实现并发线程

  • 2009-07-04
  • 本文字数:1071 字

    阅读完需:约 4 分钟

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

2009-07-04 23:591773
用户头像

发布了 90 篇内容, 共 34.1 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

阿里P8爆肝三月!最新出土SQL手册:收获不止SQL优化,抓住SQL的本质

Java 编程 程序员 IT 计算机

#1024我在现场# 征集线索引爆大奖!

InfoQ写作社区官方

1024我在现场 热门活动

真香!在Github一夜爆火的面试题库,被各大厂要求直接下架

程序员小呆

Java 程序员 面试 架构师

国家第一梯队!开物入选特色专业型工业互联网平台

百度大脑

人工智能 百度 智能云

直接霸榜Github!阿里内网流传P8大牛的“满级”分布式架构笔记,

程序员小呆

Java 程序员 面试 架构师

架构实战营 设计微博系统中”微博评论“的高性能高可用计算架构

💤 ZZzz💤

架构实战营

从Android系统架构学习设计模式

轻口味

android 架构设计原则 10月月更

Webrtc Rtp/rtcp (2)

webrtc developer

WebRTC rtp/rtcp

反序列化漏洞复现总结

网络安全学海

黑客 网络安全 信息安全 WEB安全 安全漏洞

如何说孩子才肯听,怎么听孩子才肯说(上)

石云升

读书笔记 育儿 10月月更

服务业CRM软件能为你提供哪些服务?

低代码小观

企业管理 CRM 管理系统 管理工具 管理软件

模块五作业

potti

架构实战营

用区块链技术打造AEO高信用国际贸易生态圈的创新实践

CECBC

“区块链+物联网”融合 推动产业创新发展

CECBC

实时监控:基于流计算 Oceanus ( Flink ) 实现系统和应用级实时监控

腾讯云大数据

流计算 Oceanus

自定义View:几何变换实质与技巧

Changing Lin

10月月更

5G通话占道4G,你的5G套餐性价比真的高吗?

脑极体

微博评论高性能高可用计算架构

Imaginary

山东移动用明道云赋能一线,打通业务创新最后一公里

明道云

Zookeeper配置详解

Regan Yue

zookeeper 配置 10月月更

NFT商业落地中的思考:区块链

CECBC

一口气面试7家大厂,已拿下4家offer,其实大厂没有你想象中难!

程序员小呆

Java 程序员 面试 架构师 资料

重学 Java 之 5种字符流读取方法

进击的王小二

java基础 字符流 java

极光笔记丨iOS 15推送新特性

极光JIGUANG

ios 消息推送 移动端

内卷把同事逼成了“扫地僧”,把 Github 上所有面试题都整理了一遍~ 足足 24W 字!

编程 程序员 IT 计算机 java

WeTest自助压测1折起,最低1分钱参与Q币抽奖

WeTest

健身房CRM软件帮你寻找更多客户

低代码小观

企业管理 管理系统 健身房 管理软件 行业

模块五-微博评论的高性能高可用计算架构

娜酱

「架构实战营」

面对疾风吧,如何搭建高协同的精准告警体系?

阿里巴巴云原生

阿里云 产品 云原生 Arms 告警运维中心 告警体系

绝绝子!美团大牛吐血整理总结“消息队列核心知识笔记”是真的吊

进击的王小二

分布式 MQ 消息队列 java

极客时间【架构实战营】第二期 模块五作业

Geek_91606e

架构实战营

MacRuby放弃GIL,实现并发线程_Ruby_Werner Schuster_InfoQ精选文章