select和epoll ET和LT

select&&epoll

select:
1.监听fd数量有限制,受控于fd_set数组大小
2.每次select均要重新设置fd_set
3.select函数内是通过poll依次轮询fd_set中的fd,
4.select后,要依次轮训fd_set,使用FD_ISSET(fd,&fd_set)判断标志位是否置为1,然后进行处理
5.需要从内核拷贝到用户空间

epoll:
1.监听fd数量无限制
2.每次epoll_wait前不需要重新设置监听fd。epoll_ctl的调用,使得epoll维护了一个监听队列,fd是否在epoll监听队列中由epoll_ctl控制,包括添加,删除,更改。
3.epoll函数直接去查看epoll就绪队列,并返回就绪队列中就绪的fd的数量。
 ep_poll_callback函数是fd的回调函数,一个fd就绪后(活跃了,比如有数据来到;需要看ET还是LT模式),这个函数会被回调。回调的时候把fd放到就绪队列中。
4.epoll_wait后返回epoll_events,epoll_events里储存所有的读写事件,便利依次处理即可
5.内核和用户空间共享同一块内存(mmap)


LT&&ET

LT:水平触发

ET:边缘触发,垂直触发


LT:epoll的LT和select一样,就绪条件是相同的。并且可以是阻塞或者非阻塞都可以

ET:必须做了导致fd不在为就绪状态的操作,才会变为非就绪状态 (比如EWOULDBLOCK EAGIN等)


对于LT来说,只要有事件未处理,则会通知。

对于ET来说,只有在事件发生时,才会通知。(从0-1,或者从1-0)


例:fd的读缓冲区

假设读缓冲区中开始没有数据,然后到达了2k数据,不管是ET还是LT都会触发,从未就绪状态转换成就绪状态。
如果这2k的数据被read调用,直到read返回EAGIN(非阻塞的),在ET来说才会变为非可读就绪状态。
但是对于LT来说,只要读缓冲区可读(比如read只读取了1k数据),epoll_wait都是可读就绪的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值