当前位置: 首页 > news >正文

【Linux:IO多路复用(select、poll函数)

目录

什么是IO多路复用?

select:

参数介绍:

 select函数返回值:

fd_set类型:

内核如何更新集合中的标志位 

处理并发问题

处理流程的步骤: 

 poll:

 poll的函数原型:

参数介绍:

select与poll的区别:


什么是IO多路复用?

一种网络通信的手段,IO多路复用可以同时监测多个文件描述符,且这个过程是阻塞的,当检测有文件描述符就绪,程序的阻塞就会解除,就可以通过这些就绪的文件描述符进行通信。通过这种方式在单线程/进程的场景下也可以在服务器端实现并发。常见的IO多路转接方式有:select、poll、epoll。

select:

该函数是跨平台的,检测文件描述符的读写状态

 这三个指针是指向三个文件描述符集合的指针。

参数介绍:

  • nfds:是在这三个文件描述符集合中找出一个最大的文件描述符再+1
    • 内核中需要线性遍历这些集合中的文件描述符,该值是循环结束的条件
    • 该参数在windows中无效,指定为-1即可
  • readfds:读集合一般都是需要进行检测的,这样才能知道哪些文件描述符可以接收数据
  • writefds:内核只检测这个集合中的文件描述符对应的写缓冲区,如果不使用该参数可以用NULL指定
  • exceptfds:内核只检测这个集合中的文件描述符是否有异常状态,如果不使用该参数可以用NULL指定
  • timeout:是表示检测文件描述符的时间,超过该时间函数返回。超长时长,用来解除select函数的阻塞
    • 等待固定时长:如果函数检测不到就绪的文件描述符,在指定时长过后就会解除堵塞
    • 如果设定为NULL:检测不到就绪的文件描述符就会一直阻塞
    • 不等待时长:检测不到就绪的文件描述符就会直接返回,不会阻塞

 select函数返回值:

  • >0:返回集合中就绪的文件描述符的个数
  • =0:超时,没有检测到就绪的文件描述符
  • <1:函数调用失败

fd_set类型:

fd_set类型的数据拥有1024个字节,也就是128个比特位,这个可以把他想象成一个整型的数组,大小为32。 fd_set中存储了要委托内核检测读缓冲区的文件描述符集合。

  • 如果集合中的标志位为0表示不检测这个文件描述符状态
  • 如果集合中的标志位为1表示检测这个文件描述符状态

内核如何更新集合中的标志位 

  

  • 假设需要检测读集合是否有文件描述符触发
  • 传入内核中的集合在此之前做初始化之后再传入
  • 内存中的数据拷贝到内核中
  • 内核检测拷贝的数据,检测完后,把满足条件的文件描述符重新写入到该内存中(可以理解为内核需要更新fd_set中的数据)

  • 把文件描述符中fd3,fd5,fd6,fd8,fd9,fd10,fd11设置到fd_set文件描述符集合中
  • 再通过select函数将文件描述符集合传递给内核
  • 内核把传入的集合拷贝一份(数据拷贝的过程)
  • 内核基于拷贝出来的集合做线性检测
  • 内核通过拷贝的集合与文件描述符表做对比
  • 文件描述符表的每个文件描述符具有两个缓冲区:读和写的缓冲区
  • 检测读缓冲区是否有数据
  • 内核基于拷贝的该线性表把需要检测的文件描述符的读缓冲区检验一遍
  • 把满足条件的文件描述符再重新写入指定的内存中

写集合也是一样的道理

以上函数能够实现把文件描述符存储到fd_set这个集合中/把已经存储的文件描述符从集合中删除等对该表的一系列增删查改 

处理并发问题

处理流程的步骤: 

  1. 创建套接字
  2. 绑定本地IP端口
  3. 建立监听
  4. 对需要检测的文件描述符做初始化(前三步完成后拥有一个监听的文件描述符)
    1. 监听的文件描述符用于检测是否有客户端连接
    2. 若客户端有连接请求,文件描述符会把发送进来存储到用于监听的文件描述符的读缓冲区中
  5. 创建一个fd_set的读集合并初始化(把标记为初始化为0)
  6. 再通过fd_set把监听的文件描述符对应的标志位设置为1
  7. 调用select进行检测
    1. select调用一次只检测一次
    2. 需要多次检测需要写入到循环中
    3. 返回值为-1或者0,即可做异常处理
      1. >0:文件描述符如果是监听的描述符,大于0表示有新的客户端连接到达
        1. 调用accept与客户端建立连接(不会阻塞,内核已检测完并知道文件描述符中是有数据的)得到通信的文件描述符
        2. 把得到的文件描述符放入读集合中,如果不进行下一轮的检测,服务端则不知道客户端有新的数据到达
  8. 检测到通信的文件描述符,调用recv接收数据
    1. 返回值:
      1. <0:客户端断开连接,调用close关闭通信的套接字,紧接着调用fd_clr函数删除
      2. >0:接收到数据,调用send函数发送数据

 poll:

 poll的函数原型:

