select,poll,epoll三者的差别

先对比一下select和poll

(1)poll不要求开发者在计算最大文件描述符时进行+1的操作

(2)poll在应付大数目的文件描述符的时候速度更快,因为对于select来说内核需要检查大量描述符对应的fd_set中的每一个比特位

(3)select可以监控的文件描述数目是固定的,相对来说较少(1024/2048)。

如果需要监控数值比较大的文件描述符,或者是分布的很稀疏的较少的描述符,效率也会很低。

而对于poll函数来说,就可以创建特定大小的数组来保存监控的描述符,而不受文件描述符值大小的影响,而且poll可以监控的文件数目大于select

(4)对于select来说,所监控的fd_set在select返回之后会发生变化, 所以在下一次进入select之前都需要初始化需要监控的fd_set

poll函数将监控的输入和输出时间分开,允许被监控的文件数组被复用而不需要重新初始化

 

select的优点如下

(1)select的可移植性好,在某些UNIX系统上不支持Poll

(2)slect对于超时值提供了更好的精度,而poll的精度较差

 

epoll优点如下:

(1)支持一个进程打开大数目的socket描述符

select最不能忍受的是一个进程所打开的FD友一定的限制,因为FD_SETSIZE的默认值为1024/2048

对于那些需要支持上完链接数目的IM服务器来说显然太笑了,这时候可以选择修改这个宏然后重新编译内核

不过epoll没有这个限制,它所支持的FD上限是最大可以打开的数目,这个数字远大于2048。比如在1GB内存的空间中这个数字为10WW

 

(2)IO效率不随FD数组增加而线性下降

select和poll都有一个致命的弱点就是因为网络延迟的问题,大量的socket在这这时候只会有一小部分是活跃的,然而select和poll

每次调用都会线性扫描全部的集合,这时候就导致效率的下降。但是epoll不存在这个其问题,它只会对活跃的socket进行操作

则是因为在内核中实现epoll是根据每个fd上面的callback函数实现的。name只有活跃的socket才会主动调用callback

其他处于idle形态的socket则不会

 

(3)使用mmap加速内核与用户空间的消息传递

无论是epoll还是select、poll都需要内核将fd信息通知给用户空间,如何避免不必要的内存拷贝就显得尤为重要

epoll是通过内核与用户空间的mmap处于同一内存空间实现的

对于poll来说用户传入pollfd数组拷贝到内和空间,因为拷贝操作和数组长度,时间上看这是O(n)操作

当事件发生后,poll将获得的数据传送到用户空间。并执行释放内存和剥离等待队列等工作,向用户空间拷贝数据

与剥离等待队列等操作的世界都时候O(n)

 

转载于:https://www.cnblogs.com/tijie/p/10580707.html

### 回答1: 答:select pollepoll之间的主要区别select poll是一种阻塞式I/O多路复用技术,而epoll是一种非阻塞式I/O多路复用技术。它们都是用来处理文件和套接字的I/O多路复用技术,但epollselect更高效,而且更加灵活。 ### 回答2: selectpollepoll 都是用于处理 I/O 多路复用的机制,并且都属于阻塞 I/O 模型。 联系: 1. 都能够同时监视多个文件描述符的状态。 2. 都利用事件通知的方式来通知用户进程(线程)有 I/O 事件可读或可写。 3. 都可以处理多个连接/文件描述符,提高系统的并发性能。 4. 都可以用于非阻塞模式的文件描述符。 区别: 1. selectpoll 是基于轮询的模型,需要遍历整个监视集合,而 epoll 是利用回调机制,只有活跃的文件描述符才会被通知。 2. selectpoll 使用的是链表来存储监视的文件描述符集合,而 epoll 使用的是红黑树来存储文件描述符集合,提高了检索速度。 3. select 对监视的文件描述符数量有限制,最大可监视的文件描述符数量由 FD_SETSIZE 定义,而 poll 没有该限制,epoll 则由内核支持。 4. selectpoll 需要每次将监视集合从用户态复制到内核态,而 epoll 将监视集合注册到内核完成一次性拷贝,避免了数据的复制。 5. selectpoll 每次调用都会线性扫描所有的文件描述符,而 epoll 通过事件通知机制,只活跃的文件描述符才会被通知,因此在同样的场景下,epoll 的性能更高。 总的来说,selectpoll 适用于文件描述符数量较少的情况,而 epoll 更适合大规模的并发操作,具有更高的性能。 ### 回答3: selectpollepoll都是用于实现IO复用的系统调用。它们的共同点是可以让一个进程同时监听多个文件描述符,一旦某个文件描述符就绪(可读、可写或异常),就会通知进程进行相应的操作。 三者区别主要体现在性能、扩展性和灵活性上: 1. 性能:selectpoll采用轮询的方式来检查所有的文件描述符,且每次都要遍历整个集合,因此性能较差。而epoll采用事件驱动的方式,只有在文件描述符就绪时才会通知进程,避免了无效遍历,因此性能更好。 2. 扩展性:selectpoll的最大文件描述符数量受到编译时定义的FD_SETSIZE限制,一般较小(默认为1024)。而epoll没有这个限制,可以动态增加。 3. 灵活性:selectpoll无法保存和传递信息,每次都需要重新设置监听事件。而epoll可以将就绪的文件描述符放入一个内核事件表中,可以保存和传递事件信息,提高了灵活性。 总结起来,epoll相较于selectpoll具有更好的性能、扩展性和灵活性,特别适用于连接数较多的高并发场景。但selectpoll在一些小规模应用中仍然可以使用,并且在一些特定的情况下可能更加方便和简单。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值