zoukankan      html  css  js  c++  java
  • 5种I/O模型和epoll,select和水平触发边缘触发

     

    https://www.cnblogs.com/renxs/p/3683189.html

    在linux的IO多路复用中有水平触发,边缘触发两种模式,这两种模式的区别如下:

         水平触发:

    如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知.

    允许在任意时刻重复检测IO的状态.select,poll就属于水平触发.

         边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知.

    在收到一个IO事件通知后要尽可能多的执行IO操作,因为如果在一次通知中没有执行完IO那么就需要等到下一次新的IO活动到来才能获取到就绪的描述符.信号驱动式IO就属于边缘触发.

         写过单片机的人可以从另一方理解水平触发和边缘触发的区别:

         水平触发:就是只有高电平(1)或低电平(0)时才触发通知,只要在这两种状态就能得到通知.上面提到的只要有数据可读(描述符就绪)那么水平触发的epoll就立即返回.

        边缘触发:只有电平发生变化(高电平到低电平,或者低电平到高电平)的时候才触发通知.上面提到即使有数据可读,但是io状态没有变化epoll也不会立即返回.

      epoll既可以采用水平触发,也可以采用边缘触发.

    ================================

    上面的不怎么靠谱,看下面的

    1.水平触发level trigger  LT(状态达到)

      当被监控的文件描述符上有可读写事件发生时,会通知用户程序去读写,如果用户一次读写没取完数据,他会一直通知用户,如果这个描述符是用户不关心的,它每次都返回通知用户,则会导致用户对于关心的描述符的处理效率降低。

      复用型IO中的select和poll都是使用的水平触发方式。

    2.边缘触发edge trigger  ET(状态改变)

      当被监控的文件描述符上有可读写事件发生时,会通知用户程序去读写,它只会通知用户进程一次,这需要用户一次把内容读取玩,相对于水平触发,效率更高。如果用户一次没有读完数据,再次请求时,不会立即返回,需要等待下一次的新的数据到来时才会返回,这次返回的内容包括上次未取完的数据。

      信号驱动型IO使用的是边缘触发方式。

      epoll既支持水平触发也支持边缘触发,默认是水平触发。

    3.比较

      水平触发是状态达到后,可以多次取数据。这种模式下要注意多次读写的情况下,效率和资源利用率情况。

           边缘触发是状态改变一次,取一次数据。这种模式下读写数据要注意一次是否能读写完成。

  • 相关阅读:
    窗口显示于parent控件上
    DELPHI SOCKET 通信编程要点小结
    dxBarManagerToDxNavBar方法
    DLL直接返回对象
    海量数据库的查询优化及分页算法方案
    excel怎么只打印某页?excel怎么只打印某几页
    HTTP请求错误400、401、402、403、404、405、406、407、412、414、500、501、502解析
    excel中如何设置只打印第一页
    Navicat Premium 常用功能讲解
    laravel查询构造器DB还是ORM,这两者有什么区别,各该用在什么场景中
  • 原文地址:https://www.cnblogs.com/WHUT-Simon/p/11759704.html
Copyright © 2011-2022 走看看