美文网首页
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