多路IO复用服务器——select模型和poll模型
文章目录
- 一、多路IO复用服务器是什么?
- 二、使用原理
- 三、种类
- 四、select模型
- 五、select模型优缺点
- 六、poll模型
- 总结
一、多路IO复用服务器是什么?
服务器要与客户端完成tcp连接,并保持连接维护可用sock。
每个都需要准备一个进程管一个sock,代价太大,不能让进程等待数据。
解决办法:监听sock,设置sock事件管理(sock事件:读、写、异常)
监听事件触发->事件触发->处理事件->处理完毕
二、使用原理
用一种技术来帮忙监听sock,搞一个进程使用IO复用技术监听所有可监听的sock,监听与辨别就绪(客户端还是服务端),然后处理就绪。
主要特点是recv和accept不再是阻塞,监听功能交给了IO复用,它只负责读取就可以了。
lO复用技术有名多路IO转接技术,可以帮助开发者监听大量的sock。可以单进程实现一对多。
如果此模型在读取处理请求时无法建立新连接,连接时依然无法读取数据。
三、种类
IO复用技术有很多种:select、poll、epoll。详细认识一下select模型(其他的差不多)
四、select模型
要想使用select模型,就先得建立一个监听集合。select模型的监听集合是fd_set类型,存储所有监听的sock。大小固定为1024。集合里每一位对应一个sock。服务器最开始有个serverfd的sock。
监听数量要的是maxfd+1,并且记得**+3**(监听集合对应文件描述符表:最开始应该会有0,1,2(标准输入,标注输出、标准出错))
所以要执行时时刻记录最大的描述符 maxfd。
监听集合里面设置的是0或1代表是否监听。
调用select函数,但其实它也是一个阻塞监听函数,使用的是轮询监听。参数是监听数量、监听事件选择(以集合为单位批处理),监听阻塞函数,工作模式(NULL代表阻塞监听)。返回值是int类型,就绪码。
监听集合里的是一个传入传出参数,传入代表监听谁,传出代表谁就绪了。
当监听的sock就绪,select会修改监听集合改为就绪集合传出,便于用户判断就绪的sock。将就绪sock保留为1,没就绪清0。
单进程需要一个数组存储sock。
serverfd就绪->建立tcp->将新的sock设置到监听集合中,并将它放入sock数组。
clientfd就绪->读取数据处理并响应->如果客户端断开将此sock从数组中删除,将监听取消。
监听集合(就绪集合)下一次不能再次使用。监听集合当就绪后会被修改, 所以用户要将传入和传出分离。
如果就绪的数量 >1 产生异常,因为就绪的sock存储在oset中, 用户处理完就绪后(建立连接读取完数据), 将刚刚处理完毕的sock在oset中设置0 ,避免因为oset不变导致异常判断的问题。
五、select模型优缺点
优点:
- 使用比较简单, 了解监听集合以及IO复用机制即可使用帮助用户完成少量sock的网络事件监听。
- 跨平台兼容性比较好,在各个系统语言均有select支持。
- select支持微妙级定时, 可以满足一些特定需求。
缺点:
- select无法满足大监听需求, 最大监听数1024(fd set)。
- 轮询监听(CPU), 虽则轮询数量的增大, O处理性能(CPU)呈线性下降。
- select监听到就绪后只返回就绪的数量,需要用户自行遍历查找就绪的sock。
- 需要用户进行传入传出分离设置。
- 随着select的持续使用, 会有庞大的拷贝开销与挂载开销。(select每轮使用都需要将新的监听拷贝到内核空间, 但是监听集合中大量的项以前已经拷贝过, 重复且没有意义的拷贝开销)
- 监听的数量比较少,其次设置监听不灵活,无法针对不同的sock设置不同的监听。
六、poll模型
几乎与select一模一样。但是使用频率远低于select模型。
优点:
- 监听事件的种类丰富,对监听与就绪进行了传入传出分离, 无需用户分离。
- poll 支持用户自定义长度结构体数组作为集合,突破了1024限制(然而没解决轮询,没啥大用)
缺点:
- 轮询问题,拷贝开销与挂载开销,只返回就绪数量用户自行遍历查询就绪,poll只支持毫秒级别定时。
- 在某些特定的Linux版本才可以使用。
总结
IO复用技术其实就是一种sock监听技术。
相关文章:
多路IO复用服务器——select模型和poll模型
文章目录 一、多路IO复用服务器是什么?二、使用原理三、种类四、select模型五、select模型优缺点六、poll模型总结 一、多路IO复用服务器是什么? 服务器要与客户端完成tcp连接,并保持连接维护可用sock。 每个都需要准备一个进程管一个sock&a…...
【书生·浦语大模型实战营】学习笔记目录
【书生浦语大模型实战营01】《书生浦语大模型全链路开源体系》【书生浦语大模型实战营02】《轻松玩转书生浦语大模型趣味Demo》学习笔记【书生浦语大模型实战营03】《基于 InternLM 和 LangChain 搭建你的知识库》学习笔记【书生浦语大模型实战营04】《(4)XTuner 大模型单卡低成…...
APT32F1023X 发送RF433处理
1.硬件电路--CMT2110A 需要注意:发射端MCU写数据的频率要匹配,如果MCU发送中时间最小脉宽是1MS,那么它的发送需要设置为1kbps。 通过华普微USB调试工具PC软件RFPDK_V1.55查看设置是否正确。 2.RF433发送 用到的发送和接收代码来自“无线433发…...
如何做一个合格的产品经理
如何做一个合格的产品经理 如何做一个合格的产品经理 一、了解市场需求 产品经理的核心工作之一是了解市场需求。为了确保产品的成功,你需要密切关注市场动态,了解用户需求,分析竞争对手,并预测未来趋势。通过市场调查、用户访…...
Git 入门精讲
我们为什么要学习git? 就当下的发展而言,只要你从事开发就一定会接触git。作为最强大的分布式版本控制器,git 与 svn 有着本质上的区别。 Git是一种分布式版本控制系统,每个开发者都可以在本地维护完整的代码库,可以离…...
论文笔记(四十二)Diff-DOPE: Differentiable Deep Object Pose Estimation
Diff-DOPE: Differentiable Deep Object Pose Estimation 文章概括摘要I. 介绍II. 相关工作III. DIFF-DOPEIV. 实验结果A. 实施细节和性能B. 准确性C. 机器人-摄像机校准 V. 结论VI. 致谢 文章概括 作者:Jonathan Tremblay, Bowen Wen, Valts Blukis, Balakumar Su…...
设计模式:简单工厂模式
工厂设计模式属于创建型模式,它提供了一种创建对象的最佳方式。工厂模式提供了一种创建对象的方式,而无需指定要创建的具体类。工厂模式属于创建型模式,它在创建对象时提供了一种封装机制,将实际创建对象的代码与使用代码分离。 …...
老龄化对投资意味着什么?
1月15日,国务院办公厅印发《关于发展银发经济增进老年人福祉的意见》从4个方面提出26项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告࿰…...
从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息
我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话,要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中,其中我们更深入地研究了与遣返相关的成本和节省,以便您更轻松地进行自己的分析。…...
C#颜色拾取器
1,目的: 获取屏幕上任意位置像素的色值。 2,知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…...
最长公共子串的问题(正常方法和矩阵法,动态规划)
题目: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。 一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...
Linux实验记录:使用LVM(逻辑卷管理器)
前言: 本文是一篇关于Linux系统初学者的实验记录。 参考书籍:《Linux就该这么学》 实验环境: VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: 硬盘分好区或者部署为RAID磁盘阵列…...
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
前言: 为什么之前写过Golang 版的设计模式,还在重新写Java 版? 答:因为对于我而言,当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言,更适合用于学习设计模式。 为什么类图要附上uml 因为很…...
【国产MCU】-认识CH32V307及开发环境搭建
认识CH32V307及开发环境搭建 文章目录 认识CH32V307及开发环境搭建1、CH32V307介绍2、开发环境搭建3、程序固件下载1、CH32V307介绍 CH32V307是沁恒推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度…...
python flask request教程
request 一、传json1、resquest.get_data()与resquest.data2、request.get_json()3、request.json["imageURL"]二、传file1、request.files["file"]2、request.form["username"]3、request.form.get(username)与2等价,其他get()与[]也相同三、其…...
UE5 Chaos系统 学习笔记
记得开插件: 1、锚点场(构造场) 在锚点场范围内的物体静止且不被其他力场损坏 需要在Geometry Collection的初始化场把构造场设置过去 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止行为和模拟物…...
MkDocs 部署指南
简介 MkDocs 可以同时编译多个 markdown 文件,形成书籍一样的文件。有多种主题供你选择,很适合项目使用。 MkDocs 是快速,简单和华丽的静态网站生成器,可以构建项目文档。文档源文件在 Markdown 编写,使用单个 YAML …...
【Java 设计模式】行为型之访问者模式
文章目录 1. 定义2. 应用场景3. 代码实现结语 访问者模式(Visitor Pattern)是一种行为型设计模式,用于在不改变被访问元素的类的前提下定义对这些元素的新操作。访问者模式将数据结构与作用于结构上的操作解耦,使得操作集合可以灵…...
堆和堆排序【数据结构】
目录 一、堆1. 堆的存储定义2. 初始化堆3. 销毁堆4. 堆的插入向上调整算法 5. 堆的删除向下调整算法 6. 获取堆顶数据7. 获取堆的数据个数8. 堆的判空 二、Gif演示三、 堆排序1. 堆排序(1) 建大堆(2) 排序 2.Topk问题 四、完整代码1.堆的代码Heap.cHeap.htest.c 2. 堆排序的代码…...
【全程录屏GPT3.5升级4.0】2024最新GPT4升级订阅详细指南
前言:为什么要升级GPT4.0,下图是来自GPT4.0的官方回答,可以看出,GPT4无愧于是一个大版本升级的。 一、视频教程 记录了普通用户使用WildCrad从GPT3.5升级到4.0的全部过程,感兴趣可以前往观看:https://www.…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
