热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程运行原理分析(GiL锁+线程互斥锁)

首先抛出问题:1.GIL锁和线程互斥锁在整个程序中有何屌用?锁的是什么?2.多线程究竟是如果竞争offer?操作系统解释器执行多线程的流程?直接贴图(个人理解+参考绘制,如有问题,

首先抛出问题:

1.GIL锁和线程互斥锁在整个程序中有何屌用?锁的是什么?
2.多线程究竟是如果竞争offer?操作系统-解释器-执行多线程的流程?

直接贴图(个人理解+参考绘制,如有问题,请指正 ^)

解释:

    T1():
           1.线程1和线程2分别读取共享数据池变量a的指针
           2.T1竞争到GIl锁,cpython解释器保存锁状态(T1占用)
           3.T1交给操作系统,OS调用原生线程,将T1交给 CPU1
           4.CPU1(每一步都是一条CPU指令)
                4.1 读取a指针加载全局变量 0
                4.2 加载常量1
                4.3 完成 0+1 运算
                !!! OS分配给T1的时间片到
           5.T1无奈返回解释器,释放GIL锁,解释器保存锁状态(无占用)
           6.解释器保存T1运行状态,T1等待下次调用
    T2():
           7.T2获得GIl锁,解释器保存锁状态(T2占用)
           8.T2交给操作系统,OS调用原生线程,将T2交给 CPU4
           9.CPU4
                9.1 读取a指针(此时T1未运行完,a处于locked状态)
                9.2 阻塞.....等待时间片到
           10.T2无奈返回解释器,释放GIL锁,解释器保存锁状态(无占用)
    T1(2):
           11.T1竞争到GIl锁,读取上次运行状态,解释器保存锁状态(T1占用)
           12.T1交给操作系统,OS调用原生线程,将T1交给 CPU1
           13.CPU1
                ##  接着上次运行状态
                4.4 将计算结果返赋值给 指针a (此时全局变量a已改变)
                4.5 等待时间片....
                4.6 OS分配给T1的时间片到
           14.T1返回解释器,释放线程互斥锁,并结束线程
           15.T1释放GIL锁,解释器保存锁状态(无占用)
    T2(2):
           16.T2获得GIl锁,解释器保存锁状态(T2占用)
           17.T2交给操作系统,OS调用原生线程,将T2交给 CPU4
           18.CPU4
                ##  接着上次运行状态
                9.3 读取a指针加载全局变量 1
                9.4 加载常量1
                9.5 完成 1+1 运算
                9.6 时间片
                        未到 :将结果返回给全局变量a
                        到了 : 返回解释器交出GIL等待下次调用
           19.T2返回解释器,结束线程2,解释器保存锁状态(无占用)[T2在时间片之内完成运算并且成功返回值]
    

纯属个人理解,转载标注,Thanks ^.*


推荐阅读
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • Spring Batch中多线程配置及实现例子
    本文介绍了在Spring Batch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 数据结构系列1 数组和链表
    数组,链表,l ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • 显卡驱动对游戏的影响及其提升效果的研究
    本文研究了显卡驱动对游戏体验的提升效果,通过比较新旧驱动加持下的RTX 2080Ti显卡在游戏体验上的差异。测试平台选择了i9-9900K处理器和索泰RTX 2080Ti玩家力量至尊显卡,以保证数据的准确性。研究结果表明,显卡驱动的更新确实能够带来近乎50%的性能提升,对于提升游戏体验具有重要意义。 ... [详细]
author-avatar
jyyxk55232
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有