select跟poll还有epoll的区别
时间: 2023-09-20 20:06:02 浏览: 128
### 回答1:
Select、Poll和Epoll的不同之处在于它们的I/O多路复用技术的实现方式。Select采用的是循环检查机制,Poll采用的是间隔检查机制,而Epoll采用的是事件通知机制,它可以更有效地处理大量的并发连接。
### 回答2:
select、poll和epoll都是用于进行I/O多路复用的机制,主要用于解决同时处理多个网络连接或文件描述符的问题。
1. select是最古老的I/O多路复用机制,它使用fd_set集合来管理文件描述符,当有可读、可写或异常事件发生时,会阻塞并返回就绪文件描述符的个数。然后程序需要遍历整个fd_set集合来确定到底哪些文件描述符发生了事件,并进行相应处理。select存在以下缺点:
- fd_set集合是一个固定大小的数据结构,对于大量的文件描述符,需要遍历整个集合,导致性能下降;
- 每次调用select时,需要把fd_set集合从用户态拷贝到内核态,而且每次返回结果也需要从内核态拷贝到用户态,造成了额外的开销;
- select对于每个文件描述符的事件都需要轮询检查,对于不活跃的文件描述符也会进行检查,导致浪费。
2. poll是select的改进版本,使用pollfd数组管理文件描述符,与select类似,当有事件触发时,会返回就绪文件描述符的个数。不同之处在于,poll需要通过遍历整个pollfd数组来确定发生事件的文件描述符,相比于select的fd_set集合,poll的性能改善不大。
3. epoll是Linux上最新的I/O多路复用机制,它使用一个Epoll实例来管理文件描述符,当有事件就绪时,通过epoll_wait函数来返回就绪文件描述符的个数。epoll具有以下特点:
- Epoll实例通过内存映射技术将所有的就绪文件描述符存储在内核态,减少了系统调用的次数,提高了性能;
- Epoll使用回调机制,只返回就绪的文件描述符,避免了对所有文件描述符的轮询检查;
- Epoll支持ET(边缘触发)和LT(水平触发)两种工作模式;
- Epoll使用eventfd机制来通知用户态程序有事件发生,避免了多次用户态和内核态的切换。
综上所述,select、poll和epoll在性能和原理上都有一定的差异,epoll具有更好的性能和更强大的功能,因此在Linux上选择epoll是一个更好的选择。
### 回答3:
select、poll和epoll都是用于实现异步I/O的系统调用函数,它们在处理多个文件描述符时的方式有所不同。
1. select是最早出现的多路复用机制,它使用一个数据结构fd_set来表示文件描述符集合,通过循环遍历所有文件描述符来检查是否有可读、可写或者异常事件发生,是一种阻塞式调用。select的效率不高,因为每次调用时需要遍历所有文件描述符,无法处理大量的连接事件。
2. poll是改进版的多路复用机制,也是使用一个数据结构pollfd数组来表示文件描述符集合,通过poll系统调用来实现。poll的优势在于可以处理更多的文件描述符,并且不会出现"文件描述符达到上限"的问题。但是仍然采用了轮询的方式来进行事件检查,效率略低。
3. epoll是Linux特有的多路复用机制,它使用一个事件数组来管理感兴趣的文件描述符,并通过epoll_ctl函数向内核注册感兴趣的事件,然后通过epoll_wait函数来等待事件的发生。epoll的优点在于可以"边缘触发"和"水平触发"两种模式,即只在事件发生或者状态变化时才通知应用程序。相比于select和poll,epoll具有更高的效率,能够处理更多的并发连接。
综上所述,select、poll和epoll是三种不同的多路复用机制。select是最基本也是最传统的,而poll是一种改进版的多路复用机制,epoll则是在Linux系统中引入的最先进的多路复用机制。epoll相比于select和poll有更高的效率和更好的扩展性,所以在高并发服务器编程中被广泛使用。
阅读全文
相关推荐


















