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等,当然也可以用多线程做,但协程的优势在于并发能力高,代码编写相对于多线程来说简单,多线程要做互斥锁,因为多个线程共享一个调度器。
以下是本章的几个问题: