协程api

用途:
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差不多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值