epoll 水平触发和边缘触发的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了epoll 水平触发和边缘触发的区别相关的知识,希望对你有一定的参考价值。

参考技术A 1. 使用水平触发可以在没有epoll的时候降级到select
2.水平触发对应用程序更简单,也更适合http这种请求响应模式。(读完就写,不用管写状态)
ge_triggered(边缘触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。如果这次没有把数据全部读写完(如读写缓冲区太小),那么下次调用epoll_wa尝畅佰堆脂瞪拌缺饱画it()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符!!!
阻塞IO:当你去读一个阻塞的文件描述符时,如果在该文件描述符上没有数据可读,那么它会一直阻塞(通俗一点就是一直卡在调用函数那里),直到有数据可读。当你去写一个阻塞的文件描述符时,如果在该文件描述符上没有空间(通常是缓冲区)可写,本回答被提问者采纳

epoll的水平触发和边缘触发

水平触发(Level Triggered): 当满足条件时, 触发.  (select和poll采用该方式)
边缘触发(Edge Triggered): 当状态变化时,触发.  (信号驱动[Signal-Driven I/O]采用该方式)

 

过程:

当数据到来的时候, 触发器满足条件,发送通知, 进程接收到通知后,请求内核读取数据.

 

水平触发,是因为数据就绪,可IO,满足条件,则发送通知.

边缘触发,是因为状态发生了变化, 则发送通知.

 

理想情况下, 两种触发方式都能满足需求.

 

但是当内核在读取数据的过程无法一次读完, 就会产生问题.

水平触发: 这里依旧有数据在, 发送通知!

边缘触发: 没有状态变化, 不发送...

于是, 边缘触发情况下,未读数据就再无法被读到.

 

相较而言 边缘触发的实际使用效率并没有大幅度提高, 而且还需要解决数据.

在epoll中, LT(Level Triggered)模式为缺省默认.

如果需要选择使用ET(Edge Triggered)模式, 则需要考虑, 如何解决数据读取问题.

以上是关于epoll 水平触发和边缘触发的区别的主要内容,如果未能解决你的问题,请参考以下文章

epoll的两种触发模式ET、LT

epoll的水平触发和边缘触发

epoll的水平触发和边缘触发,以及边缘触发为什么要使用非阻塞IO

Linux网络编程之selectpollepoll的比较,以及epoll的水平触发(LT)和边缘触发(ET)

水平触发和边沿触发(IO复用)

水平与边缘触发网络事件机制