面试题答案
一键面试UDP协议场景下IO多路复用技术工作原理
- select:
- 它通过设置一组文件描述符集合(读、写、异常),然后调用
select
函数。内核会遍历这些文件描述符集合,检查是否有就绪的文件描述符。 - 在UDP场景下,当UDP套接字有数据到达时,该套接字的读描述符会被标记为就绪,
select
返回后,应用程序可以遍历集合,检查哪些描述符就绪,进而从就绪的UDP套接字读取数据。
- 它通过设置一组文件描述符集合(读、写、异常),然后调用
- poll:
- 与
select
类似,也是通过传递一个文件描述符数组给内核。但poll
使用的是链表结构来存储文件描述符及其相关事件,不像select
使用固定大小的数组。 - 在UDP场景中,同样当UDP套接字有数据到达,对应的描述符会被标记为就绪,应用程序通过遍历链表获取就绪描述符,进行数据读取。
- 与
- epoll:
- 有两种工作模式:LT(水平触发)和ET(边缘触发)。epoll通过
epoll_create
创建一个epoll实例,通过epoll_ctl
添加、修改或删除要监控的文件描述符及其事件。 - 在UDP场景下,当UDP套接字有数据到达,内核会将该事件通知给epoll实例,应用程序通过
epoll_wait
获取就绪事件。在LT模式下,只要数据未被读完,每次epoll_wait
都会通知;在ET模式下,只有数据到达的边缘(新数据到来)才通知一次。
- 有两种工作模式:LT(水平触发)和ET(边缘触发)。epoll通过
各自特点
- select:
- 优点:跨平台性好,几乎所有操作系统都支持。
- 缺点:
- 文件描述符数量受限(通常1024),通过修改系统参数可调整但不灵活。
- 采用轮询方式,随着文件描述符增多,性能线性下降。
- 每次调用
select
都需要重新设置文件描述符集合,从用户态到内核态数据拷贝开销大。
- poll:
- 优点:文件描述符数量理论上无限制(仅受限于系统资源)。
- 缺点:
- 同样采用轮询方式,随着文件描述符增多,性能下降明显。
- 每次调用
poll
也需要传递整个文件描述符链表,用户态到内核态数据拷贝开销较大。
- epoll:
- 优点:
- 支持大量文件描述符(能轻松支持上万)。
- 采用事件驱动,只有就绪的文件描述符才会被处理,性能高,适用于高并发场景。
- 内核和用户空间共享存储,减少数据拷贝开销。
- 缺点:
- 只在Linux系统上支持,跨平台性不如
select
。 - ET模式编程复杂,需要应用程序一次性处理完所有数据,否则可能丢失事件。
- 只在Linux系统上支持,跨平台性不如
- 优点:
适用场景
- select:适用于小型应用程序,文件描述符数量较少且对性能要求不是特别高,需要跨平台兼容性的场景。
- poll:适用于中等规模应用,对文件描述符数量要求比
select
高一些,但对性能要求不是极端高的场景。 - epoll:适用于高并发、大量文件描述符的网络服务器应用,尤其是对性能有较高要求的场景,如Web服务器、游戏服务器等。