epoll的水平触发和边缘触发

3 分钟阅读 564 字 + 157 词
参考答案
epoll_wait的就绪触发有两种方式:一种是默认的水平触发方式(Level-triggered),另一种是边缘触发模式(Edge-triggered)。以读事件为例子: 水平触发模式下,只要缓冲区当中存在数据 ,就可以使epoll_wait就绪;在边缘触发的情况下,如果缓冲区中存在数据,但是数据一直没有增多,那么epoll_wait就不会就绪,只有 缓冲区的数据增多 的时候,才能使epoll_wait就绪。
使用水平触发的话,线程能够以更短的响应时间来处理事件,但是这可能会导致饥饿问题,如果存在某个事件传输的数据量过大,那么epoll_wait就会多次就绪直到处理完所有数据为止,而一些其他的任务所占用的资源就会相对变少。使用边缘触发可以避免这个问题。为了确保读操作可以将所有数据读完,可以考虑 使用循环配合非阻塞的形式来处理
在线程池架构中,**主线程通常会将实际的IO交给子线程即工作线程完成,采用边缘触发可以有效地降低主线程的响应频率,提高整体的性能。**除此以外,如果一次请求对应一次响应是用户追求的通信模式,那么边缘触发正好符合。
水平触发优缺点:
优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。
缺点:由于只要还有数据,内核就会不停的从内核空间转到用户空间, 占用了大量内核资源 ,试想一下当有大量数据到来的时候,每次读取一个字节,这样就会不停的进行切换。内核资源的浪费严重。效率来讲也是很低的。
边缘触发优缺点:
优点: 每次内核只会通知一次,大大减少了内核资源的浪费 ,提高效率。
缺点:不能保证数据的完整。不能及时的取出所有的数据。
应用场景:处理大数据。使用non-block模式的socket。