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

多路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模型优缺点

优点:

  1. 使用比较简单, 了解监听集合以及IO复用机制即可使用帮助用户完成少量sock的网络事件监听。
  2. 跨平台兼容性比较好,在各个系统语言均有select支持。
  3. select支持微妙级定时, 可以满足一些特定需求。

缺点:

  1. select无法满足大监听需求, 最大监听数1024(fd set)。
  2. 轮询监听(CPU), 虽则轮询数量的增大, O处理性能(CPU)呈线性下降。
  3. select监听到就绪后只返回就绪的数量,需要用户自行遍历查找就绪的sock。
  4. 需要用户进行传入传出分离设置。
  5. 随着select的持续使用, 会有庞大的拷贝开销与挂载开销。(select每轮使用都需要将新的监听拷贝到内核空间, 但是监听集合中大量的项以前已经拷贝过, 重复且没有意义的拷贝开销)
  6. 监听的数量比较少,其次设置监听不灵活,无法针对不同的sock设置不同的监听。

六、poll模型

几乎与select一模一样。但是使用频率远低于select模型。

优点:

  1. 监听事件的种类丰富,对监听与就绪进行了传入传出分离, 无需用户分离。
  2. poll 支持用户自定义长度结构体数组作为集合,突破了1024限制(然而没解决轮询,没啥大用)

缺点:

  1. 轮询问题,拷贝开销与挂载开销,只返回就绪数量用户自行遍历查询就绪,poll只支持毫秒级别定时。
  2. 在某些特定的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项举措,为我国首个以“银发经济”命名的政策文件。 近期,国信证券分析师王开发布题为《银发经济再思考:老龄化对投资的影响》的报告&#xff0…...

从公有云对象存储迁移到回私有化 MinIO需要了解的所有信息

我们上一篇文章《如何从 AWS S3 遣返到 MinIO》的反响非常出色 - 我们已经接到了数十个企业的电话,要求我们提供遣返建议。我们已将这些回复汇总到这篇新文章中,其中我们更深入地研究了与遣返相关的成本和节省,以便您更轻松地进行自己的分析。…...

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…...

最长公共子串的问题(正常方法和矩阵法,动态规划)

题目&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些字符…...

Linux实验记录:使用LVM(逻辑卷管理器)

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注&#xff1a; 硬盘分好区或者部署为RAID磁盘阵列…...

[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上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系统 学习笔记

记得开插件&#xff1a; 1、锚点场&#xff08;构造场&#xff09; 在锚点场范围内的物体静止且不被其他力场损坏 需要在Geometry Collection的初始化场把构造场设置过去 2、ClusterStrain 破裂效果的力 3、DisableField chaos破裂后的模拟物理在绿色范围内禁止行为和模拟物…...

MkDocs 部署指南

简介 MkDocs 可以同时编译多个 markdown 文件&#xff0c;形成书籍一样的文件。有多种主题供你选择&#xff0c;很适合项目使用。 MkDocs 是快速&#xff0c;简单和华丽的静态网站生成器&#xff0c;可以构建项目文档。文档源文件在 Markdown 编写&#xff0c;使用单个 YAML …...

【Java 设计模式】行为型之访问者模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在不改变被访问元素的类的前提下定义对这些元素的新操作。访问者模式将数据结构与作用于结构上的操作解耦&#xff0c;使得操作集合可以灵…...

堆和堆排序【数据结构】

目录 一、堆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升级订阅详细指南

前言&#xff1a;为什么要升级GPT4.0&#xff0c;下图是来自GPT4.0的官方回答&#xff0c;可以看出&#xff0c;GPT4无愧于是一个大版本升级的。 一、视频教程 记录了普通用户使用WildCrad从GPT3.5升级到4.0的全部过程&#xff0c;感兴趣可以前往观看&#xff1a;https://www.…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…...