sylar源码阅读笔记-协程模块-基础知识

什么是协程?

协程是由线程创建的执行体,因为用户程序不能操作内核空间,所以只能给协程分配用户栈,操作系统对协程一无所知,所以协程被称为”用户级“线程。

每个协程拥有自己的执行栈,可以保存自己的执行现场,所以可以由用户程序按需创建协程,协程”主动让出“执行权时,会保存执行现场,然后切换到其他协程,协程恢复执行时,会根据之前保存的执行现场恢复到中断前的状态继续执行。实现了由用户态进行调度的多任务模型。

协程的本质是函数函数运行状态的组合。(是可以在某个地方挂起的特殊函数,并且可以重新在挂起处继续执行)

协程、进程、线程的区别在那里?

进程是资源分配的最小单位,线程是处理机调度的最小单位。协程是用户级的线程,操作系统对协程一无所知。

操作系统01-20 | 阿秀的学习笔记 (interviewguide.cn)

同样是单线程环境下,协程的yield和resume一定是同步进行的,一个协程的yield,必然对应另一个协程的resume,因为线程不可能没有执行主体。并且,协程的yield和resume是完全由应用程序来控制的。与线程不同,线程创建之后,线程的运行和调度也是由操作系统自动完成的,但协程创建后,协程的运行和调度都要由应用程序来完成,就和调用函数一样,所以协程也被称为用户态线程。

并发性:

进程:不同进程之间切换实现并发,各自占有CPU实现并行;

线程:一个进程内部多个线程并发执行;

协程:同一时间内只能执行一个协程,而其他协程处于休眠状态,适合对任务进行分时处理(一个线程内的线程必须串行)

通信方面:

进程:进程间的通信需要借助操作系统;

线程:直接读写进程的数据段,例如全局变量;

协程:共享内存,消息队列;

协程的切换不需要锁机制。因为用户可以创建大量的协程,这些协程是按顺序执行的,不存在临界资源竞争的现象。

既然有了线程,为什么还要引入协程?

有线程的时候,如果线程阻塞了,需要释放处理机,保存现场,涉及用户态到内核态的切换,这样比较耗费资源,所以引入协程,在用户态进行调度,不需要进行切换到内核态。

协程是轻量化的进程。

协程是怎么实现的?

具体看完代码才能理解

引入协程后又有哪些缺点?

总结后自己想想

不能利用多核CPU,只能在某一核CPU上面执行,各个协程之间还是串行的。

什么是对称协程和非对称协程?

非对称协程:子协程只能和线程主协程(调度器)切换,而不能和另一个子协程切换,并且在程序结束时,一定要再回到主协程,以保证程序正常运行。可以有两个操作,就是resume和yield,从哪里resume的,yield就会回到那里;

在这里插入图片描述

对称协程:子协程可以直接和子协程切换,相当与每个协程都要充当调度器的角色,进入到协程之后只能由yield操作,将CPU让给调度器。

什么时候比较适合使用协程?

高并发,处理海量请求。对于多线程而言,内核态用户态两头忙,需要来回切换。I/O多路复用中的应用(回头学明白总结总结)。

目前存在哪些开源的协程库?

开源协程库libco,libco是微信后台大规模使用的C++协程库,属于非对称协程库。

参考

https://www.midlane.top/wiki/pages/viewpage.action?pageId=10060957
【协程第二话】协程和IO多路复用更配哦~_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值