面试题答案
一键面试select
- 性能:
- 每次调用
select
都需要将用户态的文件描述符集合拷贝到内核态,开销较大。 - 随着文件描述符数量的增加,其性能会急剧下降,因为它采用轮询的方式遍历所有文件描述符来检查是否有事件发生。
- 每次调用
- 适用场景:适用于文件描述符数量较少的场景,例如一些简单的网络服务,连接数不多的情况下可以使用。
- 可扩展性:扩展性较差,由于轮询的方式和文件描述符数量的限制(通常默认最大为1024),很难应对大规模并发连接的场景。
poll
- 性能:
- 与
select
类似,每次调用也需要将数据从用户态拷贝到内核态,但它没有最大文件描述符数量的限制(理论上)。不过同样采用轮询方式遍历文件描述符,所以在文件描述符数量较多时性能不佳。
- 与
- 适用场景:比
select
更适用于文件描述符数量稍多的场景,但总体还是适用于连接数不是特别庞大的应用。 - 可扩展性:扩展性相对
select
稍好,因为没有固定的文件描述符数量限制,但由于轮询机制,随着连接数增加性能下降明显,扩展性有限。
epoll
- 性能:
- 采用事件驱动的方式,只返回有事件发生的文件描述符,不需要轮询所有文件描述符,大大提高了效率。
- 内核中使用红黑树管理文件描述符,查找效率高。并且在用户态和内核态之间传递数据时采用共享内存方式,减少了数据拷贝开销,性能优势明显。
- 适用场景:非常适合高并发场景,如大型的网络服务器,能够高效处理大量的并发连接。
- 可扩展性:扩展性很强,能够轻松应对成千上万甚至更多的并发连接,是目前在高并发网络编程中广泛使用的多路复用技术。