众所周知,网络socket处理常见的三种方式是select / poll / epoll(linux) / 完成端口(windows),简单说一下各自的差异:
select:
1)每次轮循需要把监控的fd集合拷贝到内核
2)轮循fd数组查看fd是否可读写
3)最大fd值为1024,maxfd+1<=1024 (windows下为个数,linux下为值)
poll:
1)每次轮循需要把监控的fd集合拷贝到内核
2)轮循fd数组查看fd是否可读写
3)没有最大fd值限制
epoll:
1)epoll实现时开辟了一块共享内存,所以监控的fd集合不需要反复在用户态和内核态之间拷贝
2)类似回调函数的机制,只返回可读写的fd集合
3)没有最大fd限制
性能:
1)select 和 poll 性能随着 fd 个数增加 会呈线性下降
2)epoll 性能根据活跃的 fd 的个数增加 呈线性下降,如果所有 fd 都处在活跃状态,那么epoll的性能和select/poll 差异不大
使用建议:
1)fd 个数较少的情况建议使用select / poll,逻辑简单,性能也差不了多少;
2)fd个数较多特别是活跃fd较少的情况,使用epoll 性能上会比select/poll 高好多;