python-进程-线程-协程笔记
文章目录
进程概念
- 每一个运行中的程序称为进程(就是应用程序执行的实例)
- 现代操作系统几乎是支持多进程并发执行
线程概念
- 线程是进程的组成部分,一个进程可以拥有多个线程
- 在多线程中,会由一个主线程完成整个进程从开始到结束的全部操作,其他线程会在主线程的运行过程中被创建或退出。
协程概念
-
一个线程,包含多协程。
-
协程由应用程序实现调度,线程由操作系统实现调度,不需要陷入内核
-
有中断,因而可以执行上下文,执行权限被挂起
协程组成
一个是具体的代码逻辑(通过代码地址引用)和所依赖的资源信息
从用户层来说需要保存变量和所用到的数据,从系统层来说,它需要保存调用时的寄存器信息,以便后续恢复执行时使用
调度概念
调度器负责将我们用户用协程编写的业务逻辑来运行调度
调度器通常在用户声明的一个协程的时候,去插入一些调度指令
转移其实同操作系统的调度差不多,将当前协程的上下文信息,进行保存,然后执行新的协程,加载执行
所以关系是:调度器—》用户线程—》内核线程—》CPU核。
线程里面可以有协程,协程有调度指令,使得他能够执行保存协程的上下文信息,然后执行新的协程,实现转移。(这协程的调度是基于应用程序的调度)
但是当线程是没有协程的,那么线程的调度是依赖操作系统的调度,那么线程多了,就会有大量的资源的消耗
所以并发模式会有线程模型,有协程模型。
线程分类
- 进程里只有一个线程:单线程
- 进程里超过一个线程:多线程
线程和进程关系
- 每一个线程都必须有自己的父进程
- 线程是可以拥有自己的堆栈,程序计数器,局部变量
- 但是不拥有系统资源,所以是和父进程的其他线程共享该进程所拥有的全部资源
- 因而线程是可以完成一部分任务;又可以和线程共享父进程的共享变量和部分环境。
全局解释器锁
python主程序只允许有一个线程执行
线程执行流程
- 获取 GIL
- 执行对应线程的代码
- 释放 GIL
并发概念
多线程----每个线程的执行一定会占用这个处理器一个时间片段,同一时刻,其实只有一个线程在执行。
如果使用多线程,处理器就可以在某个线程等待的时候,去执行其他的线程,从而从整体上提高执行效率。
因而有可能会出现IO密集型任务
IO密集型任务
启用多线程,处理器就可以在某个线程等待的过程中去处理其他的任务
并行概念
多进程----它是指同一时刻只能有一条指令执行,但是多个线程的对应的指令被快速轮换地执行。并行只能在多处理器系统中存在
所以多核处理器是可以实现并行执行指令
因而可能会出现CPU 密集型任务
CPU 密集型任务
线程切换的过程中多耗费一些时间,整体效率会变低
线程的状态
线程生命周期:新建,就绪,运行,阻塞,死亡
进程的状态
主要是:就绪态,执行态,阻塞态
而从图中得到的是:
- 新的:进程正在创建。
- 运行:指令正在执行。
- 等待:进程等待发生某个事件(如 I/O 完成或收到信号)。
- 就绪:进程等待分配处理器。
- 终止:进程已经完成执行。