LT(Level Trigger,水平触发)模式和ET(Edge Trigger,边沿触发)模式是两种文件描述符准备就绪的通知模式。
epoll默认是水平触发
两者的区别在哪里呢?
水平触发:读缓冲区非空就会一直触发,写缓冲区只要不满就会一直触发写事件。
边缘触发:读缓冲区空转非空(有新消息)的时候触发一次,写缓冲区从满到非满的时候(空出来可以写了)触发一次。
水平触发优、缺点及应用场景:
优点:当进行socket通信的时候,保证了数据的完整输出,进行IO操作的时候,如果还有数据,就会一直的通知你。
缺点:由于只要还有数据,内核就会不停的从内核空间转到用户空间,所有占用了大量内核资源,试想一下当有大量数据到来的时候,每次读取一个字节,这样就会不停的进行切换。内核资源的浪费严重。效率来讲也是很低的。
- LT要避免写的死循环问题,写缓冲区满的概率很低,只要缓冲区没满(空闲)就会不断发信号,所以写完数据后一定要记得取消写事件。
边沿触发优、缺点及应用场景:
优点:每次内核只会通知一次,大大减少了内核资源的浪费,提高效率。
缺点:不能保证数据的完整。不能及时的取出所有的数据。
应用场景:处理大数据。使用non-block模式的socket。
- ET要避免"short read"的问题,比如用户收到100个字节,触发了一次边沿警告,读了50个字节,剩下50个字节没读。但是没有警告。
在实践中大家还是更倾向于LT,因为ET容易漏数据不安全。