前言

coroutines一词1958年提出来的,协程发明并用于构建汇编程序,说明协程是一种编程思想,并不局限于特定的语言。笔者就着文档简单的过了一下,记录了一点东西,有一些不常用的就没研究了,以后再补充,文章有点长,可能看字有点干,先上我最爱的熊猫图。

补充1:为啥我8核16线程的处理器,任务管理器里有那么多进程?

以AMD3700x 8核心16线程的处理器为例。严格意义上来说,他只有8核,同一时间点,应该只能有8个进程16个线程在运行。但是实际上,不管是进程也好,线程也好,远远不止这么点。为什么呢?因为现在硬件性能非常好,进程切换的非常快,宏观上给人感觉有多个程序在同时运行,所以任务管理器里才会有那么多的进程和进程树。

补充2:并行和并发

并发:在操作系统中,某一时间段,几个程序在同一个CPU上运行,但在任意一个时间点上,只有一个程序在CPU上运行。
并行:当操作系统有多个CPU时,线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式成为并行。

并发告诉我们,有处理多个任务的能力,但不要求同时。并行告诉我们,同一时间点有处理多个任务的能力。所以重点是同时

补充3:进程和线程

进程是资源分配的最小单位。线程是程序执行过程中的最小单元。
其实操作系统有他自己的一套进程管理方法,因为要给人用啊,所有搞了个内核态和用户态。有没有发现一个事,任务管理器里有些进程关不掉或者关掉直接黑屏,没错,用户就好好关注你的用户线程,别有事没事去动系统的。

补充4:线程的效率已经这么高了,为啥还要协程

用协程的好处:内存开销小、上下文切换开销小、由于是用户态所以执行过程不会被系统强行中断、适合高并发场景。

线程的切换是由内核控制的,时间片用尽,当调用阻塞方法时,内核为了CPU 充分工作,也会切换到其他线程执行。当线程繁忙且数量众多时,这些切换会消耗绝大部分的CPU运算能力,经过实践得到一次切换耗时为3.5us。而协程可以在不陷入内核的情况进行上下文切换。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快,切换耗时只有区区100ns多一些。协程是用户态的轻量级线程

在Linux系统中,系统默认分配8M给一个线程(可以通过 ulimit 之类的命令修改);java中,如jdk1.8,系统默认分配1M给一个线程;kotlin的协程需要分配的内存非常小(几十KB的级别)。

讲一讲协程并发模型多线程同步模型。举个例子,用分治算法. 进程太多要靠线程分摊. 线程太多要用协程分摊. 100万个任务, 分解成100个进程, 每个进程100个线程, 每个线程100个协程, 列表的时间复杂度就能大幅度降低.

思考:空间还是时间性能都这么牛逼,操作系统干嘛不用协程

无论是空间还是时间性能都比进程(线程)好这么多,那么Linux为啥不把它在操作系统里实现了多好?操作系统为了实现实时性更好的目的,对一些优先级比较高的进程是会抢占其它进程的CPU的。而协程无法实现这一点,还得依赖于当前使用CPU的协程主动释放,于操作系统的实现目的不相吻合。所以协程的高效是以牺牲可抢占性为代价的。

协程中重要的概念

CoroutineScope

协程作用域,内部有作用域的CoroutineContext。协程的使用离不开其作用域,所有的协程构建器都声明为在它之上的扩展。

构造函数

ContextScope(context: CoroutineContext)

示例

//MainScope是工厂函数
private val mainScope = MainScope()

CoroutineContext

