select
- 最大描述符个数限制,bitmap的位数由FD_SETSIZE设置,32位机默认是1024个。64位机默认是2048
- 每次select()都要遍历FD_SET数组( O ),当套接字比较多的时候,浪费CPU时间
- 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大。
poll
- 没有最大描述符个数限制(基于链表来存储的)
- FD_SET可重用,使用reevents来置位
epoll
- 没有最大连接数的限制。(基于 红黑树+双链表 来存储的:1G的内存上能监听约10万个端口)
- 时间复杂度低: 边缘触发和事件驱动,监听回调,时间复杂度O(1)。只有活跃可用的fd才会调用callback函数;即epoll最大的优点就在于它只管“活跃”的连接,而跟连接总数无关,因此实际网络环境中,Epoll的效率就会远远高于select和poll。 3.内存拷贝:利用mmap()文件映射内存加速与内核空间的消息传递,减少拷贝开销。