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的特点及其总结

相关推荐
罗光记8 小时前
Quantinuum 发布新型量子计算机“Helios“
数据库·经验分享·其他·百度·twitter
友友马9 小时前
『 数据库 』MySQL索引深度解析:从数据结构到B+树的完整指南
数据库·mysql
SelectDB9 小时前
替换 ClickHouse,查询并发提升 7 倍!高途教育基于阿里云 SelectDB 构建秒级实时报表
数据库·apache
d111111111d9 小时前
STM32外设学习--DMA直接存储器读取(AD扫描程序,DMA搬运)--学习笔记。
笔记·stm32·单片机·嵌入式硬件·学习
JamSlade9 小时前
优化用户体验的小点:乐观更新链路 双数据库查询
数据库·ux
一 乐9 小时前
个人博客|博客app|基于Springboot+微信小程序的个人博客app系统设计与实现(源码+数据库+文档)
java·前端·数据库·spring boot·后端·小程序·论文
小二·10 小时前
用 eBPF 实现 MySQL 慢查询实时追踪(终极实战版):零侵入、毫秒级、全上下文捕获
数据库·mysql·adb
labview_自动化10 小时前
GitHub笔记
笔记·github
云飞云共享云桌面10 小时前
三维设计办公资源如何共享集中和安全管控?
运维·服务器·数据库·安全·自动化·制造
华法林的小助手10 小时前
[笔记]SolidWorks转URDF 在rviz2中显示
笔记