select 和epoll的区别
时间: 2023-12-03 13:05:00 浏览: 60
linux中 epoll poll 和select的区别
select 和 epoll 都是用来实现 I/O 多路复用的机制,但是它们之间有以下几个区别:
1. 数据结构不同
select 使用 fd_set 结构体来保存文件描述符集合,每次调用 select 都需要把所有需要检测的文件描述符重新加入 fd_set 中,这样会造成时间开销的浪费。
而 epoll 使用 epoll_event 结构体来保存文件描述符集合,每次调用 epoll_wait 只需要传递一次 epoll_event 结构体,就可以检测多个文件描述符。
2. 可扩展性不同
select 的可扩展性受到限制,因为它使用的是单一的文件描述符集合,每次调用 select 都需要重新将需要检测的所有文件描述符加入集合中。当需要检测的文件描述符数量很大时,这个过程会非常耗时。
而 epoll 的可扩展性更好,因为它使用的是事件驱动机制。当有新的文件描述符加入或者移除时,只需要修改 epoll_event 结构体中的事件类型即可,不需要重新构建整个文件描述符集合。
3. 事件通知方式不同
select 使用轮询方式来检测文件描述符的状态,每次调用 select 都会遍历整个文件描述符集合,检测是否有可读、可写或者异常事件发生,如果没有发生事件,就会一直阻塞等待。
而 epoll 使用回调机制来通知应用程序事件的发生。当有事件发生时,epoll_wait 会返回发生事件的文件描述符列表,应用程序只需要处理这些文件描述符即可。
总的来说,epoll 比 select 更加高效和灵活,尤其是在需要同时处理大量文件描述符的场景下,epoll 的性能优势更加明显。
阅读全文