背景
select 和epoll的背景不同,select是POSIX标准,代码移植性好,epoll是Linux标准,代码可移植性只在Linux操作系统之间。
触发条件
select只支持条件触发(level-triggered),epoll支持条件触发和边缘触发。
条件触发(level-triggered):当条件满足时,发生一个I/O事件。
边缘触发(edge-triggered):当状态改变时,发生一个I/O事件。
条件触发对编码代码的要求低,不容易丢事件,在大流量,高并发的环境下,效率不好,只要有数据没有处理,内核不断的通知你。
边缘触发,代码编写复杂,需要防止丢失事件,容易发生事件丢失的情况。
对文件描述符的处理
select最大支持1024个文件描述符,选择描述符时,遍历所有的描述符才能获取到哪些描述符有事件通知,效率低。
epoll对于描述符事件的选择不是遍历,是事件响应的,描述符上事件来就马上选择出来,不需要遍历整个句柄链表,因此效率非常高。