Level_triggered(水平触发): 当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。若是此次没有把数据一次性所有读写完(如读写缓冲区过小), 那么下次调用 epoll_wait()时,它还会通知你在上没读写完的文件描述符上继续读写,固然若是你一直不去读写,它会一直通知你!!!若是系统中有大量你不须要读写的就绪文件描述符,而它们每次都会返回,这样会大大下降处理程序检索本身关心的就绪文件描述符的效率!!!并发
Edge_triggered(边缘触发):当被监控的文件描述符上有可读写事件发生时,epoll_wait()会通知处理程序去读写。若是此次没有把数据所有读写完(如读写缓冲区过小),那么下次调用epoll_wait()时,它不会通知你,也就是它只会通知你一次,直到该文件描述符上出现第二次可读写事件才会通知你!!!这种模式比水平触发效率高,系统不会充斥大量你不关心的就绪文件描述符!!!函数
阻塞IO:当你去读一个阻塞的文件描述符时,若是在该文件描述符上没有数据可读,那么它会一直阻塞(通 俗一点就是一直卡在调用函数那里),直到有数据可读。当你去写一个阻塞的文件描述符时,若是在该文件描述符上没有空间(一般是缓冲区)可写,那么它会一直 阻塞,直到有空间可写。以上的读和写咱们统一指在某个文件描述符进行的操做,不仅仅指真正的读数据,写数据,还包括接收链接accept(),发起链接 connect()等操做...高并发
非阻塞IO:当你去读写一个非阻塞的文件描述符时,无论可不能够读写,它都会当即返回,返回成功说明读写操做完成了,返回失败会设置相应errno状态码,根据这个errno能够进一步执行其余处理。它不会像阻塞IO那样,卡在那里不动!!!spa
select(),poll()模型都是水平触发模式,信号驱动IO是边缘触发模式,epoll()模型即支持水平触发,也支持边缘触发,默认是水平触发。事件
1.对于监听的sockfd,最好使用水平触发模式,边缘触发模式会致使高并发状况下,有的客户端会链接不上。若是非要使用边缘触发,网上有的方案是用while来循环accept()。it
2.对于读写的connfd,水平触发模式下,阻塞和非阻塞效果都同样,不过为了防止特殊状况,仍是建议设置非阻塞。效率
3.对于读写的connfd,边缘触发模式下,必须使用非阻塞IO,并要一次性所有读写完数据。监控