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将数据存储在文件系统中的存储…

隐语技术架构

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

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

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

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

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

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

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

一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧

作为一名互联网技术爱好者,我对数据的探索充满热情。在本文中,我将以豆瓣读书为案例,详细介绍如何利用Python爬虫、Pandas和Excel这三大工具,一键化地实现数据采集和存储。豆瓣读书作为一个备受推崇的图书评价平台,拥有…

亮剑AIGC,紫光云能否胜人一筹?

【全球云观察 | 科技热点关注】 扎实创新每一步, 先人一步快人一步。 2023年全球科技行业最火的莫过于生成式AI,即Artificial Intelligence Generated Content。在迈向生成式AI的道路上,虽然说不上千军万马,但是国内…

Python学习笔记------文件操作

编码 编码就是一种规则集合,记录了内容和二进制间进行相互转换的逻辑。 编码有许多中,我们最常用的是UTF-8编码 计算机只认识0和1,所以需要将内容翻译成0和1才能保存在计算机中。同时也需要编码,将计算机保存的0和1&#xff0c…

2.4 如何运行Python程序

如何运行Python程序? Python是一种解释型的脚本编程语言,这样的编程语言一般支持两种代码运行方式: 1) 交互式编程 在命令行窗口中直接输入代码,按下回车键就可以运行代码,并立即看到输出结果;执行完一行…

ReentrantLock加锁分析

1、ReentrantLock中其实是有一个AQS的子类实例的成员变量sync; 2、实际是调用的Sync中的lock;Sync是AQS的子类;Sync有两个子类,公平与非公平;默认为非公平;如下是非公平加锁分析; public Reentr…

Visual Basic6.0零基础教学(4)—编码基础,数据类型与变量

编码基础,数据类型与变量 文章目录 编码基础,数据类型与变量前言一、VB中的编程基础二、VB的基本字符集和词汇集1、字符集2、词汇集 VB中的数据类型VB中的变量与常量一.变量和常量的命名规则二.变量声明1.用Dim语句显式声明变量三. 常量 运算符和表达式一. 运算符 1. 算术运算符…

获取Book里所有sheet的名字,且带上超链接

应用背景: 当一个excel有很多sheet的时候,来回切换sheet会比较复杂,所以我希望excel的第一页有目录,可以随着sheet的增加,减少,改名而随时可以去更新,还希望有超链接可以直接跳到该sheet。 可以…

06-验证浮点数输入

鉴于shell脚本的限制和本事,浮点数(或“实数”)的验证过程乍一看似乎让人望而生畏,不过考虑到浮点数只不过是由小数点分隔的两个整数,再配合能够在脚本中引用其他脚本的能力(validint)&#xff…

【爬取网易财经文章】

引言 在信息爆炸的时代,获取实时的财经资讯对于投资者和金融从业者来说至关重要。然而,手动浏览网页收集财经文章耗时费力,为了解决这一问题,本文将介绍如何使用Python编写一个爬虫程序来自动爬取网易财经下关于财经的文章 1. 爬…

前端基础 Vue -组件化基础

1.全局组件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&…