参数介绍:

  • fds:struct pollfd类型的数组,里边存储了待检测的文件描述符的信息
  • nfds:第一个参数数组中最后一个有效元素的下标+1
  • timeout:指定poll函数的阻塞时长
    • -1:一直阻塞,直到检测的集合有就绪的文件描述符,解除阻塞
    • 0:不阻塞,不论检测集合是否有就绪的文件描述符,函数立刻返回

select与poll的区别:

  • select一次检测需要两次拷贝,效率低
  • 内核对select函数传递的待测集合的检测方式为线性(效率高低取决于检测的文件描述符的个数)
  • select检测的最大文件描述符个数有上限 
  • selec可以跨平台,poll不能开平台。

相关文章:

【Linux:IO多路复用(select、poll函数)

目录 什么是IO多路复用&#xff1f; select: 参数介绍&#xff1a; select函数返回值&#xff1a; fd_set类型&#xff1a; 内核如何更新集合中的标志位 处理并发问题 处理流程的步骤&#xff1a; poll: poll的函数原型&#xff1a; 参数介绍&#xff1a; select与p…...

计数排序(C语言)

一、步骤 1.首先&#xff0c;遍历数组统计出相同元素出现的次数 2.根据统计的结果将序列收回到原来的数组 方法&#xff1a;我们可以建立一个临时数组用来存储元素出现的次数&#xff0c;然后用该数组的下标表示该元素&#xff08;即假设i为临时数组的下标&#xff0c;a[i]为…...

LabVIEW弧焊参数测控系统

在现代制造业中&#xff0c;焊接技术作为关键的生产工艺之一&#xff0c;其质量直接影响到最终产品的性能与稳定性。焊接过程中&#xff0c;电流、电压等焊接参数的精确控制是保证焊接质量的核心。基于LabVIEW开发的弧焊参数测控系统&#xff0c;通过实时监控和控制焊接过程中关…...

Android笔记(三十七):封装一个RecyclerView Item曝光工具——用于埋点上报

背景 项目中首页列表页需要统计每个item的曝光情况&#xff0c;给产品运营提供数据报表分析用户行为&#xff0c;于是封装了一个通用的列表Item曝光工具&#xff0c;方便曝光埋点上报 源码分析 核心就是监听RecyclerView的滚动&#xff0c;在滚动状态为SCROLL_STATE_IDLE的时…...

【Linux】内核模版加载modprobe | lsmod

modprobe modprobe 是一个用于加载和卸载 Linux 内核模块的命令。它不仅能够加载单个模块&#xff0c;还能处理模块之间的依赖关系&#xff0c;确保所有依赖的模块都被正确加载。以下是一些关于 modprobe 命令的基本用法和常见选项的详细介绍。 基本语法 modprobe [option…...

Android从Drawable资源Id直接生成Bitmap,Kotlin

