面试题答案
一键面试IO多路复用技术基本原理
- select
- select允许应用程序监视一组文件描述符,它会阻塞进程直到其中一个文件描述符准备好进行IO操作(读、写或异常)。
- 应用程序通过
select
函数传入一组待监视的文件描述符集合(读、写、异常),内核遍历这些文件描述符集合,检查每个文件描述符的状态。 - 当有文件描述符准备好时,
select
函数返回,应用程序需要再次遍历文件描述符集合来确定哪些文件描述符真正准备好。
- poll
- poll的工作原理和select类似,也是用于监视一组文件描述符的状态变化。
- 它通过
poll
函数传入一个pollfd
结构体数组,每个结构体包含文件描述符、感兴趣的事件(读、写、异常等)以及返回的事件。 - 内核同样遍历这个数组来检查文件描述符的状态,当有文件描述符准备好时,
poll
函数返回,应用程序同样需要遍历数组确定具体就绪的文件描述符。
- epoll
- epoll是Linux下高效的IO多路复用机制。
- 它通过
epoll_create
创建一个epoll实例,通过epoll_ctl
添加、修改或删除要监视的文件描述符及其感兴趣的事件。 - 内核使用红黑树来管理这些文件描述符,当有文件描述符状态改变时,将其放入一个就绪链表。应用程序通过
epoll_wait
获取就绪的文件描述符列表,无需遍历所有监视的文件描述符。
在嵌入式系统应用场景下的优缺点
- select
- 优点:
- 跨平台性好,几乎所有操作系统都支持。
- 简单易用,对于简单的嵌入式项目快速实现IO多路复用较为方便。
- 缺点:
- 单个进程可监视的文件描述符数量有限(通常为1024),在一些需要处理大量连接的嵌入式场景中可能不够用。
- 每次调用
select
都需要将文件描述符集合从用户态拷贝到内核态,开销较大。 - 检查就绪文件描述符时采用线性遍历,时间复杂度为O(n),随着文件描述符数量增加效率降低。
- 优点:
- poll
- 优点:
- 与select相比,没有文件描述符数量的限制。
- 跨平台性较好,在类Unix系统中广泛支持。
- 缺点:
- 每次调用
poll
同样需要将pollfd
结构体数组从用户态拷贝到内核态,开销较大。 - 检查就绪文件描述符时也是线性遍历,时间复杂度为O(n),在文件描述符较多时性能不佳。
- 每次调用
- 优点:
- epoll
- 优点:
- 支持大量文件描述符,适合处理高并发的嵌入式网络应用场景。
- 采用事件驱动机制,只有就绪的文件描述符才会被通知,不需要像select和poll那样线性遍历所有文件描述符,时间复杂度为O(1),性能高效。
- 内核和用户空间传递数据时,采用共享内存方式,减少数据拷贝开销。
- 缺点:
- 只在Linux系统下支持,不具备跨平台性,对于需要跨平台的嵌入式项目不太适用。
- 编程相对复杂,需要对epoll机制有深入理解才能用好,对于简单嵌入式项目开发成本较高。
- 优点: