IO复用并发模型

在讲解复用并发模型之前,先补齐一些知识:

设想一个场景,你今天想洗衣服,但是没有洗衣粉,于是你让快递小哥送来,那在送的这段时间,如果你干了别的活,洗衣服这件事情就被阻塞了,等待快递小哥送来洗衣粉后,唤醒洗衣服的事件。

阻塞:将CPU资源让出,等待事件唤醒。

如果你没有干别的,而是在不停的给快递小哥打电话询问到哪里了,那末这个行为就叫,非阻塞忙轮询。

非阻塞忙轮询:继续占用CPU资源,持续判断是否有事件。

如果你同时买了多个快递,都在派送,但是此时只有一个电话,那末其他的小哥要依次拨打,否则会提示占线。

阻塞等待存在问题:同时只能处理一个IO请求,其余的IO请求会阻塞。

如何解决呢,你可以将收快递业务托管给一个驿站,这个驿站收到快递会通知你。一种是通知你到了,但是不通知你到的是哪个,需要你自己查询。   另一种是通知你哪个到了,不需要再去查询

解决方式:多路IO复用

select/poll:内核拷贝到用户态的是全部的文件描述符集合,还需要遍历得到触发的那个。 文件描述有上限,默认1024。

epoll:只在linux系统中才有的。 内核拷贝到用户态的是被触发的文件描述符,不需要遍历可以直接去处理。存放的文件描述符更多了。

前瞻知识讲完了,下面介绍公司级多路IO复用并发模型

单线程IO多路复用 + 多线程IO多路复用模型:

流程大概是这样的 服务端起来时,开辟固定数量的线程,主线程会创建listenFd后,并进行绑定和监听。等待client向server发送conn连接请求。

IO多路复用发现监听描述符触发后,会调用accept进行连接。三次握手连接成功后,得到了一个新的连接描述符connFd。此时会通过轮询或者常用负载方式,将连接描述符交给某一个子线程。此时主线程又会返回到IO多路复用监听状态,继续监听listenFd。

子线程拿到connFd,会放入子线程内部的监听IO集合中。 client发起 read write后,子线程的IO集合监听到connFd触发,也会开始 read write。双方读写数据成功。

优点:

  1. 主线程,只监听连接操作,不做读写操作,分散读写到多个子线程来完成。增加同一时间读写的并行通道。并行数量为子线程的数量。
  2. server同时监听ConnFd套接字数量N倍增加

建议子线程数量和CPU核心数一致,会降低CPU切换的频率。CPU切换线程是有成本的,每个线程绑定一个CPU,可以让CPU运行最大化。省掉切换的成本

缺点:

每一个子线程内同时读写的只能有一个,其余的会被延迟处理。等待读写完成后,回到多路IO复用方法后,才能再次执行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/770269.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus(五):监控物理机并进行数据展示

目录 1 ipmi export安装配置1.1 ipmi exporter简介1.2 安装1.2 创建yaml文件1.3 systemd启动配置 ipmi_exporter.service1.4 启动 ipmi_exporter 服务1.5 Prometheus配置创建target:修改Prometheus配置文件 1.6 Grafana配置1.7 IPMI说明1、IPMI2、ipmitool远程电源管…

C++项目——集群聊天服务器项目(五)网络模块与业务模块

今天来正式书写集群聊天服务器网络模块与部分业务模块的代码 环境搭建C项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置-CSDN博客 Json第三方库 muduo网络库 MySQL数据库 一、工程目录创建 项目通过CMake编译&#xff0c…

C语言:自定义类型:联合体和枚举

目录 联合体 联合体是什么? 联合体的大小计算 枚举 枚举是什么? 为什么要使用枚举? 联合体 联合体是什么? 联合体也是个自定义类型,它和结构体类似,都是由多个成员构成,可以有不同的内置…

【OJ】动归练习二

个人主页 : zxctscl 如有转载请先通知 题目 1. 91.解码方法1.1 分析1.2 代码 2. 62.不同路径2.1 分析2.2 代码 3. 63.不同路径 II3.1 分析3.2 代码 1. 91.解码方法 1.1 分析 题目所述就是把一串数字反向解码为字母映射出来,有多少种方法。 题目也说&…

nav仿真(2)