Android从Drawable资源Id直接生成Bitmap,Kotlin val t1 System.currentTimeMillis()val bmp getBmpFromDrawId(this, R.mipmap.ic_launcher_round)Log.d("fly", "1 ${bmp?.byteCount} h${bmp?.height} w${bmp?.width} cost time${System.currentTimeMillis…...

蓝桥杯——数组

1、移动数组元素 package day3;import java.util.Arrays;public class Demo1 {public static void main(String[] args) {int[] arr {1,2,3,4,5,6};int k 2;int[] arr_new f(arr,k);for (int i : arr_new) {System.out.print(i",");}//或System.out.println();St…...

在Flutter中,禁止侧滑的方法

在Flutter中&#xff0c;如果你想禁用侧滑返回功能&#xff0c;你可以使用WillPopScope小部件&#xff0c;并在onWillPop回调中返回false来阻止用户通过侧滑返回到上一个页面。 class DisableSwipePop extends StatelessWidget {overrideWidget build(BuildContext context) {…...

黑盒测试案例设计方法的使用(1)

黑盒测试用例的设计是确保软件质量的关键步骤之一。 一、等价类划分法 定义&#xff1a;把所有可能的输入数据&#xff0c;即程序的输入域划分成若干部分&#xff08;子集&#xff09;&#xff0c;然后从每一个子集中选取少数具有代表性的数据作为测试用例。 步骤&#xff1a…...

第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令

文章目录 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令客户端OPEN命令 第二十一章 TCP 客户端 服务器通信 - 客户端OPEN命令 客户端OPEN命令 客户端OPEN命令与服务器端OPEN命令只有一个方面的不同&#xff1a;第一个设备参数必须指定要连接的主机。要指定主机&#xf…...

pycharm报错:no module named cv2.cv2

1、问题概述&#xff1f; 在项目中报错no module named cv2.cv2&#xff0c;就会导致import cv2 as cv无法使用。 需要安装opencv-python,一个开源的计算机视觉库。 2、解决办法&#xff1f; 【第一步&#xff1a;如果当前环境中已经安装&#xff0c;先卸载】 有时候会出现…...

Android音视频直播低延迟探究之:WLAN低延迟模式

Android WLAN低延迟模式 Android WLAN低延迟模式是 Android 10 引入的一种功能&#xff0c;允许对延迟敏感的应用将 Wi-Fi 配置为低延迟模式&#xff0c;以减少网络延迟&#xff0c;启动条件如下&#xff1a; Wi-Fi 已启用且设备可以访问互联网。应用已创建并获得 Wi-Fi 锁&a…...

docker 部署freeswitch(非编译方式)

一&#xff1a;安装部署 1.拉取镜像 参考&#xff1a;https://hub.docker.com/r/safarov/freeswitch docker pull safarov/freeswitch 2.启动镜像 docker run --nethost --name freeswitch \-e SOUND_RATES8000:16000 \-e SOUND_TYPESmusic:en-us-callie \-v /home/xx/f…...

OpenHarmony的公共事件

OpenHarmony的公共事件 公共事件简介 CES&#xff08;Common Event Service&#xff0c;公共事件服务&#xff09;为应用程序提供订阅、发布、退订公共事件的能力。 公共事件分类 公共事件从系统角度可分为&#xff1a;系统公共事件和自定义公共事件。 系统公共事件&#…...

深度学习transformer

Transformer可是深度学习领域的一个大热门呢&#xff01;它是一个基于自注意力的序列到序列模型&#xff0c;最初由Vaswani等人在2017年提出&#xff0c;主要用于解决自然语言处理&#xff08;NLP&#xff09;领域的任务&#xff0c;比如机器翻译、文本生成这些。它厉害的地方在…...

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…...

【黑马点评debug日记】redis登录跳转不成功

登录后一直跳转登录界面&#xff1b; debug: 网络日志报401&#xff0c; 说明前端获取的token为空&#xff1b; 查看应用程序&#xff0c; 发现没有token存储信息 前端网页增加 sessionStorage.setItem("token", data); 记得刷新网页 成功存储token...

C#自定义特性-SQL

语法 原则 自定义特性必须继承自System.Attribute类&#xff1b; AttributeUsage属性来指定特性的使用范围和是否允许重复等&#xff1b; 在特性类中定义属性&#xff0c;这些属性将用于存储特性值。 示例 using System;// 定义一个自定义特性类 [Attribute…...

协方差矩阵及其计算方法

协方差矩阵&#xff08;Covariance Matrix&#xff09;是一个描述多维数据特征之间相互关系的矩阵&#xff0c;广泛应用于统计学和机器学习中。它用于表示各个特征之间的协方差&#xff0c;是分析多维数据分布和特征依赖性的重要工具。 什么是协方差矩阵&#xff1f; 协方差矩…...

【OH】openHarmony开发环境搭建(基于windows子系统WSL)

前言 本文主要介绍基于windows子系统WSL搭建openHarmony开发环境。 WSL与Vmware虚拟机的区别&#xff0c;可以查看WSL与虚拟机的区别 更详细的安装配置过程可参考微软官网&#xff1a; ​安装 WSL 前提 以下基于windows 111专业版进行配置&#xff0c;windows 10应该也是可以…...

如何用UABEA解锁Unity游戏资源:跨平台编辑器的完整指南

如何用UABEA解锁Unity游戏资源&#xff1a;跨平台编辑器的完整指南 【免费下载链接】UABEA c# uabe for newer versions of unity 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 想要修改游戏角色皮肤、替换背景音乐或探索游戏内部资源吗&#xff1f;UABEA&#x…...

构建个人效率工具集:模块化Shell环境配置与自动化工作流实践

1. 项目概述与核心价值最近在整理个人技术栈和自动化工具时&#xff0c;发现了一个挺有意思的项目&#xff0c;叫“Tsai1030/Tsai_PIG”。乍一看这个仓库名&#xff0c;可能会让人有点摸不着头脑&#xff0c;PIG&#xff1f;和数据处理框架Apache Pig有关吗&#xff1f;还是某种…...

从STK仿真到链路决策:低轨卫星网络静态拓扑构建实战解析

1. 低轨卫星网络静态拓扑基础认知 第一次接触卫星网络拓扑时&#xff0c;我被各种专业术语绕得头晕。直到把STK软件里的卫星模型调出来&#xff0c;看着那些在三维空间规律运转的小圆点&#xff0c;才真正理解什么是静态拓扑。简单来说&#xff0c;就是在不考虑卫星实时运动的情…...

数控编程软件|PowerMill 2026全流程下载安装教程

相信大家不会感到陌生&#xff0c;PowerMill‌是一款‌功能强大且专业的计算机辅助制造&#xff08;CAM&#xff09;软件‌工具&#xff0c;专注于‌复杂零件的数控&#xff08;CNC&#xff09;加工编程‌&#xff0c;尤其适用于‌模具、航空航天、汽车制造‌等高精度、高复杂度…...

3个关键指标揭示:你的游戏手柄响应速度是否拖了后腿?

3个关键指标揭示&#xff1a;你的游戏手柄响应速度是否拖了后腿&#xff1f; 【免费下载链接】XInputTest Xbox 360 Controller (XInput) Polling Rate Checker 项目地址: https://gitcode.com/gh_mirrors/xin/XInputTest 在竞技游戏的激烈对决中&#xff0c;每一毫秒的…...

基于Vue3+TypeScript的ChatGPT风格前端界面集成实战

1. 项目概述与核心价值最近在折腾一个个人项目&#xff0c;想给一个静态网站加上智能对话的能力&#xff0c;让访客能随时问点问题。一开始想自己从零搭建&#xff0c;但考虑到前后端、AI接口、实时通信这些环节&#xff0c;工作量着实不小。后来在GitHub上逛的时候&#xff0c…...

技术解析【无人机实时建图】 - DenseFusion:如何实现CPU上的大规模密集点云与DSM在线融合

1. DenseFusion框架的核心价值 第一次接触DenseFusion时&#xff0c;最让我惊讶的是它在普通笔记本电脑CPU上就能跑出实时建图效果。要知道传统无人机建图方案要么依赖昂贵GPU&#xff0c;要么需要后期数小时处理。这个框架通过三个关键创新点实现了突破&#xff1a;虚拟立体对…...

瑞芯微-I2S | 音频驱动调试实战:从寄存器分析到音频环路测试

1. 瑞芯微I2S音频驱动调试全景指南 第一次接触瑞芯微平台的音频驱动调试时&#xff0c;我被各种专业术语和复杂的寄存器配置搞得晕头转向。经过多个项目的实战积累&#xff0c;我发现只要掌握正确的调试方法&#xff0c;音频驱动问题都能迎刃而解。本文将带你从底层寄存器分析开…...

如何在macOS上免费解锁百度网盘SVIP下载限速?终极解决方案

如何在macOS上免费解锁百度网盘SVIP下载限速&#xff1f;终极解决方案 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS BaiduNetdiskPlugin-macOS是一款…...

Java应用性能监控利器zorka:嵌入式APM的深度定制与实战

1. 项目概述&#xff1a;一个被低估的Java应用性能监控利器如果你是一名Java后端开发者或系统运维&#xff0c;肯定对应用性能监控&#xff08;APM&#xff09;不陌生。市面上有New Relic、Dynatrace这样的商业巨兽&#xff0c;也有Pinpoint、SkyWalking这类开源明星。但今天我…...