Java教程

线程、进程和协程

本文主要是介绍线程、进程和协程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

进程


进程是操作系统进行资源分配和调度的一个独立单位,是应用程序的载体。进程一般有程序,数据集合和进程控制块三部分组成。每一个进程都有自己的独立内存空间,不同进程通过进程间通信。由于进程比较重量,占据独立的内存,所以上下文进程间切换开销比较大,但相对比较安全。

进程具有的特征

  1. 动态性:进程是程序的一次执行过程,是临时的,有生命周期的,是动态产生,动态消亡的。
  2. 并发性:任何进程都可以同其他进程一起并发执行
  3. 独立性:进程是系统进行资源分配和调度的一个独立单位
  4. 结构性:程序,数据集合和进程控制块三部分组成

进程的生命周期:
进程在运行过程中有三种状态:就绪、运行、阻塞。创建和退出状态是进程的创建过程和推出过程
创建:进程正在创建,还不能运行。操作系统在创建进程时要进行的工作包括分配和建立进程,控制块表象,建立资源表格并分配资源、加载程序并建立地址空间
就绪:时间片已用完,此线程被强制暂停,等待下一个属于它的时间片到来
运行:此线程正在执行,正在占用时间片
阻塞:等待状态,等待某一个事件(如IO或另一个线程)执行完
退出:进程已结束,释放操作系统分配的资源

image

线程


线程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位,是处理器调度的基本单元。线程一般有线程ID,当前指令指针,寄存器和堆栈组成。一个进程至少拥有一个线程,同一个进程中的多个线程共享该进行的资源。

线程的生命周期:
创建:一个新的线程被创建,等待该线程被调用执行
就绪:时间片已经用完,此线程被强制暂停,等待下一个属于它的时间片到来
运行:此线程正在执行,正在占用时间片
阻塞:等待状态,等待某一个事件(如IO或另一个线程)执行完
退出:一个线程完成任务或者其他终止条件发生,该线程终止进入退出状态,退出状态释放该线程所分配的资源。

协程

协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。

进程和线程、协程在python中的使用

  1. 多进程一般使用multiprocessing库,来利用多核CPU,主要是用于CPU密集型的程序
  2. 多线程一般使用threading库,主要用户一些IO密集型并发操作
  3. 协程一般使用gevent库,主要用于非阻塞一步并发的程序

GIL锁


GIL是CPython解释器的概念,叫全局解释器锁。

产生的原因:创建Python是只考虑到单核CPU,解决多线程之间数据完整性和状态同步的最简单的方法就是加锁,于是有了GIL,因为CPython解析只允许拥有GIL全局解析器才能运行程序,这样保证了同一时刻只允许一个线程使用CPU

image

解决办法:

  1. 更换Cpython为Ipython
  2. 使用多进程完成多线程任务
  3. 在使用多线程的情况可以使用C语言完成
这篇关于线程、进程和协程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!