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

相关推荐
geovindu2 分钟前
python: Oracle Stored Procedure query table
数据库·python·mysql·postgresql·oracle·sqlserver·mssql
神经网络的应用4 分钟前
C++程序设计例题——第三章程序控制结构
c++·学习·算法
南宫生16 分钟前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
挥剑决浮云 -21 分钟前
STM32学习之 按键/光敏电阻 控制 LED/蜂鸣器
c语言·经验分享·stm32·单片机·嵌入式硬件·学习
山人在山上33 分钟前
arcgis server ip修改后服务异常解决方案
数据库·tcp/ip·arcgis
keep-learner34 分钟前
Unity Dots理论学习-2.ECS有关的模块(1)
学习·unity·游戏引擎
A懿轩A1 小时前
C/C++ 数据结构与算法【树和二叉树】 树和二叉树,二叉树先中后序遍历详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·二叉树·
不剪发的Tony老师1 小时前
SQL实现新年倒计时功能
数据库·sql
小小药1 小时前
009-spring-bean的实例化流程
java·数据库·spring
胡楚昊1 小时前
攻防世界PWN刷题笔记(引导模式)1-3
笔记