文章目录

  • 前言
  • 一、协程是什么?
  • 二、协程是怎么来的?
  • 三、协程的好处有哪些?
  • 总结

前言

该文章为我参考网上一些文章、网友回答后拼凑整理得来。


一、协程是什么?

百度百科:协程(Coroutines)不是进程或线程,其执行过程更类似于子例程,或者说不带返回值的函数调用。

二、协程是怎么来的?

  没有啥复杂的东西,考虑清楚需求,就可以很自然的衍生出这些解决方案。

  一开始大家想要同一时间执行那么三五个程序,大家能一块跑一跑。特别是UI什么的,别一上计算量比较大的玩意就跟死机一样。于是就有了并发,从程序员的角度可以看成是多个独立的逻辑流。内部可以是多cpu并行,也可以是单cpu时间分片,能快速的切换逻辑流,看起来像是大家一块跑的就行。

  但是一块跑就有问题了。我计算到一半,刚把多次方程解到最后一步,你突然插进来,我的中间状态咋办,我用来储存的内存被你覆盖了咋办?所以跑在一个cpu里面的并发都需要处理上下文切换的问题。进程就是这样抽象出来个一个概念,搭配虚拟内存、进程表之类的东西,用来管理独立的程序运行、切换。

  后来一电脑上有了好几个cpu,好咧,大家都别闲着,一人跑一进程。就是所谓的并行

  因为程序的使用涉及大量的计算机资源配置,把这活随意的交给用户程序,非常容易让整个系统分分钟被搞跪,资源分配也很难做到相对的公平。所以核心的操作需要陷入内核(kernel),切换到操作系统,让老大帮你来做。

  有的时候碰着I/O访问,阻塞了后面所有的计算。空着也是空着,老大就直接把CPU切换到其他进程,让人家先用着。当然除了I\O阻塞,还有时钟阻塞等等。一开始大家都这样弄,后来发现不成,太慢了。为啥呀,一切换进程得反复进入内核,置换掉一大堆状态。进程数一高,大部分系统资源就被进程切换给吃掉了。后来搞出线程的概念,大致意思就是,这个地方阻塞了,但我还有其他地方的逻辑流可以计算,这些逻辑流是共享一个地址空间的,不用特别麻烦的切换页表、刷新TLB,只要把寄存器刷新一遍就行,能比切换进程开销少点。

  如果连时钟阻塞、 线程切换这些功能我们都不需要了,自己在进程里面写一个逻辑流调度的东西。那么我们即可以利用到并发优势,又可以避免反复系统调用,还有进程切换造成的开销,分分钟给你上几千个逻辑流不费力。这就是用户态线程

  从上面可以看到,实现一个用户态线程有两个必须要处理的问题:一是碰着阻塞式I\O会导致整个进程被挂起;二是由于缺乏时钟阻塞,进程需要自己拥有调度线程的能力。如果一种实现使得每个线程需要自己通过调用某个方法,主动交出控制权。那么我们就称这种用户态线程是协作式的,即是协程

作者:阿猫 链接:https://www.zhihu.com/question/20511233/answer/24260355 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


三、协程的好处有哪些?

  协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态
  协程的执行效率非常高。因为子程序切换不是线程切换,而是由程序自身控制。因此,没有线程切换的开销,和多线程相比,线程数量越多,相同数量的协程体现出的优势越明显。
  不需要多线程的锁机制。由于只有一个线程,也不存在同时写变量的冲突,在协程中控制共享资源不需要加锁,只需要判断数据的状态,所以执行效率远高于线程。对于多核CPU可以使用多进程+协程来尽可能高效率地利用CPU。


总结

本质上协程就是用户空间下的线程。

虽然协程的概念很早就有,但是很长一段时间,主流的编程语言都没有提供对协程的原生支持,它只出现在一些小众语言中(Simula 和 Modula-2等)。后来出现的纤程啦、coroutine啦都是协程的具体实现,但是都没有达到现在的热度!

直到高并发成为主流趋势,瞬间涌入的海量请求,让多进程模型下,内存资源“捉襟见肘”;让多线程模型下,“用户态”“内核态”两头忙,却依然疲于应对!

而协程这种既轻量又灵活的,由用户态进行调度的多任务模型,便获得了广泛的关注。越来越多的编程语言提供了对协程的支持,而真正让协程大放异彩的,是它在IO多路复用中的应用!


