网络IO模型之多路复用器.md

多路复用是什么?怎么理解?

本文主要涉及为

程序中处理网络IO时的模型,对于系统内核而言网络IO模型。这里只做普及使用

前置知识,什么是IO?怎么理解IO

IO其实就是In和Out。中文翻译是输入和输出,只要涉及到输入和输出的,我们都可以称之为IO。

例如你在磁盘中读取文件,读取文件为In,输出到其他地方为Out。

例如你Windows系统在网络通信时,读取客户端的输入数据包,这叫In,系统将数据包输出给我们编写的应用程序,这叫Out。

当然,我们如果成自身程序的角度去看网络通信的话,我们根据系统内核给予的文件描述符去获取TCP连接数据时,这就叫In,将数据输出到其他位置,这叫Out。

所以,我们可以总结,IO其实就是输入输出,它是对输入输出这个动作的统称,并不仅限于磁盘、网络等。

当然,IO相关的设备有很多,比如鼠标、触摸屏、NFC等

对于系统而言,处理IO有什么模型?

这里的系统,指的是Windows内核程序、Linux内核程序。

我们要知道,一个TCP连接到达服务器后,该连接是由系统内核程序进行管控的,它维护这条连接和上层应用与之交互的过程。

回到正题,我们今天说的是系统内核层面的IO模型情况,至于应用程序层的IO模型我会一笔带过。

同步模型

画个图更好理解:

这张图中,注意我们的业务程序中线程是需要不停的读取TCP连接通道中的数据,我们可以称之为为read操作。而本质上业务程序一直不停的主动读取数据的这种情况,本质上就是一个同步模型,因为始终是应用程序主动来读取的。

此时如果我们的线程,read数据没有的话,一直等待读取到数据的这个操作,对于我们业务程序而言,就是阻塞模型。而业务程序如果读取read后发现没有数据,直接跳过,这个就是非阻塞模型。至于业务程序读取到数据后,自身如何去操作,其实就是业务层面的同步和异步模型。

说到这里,你应该也明白了,系统内核层面的IO模型和我们业务程序层面的IO模型是可以完全不相关的。举个例子,我们先不谈系统内核层面,只说应用程序,应用程序读取到数据后,读取数据的线程用来处理业务,那就是同步模型;而应用程序读取数据的线程不参与业务处理,只处理网络连接的事情,当其他业务处理线程执行完业务逻辑后再让处理连接的线程响应数据,这就是异步模型。

那么此时你会有疑问,每次都要应用程序主动去读取,这太浪费资源了,应用程序能不能等数据来,而不是主动去找内核要,那么就代表着系统内核级别上有没有异步模型的存在?

实际上是有的,我们马上来描述。

异步模型

我们可以假想一下它的模型:

其实真实的内核异步网络IO的比这个图大很多,这里为了方便理解,做了一些简化。

从这张图我们可以知道,内核要实现异步的网络IO本身是可以实现的,但要注意,其实内核的异步IO应用并不广泛,原因如下:

1、内核实现难度增大,出问题的风险更大:内核要实现异步IO要比同步复杂得多,涉及到回调函数、事件循环等概念,要知道内核程序对稳定性要求极高,因为它是整个程序运行最基础的部分,增加复杂度则意味着增加风险。

2、性能考虑:虽然异步IO理论上可以提高性能,但在某些情况下,它可能不会带来显著的性能提升,尤其是当系统已经通过其他方式(如多线程或多路复用)进行了优化时。

3、内核实现限制:在Linux系统中,真正的异步IO模型发展面临一些挑战,特别是内核实现上的限制和历史遗留问题。例如,Linux的io_uring虽然是真在往异步IO发展,但在某些领域(如网络IO)还是基于epoll这种IO多路复用机制更加稳定和成熟。

等等还有很多理由可以说,总体来说,内核的异步IO应用不广泛主要是在于复杂度与稳定性上,但还有一个重要因素,也就是IO多路复用模型的实现。

IO多路复用模型

前面铺垫那么多,就是为了引出IO多路复用模型。

我们前面说了异步IO模型的本质是为了提高性能,而在内核层面上为了提高这个性能付出的代价未免太大了一点,那么就需要产生一个折中的办法。

这个折中的办法需要满足以下条件:

​ 1、应用程序不能一直去等待读取数据,节约线程资源。

​ 2、内核方面不能用异步操作,保持原来同步读的模型。

那么**【多路复用】**就能满足这两个条件,多路复用模型如图所示:

内核提供多路复用器,多路复用器中会监听各个网络TCP连接的状态,然后业务程序方面有专门的线程用来不停往多路复用器处查询连接状态,当发现有连接的状态发生变更后,就通知其他对应的线程去读取数据。

这样就达到了我们前面说的两个条件,应用程序无需一直反复尝试读取连接中的数据,而内核也无需实现异步模型。

在目前的环境下,绝大多数系统和应用都是使用这类模型来处理网络请求,例如Windows的IOCP,Linux的epoll,而业务程序方面代表性最强的则是Netty。

当然,多路复用可不是这一点讲清楚的,这里让大家对多路复用的基本原理有个了解,其实在上图中每一个涉及的点都有不同的实现方式,可以自行网上搜索了解下。

那么最后做个总结:

​ 1、业务程序自身处理IO和内核处理IO是无关的,本身是两个层面。

​ 2、内核层面绝大多数都是同步模型,此时加入多路复用后性能已经足够当下环境的需求,而异步模型由于复杂度和稳定性问题普及并不广泛。

​ 3、多路复用器不仅仅用于IO方面,其他很多场景都可以使用,所以多路复用器我们要理解其模型,而不能限定于IO。