CoroutineContext作为协程上下文。协程上下文是各种不同元素的集合,其主元素是协程中的Job。有时我们需要在协程上下文中定义多个元素。我们可以使用 + 操作符来实现(表面上是个操作符,其实是个操作符函数

kotlin协程知识点梳理相关推荐

  1. pdf 深入理解kotlin协程_Kotlin协程实现原理:挂起与恢复

    今天我们来聊聊Kotlin的协程Coroutine. 如果你还没有接触过协程,推荐你先阅读这篇入门级文章What? 你还不知道Kotlin Coroutine? 如果你已经接触过协程,但对协程的原理存 ...

  2. 一文看透 Kotlin 协程本质

    前言 公司开启新项目了,想着准备亮一手 Kotlin 协程应用到项目中去,之前有对 Kotlin 协程的知识进行一定量的学习,以为自己理解协程了,结果--实在拿不出手! 为了更好的加深记忆和理解,更全 ...

  3. Kotlin协程:挂起与恢复原理逆向刨析

    前言:只有在那崎岖的小路上不畏艰险奋勇攀登的人,才有希望达到光辉的顶点. --马克思 前言 经过前面两篇协程的学习,我相信大家对协程的使用已经非常熟悉了.本着知其然更要知其之所以然的心态,很想知道它里 ...

  4. Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync

    前言 Kotlin的协程,本质上是一个线程框架,它可以方便的切换线程的上下文(如主线程切换到子线程/子线程切回主线程).而平时我们要想在Android Studio使用协程,先要在gradle引入协程 ...

  5. 在 Android 开发中使用 Kotlin 协程 (一) -- 初识 Kotlin 协程

    前言 最近在研究 Kotlin 协程,发现功能真的超级强大,很有用,而且很好学,如果你正在或计划使用 Kotlin 开发 Android,那么 Kotlin 协程你一定不能错过! 协程是什么? 我们平 ...

  6. 分析Kotlin协程只挂起不恢复会怎样(是否存在协程泄漏),以及挂起的协程存在哪里?

    前言 刚开始正式学协程原理的时候(以前只是学api怎么用),大概是20年6月,也就是bennyhuo大佬出书<深入理解Kotlin协程>的时候,我买了本然后细细研究,我的内心就一直有一个问 ...

  7. 动手实现Kotlin协程同步切换线程,以及Kotlin协程是如何实现线程切换的

    前言 突发奇想想搞一个同步切换线程的Kotlin协程,而不用各种withContext(){},可以减少嵌套且逻辑更清晰,想实现的结果如下图: 分析 实现我们想要的结果,首先需要知道协程为什么可以控制 ...

  8. Kotlin 协程 + Spring webflux 开发后端

    前言 后端响应式是未来,吞吐量会更大,而资源占用更少,其用到了类似Android系统的Loop(事件循环)机制,而协程可以减少线程等待的消耗,并且同步式的编程方式使代码可读性更高,两个仿佛天生就是一对 ...

  9. Android Kotlin协程和Retrofit结合使用

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118085035 本文出自[赵彦军的博客] 往期精彩文章: Kotlin实战指南二十 ...

最新文章

  1. JFileChooser文件过滤的实现
  2. VM Depot 分布式计算框架主题应用精选
  3. 华硕笔记本:Ubuntu 18.04安装Nvidia驱动
  4. GDCM:将PDF文件转换为DICOM / PDF文件的测试程序
  5. ASP.NET MVC+JQueryEasyUI1.4+ADO.NET Demo
  6. 5.2jquery案例2
  7. 2020 全球 JS 现状调查报告
  8. linux查看vnc服务加密修复,VNC远程管理Linux服务器安全指导
  9. debian+apache+acme_tiny+lets-encrypt配置笔记
  10. CYYMysql 源码解读 2
  11. android 血压计开发,智能血压计方案开发
  12. 她看:2021年95后女性人群洞察与媒体消费趋势前瞻.pdf(附下载链接)
  13. fprom预测结果内容_生物标志物联合OCT预测ACS患者再发冠脉事件|博“冠”精点...
  14. The First Python man in Github
  15. linux基本命令示例_Linux中带示例的sort命令
  16. 阅读go语言程序设计
  17. Vray渲染器和Corona渲染哪个更好用?
  18. 制作一个企业网站——html华为官网购物商城项目的设计与实现
  19. 哔哩哔哩中缓存的视频和音频如何合并
  20. 计算机远程终端控制示意图,Windows远程控制完全指南

热门文章

  1. 2.4G语音空鼠翻页笔激光笔遥控器方案
  2. window环境下运行linux解压命令,使用压缩的方式将Windows下的zip压缩包上传到Linux系统的方法解析...
  3. 爬虫08-验证码的处理
  4. MySQL中如何设置 auto_increment 重新计数 主键id从1开始
  5. 生产环境中报错:would dispatch back to the current handler URL......
  6. 迁移jira后,confluence不能登录解决方法
  7. 世界之窗6.0.0.170发布,支持自定义安装路径
  8. git add . 报错 The following problems have occurred when adding the files: Pathspec ‘part02
  9. 五大浏览器哪个最好用。。。
  10. 从芯片公司到VR,字节跳动为了元宇宙加码布局