2.3 自研框架:协程框架NtyCo的实现

2.3.1 协程设计原理与汇编实现

为什么要有协程?同步的编程,异步的性能。

同步就相当于串行,异步就相当于并行,异步的性能要优于同步,但异步的逻辑不好理解。

协程的核心原语分别是create(创建一个协程),resume(恢复协程的运行权),yield(让出CPU)。

协程不止用来处理网络相关的问题,只是这里举例是。

可以看到同步执行时间大概是异步的5倍,以检测与读写io为例,异步跟同步不同的是同步是直接执行,而异步是建立线程池,将io任务放在线程池里。

2.3.2 协程调度器实现与性能测试

协程如何实现?主要通过callback回调来实现,实现函数之间的跳转有setjmp/longjmp,ucontext,汇编方式(ntyco就是用的这种方式),个人感觉函数之间的跳转其实就是在模拟异步的执行方式。

可以看到setjmp/longjmp的方式如上,这种跨平台性最好但也是最老的。

以上是ucontext,这种实现起来最简单,其中的main_ctx,ctx[ ]就是调度器。

汇编方式性能最好,但三种方式性能差别不大,汇编方式主要使用mov指令,如果想了解可以看ntyco源码(开源的)。

接下来再讲解hook钩子的实现。

如上图,其实就相当于重写了函数read和write,根据实际情况自己定义,如果不需要也可以注释掉用系统自带的。

这里是协程的三种状态,大家可以了解一下运行体如何高效地在多种状态集合更换。

大家也可以写一个协程测试一下它的并发。

本节讲的主要是协程是什么东西,在实际开发过程中,是要调用协程框架或者叫协程库的,比如libco、libuv等,当然也可以用多线程做,但协程的优势在于并发能力高,代码编写相对于多线程来说简单,多线程要做互斥锁,因为多个线程共享一个调度器。

以下是本章的几个问题:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值