对epoll的一点新认识

7 篇文章 0 订阅

最近打算写一个WebServer,又对epoll(ET)模式有了新的理解,记录一下。

epoll(ET)必须使用非阻塞socket的原因:

  • 而如果你的文件描述符如果不是非阻塞的,那这个一直读或一直写势必会在最后一次阻塞。这样就不能在阻塞在epoll_wait上了,造成其他文件描述符的任务饿死。

epoll的两种模式LT和ET

  • level-trigger模式下只要某个socket处于readable/writable状态,无论什么时候进行epoll_wait都会返回该socket
  • edge-trigger模式下只有某个socketunreadable变为readable或从unwritable变为writable时,epoll_wait才会返回该socket

所以,在epoll的ET模式下,正确的读写方式为:

  • 只要可读,就一直读,直到 errno = EAGAIN或返回0
  • 只要可写,就一直写,直到 errno = EAGAIN或数据发送完

考虑这种情况:
多个连接同时到达,服务器的 TCP 就绪队列瞬间积累多个就绪连接,由于是边缘触发模式,epoll 只会通知一次,accept 只处理一个连接,导致 TCP 就绪队列中剩下的连接都得不到处理。

  • 解决办法是用 while 循环抱住 accept 调用,处理完 TCP 就绪队列中的所有连接后再退出循环。

如何知道是否处理完就绪队列中的所有连接呢?

  • accept 返回 -1 并且 errno 设置为 EAGAIN 就表示所有连接都处理完。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值