select/poll/epoll优缺点及应用场景

简介: select/poll/epoll优缺点及应用场景


  1. select
  • 优点:
  • 跨平台性好,几乎所有的操作系统都支持 select
  • 简单易用,接口简洁,易于理解和上手。
  • 缺点:每次调用select后,内核会清除集合中未就绪的文件描述符,不会保存,每次调用select前都要重新设置一次集合
  • 效率较低,select 在处理大量文件描述符时性能下降明显,因为它采用线性扫描的方式来遍历文件描述符集合
  • select 调用需要传入 fd 数组,每次调用select需要拷贝一份到内核,每次调用select前都要重新将fd加入文件描述符集合中,因为事件发生后,文件描述符集合将被内核修改,高并发场景下这样的拷贝消耗的资源是惊人的。
  • select 在内核层仍然是通过遍历的方式检查文件描述符的就绪状态,是个同步过程,只不过无系统调用切换上下文的开销。
  • select 仅仅返回可读文件描述符的个数,具体哪个可读还是要用户自己遍历。
  • 对于大量的文件描述符,需要维护大型的数据结构,会带来额外的开销。
  • 文件描述符集合的大小有限制,通常为 FD_SETSIZE,1024,在一些系统中可能会受到限制。
  1. poll
  • 优点:
  • 跨平台性好,几乎所有的操作系统都支持 poll
  • select 更加灵活,没有文件描述符集合大小的限制。
  • 对于大量的文件描述符,性能相对较好,因为 poll 使用链表来管理文件描述符,遍历开销相对较小。
  • 缺点:
  • 在大量文件描述符的情况下,性能仍然有限,因为每次调用 poll 都需要将所有的文件描述符从用户空间复制到内核空间,然后再从内核空间复制回来。
  1. epoll
  • 优点:
  • 高性能,适用于大量的并发连接,因为 epoll 使用了红黑树来管理文件描述符,可以快速定位到就绪事件。
  • 内核中保存一份文件描述符集合(红黑树结构),无需用户每次都重新传入,只需进行增删改即可。
  • 内核不再通过轮询的方式找到就绪的文件描述符,而是通过异步 IO 事件唤醒。
  • 支持水平触发和边缘触发两种模式,边缘触发模式下只会触发一次就绪事件,避免了反复触发事件的开销。
  • 内核仅会将有 IO 事件的文件描述符返回给用户,用户也无需遍历整个文件描述符集合。
  • 没有文件描述符集合的大小限制,可以处理大量的并发连接。
  • 缺点:
  • 不能跨平台,epoll 是 Linux 特有的 API,不太容易移植到其他操作系统上。
  • 使用较为复杂,相比于 selectpollepoll 的接口更加底层,需要更多的编程技巧和经验。

应用场景

很容易产生一种错觉认为只要用 epoll 就可以了,select 和 poll 都已经过时了,其实它们都有各自的使用场景。

select 应用场景

select 的 timeout 参数精度为微秒,而 poll 和 epoll 为毫秒,因此 select 更加适用于实时性要求比较高的场景,比如核反应堆的控制。

select 可移植性更好,几乎被所有主流平台所支持。

poll 应用场景

poll 没有最大描述符数量的限制,如果平台支持并且对实时性要求不高,应该使用 poll 而不是 select。

epoll 应用场景

只需要运行在 Linux 平台上,有大量的描述符需要同时轮询,并且这些连接最好是长连接。

需要同时监控小于 1000 个描述符,就没有必要使用 epoll,因为这个应用场景下并不能体现 epoll 的优势。

需要监控的描述符状态变化多,而且都是非常短暂的,也没有必要使用 epoll。因为 epoll 中的所有描述符都存储在内核中,造成每次需要对描述符的状态改变都需要通过 epoll_ctl() 进行系统调用,频繁系统调用降低效率。并且 epoll 的描述符存储在内核,不容易调试。

目录
相关文章
|
API iOS开发
彻底搞懂同步与异步,阻塞/非阻塞
彻底搞懂同步与异步,阻塞/非阻塞
3790 0
|
数据采集 自然语言处理 搜索推荐
图文详解 DFS 和 BFS | 算法必看系列知识二十四
深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在高频面试题中。
37733 6
图文详解 DFS 和 BFS | 算法必看系列知识二十四
|
存储 算法 NoSQL
还分不清 Cookie、Session、Token、JWT?看这一篇就够了
Cookie、Session、Token 和 JWT(JSON Web Token)都是用于在网络应用中进行身份验证和状态管理的机制。虽然它们有一些相似之处,但在实际应用中有着不同的作用和特点,接下来就让我们一起看看吧,本文转载至http://juejin.im/post/5e055d9ef265da33997a42cc
50795 16
|
安全 数据处理 C++
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
【Qt 底层之事件驱动系统】深入理解 Qt 事件机制:主事件循环与工作线程的交互探究,包括 QML 的视角
3609 3
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
724 0
Linux C/C++之IO多路复用(poll,epoll)
|
移动开发 网络协议 算法
TCP中的粘包、拆包问题产生原因及解决方法
TCP中的粘包、拆包问题产生原因及解决方法
2077 0
TCP中的粘包、拆包问题产生原因及解决方法
io_uring之liburing库安装
io_uring之liburing库安装
1577 0
|
网络协议 算法 网络性能优化
|
消息中间件 存储 负载均衡
2024消息队列“四大天王”:Rabbit、Rocket、Kafka、Pulsar巅峰对决
本文对比了 RabbitMQ、RocketMQ、Kafka 和 Pulsar 四种消息队列系统,涵盖架构、性能、可用性和适用场景。RabbitMQ 以灵活路由和可靠性著称;RocketMQ 支持高可用和顺序消息;Kafka 专为高吞吐量和低延迟设计;Pulsar 提供多租户支持和高可扩展性。性能方面,吞吐量从高到低依次为
6609 1

热门文章

最新文章

下一篇
开通oss服务