select、poll和epoll的优缺点

Linux中高级IO多路转接中select、poll和epoll的优缺点,这里主要谈select和poll的缺点以及epoll的优点。

一、select的缺点:

1、编写难度大

2、同时处理的文件描述符是有上限的

3、每次需要重新设定fd集合

4、性能会随用户的增多而效率降低

5、输入输出参数在一起

二、poll的缺点

poll是对select的一种改良,最突出的改良有两点:

1、文件描述符数量没有上限

2、将输入输出参数进行分离,不用每次设定

那么poll的缺点是:

poll中监听的文件描述符数目增多时:

1、和select一样,poll返回后,需要轮询pollfd来获取就绪的描述符

2、每次调用poll都需要大把大量客户端在一时刻可能只有很少的处于就绪状态,因此随着监视的描述符数量的增长,其效率也会线性下降。

三、epoll的优点:

1、文件描述符数目没有上限:通过epoll_ctl()来注册一个文件描述符,内核中使用红黑树的数据结构来管理所有需要监控的文件描述符。

2、基于事件就绪通知方式:一旦被监听的某个文件描述符就绪,内核会采用类似于callback的回调机制,迅速激活这个文件描述符,这样随着文件描述符数量的增加,也不会影响判定就绪的性能。

3、维护就绪队列:当文件描述符就绪,就会被放到内核中的一个就绪队列中,这样调用epoll_weit获取就绪文件描述符的时候,只要取队列中的元素即可,操作的时间复杂度恒为O(1)。

4、关于有些地方说:epoll还有内存映射机制,即内核将就绪队列通过mmap的方式映射到用户态,避免了拷贝内存这样的额外性能开销。关于这一点,我并不认为这是epoll的优点,因为他和epoll底层工作方式相悖。mmap是一种共享内存,但是我们都知道共享内存中一旦有数据,用户就能直接看到,并且使用,但是epoll_wait在取数据时传入了一块缓存区这是和贡献内存相悖的其一;其二是操作系统并不相信任何人,尤其是用户,它不会让用户直接去取内核中的数据。当然这只是自己的个人观点,如有其它见解请不吝赐教,谢谢!

selectpollepoll是三种多路复用的机制,用于处理多个I/O事件的方式。它们在网络编程中常用于监听多个文件描述符的状态变化,以提高程序的并发处理能力。 1. selectselect是最古老的一种多路复用机制。它的原理是通过一个位图数组来标记文件描述符的状态变化,并提供了三个监视集合,分别是读集合、写集合和异常集合。通过调用select函数,将需要监视的文件描述符及其对应的集合传入,然后select会阻塞程序,直到有文件描述符状态发生变化或超时。缺点是select所能监视的文件描述符数量存在限制。 2. pollpollselect的改进版,它使用链表来存储文件描述符和对应的事件集合。与select不同,poll没有限制监视的文件描述符数量。通过调用poll函数,将需要监视的文件描述符及其对应的事件集合传入,然后poll会阻塞程序,直到有文件描述符状态发生变化或超时。 3. epollepoll是Linux特有的一种多路复用机制,与selectpoll相比,在大规模并发连接时具有更好的性能。epoll通过在内核中创建一个事件表,将需要监视的文件描述符注册到这个事件表中,并通过epoll_ctl函数来控制事件的注册和删除。通过调用epoll_wait函数,程序可以等待多个文件描述符上的事件,并将就绪的文件描述符返回。 总结来说,selectpollepoll都是用于处理多个I/O事件的方式,但epoll在性能上更为出色。在选择使用哪种机制时,需要根据实际情况考虑并发连接数、平台兼容性以及对性能的要求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值