水平触发与边缘触发

今天开始封装c的socket的基础,在封装的时候意识到这样一个问题,如果我现在fd的接收缓冲区中有2048字节的数据,但是我只读出来1024个字节的数据,当我下次select的时候(这之间没有网络数据过来), 还会检测到该select可读吗?这样就引申出来水Linux的IO多路复用中的水平触发模式和边缘触发模式,那么什么是水平触发模式,什么是边缘触发模式呢?
水平触发模式:如果文件描述符已经就绪可以非阻塞的执行IO操作了,此时会触发通知,允许在任意时刻重复检测IO的状态,没有必要每次描述符就绪尽可能多的执行IO,select,poll
边缘触发:如果文件描述符自上次状态改变后有新的IO活动到来,此时会触发通知。在收到一个IO事件通知后要尽可能多的IO操作,因为如果在一次通知中没有执行完IO,因为如果在一次通知中没有执行完IO,那么就需要等到下一次新的IO活动到来才能获取到就绪的描述符,信号驱动IO就属于边缘触发

大家可能还不能完全了解这两种模式的区别,我们可以举例说明:一个管道收到了1kb的数据,epoll会立即返回,此时读了512字节数据,然后再次调用epoll.这时如果是水平触发的,epoll会立即返回,因为有数据准备好了.如果是边缘触发的不会立即返回,因为此时虽然有数据可读但是已经触发了一次通知,在这次通知到现在还没有新的数据到来,直到有新的数据到来epoll才会返回,此时老的数据和新的数据都可以读取到(当然是需要这次你尽可能的多读取).
下面我们还从电子的角度来解释一下:

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

epoll既可以采用水平触发,也可以采用边缘触发.
边缘触发:只有电平发生变化(高电平到低电平,或者低电平到高电平)的时候才触发通知.上面提到即使有数据可读,但是没有新的IO活动到来,epoll也不会立即返回.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值