zoukankan      html  css  js  c++  java
  • python的GIL锁

    进程:系统运行的一个程序,是系统分配资源的基本单位。

    线程:是进程中执行运算的最小单位,是处理机调度的基本单位。

    处理机:是计算机中存储程序和数据,并按照程序规定的步骤执行指令的部件。包括中央处理器、主存储器、I/O接口。

    程序:程序是描述处理机完成某任务的指令序列。

    指令:处理机能够解释、直接执行的信息单位。

    计算机系统:处理机+外围设备。

    并行:多个cpu同时执行多个任务,假设有两个程序,这两个程序在两个不同的cpu上同时运行。

    并发:单个cpu交替执行多个任务,假设有两个程序,这两个在该cpu上交替进行运行,而不是同时运行,只是由于执行的时间太快,让人误以为是在“同时进行”。执行的先后取决于对时间片资源的竞争。其中两种并发关系是同步和互斥。

    同步:不是指同时进行指线程之间按一定顺序进行运行,当前一个线程结束时,下一个线程才能够运行。

    异步:线程不可以同时进行运行。

    (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
    (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段,栈段又叫运行时段,用来存放所有局部变量和临时变量。
    (3)处理机分给线程,即真正在处理机上运行的是线程。
    (4)线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
    如果把上课的过程比作进程,那么每个学生就是一个线程,他们共享教室,即线程共享进程的内存空间。每一个时刻,只能一个学生问老师问题,老师回答完毕,轮到下一个。即线程在一个时间片内占有cpu。

    用C语言写的python解释器存在GIL,python语言本身是不存在GIL的 。GIL是cpython的全局解释器锁,而且只有一个。当同一进程中存在多个线程运行,一个线程在运行python程序的时候会占用Python解释器(即获得GIL),使该进程内的其他线程无法运行,等该线程运行完成后,其他线程才能运行。即使是在多核况下,也只能发挥单核的性能。

    什么时候释放锁?

    (1)对于i/o的线程,是不需要cpu的,也就是cpu空闲的时候。

    (2)对于cpu密集型的线程,cpu会一直被占用进行计算,此时有一个指令计数器,当一个线程执行了一定数量的指令时(100),GIL就会被释放,释放后多个线程对GIL进行竞争。

    解决GIL的方法?

    (1)在使用多线程时,使用其他语言;

    (2)换一种Python解释器;

    (3)使用多进程;

    GIL和互斥锁有什么区别?

    互斥锁:修改数据时有序的更改,不产生数据的混乱。

     一张图解决,注意:互斥不是线程之间按一定顺序执行,而是在同一时间只能执行一个线程。

  • 相关阅读:
    Codeforces Round #609 (Div. 1)
    Codeforces Round #607 (Div. 1)
    Codeforces Round #604 (Div. 1)
    网络流应用
    javaScript遍历数组总结
    JavaScript遍历对象的常见方法
    JS中的可枚举属性与不可枚举属性
    typeScript泛型
    ts中函数重载声明
    ts中的可选参数
  • 原文地址:https://www.cnblogs.com/xiximayou/p/11729788.html
Copyright © 2011-2022 走看看