用途:
1、文件操作
2、mysql操作
3、网络io
4、redis操作
源语:yield resume switch
协程api封装
几个协程在一个线程里:
yield io没有准备就绪,该协程就让给调度器:
协程一直不让出会怎么处理?
协程是解决io等待挂起,如果没有io操作,用协程意义不大
sSS
加入sleep队列,时间冲突怎办:key(时间)-value(协程),key重复了 插入失败 key(时间)++(几纳秒) 再++
协程多核问题
1、采用多进程,协程代码不用修改,简单,
2、采用多线程,需要对调度器进行加锁,加如sleep数的时候需要对其进行加锁,锁定义在调度器结构体内,在调度器中引入概念,sleep加互斥锁,ready加自旋锁wait加互斥锁。
3、x86指令使用
多核如何与多线程/多进程 联系?
每个线程或进程亲和一个CPU
协程接口
1、coroutine_create();
2、schedule_loop();
3、sleep();
4、accept()、connect()、send()、sendto、write、recv、read、recvfrom,会引起阻塞的函数
对网络io的操作都需要封装一层read、write、accept、、、、、
,异步read
socket、close、fcntl、setsockopt、getsockopt、listen这些函数不会引起阻塞,不需要封装成异步、但是也可以封装,
例如socket封装为申请的fd为非阻塞的
如何封装:
1、__read();
2、系统调用,利用钩子 hook
ntyco性能
用以前同步的读改成异步的读
将系统的读写 改成 重定义的异步的读写操作
非阻塞io和协程效率一样
reactor 可以自己实现
协程需要依赖库
协程是用户态的线程。
针对io操作,协程相对于线程,轻量级,不会向线程的切换的代价大(线程的栈,上下文环境)
和reactor差不多。