协程(Coroutine)是什么?为什么需要协程(Coroutine)?

https://blog.csdn.net/jason_cuijiahui/article/details/82587076

Coroutine是编译器级的,Process和Thread是操作系统级的。 对于Coroutine,是编译器帮助做了很多的事情,来让代码不是一次性的跑到底,而不是操作系统强制的挂起。代码每次跑多少,是可预期的。但是,Process和Thread,在这个层面上完全不同,这两个东西是操作系统管理的。

实现
Coroutine的实现,通常是对某个语言做相应的提议,然后通过后成编译器标准,然后编译器厂商来实现该机制。
Process和Thread看起来也在语言层次,但是内生原理却是操作系统先有这个东西,然后通过一定的API暴露给用户使用,两者在这里有不同。
调度
Process和Thread是os通过调度算法,保存当前的上下文,然后从上次暂停的地方再次开始计算,重新开始的地方不可预期,每次CPU计算的指令数量和代码跑过的CPU时间是相关的,跑到os分配的cpu时间到达后就会被os强制挂起。

Coroutine是编译器的魔术,通过插入相关的代码使得代码段能够实现分段式的执行,重新开始的地方是yield关键字指定的,一次一定会跑到一个yield对应的地方。

调用切换所耗资源
进程调度,切换进程上下文,包括分配的内存,包括数据段,附加段,堆栈段,代码段,以及一些表格。
线程调度,切换线程上下文,主要切换堆栈,以及各寄存器,因为同一个进程里的线程除了堆栈不同。
协程又称为轻量级线程,每个协程都自带了一个栈,可以认为一个协程就是一个函数和这个存放这个函数运行时数据的栈,这个栈非常小,一般只有几十kb。

协程与IO
IO密集型为什么用线程不好
当涉及到大规模的并发连接时,例如10K连接。以线程作为处理单元,系统调度的开销还是过大。当连接数很多 —> 需要大量的线程来干活 —> 可能大部分的线程处于ready状态 —> 系统会不断地进行上下文切换。 可见性能瓶颈在上下文切换。

协程出现
协程的出现出现为克服同步模型和异步模型的缺点,并结合他们的优点提供了可能: 现在假设我们有3个协程A,B,C分别要进行数次IO操作。

这3个协程运行在同一个调度器或者说线程的上下文中,并依次使用CPU。 调度器在其内部维护了一个多路复用器(epoll/select/poll)。

协程A首先运行,当它执行到一个IO操作,但该IO操作并没有立即就绪时,A将该IO事件注册到调度器中,并主动放弃CPU。
这时调度器将B切换到CPU上开始执行,同样,当它碰到一个IO操作的时候将IO事件注册到调度器中,并主动放弃CPU。
调度器将C切换到cpu上开始执行。
当所有协程都被“阻塞”后,调度器检查注册的IO事件是否发生或就绪。假设此时协程B注册的IO时间已经就绪,调度器将恢复B的执行,B将从上次放弃CPU的地方接着向下运行。A和C同理。
这样,对于每一个协程来说,它是同步的模型;但是对于整个应用程序来说,它是异步的模型。 意味着

协程访问全局变量是不需要加锁的,因为一个个协程轮流运行
在协程轮流执行的过程中如果一个协程进入死循环,或者陷入内核态,那么其他的协程也会被堵死。

进程 协程 线程的选择情景

多核CPU,CPU密集型应用
此时多线程的效率是最高的,多线程可以使到全部CPU核心满载,又避免了协程间切换造成性能损失。当CPU密集型任务时,CPU一直在利用着,切换反而会造成性能损失,即便协程上下文切换消耗最小,但也还是有消耗的。

多核CPU,IO密集型应用
此时采用多线程多协程效率最高,多线程可以使到全部CPU核心满载,而一个线程多协程,则更好的提高了CPU的利用率。

单核CPU,CPU密集型应用
单进程效率是最高,此时单个进程已经使到CPU满载了。

单核CPU,IO密集型应用(上下文切换是瓶颈)
多协程,效率最高。例如,看了上面应该也是知道的了

您可以自由的转载和修改,但请务必注明文章来源并且不可用于商业目的。
本站大部分内容收集于互联网,如果有侵权内容、不妥之处,请联系删除。敬请谅解!

  Previous post 进程 线程 协程
Next post   降准时代

添加新评论

  关于博主【WANG-FEiHU】

Duplicate
-----------Complicate
--------------------------Appreciate
-----------------------------------------Fate

闻先后,术专攻
三人有师
习得文武艺,货与帝王家
人性不曾变,资本永无眠

-----------花有重开日,人无再少年-----------

  分类目录

  monitor(TD)

不放弃

不怕万人阻挡,只怕自己投降。

人家的时间都用在了努力,而你的时间却用在了选择,当你将放弃当作一种习惯,你一辈子也不会有出息。

知其所以然

鲜衣怒马,绝代风华。 we are the world

Je le sais continue c'est pas bon,A la fin tu restes pas longtemps