IO多路复用学习笔记(select和poll)

视频链接:https://www.bilibili.com/video/BV1fg411376j?p=1\&vd_source=fa4ef8f26ae084f9b5f70a5f87e9e41b

IO多路复用

在我们进行套接字通信时,会由一系列的阻塞函数如:read,write,accept等,这些函数都会监听各自的读写缓冲区,当自己的缓冲区为空时程序就会被阻塞。因此在只有一个进程/线程的情况下无法进行并发

想要实现服务端的并发一般可以使用多进程或者多线程来实现,但是在服务端的进程和线程只有一个的时候,要实现服务端的并发就可以使用IO多路复用技术 。IO多路复用技术使得这些读写缓冲区不需要程序员来维护,OS的内核会承担这些功能,内核会同时检测这些文件描述符的读写缓冲区和剩余的空间大小。但是处理新连接或者这些文件描述的读写事件是按照到达顺序顺序执行的

与IO多路复用有关的函数有三个select,poll,epoll,其中poll和epoll都是只能在Linux环境下使用的,select是跨平台的,无论在哪个系统下都可以使用
select和poll底层是由线性表实现的,epoll是由红黑树实现的,所以epoll的效率更高

select函数

select对文件描述符的检测上限为1024,每个程序对应的文件描述符表只有1024个,且序号为0-1023

监听的文件描述符只有一个,但是连接的文件的描述符有n个


注:

  1. 第一个参数监听的集合在后续三个参数里,比如需要监听的读缓冲区r有3个,写缓冲区w有4个,需要检测的异常缓冲区e有5个,那么第一个参数就填6(max(3,4,5) + 1),如果不清楚有多少个文件描述符,可以直接填1024,因为select对文件描述符检测上限就是1024
  2. 第2、3、4个参数分别代表需要检测缓存区集合的地址,分别是读缓冲区,写缓冲区和异常检测缓冲区(这些缓冲区可以被同时检测 ),同时这也是个传入传出参数(函数调用结束后原本传入的地址里面的内容会发生变化),比如:我需要检测的读缓冲区的是5,6,7,8号,内核检测后发现第5,6号缓冲区有数据,那么第二个参数会传出5,6号缓冲区,其余缓冲区同理
  3. 根据上述的传出参数,我们可以拿到可以进行操作的缓冲区,然后我们就可以判断这个缓冲区的功能是什么从而来写出对应的逻辑,如果这个缓冲区用于监听,那就调用accept,用于通信就read/recv
  4. 最后一个参数用于指定内核检测缓冲区的时长,时长为图中成员指定的值相加 秒 + 微秒,一般只需要使用秒,但是微秒必须初始化为0!!否则它会被系统安排一个随机数,这个随机数有可能会很大,这样会导致程序不如预期。 可以将这个位置指定为null,表示select会一直检测fd_set直到出现了就绪状态的文件描述符
  5. fd_set占用了1024个标志位------对应文件描述符表最多只有1024,每个标志位占用1个比特,不难换算出,这个fd_set占用的内存大小为int [32]的内存大小(一个int型变量占用4个字节),但是实际上是按照一位一位来处理的 ------ 实际上就是位图
  6. 内核在处理监听缓冲区时会将传进来的fd_set拷贝到内核里,内核会基于拷贝出来的进行线性检测,查看对应的套接字缓冲区是否满足使用的需要,满足条件的文件描述符就写回到fd_set(对应位置为1)
  7. 就绪文件描述符 -> 读缓冲区有数据,那么它对应的文件描述符就是就绪的,写缓冲区为为空,那么它对应的文件描述符就是就绪的,缓冲区有异常,那么它对应的文件描述符就是就绪的

使用select处理服务器并发

处理流程和处理流程图

代码见视频

poll

使用比select更直观,参数也更少,但是只能在Linux下使用,效率又不如epoll且不能跨平台,所以一般不怎么用,只做简单介绍

poll和select使用IO多路复用的执行流程类似

select和poll的特点及其总结

相关推荐
哈基鑫6 小时前
手写数字识别学习笔记
笔记·学习
im_AMBER6 小时前
Web 开发 29
前端·学习·web
缘友一世6 小时前
活动目录的枚举学习
学习·网络安全·网路攻击
Da Da 泓6 小时前
shellSort
java·数据结构·学习·算法·排序算法
济南java开发,求内推6 小时前
mongodb一个服务器部署多个节点
服务器·数据库·mongodb
武子康6 小时前
Java-148 深入浅出 MongoDB 聚合操作:$match、$group、$project、$sort 全面解析 Pipeline 实例详解与性能优化
java·数据库·sql·mongodb·性能优化·系统架构·nosql
程序猿(雷霆之王)6 小时前
MySQL——复合查询
数据库·mysql
润 下6 小时前
C语言——深入解析C语言指针:从基础到实践从入门到精通(三)
c语言·开发语言·经验分享·笔记·学习·程序人生·其他
焚 城6 小时前
UniApp中Flex布局学习
学习·uni-app
你真的可爱呀6 小时前
uniapp学习【整体实践】
前端·学习·uni-app·实践