1、进程

为了使多个程序能够并发(同一时刻只有一个在运行,但感觉起来像多个同时运行)、并行(同一时刻真的多个在运行)的执行,操作系统需要一个结构来抽象和表示这个程序的运行。进程是代码在数据集合上的一次运行活动,是操作系统进行资源分配和调度的基本单位。

  1. 进程是操作系统对一个正在运行的程序的一种抽象结构
  2. 进程是指在操作系统中能独立运行并作为资源分配的基本单位,有一组机器指令、数据和堆栈等组成的能独立运行的活动实体
  3. 操作系统可以同时运行多个进程,多个进程直接可以并发执行和交换信息
  4. 进程在运行是需要一定的资源,如 CPU、存储空间和 I/O 设备等

2、线程

进程是资源分配的基本单位,进程的调度涉及到的内容比较多(存储空间,CPU,I/O 资源等,进程现场保护),调度开销大,在并发的切换过程效率较低。为了高效的进行调度,提出了比进程更轻量的独立运行和调度的基本单位。线程是任务调度和执行的基本单位。

  1. 线程比进程更轻量,是进程的一个执行路径,一个进程可以有多个线程
  2. 线程能独立运行,独立调度,拥有资源(一般 CPU 资源,程序计数器等)
  3. 线程调度能大幅度减小调度的成本(相对于进程来说),线程的切换不会引起进程的切换
  4. 线程的引入进一步提高了操作系统的并发性,线程能并发执行
  5. 同一个进程的多个线程共享进程的资源(省去了资源调度现场保护的很多工作)

3、协程 coroutine

由于最初多数的用户线程是被设计成协同式调度的,所以它有一个别名叫协程。又由于这时候的协程会完整地调用栈的保护、恢复工作,所以今天也被称为有栈协程。
本质是基于线程上的调度,要求协程上的代码不要做阻塞动作,在异步操作结束后重新排队。各个子任务之间的关系比较弱,如果暂时都没事干,调度者甚至会释放线程,等到有事干的时候再开另外一个新线程。

  1. 协程是用户模式下的轻量级线程,操作系统内核对协程一无所知
  2. 协程的调度完全由应用程序来控制,操作系统不管这部分的调度
  3. 一个线程可以包含一个或多个协程
  4. 协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存起来,在切换回来时,恢复之前保存的寄存器上下文和栈
  5. 协程能保留上一次调用时的状态,看到这里各种生成器(生成器是被阉割的协程)的概念浮现出来了
  6. Windows 下的实现叫纤程

4、纤程 quasar

代码易移植性一直是平台交互考虑的重点,在将引用程序从 Unix 移植到 Windows 的过程中,会存在一些类似于线程栈管理的不一致,结构和异常处理等问题,增加移植难度和成本。

为了帮助各公司更快、更正确地将他们的代码移植到 Windows,Microsoft 在操作系统中增加了纤程(Fiber)。

  1. 线程是在 Windows 内核中实现的,操作系统会根据系统的调度算法对线程进行调度
  2. 纤程是在用户模式下实现的,内核对纤程一无所知
  3. 纤程是更轻量级的线程,一个线程可以包含一个或多个纤程
  4. 内核会对线程进行抢占式调度,线程一次只能执行一个纤程的代码(具体执行哪一个纤程由用户调度算法决定)
  5. 纤程的调度与线程的调度没有直接关系,操作系统随时可能会夺取纤程所在线程的运行权
  6. 除非正在运行的纤程显式的切换到另一个纤程,否则其他纤程将无法运行
  7. Windows 有一套 API 来讲线程转换为纤程或者在同一个线程里创建多个纤程