网络模型-IO多路复用

本文详细介绍了Linux的IO多路复用技术,包括select、poll和epoll三种模式。讨论了select的限制,如FD集合大小有限制、需要遍历查找就绪FD等。接着介绍了poll如何改进了select的限制,但性能提升不明显。重点讲解了epoll的优势,如红黑树结构、epoll_ctl和epoll_wait的使用,以及ET和LT两种触发模式,并给出了基于epoll的服务器端流程概述。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

网络模型-IO多路复用-select方式

select是Linux最早是由的I/O多路复用技术:

简单说,就是我们把需要处理的数据封装成FD,然后在用户态时创建一个fd的集合(这个集合的大小是要监听的那个FD的最大值+1,但是大小整体是有限制的 ),这个集合的长度大小是有限制的,同时在这个集合中,标明出来我们要控制哪些数据,

比如要监听的数据,是1,2,5三个数据,此时会执行select函数,然后将整个fd集合发给内核态,内核态会去遍历用户态传递过来的数据(从1到5),如果发现这里边都数据都没有就绪,就休眠,直到有数据准备好时,就会被唤醒,唤醒之后,再次遍历一遍,看看谁准备好了,然后再将处理掉没有准备好的数据,最后再将这个FD集合写回到用户态中去,此时用户态就知道了,奥,有人准备好了,但是对于用户态而言,并不知道谁处理好了,所以用户态也需要去进行遍历,然后找到对应准备好数据的节点,再去发起读请求,我们会发现,这种模式下他虽然比阻塞IO和非阻塞IO好,但是依然有些麻烦的事情, 比如说频繁的传递fd集合,频繁的去遍历FD等问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wGbKiTm-1666116035563)(.\原理篇.assets\1653900022580.png)]

select模式存在的问题:

  • 需要将整个fd_set从用户空间拷贝到内核空间,select结束还要再次拷贝回用户空间
  • select无法得知具体是哪个fd就绪,需要遍历整个fd_set
  • fd_set监听的fd数量不能超过1024

2.6 网络模型-IO多路复用模型-poll模式

poll模式对select模式做了简单改进,但性能提升不明显,部分关键代码如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值