​ 4、在Java层面,多路复用器在JVM的NIO包中已经实现好了,我们只管用就行,而当我们使用了Netty这类集成框架后,大多数情况下我们并不需要关系底层的内容

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

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

相关文章

clone()方法

在Java中,clone() 方法是一个非常有趣且强大的工具,用于创建对象的一个副本。这个方法位于 Object 类中,因此可以被所有类使用。让我们讨论一下它的几个要点: 什么是克隆? 克隆就是创建一个对象的新副本,这…

2005-2022全国及各省家庭承包耕地流转总面积及经营耕地面积数据(无缺失)

2005-2022全国及各省家庭承包耕地流转总面积及经营耕地面积数据(无缺失) 1、时间:2005-2022年 2、范围:全国及30省 3、指标:家庭承包耕地流转总面积、家庭承包经营耕地面积、土地流转率、 4、来源:农村…

《web应用技术》第十一次课后作业

验证过滤器进行权限验证的原理。 创建Filter: package com.example.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.IOException;WebFilter(urlPatterns "/*") public class DemoFilter implements Filter …

adobe pdf设置默认打开是滚动而不是单页视图

上班公司用adobe pdf,自己还不能安装其它软件。 每次打开pdf,总是默认单页视图,修改滚动后,下次打开又 一样,有时候比较烦。 后面打开编辑->首选项, 如下修改,下次打开就是默认滚动了

Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现

Rqtz : 个人主页 ​​ 共享IT之美,共创机器未来 ​ Sharing the Beauty of IT and Creating the Future of Machines Together 目录 项目背景 ​编辑​专有名词介绍 服务器GUI展示 功能(位置见上图序号) 客户端GUI展示(h5cssjs&#xf…

flask的进阶使用方法

【 一 】一对多关系 # 1 一对一 [本质就是一对多--》多的那个唯一] # 2 一对多 # 3 多对多1.1 关系 #### 一对多关系 class Hobby(Base):__tablename__ hobbyid Column(Integer, primary_keyTrue)caption Column(String(50), default篮球)def __str__(self):return sel…

pydub、ffmpeg 音频文件声道选择转换、采样率更改

快速查看音频通道数和每个通道能力判断具体哪个通道说话;一般能量大的那个算是说话 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

Android10以上实现获取设备序列号功能

Android10以上实现获取设备唯一标识,目前只支持华为和荣耀设备。实现原理:通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…

Zoom使用的基本步骤和注意事项

Zoom是一款功能强大的视频会议软件,广泛应用于远程办公、在线教育、团队协作等多个场景。以下是Zoom使用的基本步骤和注意事项: 一、注册与登录 注册Zoom账户: 访问Zoom官方网站(如zoom.us),点击“注册”…

mybatis实现动态sql

第一章、动态SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特…

[ C++ ] 深入理解模板( 进 阶 )

目录 非类型模板参数 类模板没有实例化的情况 模板的特化 注意函数特化中遇到的问题 建议:(直接使用函数重载) 类模板特化 全特化 偏特化 偏特化有以下两种表现方式: 部分特化(将模板参数类表中的一部分参数特化…

旅游系统(附管理端+前台)PHP源码

一. 前言 今天小编给大家带来了一款可学习,可商用的,旅游系统 源码,支持二开,无加密。支持景点管理,登录,景点预定,意见反馈,统计等功能。详细界面和功能见下面视频演示。 二. 视频…

【flutter问题记录】 无效的源发行版:17

问题描述 在看开源项目的时候,clone下来后一直编译失败,提示:无效的源发行版:17,看描述大概是jdk的版本问题,但是在Android studio各种指定都无用,网上资料也没有flutter项目的解决方案,最后在…

广州自闭症机构哪家好?

在广州,众多的自闭症康复机构中,星贝育园自闭症儿童康复学校以其独特的优势脱颖而出。 一、专业的师资团队 我们拥有一支经验丰富、专业素养极高的师资队伍。每位老师都经过严格的专业培训,深入了解自闭症儿童的特点和需求。他们不仅具…

深入挖掘海外快手kwai ads推广巴西slots手游广告独家优势

深入挖掘海外快手kwai ads推广巴西slots手游广告独家优势 在数字化时代,广告投放已成为各行各业不可或缺的一部分,特别是在游戏行业,如何有效地推广游戏产品,吸引玩家的眼球,成为了每一个游戏开发商和广告主所关注的焦…

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE:大模型 对比学习,从关键词相似度搜索到语义搜索 提出背景流程图解法拆解类比1. 单一文档嵌入空间的搜索2. 指令跟随型语言模型(InstructLM)的引入3. 生成文档的嵌入编码 提出背景 论文:https://…

python怎么样将一段程序无效掉

1、python中可以用注释屏蔽一段语句,具体方法如下,首先打开一段python的示例程序: 2、然后单行注释的方法是在语句前面加上#,程序运行后添加注释的地方的语句会被自动跳过,这里可以看到将打印变量a的语句添加注释就没有…

【实验室精选】PFA反应瓶带鼓泡球 高效气体鼓泡 化学分析优选

PFA反应瓶带鼓泡球是一种特殊设计的实验室容器,它集成了鼓泡球和PFA(全氟烷氧基)材料的反应瓶,用于气体的鼓泡和液体的混合。以下是它的一些特点和用途: 特点: 鼓泡球设计:鼓泡球周围布满小孔&…

界面材料知识

界面材料是用于填充芯片和散热器之间的空隙,将低导热系数的空气挤出,换成较高导热系数的材料,以提高芯片散热能力。参考下图 图片来源网上 热阻是衡量界面材料性能最终的参数,其中与热阻有关的有: 1、导热系数&#x…