poll/select/epoll 对比

 poll/select/epoll 对比

经过以上的分析能够看出,poll和select的实现基本是一致,只是用户到内核传递的数据格式有所不一样,性能

 

 

select和poll即便只有一个描述符就绪,也要遍历整个集合。若是集合中活跃的描述符不多,遍历过程的开销就会变得很大,而若是集合中大部分的描述符都是活跃的,遍历过程的开销又能够忽略。测试

epoll的实现中每次只遍历活跃的描述符(若是是水平触发,也会遍历先前活跃的描述符),在活跃描述符较少的状况下就会颇有优点,在代码的分析过程当中能够看到epoll的实现过于复杂而且其实现过程当中须要同步处理(锁),若是大部分描述符都是活跃的,epoll的效率可能不如select或poll。(参见epoll 和poll的性能测试 http://jacquesmattheij.com/Poll+vs+Epoll+once+again)指针

select可以处理的最大fd没法超出FDSETSIZE。事件

select会复写传入的fd_set 指针,而poll对每一个fd返回一个掩码,不更改原来的掩码,从而能够对同一个集合屡次调用poll,而无需调整。get

select对每一个文件描述符最多使用3个bit,而poll采用的pollfd须要使用64个bit,epoll采用的 epoll_event则须要96个bit同步

若是事件须要循环处理select, poll 每一次的处理都要将所有的数据复制到内核,而epoll的实现中,内核将持久维护加入的描述符,减小了内核和用户复制数据的开销。it

相关文章
相关标签/搜索