基于表格形式的select,poll,epoll对比-IO多路复用函数的应用场景

IO多路复用监听函数select,poll,epoll,它们的实现原理网络上大量资料,此处不做赘述

本文通过表格的形式,对比select,poll,epoll在各方面的表现,从而引出它们实际的应用场景

话不多说,看表格

  select poll epoll
实现机制 轮询+内存拷贝+FD_SET 轮询+等待队列+链表 callback+mmap
主要消耗 内存拷贝和大量的轮询 同select,但是由于使用等待队列,CPU占用率比select低 callback函数
最大监测FD数 32位系统1024 由于使用链表,所以nolimit nolimit
兼容性、跨平台性 POSIX标准 POSIX标准 Linux特有
FD增加的影响 性能线性下降 同select 几乎无影响
消息传递方式 内存拷贝 内存拷贝 内存映射
综上所述:

epoll的性能几乎不受监测的fd数目的影响,且没有最大监测fd数量的限制,各方面性能明显优于select和poll,但是当这种情况下,epoll的性能并不会优于select和poll,甚至更差:在所有并发的连接中,全部连接都是活跃连接

这种情况就是杀鸡用牛刀,用杀鸡刀杀鸡,一只鸡5秒钟,用杀牛刀杀鸡,一只鸡用时1秒钟,牛刀虽锋利,但是抬起笨重的牛刀要100s。就像使用epoll,需要建立文件系统,红黑书和链表对于此来说就是杀鸡用牛刀,效率反而不高


所以:当监测的fd数目较小,且各个fd都比较活跃,建议使用select或者poll

 当监测的fd数目非常大,成千上万,且单位时间只有其中的一部分fd处于就绪状态,这个时候使用epoll能够明显提升性能,比如ngix web服务器就是使用epoll实现的。



参考:https://www.jianshu.com/p/dfd940e7fca2

 http://blog.csdn.net/d_guco/article/details/53166722

猜你喜欢

转载自blog.csdn.net/woyimibayi/article/details/79196629
今日推荐