Ruby的GIL

简介: 一、什么是GIL GIL即全局解释锁(global interpreter lock),这个锁环绕着Ruby代码的执行,在一个多线程上下文中,任何时候只有一个线程可以执行Ruby代码。因此即使在多核的机器上运行多线程应用,在特定时间点上也只有一个线程和一个核心在忙碌,GIL一直保护着Ruby内核,以

一、什么是GIL


GIL即全局解释锁(global interpreter lock),这个锁环绕着Ruby代码的执行,在一个多线程上下文中,任何时候只有一个线程可以执行Ruby代码。因此即使在多核的机器上运行多线程应用,在特定时间点上也只有一个线程和一个核心在忙碌,GIL一直保护着Ruby内核,以免竞争条件造成数据混乱。

 

二、GIL产生原因


首先,Ruby线程依托于原生操作系统线程,所以Ruby线程的调度也是源于操作系统的线程调度程序。其次,对于Ruby来说其实没有什么操作是线程安全的,比如最简单的数组附加,如下:


arr = []
arr << ‘str1’


Ruby中的数组附加其实包含许多步骤,在其底层实现上是包含一大堆代码:


VALUE rb_ary_push(VALUE ary, VALUE iterm)
{
    long idx = RARRAY_LEN(ary);
    ary_ensure_room_for_push(ary, 1);
    RARRAY_ASET(ary, idx, item);
    ARY_SET_LEN(ary, idx + 1);
    return ary;
}


这段代码揭示了数据附加包含以下几个步骤:


1.    获取数组当前长度;


2.    检查数组是否有空间容纳新的元素;


3.    将元素附加到数组;


4.    修改数据长度+1


由于这么一系列操作不是线程安全的,所以在多线程应用中,会频繁发生上下文切换,这样就可能会发生一些匪夷所思的错误,为此,我们需要使这些操作具有原子性,所以我们需要使用GIL来解决这个问题。GIL保卫着系统的内部状态,使用GIL,就不需要在数据结构周围使用任何锁或者同步机制。如果两个线程不能够同时改变内部状态,也就不会有竞争条件发生了。

 

三、GIL的实现原理


Ruby的线程依托于原生的操作系统的线程,但是当一个Ruby线程希望在其原生操作系统线程中执行代码的时,必须要先获得GIL,如下图所示,在特定时间点上只有一个线程可以获取GIL,于是Ruby的代码执行是完全不能并行的。


 

那么Ruby如何保证GIL被线程独霸呢?Ruby提供了一个计时器线程,这个线程是仅存在于Ruby内部的原生线程,当Ruby启动并只有主线程运行时,定时器线程处于沉睡状态,但一旦有线程等待GIL,定时器线程就会被唤醒。定时器线程是用于避免一个线程独霸GIL的情况,每经过一定周期,定时器线程在当前持有GIL的线程上设置一个中断标志,Ruby会检查这些中断标志,被设置中断标志的线程会停止运行并释放GIL,这样,别的线程就可以获取GIL继而执行其代码。


 

四、总结


GILRuby内部实现细节,是为了保证Ruby内部执行的安全,它保证了RubyC实现的底层方法的原子性


PS:以上内容都是基于CRuby的,对于JRuby或者Rubinius来说,它们是可以真正做到多线程并发执行的。

相关文章
|
缓存 Kubernetes 网络协议
阿里云DNS常见问题之在手机上使用阿里的私人dns失败如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集:
|
Kubernetes jenkins 持续交付
在jenkins中连接kubernetes集群
在jenkins中连接kubernetes集群
|
存储 消息中间件 缓存
支持百万人超大群聊的Web端IM架构设计与实践
本文将回顾实现一个支持百万人超大群聊的Web端IM架构时遇到的技术挑战和解决思路,内容包括:通信方案选型、消息存储、消息有序性、消息可靠性、未读数统计。希望能带给你启发。
596 0
支持百万人超大群聊的Web端IM架构设计与实践
|
JavaScript API 数据处理
vue3使用pinia中的actions,需要调用接口的话
通过上述步骤,您可以在Vue 3中使用Pinia和actions来管理状态并调用API接口。Pinia的简洁设计使得状态管理和异步操作更加直观和易于维护。无论是安装配置、创建Store还是在组件中使用Store,都能轻松实现高效的状态管理和数据处理。
861 3
|
自然语言处理 搜索推荐 BI
有哪些好用的待办事项提醒软件?主流7款大对比
随着生活和工作节奏的加快,待办事项提醒软件成为了我们的“救命神器”。本文评测了7款主流的待办事项软件:板栗看板、Todoist、Microsoft To Do、TickTick、Google Keep、Any.do 和滴答清单,从功能、适用场景和优缺点等方面进行对比,帮助你找到最适合自己的那一款。无论是团队协作、个人时间管理还是生活与工作的平衡,总有一款能满足你的需求。
8358 1
|
关系型数据库 MySQL Linux
Linux系统绿色安装MySQL 8.0.39
Linux系统绿色安装MySQL 8.0.39
|
数据安全/隐私保护 iOS开发 Docker
深度了解MacOS Docker 安装
【8月更文挑战第23天】深度了解MacOS Docker 安装
1063 1
|
缓存 Kubernetes 专有云
Sealer - 把 Kubernetes 看成操作系统集群维度的 Docker
功能上 sealer 已经完成了“集群维度的 Docker”这一设定,未来在生态发展上会增加更多的投入,创造更多更优质的官方镜像,建立更多的合作伙伴,真正把软件的提供者与使用者连接起来,高效的协作。
1477 93
Sealer - 把 Kubernetes 看成操作系统集群维度的 Docker
|
前端开发 Java
CompletableFuture的高级用法与实战
【4月更文挑战第20天】
858 1
|
数据安全/隐私保护 Docker 容器
离线方式部署harbor
离线方式部署harbor
713 2

热门文章

最新文章

下一篇
开通oss服务