从硬件角度去理解协程

son

2022年,虎年虎虎生威~!

前言

Android 开发者来说 Kotlin 语言已经是很熟悉的了,但 Kotlin 中的 协程 不了解的同学可能还有很多。

阅读网络上大多数文章得到的关于 协程 几个关键词:

  • 像是线程;
  • 不是线程;
  • 用户态;
  • 协作式;

感觉很懵逼,我就问一个 协程 而已为什么出现这么多奇奇怪该的名词。

协程简介

维基百科:协程

协程(英語:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复。 相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛。 协程更适合于用来实现彼此熟悉的程序组件,如协作式多任务、异常处理、事件循环、迭代器、无限列表和管道。

电脑物理硬件

协程 之前我们先聊一下计算机硬件相关的知识。

物理 cpu 数

指主板上实际插入的 cpu 硬件个数(socket)。(但是这一概念经常被泛泛的说成是 cpu 数,这很容易导致与 core 数,processor 数等概念混淆,所以此处强调是物理 cpu 数)。

由于在主板上引入多个 cpu 插槽需要更复杂的硬件支持(连接不同插槽的 cpu 到内存和其他资源),通常只会在服务器上才这样做。在家用电脑中,一般主板上只会有一个 cpu 插槽。

核数

一开始,每个物理 cpu 上只有一个核心 a single core ,对操作系统而言,也就是同一时刻只能运行一个进程/线程。 为了提高性能,cpu 厂商开始在单个物理 cpu 上增加核心(实实在在的硬件存在),也就出现了双核心 cpudual-core cpu)以及多核心 cpumultiple cores),这样一个双核心 cpu 就是同一时刻能够运行两个进程/线程的。

超线程技术

同时多线程技术(simultaneous multithreading)

超线程技术(hyper–threading/HT)

本质一样,是为了提高单个 core 同一时刻能够执行的多线程数的技术(充分利用单个 core 的计算能力,尽量让其“一刻也不得闲”)。

simultaneous multithreading 缩写是 SMTAMD 和其他 cpu 厂商的称呼。 hyper–threadingIntel 的称呼,可以认为 hyper–threadingSMT 的一种具体技术实现。

AMD-R7
Intel-i7

所以可以这样说:某款采用 SMT 技术的 4核心 AMD cpu 提供了 8线程 同时执行的能力;某款采用 HT 技术的 2 核心 Intel cpu 提供了 4 线程 同时执行的能力。

总的逻辑 cpu 数 = 物理 cpu 数 * 每颗物理 cpu 的核心数 * 每个核心的超线程数

线程和协程

协程 的时候绝对不能不提 线程

线程 是操作系统能够进行运算的最小单位。

在之前一般情况下 CPU 的每个核心同一时间只能执行一个线程,除了现在比较新的 CPU 拥有上面说的使用 SMT 或者 HT 技术。

CPU 的核心数和 线程 的个数没有必然关系。举个很简单的例子,我一段代码可以一直创建100个线程

CPU 根本不理解自己执行的指令属于哪个 线程CPU 也不需要理解这些,它只需只需当前操作系统给它分配的指令就行。

在单核 CPU 时代所有的多线程其实都是多任务,多个任务交替使用 CPU资源

有了多核之后,运行在两个线程的任务才实现正真的并行,但电脑的实际核数永远也达不到我们运算需要的任务数量。所以多个任务交替使用 CPU资源 这种情况一直存在,但我们知道 CPP 切换执行线程的上下文都是需要消耗资源的,任务数量越多不一定执行效率更高。对于计算密集型的程序有的建议是设置线程的最佳数量为 CPU 可执行线程数的 1.5倍 或者 1倍+1

在这个时候我们想到能不能在异步任务之间切换的时候不切换 CPU 的上下文状态,这样可以减少很多资源的浪费。或者在 CPU 长时间执行 I/O操作 的时候让其他例程先执行,提供资源的利用率。

协程 就在这个时候产生了,协作式执行多任务的子例程。

这时候我们已经对 协程 有了初步的了解了,回头想想文章开头4个描述 协程 的说明。

  • 像是线程:在部分程序执行的过程中,协程的并发执行就是利用的多线程技术(例如:没有进行改版的 Java程序 )。所以说它像是线程;
  • 不是线程:并发任务的调度不是都通过操作系统级别线程切换执行,而是程序本身支持单个线程的多个并发任务。所以也可以说它不是线程,可以叫它们纤程 Fiber ,或者绿色线程 GreenThread 。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
  • 用户态:不是系统级别的线程而且能自主执行异步任务,这种由程序员自己写程序来管理的轻量级线程叫做用户空间线程,具有对内核来说不可见的特性。
  • 协作式:要求每个运行中的程序,定位放弃自己的执行权利,让多个任务一起交替执行。维基百科:协作式多任务

Android中的协程

上面说的 协程 减少上下文切换,提供效率,那么 Androidkotlin 支持协程么?

kotlin 官方文档说:本质上,协程是轻量级的线程。

但就目前 Kotlin-JVM 而言来说 协程 它就是线程。其本质上还是一套基于原生 Java Thread API 的封装。

可能后续 Kotlin 的版本会有正真的协程相关的机制来代替线程。

这个时候可能我们可能就有一些疑问,既然 协程Android 平台上依旧是 线程 并没有提示运行效率,Java 中的 ExecutorAndroid 中的 AsyncTask 都能提供并发任务,那么 kotlin协程 它有什么用?后面会有一篇文章单独讲解~!

参考资料:

一文读懂什么是进程、线程、协程

Kotlin 协程真的比 Java 线程更高效吗?

扔物线:Kotlin的协程用例瞥一眼

文章到这里就全部讲述完啦,若有其他需要交流的可以留言哦~!~!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容