边缘触发和水平触发是事件驱动 IO 中常用的两种触发方式,它们的主要区别在于事件通知的时机不同。
在水平触发中,如果一个文件描述符上发生了事件,只要这个事件没有被处理,内核就会一直通知应用程序这个文件描述符上的事件。这意味着应用程序需要在每个事件循环中处理所有待处理的事件,否则就会阻塞在那里,等待下一个事件到来。换句话说,水平触发模式下,只有文件描述符上的状态发生改变时,才会通知应用程序。
而在边缘触发中,只有在文件描述符上的状态发生变化时,才会通知应用程序一次,这一次事件只会通知应用程序当前的状态,并不会重复通知。这意味着应用程序需要立即处理这个事件,并在下一个事件循环中等待下一个事件到来。如果应用程序没有及时处理这个事件,那么这个事件将被丢弃,因为下一次事件通知并不会重复告知这个事件。
边缘触发可以更好地利用系统资源,因为它只会在必要的时候通知应用程序,并且只会通知一次。但是,使用边缘触发需要应用程序具备更高的实时响应能力,以确保在事件到达时立即进行处理。水平触发则相对更简单一些,但需要应用程序在事件循环中显式处理所有待处理的事件。