协程是什么?怎么来的?它有什么作用?相关推荐

  1. Python 异步 IO 、协程、asyncio、async/await、aiohttp

    From :廖雪峰 异步IO :https://www.liaoxuefeng.com/wiki/1016959663602400/1017959540289152 Python Async/Awai ...

  2. python多任务—协程(一)

    写在前面: 花了一周的时间,对协程做了一个简单的梳理,特别是异步编程asyncio库的使用,做了详细的说明.本文主要包括的知识点有:yield生成器的复习并实现协程的功能.greenlet库实现协程. ...

  3. Kotlin协程Channel中receive与send原理分析

    文章目录 0. 引言 1. runBlocking() 1.1. 开启协程 1.2. 同步阻塞式执行协程 2. receive() 2.1. 若receive操作时队列包含Send元素则异步唤醒sen ...

  4. C语言---协程介绍

    1.协程概念 1.1 什么是进程和线程?   在了解协程之前先复习下进程和线程的概念,有助于我们更好的理解协程.   进程是正在运行的程序的实例,进程拥有代码和打开的文件资源.数据资源.独立的内存空间 ...

  5. Android 协程使用到原理详解

    协程是什么 协程是我们在 Android上进行异步编程的推荐解决方案之一,通过挂起和恢复让状态机状态流转实现把层层嵌套的回调代码变成像同步代码那样直观.简洁,协程的出现很好的避免了回调地狱的出现. 所 ...

  6. Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

    参见 码云 协程使用方法一 (Dispatchers调度器模式) 指定不同线程.同线程会挂起并阻塞(挂起是不影响主线程执行,阻塞是同样的IO线程会阻塞) withContext(Dispatchers ...

  7. 连接池和协程池为何能提升并发能力?

    你有没有发现,"内存池"和"进程池"都带有"池"字?其实,这两种技术都属于"池化技术".它通常是由系统预先分配一批资源并 ...

  8. Go 知识点(14) — Go 多协程(单个协程触发panic会导致其它所有协程挂掉,每个协程只能捕获到自己的 panic 不能捕获其它协程)

    在多协程并发环境下,我们常常会碰到以下两个问题.假设我们现在有 2 个协程,我们叫它们协程 A 和 B . [问题1]如果协程 A 发生了 panic ,协程 B 是否会因为协程 A 的 panic ...

  9. Go 知识点(11) — goroutine 泄露、设置子协程退出条件

    1. 问题现象 如果在开发过程中不考虑 goroutine 在什么时候能退出和控制 goroutine 生命期,就会造成 goroutine 失控或者泄露的情况 ,看示例代码: func consum ...

  10. Go 知识点(10) — 子协程能否使用主协程变量

    我们来看这样一个问题,在主协程中创建的变量,在子协程中能否使用?来看下面代码: func main() {s := "hello"fmt.Printf("s outsid ...

最新文章

  1. Can't create handler inside thread Thread that has not called Looper.prepare()
  2. Android DHCP 启动分析【2】
  3. linux下mysql tmp满_MySQL服务器/tmp目录被占满
  4. Scala类的继承,抽象类定义,接口定义
  5. 【算法竞赛学习】数据分析达人赛2:产品关联分析
  6. python单元测试框架unittest介绍和使用_Python单元测试框架unittest简明使用实例
  7. 使用go制作微服务数据计算
  8. Java千百问_05面向对象(004)_java接口到底是什么
  9. 【浙江省第16届省赛J:】Welcome Party(并查集+优先队列bfs遍历)
  10. 如何部署服务器虚拟化,vmware服务器虚拟化方案(vmware虚拟化平台部署)
  11. abaqus帮助文档翻译,中英对照
  12. 论语之泰伯第八、子罕第九、乡党第十
  13. 网站建设应该怎样建?建站流程说明
  14. C++基础部分-学习笔记
  15. 主打“极致性价比”的酷玩7,能否让酷派再现辉煌?
  16. 2018年研究生数学建模竞赛B题(数模竞赛第二题思路)
  17. matlab 图像分割_交通标志牌检测--限速数字框选--图像处理 matlab
  18. python基础------绘制条形图、直方图、饼图、热力图、极坐标图、进度条
  19. 行人检测-Caltech Pedestrian Dataset 数据集下载及格式转换
  20. 用户体系分离项目总结

热门文章

  1. 用c语言编程求分数和,用C语言编程平均分数
  2. linux怎么判断全局符号,Linux下全局符号覆盖有关问题
  3. tplink迷你路由器中继模式_斐讯无线路由器设置无线中继(无线扩展)
  4. JDK1.8版本,java并发框架支持锁包括
  5. SQL Server索引总结二
  6. dubbo学习总结三 消费端
  7. 强大的PHP给图片加水印
  8. IT男的”幸福”生活续8
  9. poj 2240 Arbitrage(bellman-ford spfa 判断正环)
  10. 纯野今日之最:面试谈