zoukankan      html  css  js  c++  java
  • epoll 的 Edge Trigger 和 Level Trigger 理解(linux)

    epoll 的 Edge Trigger 和 Level Trigger 理解

    Stackoverflow 上有个问题讨论了这个话题:
    
    http://stackoverflow.com/questions/9162712/what-is-the-purpose-of-epolls-edge-triggered-option
    
    
    Level Trigger 就是在描述符就绪的时候,内核会持续地通知进程,直到进程处理描述符,但是有时候我们并没办法第一时间就去处理这个描述符,所以内核的持续通知会浪费系统资源。
    
    Edge Trigger 与 LT 不同,内核在描述符就绪的时候只会通知进程一次,进程可以在合适的时候再处理它。当error变成EAGAIN 时,就可以等待内核下一次的通知了
    
    ET模式仅当状态发生变化的时候才获得通知,这里所谓的状态的变化并不包括缓冲区中还有未处理的数据,也就是说,如果要采用ET模式,需要一直read/write直到出错为止,很多人反映为什么采用ET模式只接收了一部分数据就再也得不到通知了,大多因为这样,而LT模式是只要有数据没有处理就会一直通知下去的。
    
    epoll工作在ET模式的时候,必须使用非阻塞套接口,以避免由于一个文件句柄的阻塞读/阻塞写操作把处理多个文件描述符的任务饿死。最好以下面的方式调用ET模式的epoll接口 
    
        基于非阻塞文件句柄 
        只有当read(2)或者write(2)返回EAGAIN时才需要挂起,等待。但这并不是说每次read()时都需要循环读,直到读到产生一个EAGAIN才认为此次事件处理完成,当read()返回的读到的数据长度小于请求的数据长度时,就可以确定此时缓冲中已没有数据了,也就可以认为此事读事件已处理完成。 
    
    POSIX.1 要求,对于一个非阻塞的描述符如果无数据可读,则read返回-1,同时 errno 被设置为 EAGAIN
    ————————————————
    版权声明:本文为CSDN博主「amghost」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/amghost/java/article/details/22979829
    
    
  • 相关阅读:
    人工智能,垂直领域
    西方企业该向中国式创新学什么?
    [Leetcode 6] ZigZag问题的一种新思路
    Unknown column '*' in 'field list' 异常解决
    多媒体——图像文件大小的计算
    Lucky Number
    win7 64位系统下进入debug
    Chromium网页DOM Tree创建过程分析
    做好长期奋斗的准备
    IP寻址和子网运算
  • 原文地址:https://www.cnblogs.com/scotth/p/12625045.html
Copyright © 2011-2022 走看看