写点什么

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:591830
用户头像

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

关注

评论

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

即日起 Jira、Confluence 正式停售本地版,中国客户将无法购买

万事ONES

项目管理 开发者 研发管理 团队协作 CTO

OpenAI将k8s扩展至7500个节点以支持机器学习;Graph Diffusion Network提升交通流量预测精度

京东科技开发者

区块链 开源

官宣了!Apache ECharts 毕业成为 Apache 软件基金会顶级项目!

百度Geek说

百度 基金会

极客时间产品训练营第三周作业

云随心

产品 作业 产品训练营

MySQL安装教程&问题解决

Mars

MySQL 运维

《我想进大厂》之Zookeeper夺命连环9问

艾小仙

zookeeper

Idea工具的各种查找快捷键

小马哥

IntelliJ IDEA 七日更 2月春节不断更

产品经理训练营第0期-第三次作业

孙行者

第0期 产品经理训练营 问题

前端面试必备ES6全方位总结

我是哪吒

程序员 面试 大前端 ES6 2月春节不断更

即构自研海量有序数据网络MSDN,构建全球可靠的多云通讯链路

ZEGO即构

利用 Python 分析了某化妆品企业的销售情况,我得出的结论是?

JackTian

Python 数据分析 数据可视化 化妆品 2月春节不断更

Linux-Lab 入门:使用开发板

贾献华

嵌入式 Linux Kenel 开发板 arm boot

日记 2021年2月2日(周二)

Changing Lin

个人感悟 2月春节不断更

使用pgBackRest并行归档解决wal堆积问题

PostgreSQLChina

数据库 postgresql 开源 开源社区

程序员成长第一篇:机会与趋势

石云升

28天写作 2月春节不断更 机会与趋势

华为18A架构师共享:Netty+Redis+zookeeper+高并发技术栈

996小迁

redis zookeeper 架构 Netty 高并发

用RabbitMQ了好几年之后,我总结出来5点RabbitMQ的使用心得

四猿外

MQ RabbitMQ 消息队列

产品训练营 第三次作业

Wangyunnfei

说说常常被研发忽略的原型模式

后台技术汇

28天写作 2月春节不断更

ICE暴雪正悄悄崛起

DT极客

玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

YourBatman

Module IntelliJ IDEA Project Structure

Elasticsearch 写一致性原理

escray

七日更 28天写作 死磕Elasticsearch 60天通过Elastic认证考试 2月春节不断更

挖矿区块链_什么是挖矿 带你详细了解挖矿基础知识

v16629866266

EXCEL数据如何去重? Python:这事我比你熟

智分析

Python

数据库表数据量大读写缓慢如何优化(4)【分库分表】

我爱娃哈哈😍

数据库 架构

华为云FusionInsight助力宇宙行打造金融数据湖新标杆

华为云开发者联盟

数据湖 云原生 存储 FusionInsight 华为云

SpringCloud 从入门到精通15---Sentinel搭建和服务监控

Felix

托管节点池助力用户构建稳定自愈的 Kubernetes 集群

阿里巴巴云原生

Docker 容器 运维 云原生 k8s

Kafka基础简介

架构精进之路

kafka 七日更 28天写作 2月春节不断更

挖矿系统APP源码搭建

luluhulian

厚积薄发!华为云7篇论文被AAAI收录,2021年AI行业技术风向标看这里!

华为云开发者联盟

人工智能 卷积网络 远程监督 域泛化 油气储集层收集

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