libco简介

好久都没在CSDN上发博客了,大概两年了吧,看着以前写的博客,感觉自己更像是个前端工程师了,其实工作上我应该算是后端的吧。最近换了一份工作,新公司用到一个叫Colib的库,也在GitHub上开源了,虽然开源之后并没有人怎么维护,但这里面的代码的确也在线上用,这里面的思想也是挺有趣儿的,就研究了一下,也算是和后端相关了

https://github.com/Tencent/libco 

1. 协程

1. 1 概念

协程这个概念其实在《操作系统》系统里面应该有了解过,进程(process),线程(thread),协程(routinue),其中大部分博客,论文对进程和线程都有介绍,协程的介绍却比较少。协程其实是在线程里面跑的,比线程更细粒度。线程里面其实是有当前执行的上下文信息,里面装了当前执行的位置,将要执行什么代码。如果我们有多个这样的上下文,并且可以在里面各种跳转,就类似于我们在线程里面实现了一种更细粒度的“线程”。你可以把这种上下文理解成一个函数,相当于有A,B两个函数,我在执行A的时候,还没执行完,然后暂停了一下,去执行B,然后还没等B执行完,又暂停一下,去继续执行A,就像线程调度一样,但这个不是线程,因为A和B不能并发(有些框架其实是可以的,例如,在上一家公司用的一个叫BRPC的框架,后面我会写博客介绍这个框架,这里的协程就是指在一个线程里面的那种协程),也就是A执行的时候,B不能执行,B执行的时候,A不能执行,所以这种协程不用考虑锁的问题,因为不会发生竞争。另外和线程不同的是,这种协程调度不是由操作系统来调度的,是由开发者,也就是人通过代码来调度的。线程是操作系统执行的最小单位,对于操作系统来说,他只能看到线程,不知道这个线程里面是怎么调度的。这是这种“子程序”或者“运行模式”(我也不知道用什么名词比较合适)就是协程。下面附一个博客,这里面用一个例子解释了什么是协程,更加简单易懂

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013868328689835ecd883d910145dfa8227b539725e5ed000 

1.2 优势

那么协程的优势在哪儿呢,看起来协程并不能并发,似乎用处不大。但回想一下我们在一些耗时操作的时候,例如网络请求,有段时间我们会等待请求回来,这种等待其实就是一种CPU资源的浪费。这时候如果有协程,我们在知道要等待的时候,在代码里面切换一下,去执行其他操作,等那个请求回来了,我们再切回去执行那个返回的结果,这样不就把等待那部分时间给利用起来了么。如果是在多线程里面,一个线程的请求没回来,我们可能用一个thread_yield,或者wait的方法,让这个线程休眠,但这样中间就会有一次线程切换,会浪费一些消耗,而协程切换就不会有这个影响,因为在操作系统看来,这全部都是在一个线程里面去完成的。所以这也是协程的最大的优势:协程切换开销远小于线程,进程切换

 

2. libco

2. 1 协程调度

libco是我们部门底层大量使用的一个基础库,这个并发度传言很高,具体多高我也不太清楚,但经受住业务的考验这倒是真的。这个库就是一个C++的协程库,代码不多,主要有几个常用的方法:

这里主要介绍一下这三个,create,resume,yield

co_create: 参数里面有一个函数指针,用于创建一个新协程,可以理解为创建了一个上下文,但只是创建,啥都没干,就像pthread_create。

co_resume:执行某一个协程,可以看里面的实现,里面有一个pCallStack,这里面装的其实就是协程栈,要执行的时候,就取出当前执行的协程,也就是栈里面最后一个协程,然后对传进来的协程判断一下,做一个初始化,压入栈,然后和当前的协程swap一下。这个swap其实就是在把当前这个线程要执行的下一条指令,指向这个新的协程(图中那个co)。

这里的swap是怎么实现的呢,其实就是用汇编,复制,保存寄存器中的值,改变CPU寄存器里面跳转下一个指令的地址,实现上下文切换,也就是改CPU下一行要执行的代码。这里的汇编是针对不同的CPU架构,写不同的汇编,所以汇编还是很强大的。虽然协程的切换基本都是通过汇编来实现的,但是还是有很多种方法。已经有一些库,例如boost中已经提供了上下文切换,所以如果业务需要这方面的功能,不用自己去写汇编,这里附一篇博客,里面有提及一些库可以实现协程切换。

https://blog.csdn.net/waruqi/article/details/53201416 

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值