什么是协程

作者: 张柳哥 | 来源:发表于2018-06-01 20:34 被阅读0次

协程是比线程更小的一种执行单元,你可以认为是轻量级的线程,之所以说轻,其中一方面的原因是协程所持有的栈比线程要小很多,java当中会为每个线程分配1M左右的栈空间,而协程可能只有几十或者几百K,栈主要用来保存函数参数、局部变量和返回地址等信息。

我们知道,而线程的调度是在操作系统中进行的,而协程调度则是在用户空间进行的,是开发人员通过调用系统底层的执行上下文相关api来完成的,有些语言,比如nodejs、go在语言层面支持了协程,而有些语言,比如C,需要使用第三方库才可以拥有协程的能力。

由于线程是操作系统的最小执行单元,因此也可以得出,协成是基于线程实现的,协程的创建、切换、销毁都是在某个线程中来进行的。

使用协程是因为线程的切换成本比较高,而协程在这方面很有优势。

为什么协程的切换很廉价

关于这个问题,我找了很多资料,得到的答案都没有太高的说服力,我了解了一下线程切换的过程:

  • 线程在进行切换的时候,需要将CPU中的寄存器的信息存储起来,然后读入另外一个线程的数据,这个会花费一些时间
  • CPU的高速缓存中的数据,也可能失效,需要重新加载
  • 线程的切换会涉及到用户模式到内核模式的切换,据说每次模式切换都需要执行上千条指令,很耗时。

协程的切换之所以快,可能的原因是:

  • 在切换的时候,寄存器需要保存和加载的数据量比较小。
  • 高速缓存可以有效利用
  • 没有用户模式到内核模式的切换操作。
  • 更有效率的调度,因为协程是非抢占式的,前一个协程执行完毕或者堵塞,才会让出CPU,而线程则一般使用了时间片的算法,会进行很多没有必要的切换(为了尽量让用户感知不到某个线程卡)。

有哪些协程的实现

目前协程有很多版本的实现,比如云风(原网易的研发总监,开发过《大话西游》、《梦幻西游》等知名游戏)的基于ucontext实现的coroutine,还有人用C语言语法switch-case来实现的。

相关文章

  • Python并发编程系列之协程!

    1 引言 2 协程的意义 2.1 什么是协程 2.2 协程的作用 2.3 相关概念 3 定义协程 4 使用协程 4...

  • 总结:

    1.什么是协程?什么是协程协程,英文名是 Coroutine, 又称为微线程,是一种用户态的轻量级线程。协程不像线...

  • kotlin协程

    1:什么是协程,kotlin协程是什么。 2:kotlin开启协程的方式 launch async+await两...

  • 入门-协程(Coroutine)

    使用协程需要引入 1.什么是协程 官方文档(本质上,协程是轻量级的线程。) 个人理解:协程是一个线程框架,协程就是...

  • kotlin<第七篇>:协程基础

    一、什么是协程? 二、Android中协程用来解决什么问题? 三、需要添加地依赖 四、创建协程 五、协程的两部分 ...

  • Kotlin 协程

    一、关于协程 协程是Kotlin中最重要、最难学的一块! 为什么协程如此重要? 协程是 Kotlin 对比 Jav...

  • 协程

    1.协程 协程,又称微线程,纤程。英文名Coroutine。 1.1 协程是什么 协程是python个中另外一种实...

  • 协程介绍

    协程 协程,又称微线程,纤程。英文名Coroutine。 1.协程是什么? 协程是python个中另外一种实现多任...

  • Kotlin-Coroutine协程初探-扫盲

    什么是协程? 轻量级线程, 用户态的, 很像线程但又不是线程。 什么是kotlin中的协程? 协程是Kotlin官...

  • Kotlin 协程入门

    本文主要介绍协程长什么样子, 协程是什么东西, 协程挂起的实现原理以及整理了协程学习的资料. 协程 HelloWo...

网友评论

    本文标题:什么是协程

    本文链接:https://www.haomeiwen.com/subject/xyhksftx.html