select,poll,epoll的区别对比

前面写过关于IO阻塞,非阻塞,多路复用的文章,感觉还是挺好理解的,可以往前去翻。

今天主要是记录一下IO多路复用的情况下,select,poll,epoll的区别对比。

前置知识:

文件描述符(File Descriptor)是操作系统中用来标识一个打开文件的整数值。在Unix-like系统中,包括Linux,文件、网络连接、管道等都被视为文件,而文件描述符就用于唯一标识这些文件。(相当于学生的学号,一个学号定位到一个学生)

select

select方法本质其实就是维护了一个文件描述符(fd)数组,以此为基础,实现IO多路复用的功能。这个fd数组有长度限制,在32位系统中,最大值为1024个,而在64位系统中,最大值为2048个,select方法被调用,首先需要将fd_set从用户空间拷贝到内核空间,然后内核用poll机制(此poll机制非IO多路复用的那个poll方法,该函数会阻塞进程直到有文件描述符就绪或者超时。)直到有一个fd活跃,或者超时了,方法返回。

select方法的缺点就很明显了:

  • fd_set在用户空间和内核空间的频繁复制,效率低

  • 单个进程可监控的fd数量有限制,无论是1024还是2048,对于很多情景来说都是不够用的。

  • 基于轮询来实现,效率低

poll

poll本质上和select没有区别,依然需要进行数据结构的复制,依然是基于轮询来实现,但区别就是,select使用的是fd数组,而poll则是维护了一个链表,所以从理论上,poll方法中,单个进程能监听的fd不再有数量限制。但是轮询,复制等select存在的问题,poll依然存在。而且编程复杂,所以用的非常少。

epoll

给每个fd注册一个回调函数,当fd对应的设备发生IO事件时,就会调用这个回调函数,将该fd放到一个链表中,然后由客户端从该链表中取出一个个fd,以此达到O(1)的时间复杂度

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值