转:进程 线程 协程 管程 纤程 概念对比理解

引言

不知道是否是我本身自己就有那么一丝丝的密集恐惧,把这么一大堆看起来很类似很相关的概念放在一块儿,看起来是有点麻,捋一捋感受舒服多了。算法

相关概念

任务、做业(Job,Task,Schedule)

在进程的概念出现以前,进程有着这样的称谓。编程

进程

为了使多个程序可以并发(同一时刻只有一个在运行,但感受起来像多个同时运行;并行(同一时刻真的多个在运行,不是感受像多个))的执行,操做系统须要一个结构来抽象和表示这个程序的运行。数据结构

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

线程

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

  • 线程比进程更轻量
  • 线程能独立运行,独立调度,拥有资源(通常是CPU资源,程序计数器等)
  • 线程调度能大幅度减少调度的成本(相对于进程来讲),线程的切换不会引发进程的切换
  • 线程的引入进一步提升了操做系统的并发性,线程能并发执行
  • 同一个进程的多个线程共享进程的资源(省去了资源调度现场保护的不少工做)

协程、共行程序、Coroutine

  • 协程是用户模式下的轻量级线程,操做系统内核对协程一无所知
  • 协程的调度彻底有应用程序来控制,操做系统无论这部分的调度
  • 一个线程能够包含一个或多个协程
  • 协程拥有本身的寄存器上下文和栈,协程调度切换时,将寄存器上下纹和栈保存起来,在切换回来时恢复先前保运的寄存上下文和栈
  • 协程能保留上一次调用时的状态,看到这里各类生成器(生成器是被阉割的协程)的概念浮现出来了。。
  • Windows下的实现叫纤程

纤程

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

为了帮助各公司更快、更正确地将他们的代码移植到Windows,Microsoft 在操做系统中增长了纤程(Fiber)。纤程与纤程对比,有以下的特性:操作系统

  • 线程是在Windows内核中实现的,操做系统会根据系统的调度算法对线程进行调度。
  • 纤程是在用户模式下实现的,内核对纤程一无所知。
  • 纤程是更轻量级的线程,一个线程能够包含一个或多个纤程
  • 内核会对线程进行抢占式调度,线程一次只能执行一个纤程的代码(具体执行哪个纤程由用户调度算法决定)
  • 纤程的调度与线程的调度没有直接关系,操做系统随时可能会夺取纤程所在线程的运行权
  • 除非正在运行的纤程显式的切换到另外一个纤程,不然其余纤程将没法运行
  • Windows有一套API来说线程转换为纤程或者在同一个线程里面建立多个纤程

管程

把管程放最后还加了一道分割线缘由是管程跟上面的几个概念不是同一类东东,虽然长得很像,就像Car和Bar同样。线程

临界资源的概念:设计

  • 一次只容许一个进程访问的资源
  • 多个进程只能互斥访问的资源

临界资源的访问须要同步操做,好比信号量就是一种方便有效的进程同步机制。但信号量的方式要求每一个访问临界资源的进程都具备wait和signal操做。这样使大量的同步操做分散在各个进程中,不只给系统管理带来了麻烦,并且会因同步操做的使用不当致使死锁。管程就是为了解决这样的问题而产生的。协程

操做系统中管理的各类软件和硬件资源,都可用数据结构抽象地描述其资源特性,即用少许信息和对该资源所执行的操做来表征该资源,而忽略它们的内部结构和实现细节。利用共享数据结构抽象地表示系统中的共享资源。而把对该共享数据结构实施的操做定义为一组过程,如资源的请求和释放过程request和release。进程对共享资源的申请、释放和其余操做,都是经过这组过程对共享数据结构的操做来实现的,这组过程还能够根据资源的状况接受或阻塞进程的访问,确保每次仅有一个进程使用该共享资源,这样就能够统一管理对共享资源的全部访问,实现临界资源互斥访问。进程

管程就是表明共享资源的数据结构以及由对该共享数据结构实施操做的一组过程所组成的资源管理程序共同构成的一个操做系统的资源管理模块。管程被请求和释放临界资源的进程所调用。

管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操做,这组操做能同步进程和改变管程中的数据。

超线程

这个也是一个跟上面的概念不是一类事的概念,超线程是Intel CPU设计上的一种技术。

一个CPU物理核在同一时间只能执行一个线程,而线程的切换会消耗掉上万的始终周期,效率还不够高。超线程就是在实现同一个CPU物理核在同一时间能几乎执行两个线程的技术。这就是咱们在Intel CPU的机子上的任务管理器中常常看到double的CPU物理核心的原因。

参考资料

  1. 《深刻理解计算机系统》 第二版
  2. 《Windows 核心编程》 第五版
  3. 《计算机操做系统》 第三版
  4. 《操做系统概念》 第七版
  5. 《计算机程序设计艺术》 卷一
  6. Coroutine 维基百科
相关文章
相关标签/搜索