开启仿真和建图 打开第一个窗口启动仿真: source devel/setup.bash export TURTLEBOT3_MODELburger roslaunch turtlebot3_gazebo turtlebot3_world.launch # 启动仿真打开第二个窗口,开始建图: source devel/setup.bash export TURTLEBOT3_…

mysql存储引擎、行锁与索引的关系

一、存储引擎概念介绍 MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎 存储引擎是MySQL将数据存储在文件系统中的存储…

个人网络防范

目录 安全事件频发根源在于背后利益链条 不仅仅是中国 网络安全事件成国际性难题 个人网络信息安全防护 四招来帮忙 首先,预防第一 第二,健康的上网浏览习惯 第三,WiFi安全性 第四,规范的文件处理 黑客攻击无孔不入&…

小程序网络视频组件video经常出现的错误解决

小程序网络视频组件错误 1.错误提示如下 3[渲染层网络层错误] Failed to load media http://www.xxx.net/download/1.mp4#devtools_no_referrer net::ERR_FAILED From server 112.126.62.195(env: Windows,mp,1.06.2401020; lib: 3.3.4)2.解决文章请参考 本文链接&#xff…

隐语技术架构

隐语架构 产品定位 算法层 计算层 密码原语 互联互通–资源层 总结

写了几个难一点的sql

写了几个难一点的sql SELECT bn.id AS book_node_id, t.version_id, bn.textbook_id, s.id AS subject_id, s.stage_id, COUNT( CASE WHEN d.document_type_id 1 AND d.scope IS NULL AND p.document_id IS NOT NULL THEN 1 END ) AS type_1_count, COUNT( CASEWHEN d.docume…

教程1_图像入门

一、读取图像文件 cv2.imread() 是 OpenCV 库中的一个函数,用于读取图像文件。下面是 cv2.imread() 函数的基本介绍和使用方法: 函数定义 cv2.imread(filename, flagscv2.IMREAD_COLOR) 参数 filename:要读取的图像的路径和文件名。flags…

前端理论总结(css3)——三角形/梯形 // 一边固定另一边自适应

三角形/梯形 三角形 width: 0; height: 0; border-top: 40px solid transparent; border-left: 40px solid transparent; border-right: 40px solid transparent; border-bottom: 40px solid #ff0000; 梯形 width: 50px; height: 0; border-bottom: 50px solid red; border-l…

JavaScript typeof运算符使用

typeof NaN 的数据类型是数字对象、数组、null 、日期 的数据类型是 object未定义变量、未赋值变量的数据类型为 undefined typeof "Bill" // 返回 "string" typeof 3.14 // 返回 "number" typeof NaN …

数据结构(五)——树与二叉树的应用

5.5 树与二叉树的应用 5.5.1 哈夫曼树 结点的权:有某种现实含义的数值。 结点的带权路径长度:从树的根到该结点的路径长度(经过的边数)与该结点上权值的乘积。 树的带权路径长度:树中所有叶结点的带权路径长度之和…

Spring如何解决循环依赖?

Spring中的循环引用 循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A 循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖 ①一级缓存:单例池…

linux系统------------Mysql数据库介绍、编译安装

目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统(DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…

【深度学习】Pytorch中实现交叉熵损失计算的方式总结

在PyTorch中,计算交叉熵损失主要有以下几种方式,它们针对不同的场景和需求有不同的实现方式和适用范围: 1. nn.CrossEntropyLoss 类 这是最常用且方便的方法,特别适用于多分类任务。nn.CrossEntropyLoss 实际上是同时完成了 sof…

前端理论总结(css3)——页面布局方法

瀑布流 优点:节省空间,外表美观,更有艺术性 对于触屏设备非常友好,通过向上滑动浏览 用户浏览时的观赏和思维不容易被打断,留存更容易 缺点:用户…

feign demo

直接上代码 AscendKing/springcloud-feign

Saltstack 最大打开文件数问题之奇怪的 8192

哈喽大家好,我是咸鱼。 今天分享一个在压测过程中遇到的问题,当时排查这个问题费了我们好大的劲,所以我觉得有必要写一篇文章来记录一下。 问题出现 周末在进行压测的时候,测试和开发的同事反映压测有问题,请求打到…