协程:
1.为什么会有协程,解决什么问题?
2.原语
3.协程的切换
4.协程结构体定义
5.调度的策略
6.调度器如何定义
7.协程api的实现,hook
8.多核模式
9.如何测试
同步的编程方式,异步的性能
如果检测io与读写io在一个流程里面就是同步,如果不在一个流程里面就是异步
//同步 func (){ while(1){ epoll_wait(); for(;;){ recv(); send(); } } }
//伪代码,异步 thread_cb(void *arg){ recv(); send(); } func () { while(1) { epoll_wait(); for(;;) { push_other_thread(); } } }
避免不了一个问题:同一个fd会在不同的线程中操作,解决是在recv前在封装一个poll,检测是否真的可读
协程是在send之后,将fd加入到epoll,然后让出到epoll_wait,这时有两个可能1、epoll_wait没有就绪的,在恢复到send。2、如果有就绪的,处理fd,recv。
goto只能在函数内部跳转。栈内跳转
有三种跳转方式:
1、setjmp/longjmp
2、ucontext
3、汇编
线程切换:先保存当前寄存器的值(save),然后切换到下一个线程(load),相当于保留现场和恢复现场
协程也一样,yield和resume
协程作为网络io合适,做页面刷新,文件就不合适
标签:汇编,协程,epoll,send,跳转,原理,recv,wait From: https://www.cnblogs.com/cuijy1/p/16425359.html