美文网首页
epoll的三种工作模式

epoll的三种工作模式

作者: StevenHD | 来源:发表于2020-11-18 19:25 被阅读0次

epoll_wait()是中间层,它表示linux内核帮我们做检测——


epoll_wait()工作示意图

一、水平触发模式——LT

  • epoll的默认工作模式
  • 如果想要验证的话可以把【读缓冲区】read_buf改小一些,这样就可以发现epoll_wait()被调用了很多次——
    epoll水平触发模式
  • 可以根据来解释
  • 可以观察epoll_wait()的返回次数,重点是【返回次数】和【发送数据的次数】没有任何关系,比如发送了100个byte的数据,但是接收一次只能接收5个byte,那么返回次数会是20次,但是发送数据的次数只有1次。

二、边沿触发模式——ET

本质上是【边沿阻塞触发】,因为fd默认是【阻塞】的,就算为了可以读取完数据,加一个while(recv()),但是当数据读完的时候,是会阻塞的——等待新的数据,所以为了解决阻塞问题,我们可以【设置非阻塞FD】。

  • 提高epoll_wait()的效率
  • 【套接字】默认是阻塞

client给server发数据,发送一次epoll_wait就返回一次,不在乎这一次能不能把数据读完

三、边沿非阻塞模式

  • 效率最高

如何设置非阻塞?

  1. open(),因为open中有flags——将其设置成O_WDRW | O_NONBLOCK
  2. fcntl(),修改FD的flag属性
  •  int flag = fcntl(fd, F_GETFL);
    
  •  flag = O_NONBLOCK
    
  •  fcntl(fd, F_SETFL, flag);
    

将缓冲区的全部数据都读出

  • while(recv() > 0) { printf(); }

相关文章

网友评论

      本文标题:epoll的三种工作模式

      本文链接:https://www.haomeiwen.com/subject/kalfiktx.html