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和互斥锁有什么区别?
互斥锁:修改数据时有序的更改,不产生数据的混乱。
一张图解决,注意:互斥不是线程之间按一定顺序执行,而是在同一时间只能执行一个线程。