热门标签 | 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 ^.*


推荐阅读
  • 在iOS开发中,多线程技术的应用非常广泛,能够高效地执行多个调度任务。本文将重点介绍GCD(Grand Central Dispatch)在多线程开发中的应用,包括其函数和队列的实现细节。 ... [详细]
  • 面试题总结_2019年全网最热门的123个Java并发面试题总结
    面试题总结_2019年全网最热门的123个Java并发面试题总结 ... [详细]
  • 多线程基础概览
    本文探讨了多线程的起源及其在现代编程中的重要性。线程的引入是为了增强进程的稳定性,确保一个进程的崩溃不会影响其他进程。而进程的存在则是为了保障操作系统的稳定运行,防止单一应用程序的错误导致整个系统的崩溃。线程作为进程的逻辑单元,多个线程共享同一CPU,需要合理调度以避免资源竞争。 ... [详细]
  • Java高并发与多线程(二):线程的实现方式详解
    本文将深入探讨Java中线程的三种主要实现方式,包括继承Thread类、实现Runnable接口和实现Callable接口,并分析它们之间的异同及其应用场景。 ... [详细]
  • 探讨如何在Go语言中高效地处理大规模切片的去重操作,特别是针对百万级数据量的场景。 ... [详细]
  • Python多线程编程技巧与实战应用详解 ... [详细]
  • Java并发机制详解及其在数据安全性保障中的应用方案 ... [详细]
  • Python全局解释器锁(GIL)机制详解
    在Python中,线程是操作系统级别的原生线程。为了确保多线程环境下的内存安全,Python虚拟机引入了全局解释器锁(Global Interpreter Lock,简称GIL)。GIL是一种互斥锁,用于保护对解释器状态的访问,防止多个线程同时执行字节码。尽管GIL有助于简化内存管理,但它也限制了多核处理器上多线程程序的并行性能。本文将深入探讨GIL的工作原理及其对Python多线程编程的影响。 ... [详细]
  • 在嵌入式Linux系统中,性能低下通常由CPU、内存和I/O三个关键因素引起。为了有效提升系统性能,首先需要识别并定位性能瓶颈。通过综合分析这些瓶颈,可以采取针对性的优化措施,如调整内核参数、优化算法和改进数据结构等,从而显著提高系统的整体性能。 ... [详细]
  • 本文深入解析了Java 8并发编程中的`AtomicInteger`类,详细探讨了其源码实现和应用场景。`AtomicInteger`通过硬件级别的原子操作,确保了整型变量在多线程环境下的安全性和高效性,避免了传统加锁方式带来的性能开销。文章不仅剖析了`AtomicInteger`的内部机制,还结合实际案例展示了其在并发编程中的优势和使用技巧。 ... [详细]
  • 并发编程入门:初探多任务处理技术
    并发编程入门:探索多任务处理技术并发编程是指在单个处理器上高效地管理多个任务的执行过程。其核心在于通过合理分配和协调任务,提高系统的整体性能。主要应用场景包括:1) 将复杂任务分解为多个子任务,并分配给不同的线程,实现并行处理;2) 通过同步机制确保线程间协调一致,避免资源竞争和数据不一致问题。此外,理解并发编程还涉及锁机制、线程池和异步编程等关键技术。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了python3变量理解解释器理解常量理解用户交互理解相关的知识,希望对你有一定的参考价值。解释器理解 ... [详细]
  • 2022年Python面试题一.Python基础二.企业面试题结束语🥇🥇🥇✅作者简介:大家好我是编程IDὌ ... [详细]
  • 可参照github代码:https:github.comrabbitmqrabbitmq-tutorialsblobmasterjavaEmitLogTopic.ja ... [详细]
  • PBO(PixelBufferObject),将像素数据存储在显存中。优点:1、快速的像素数据传递,它采用了一种叫DMA(DirectM ... [详细]
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社区 版权所有