select/poll/epoll理解

文章介绍了为解决IO阻塞问题,采用的IO多路复用技术,包括select、poll和epoll三种系统调用。select在处理大量文件描述符时效率较低,poll通过动态数组突破1024个文件描述符限制,而epoll则利用内核中的红黑树结构和事件驱动机制提高了效率和性能。
摘要由CSDN通过智能技术生成

为了解决io阻塞请求导致的性能问题,采用io多路复用技术,针对select/poll/epoll三种不同的系统调用,进行简单的总结。

select

将已连接的socket放到一个文件描述符集合中,通过调用select函数将文件描述符拷贝到内核中,由内核检查是否有网络事件方式,通过遍历文件描述符集合,将有事件发生的socket标记为可读或者可写。然后把文件描述符集合再拷贝到用户态。用户态再通过遍历找出要处理的socket。从上面流程中可以发现,需要拷贝两次文件描述符集合,并且在内核态与用户态中都需要遍历一次集合。select采用bitMap固定数组保存文件描述符,只能存储1024个。

poll

poll方式与select没有本质区别,优化了文件描述符集合中存储方式,使用动态数组存储,突破了1024个文件描述符的限制,基本上没有使用场景。

epoll

针对select/poll的问题,epoll通过两方面进行改进:

  1. 在内核中维护了红黑树的结构去检测所有的文件描述符,由于采用红黑树的结构增删时间复杂度都是O(logn),由于本身在内核中维护了红黑树结构,所以只要传入待检测的socket到内核即可,不需要像select把整个文件描述符集合传入内核

  1. 采用事件驱动机制,内核中维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数把该socket加入到就绪列表中。然后把已就绪的socket拷贝到用户态,不需要像select/epoll那样把整个文件描述符集合进行拷贝。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值