网络模型-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)]](https://i-blog.csdnimg.cn/blog_migrate/ca124638ebdb2b09b70f44f555c74421.png)
select模式存在的问题:
- 需要将整个fd_set从用户空间拷贝到内核空间,select结束还要再次拷贝回用户空间
- select无法得知具体是哪个fd就绪,需要遍历整个fd_set
- fd_set监听的fd数量不能超过1024
2.6 网络模型-IO多路复用模型-poll模式
poll模式对select模式做了简单改进,但性能提升不明显,部分关键代码如下:

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

被折叠的 条评论
为什么被折叠?



