进程线程协程与并发并行

2018-01-23,我的笔记,不保证正确。html

1、进程 Process:(并行运算,分布式)

每个进程,均可以看做是一个完整的 Program,它有本身彻底独立的内容。不与其余进程直接共享数据。(一个工做(job)能够由多个 process 完成,例如电脑上的qq/360就会有好几个进程,这种程序可能会有一个守护进程,当主进程挂掉,它会自动重启主进程。)编程

每一个进程能够由多个线程组成。进程抽象由操做系统提供,Linux 是使用 fork 函数,Windows 是用 CreateProccess。安全

2、线程 Thread:(并发执行)

属于同一个进程的线程之间,是共享一套工做内容的。这使得线程的建立和移除开销很小,但同时也使编程变得复杂。
多线程

关于线程,分用户级线程和内核级线程。不一样的语言中,这两种线程的对应关系也不尽相同。并发

  • 多对一模型
    将多个用户级线程映射到一个内核级线程,线程管理在用户空间完成,这种模型下操做系统并不知道多线程的存在。Python 就是这种模型。
    • 优势:线程管理是在用户空间进行的,切换上下文开销比较小,性能较高。
    • 缺点:当一个线程在使用内核服务时被阻塞,那么整个进程都会被阻塞;多个线程不能并行地运行在多处理机上。
  • 一对一模型
    将每一个用户级线程映射到一个内核级线程。Java的线程就属于这种模型。
    • 优势:当一个线程被阻塞后,容许另外一个线程继续执行,因此并发能力较强;能很好的利用到CPU的多核心。
    • 缺点:每建立一个用户级线程都须要建立一个内核级线程与其对应,这样建立线程的开销比较大,会影响到应用程序的性能。而且切换线程要进出内核,代价比较大。
  • 多对多模型
    将n个用户级线程映射到m个内核级线程上,要求 m <= n。GO(1.5以后)的协程就属于这种线程模型。
    • 特色:既克服了多对一模型的并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程,开销太大的缺点。又拥有多对一模型和一对一模型各自的优势。

3、协程 Coroutine(并发执行)

若是说线程是轻量级的进程,那么协程就是轻量级的线程。线程跑在进程里,协程就跑在线程里。异步

优势:async

  1. 协程是跑在同一个线程里,而且是由程序自己来调度的。协程间的切换就是函数的调用,彻底没有线程切换那么大的开销。
    • 线程的数量越多,协程的优点越大
  2. 由于协程是程序调度的,它其实是串行运行的,所以不须要复杂的锁机制来保证线程安全。
    • 在协程中控制共享资源不加锁,只须要判断状态就行了。这免去了锁机制带来的开销。

由于协程跑在单个线程内,所占用的 CPU 资源有限,因此多协程并不能提高计算性能。不只如此,由于多了程序自己的调度开销,计算密集型程序的性能反而会降低。分布式

此外,协程代码中决不能出现阻塞,不然整个线程都会停下来等待该操做完成,这就麻烦了。函数

协程适合用于 IO 密集型任务,可用于简化异步 IO 的 callback hell。例如 Python 的 asyncio 就是用协程实现的。性能

并发并行

由此,又引出两个名词:

  1. 并发(Concurrent):多个任务交替进行。
  2. 并行(Parallel):多个任务同时进行。

一张图说明二者的差异

Note:进程 和 线程 均可能是 并发 或 并行 的。关键看你程序的运行状态。多核是并行的前提。并发则只要求交替执行,所以单核也没问题。

同步异步

  1. 同步:不一样程序单元为了完成某个任务,在执行过程当中需靠某种通讯方式以协调一致,称这些程序单元是同步执行的。
    • 多线程编程中,全部修改共享变量的行为,都必须加锁,保证顺序执行,保证同步。或者加原子锁,保证该修改操做是原子的。
    • 同步意味着有序
  2. 异步:为完成某个任务,不一样程序单元之间过程当中无需通讯协调,也能完成任务的方式。
    • 不相关的程序单元之间能够是异步的。好比爬虫下载网页
    • 异步意味着无序
相关文章
相关标签/搜索