一文讲透“进程、线程、协程”


一文讲透“进程、线程、协程”文章插图
本文从操作系统原理出发结合代码实践讲解了以下内容:

  • 什么是进程 , 线程和协程?
  • 它们之间的关系是什么?
  • 为什么说Python中的多线程是伪多线程?
  • 不同的应用场景该如何选择技术方案?
  • ...
什么是进程进程-操作系统提供的抽象概念 , 是系统进行资源分配和调度的基本单位 , 是操作系统结构的基础 。 程序是指令、数据及其组织形式的描述 , 进程是程序的实体 。 程序本身是没有生命周期的 , 它只是存在磁盘上的一些指令,程序一旦运行就是进程 。
当程序需要运行时 , 操作系统将代码和所有静态数据记载到内存和进程的地址空间(每个进程都拥有唯一的地址空间 , 见下图所示)中 , 通过创建和初始化栈(局部变量 , 函数参数和返回地址)、分配堆内存以及与IO相关的任务 , 当前期准备工作完成 , 启动程序 , OS将CPU的控制权转移到新创建的进程 , 进程开始运行 。
一文讲透“进程、线程、协程”文章插图
操作系统对进程的控制和管理通过PCB(Processing Control Block) , PCB通常是系统内存占用区中的一个连续存区 , 它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息(进程标识号,进程状态,进程优先级,文件系统指针以及各个寄存器的内容等) , 进程的PCB是系统感知进程的唯一实体 。
一个进程至少具有5种基本状态:初始态、执行状态、等待(阻塞)状态、就绪状态、终止状态
  • 初始状态:进程刚被创建 , 由于其他进程正占有CPU所以得不到执行 , 只能处于初始状态 。
  • 执行状态:任意时刻处于执行状态的进程只能有一个 。
  • 就绪状态:只有处于就绪状态的经过调度才能到执行状态
  • 等待状态:进程等待某件事件完成
  • 停止状态:进程结束
进程间的切换无论是在多核还是单核系统中 , 一个CPU看上去都像是在并发的执行多个进程 , 这是通过处理器在进程间切换来实现的 。
操作系统对把CPU控制权在不同进程之间交换执行的机制成为上下文切换(context switch) , 即保存当前进程的上下文 , 恢复新进程的上下文 , 然后将CPU控制权转移到新进程 , 新进程就会从上次停止的地方开始 。 因此 , 进程是轮流使用CPU的 , CPU被若干进程共享 , 使用某种调度算法来决定何时停止一个进程 , 并转而为另一个进程提供服务 。
单核CPU双进程的情况
一文讲透“进程、线程、协程”文章插图
进程直接特定的机制和遇到I/O中断的情况下 , 进行上下文切换 , 轮流使用CPU资源
双核CPU双进程的情况
一文讲透“进程、线程、协程”文章插图
每一个进程独占一个CPU核心资源 , 在处理I/O请求的时候 , CPU处于阻塞状态
进程间数据共享系统中的进程与其他进程共享CPU和主存资源 , 为了更好的管理主存 , 现在系统提供了一种对主存的抽象概念 , 即为虚拟存储器(VM) 。 它是一个抽象的概念 , 它为每一个进程提供了一个假象 , 即每个进程都在独占地使用主存 。
虚拟存储器主要提供了三个能力: