[计算机网络]网络I/O模型

欢迎来到啾啾的博客🐱。
这是一个致力于构建完善的Java程序员知识体系的博客📚,记录学习的点滴,分享工作的思考、实用的技巧,偶尔也分享一些杂谈💬。
欢迎评论交流,感谢您的阅读😄。

引言

我们非常有必要了解I/O模型,以Java微服务为例,微服务架构中的网关Gateway与共享缓存Redis的核心设计的理解都离不开网络I/O。

5种I/O模型

当一次网络请求发生时,将会按顺序经历“等待数据从远程主机到达缓冲区”和“将数据从缓冲区复制到应用程序网络地址空间”两个阶段
根据实现这两个阶段的不同方法,人们把网络I/O模型总结为两类、五种模型:两类是指同步I/O与异步I/O,五种是指在同步I/O中又划分出阻塞I/O、非阻塞I/O、多路复用I/O、信号驱动I/O四种细分模型以及异步I/O模型。

这里划重点,两个阶段🌟,后续5种I/O模型差异的理解基于这两个阶段的理解。
1——“等待数据从远程主机到达缓冲区”,书中这个描述理解容易有问题,如果划分成两个阶段,这个阶段的“到达”应该是“等待数据从远程主机到达缓冲区后,经由协议处理,用户进程可以安全读取的有效数据存在与内核缓冲区”。
到达缓冲区 = 数据到达——> 协议处理 ——> 数据就绪
2——“将数据从缓冲区复制到应用程序网络地址空间”
![[Pasted image 20250327130528.png]]

根据UNIX网络编程中的分类,I/O模型分为5种。

其中,同步与异步概念如下:

  • 同步
    调用端在发出请求之后,得到结果之前必须一直等待。
    比如日常代码按顺序执行就是异步,等待前一行代码执行完成然后继续下一行代码。
  • 异步
    发出调用请求之后将立即返回,不会马上得到处理结果,结果将通过状态变化和回调来通知调用者。
    比如使用线程处理任务,主线程继续执行当前任务,这种就是异步。

阻塞和非阻塞是针对请求处理过程而言,指在收到调用请求之后,返回结果之前,当前处理线程是否会被挂起。

以UDP recvfrom(接收数据并获取发送方地址的核心函数)操作为例,五种I/O模型解释如下。

阻塞I/O (Blocking I/O)

等待两个阶段操作都完成,即等待数据到缓冲区、等待数据从缓冲区复制到到应用程序网络地址空间的操作都完成。
阻塞期间,线程会休眠,状态切换开销大。
比如Socket编程就是阻塞I/O。
![[Pasted image 20250327125156.png]]

非阻塞I/O(Non-blocking I/O)

线程定期检查(轮询)数据是否就绪(数据是否已经从完成主机到达缓冲区),减少一阶段无效等待。
非阻塞I/O轮询检查本身也会消耗CPU资源,但可以避免线程休眠,适合一些很快就能返回结果的请求。

![[Pasted image 20250327125242.png]]

需要留意的是,二阶段复制数据 copy_to_user的内存拷贝操作仍可能引起微秒级阻塞(取决于数据量大小)。

多路复用I/O(I/O Multiplexing)

单线程监控多个文件描述符。即单一线程处理多个请求,当有任意请求完成阶段一进入就绪状态,则为其执行阶段二:开始复制数据。

![[Pasted image 20250327135551.png]]

其中监控多个文件描述符细分为select、poll、kqueue等不同实现。
虽然描述是单个线程的多路复用,但是一般并发处理的设计是“线程池+多路复用”。

信号驱动I/O(Signal-driven I/O)

内核通过信号(信号处理函数)通知就绪状态。

信号驱动I/O和异步I/O的区别在于,信号驱动是通知阶段一完成,可以开始阶段二,异步则是通知阶段二完成。

![[Pasted image 20250327140641.png]]

异步I/O(Asynchronous I/O)

全流程非阻塞,内核完成所有操作后通知。
异步I/O数据到缓冲区后,不需要由调用进程主动进行缓冲区复制数据到应用程序网络地址空间的操作,而是复制完成后由操作系统向线程发送信号。

![[Pasted image 20250327141231.png]]

高并发选择

模型阻塞阶段用户参与度典型应用场景
阻塞I/O全程阻塞被动等待简单客户端程序
非阻塞I/O数据拷贝阶段主动轮询低并发实时系统
I/O多路复用select阻塞,拷贝阻塞集中管理Web服务器(Nginx)
信号驱动I/O仅拷贝阶段异步通知特殊设备监控
异步I/O无阻塞完全托管高性能服务器(Proactor模式)

在高并发场景下推荐使用I/O多路复用或异步I/O模型。
相较于其他I/O模型,这两种模型没有阻塞I/O模型的休眠成本、没有非阻塞I/O模型的轮询成本、也没有信号I/O模型处理上下文切换的成本。
且多路复用I/O意味着在同样的线程数下,线程池能处理更多的请求。
而异步I/O相较于多路复用I/O则减少了通知处理次数,且多个请求不用等待一个线程延迟更低。

关于高并发场景,细讲还有多路复用优化、异步的io_uring高级特性,还有不同并发量级的选择策略等。
多路复用瓶颈:就绪事件>线程池处理能力任务堆积怎么办?
异步瓶颈:SQ(提交队列)环大小限制批量提交规模(Linux io_uring默认4096 entries)
……
等等,I/O还有很多很多可以学习,本篇先到此为止,感谢您的阅读。

推荐阅读

【linux内核】五大经典IO模型(原理+动图+代码详解)

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

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

相关文章

Vue中使用JsonView进行JSON数据展示

前言 最近在开发公司的管理系统的操作日志模块,要查看某条操作日志的请求参数,要将请求的参数以 JSON 格式的形式展示出来,于是用到了Vue-JSON-Viewer 这个插件。 一、Vue-JSON-Viewer 基础入门 插件简介 Vue-JSON-Viewer 是一个用于在Vue项…

vue vue3 走马灯Carousel

背景: 在项目中需要展示多张图片,但在页面上只有一张图片的有限位置,此时考虑使用轮播图实现多张图片的展示。element组件官网有走马灯Carousel的组件详细介绍。 实现效果: 官网链接:点击跳转 核心代码: …

重学vue3(三):vue3基本语法及使用

组合式 API是vue3 的核心特性&#xff0c;替代 Vue2 的选项式 API&#xff0c;强调逻辑复用和代码组织。基本语法如下&#xff1a; <script setup> import { ref, reactive, computed, onMounted } from vue;// 1. 响应式数据 const count ref(0); // 基本类…

Spring Boot分布式项目异常处理实战:从崩溃边缘到优雅恢复

当单体应用拆分成分布式系统&#xff0c;异常就像被打开的潘多拉魔盒&#xff1a;RPC调用超时、分布式事务雪崩、第三方接口突然罢工…在最近的电商大促中&#xff0c;我们的系统就经历了这样的至暗时刻。本文将用真实代码示例&#xff0c;展示如何构建分布式异常处理体系。 一…

导出sql命令

除了之前提到的 \G 命令&#xff0c;以下是其他优化 MySQL 查询结果显示的方法&#xff0c;供你参考&#xff1a; --- ### 1. **使用 \T 命令导出结果到文件** - 在 MySQL 命令行中&#xff0c;使用 \T 文件名 可以将查询结果以表格形式导出到指定文件&#xff0c;便于后续…

TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“

原因&#xff1a; 初始化时处于内网环境下&#xff0c;Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复&#xff1a; vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题

深度解析 BPaaS:架构、原则与研发模式探索

在当今复杂多变的业务环境下&#xff0c;软件开发面临着诸多挑战&#xff0c;如何有效地管理业务复杂性并实现系统的可扩展性成为关键。BPaaS应运而生&#xff0c;它作为一种创新的理念和架构模式&#xff0c;改变着企业研发的方式。本文将深入探讨 BPaaS 是什么&#xff0c;以…

如何在linux中部署dns服务 主备dns (详细全过程)

环境centos 7.9 主DNS&#xff1a;192.168.60.131 备DNS&#xff1a;192.168.60.134 我以 chenxingyu0.com 指向 192.168.60.200为例 首先是主dns #!/bin/bash# 检查是否为 root 用户 if [ "$(id -u)" ! "0" ]; thenecho "请使用…

操作系统导论——第13章 抽象:地址空间

一、早期系统 从内存来看&#xff0c;早期的机器并没有提供多少抽象给用户。基本上&#xff0c;机器的物理内存如图13.1所示 操作系统曾经是一组函数&#xff08;实际上是一个库&#xff09;&#xff0c;在内存中&#xff08;在本例中&#xff0c;从物理地址0开始&#xff09;&…

云端存储新纪元:SAN架构驱动的智能网盘解决方案

一、企业存储的"不可能三角"破局 1.1 传统存储架构的困局 性能瓶颈&#xff1a;NAS架构在1000并发访问时延迟飙升300%容量限制&#xff1a;传统RAID扩容需停机维护&#xff0c;PB级存储扩展耗时超48小时成本矛盾&#xff1a;全闪存阵列每TB成本高达$3000&#xff0…

Android adb自身调试log开关

本文介绍下如何打开adb源码中的debug log 1.adb源码log是可以动态打开和关闭的&#xff0c;控制逻辑代码如下 static NoDestructor<std::mutex> log_mutex; static NoDestructor<CachedProperty> log_property GUARDED_BY(log_mutex)("debug.adbd.logging&q…

Axure RP 9.0教程: 基于动态面板的元件跟随来实现【音量滑块】

文章目录 引言I 音量滑块的实现步骤添加底层边框添加覆盖层基于覆盖层创建动态面板添加滑块按钮设置滑块拖动效果引言 音量滑块在播放器类APP应用场景相对较广,例如调节视频的亮度、声音等等。 I 音量滑块的实现步骤 添加底层边框 在画布中添加一个矩形框:500 x 32,圆…

rocky linux 与centos系统的区别

Rocky Linux 和 CentOS 都是基于 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的社区发行版&#xff0c;但两者在目标定位、更新策略和社区管理上有显著差异。以下是核心区别的详细对比&#xff1a; 一、背景与定位 特性Rocky LinuxCentOS起源由 CentOS 联合创始人…

洛谷题单1-B2002 Hello,World!-python-流程图重构

题目描述 编写一个能够输出 Hello,World! 的程序。 提示&#xff1a; 使用英文标点符号&#xff1b;Hello,World! 逗号后面没有空格。H 和 W 为大写字母。 输入格式 无 输出格式 无 输入输出样例 #1 输入 #1 无输出 #1 Hello,World!方式-print() 代码 class Solut…

网络基础-路由器和交换机工作配置

三、路由器和交换机的工作原理配置以及华为体系下的小型网络的搭建 3.1路由基础 3.1.1数据转发 通过链路层交换机和网络层路由器进行数据转发 交换机&#xff08;链路层&#xff09;mac地址表的数据转发路由器&#xff08;网络层&#xff09; ip路由表的数据转发 隔离广播域…

爱普生SG-3031CMA有源晶振在汽车雷达中的应用

随着自动驾驶技术的普及&#xff0c;汽车雷达已成为高级驾驶辅助系统&#xff08;ADAS&#xff09;和自动驾驶系统的核心感知组件。雷达模块需要精确的时钟信号来确保发射/接收时序的准确性、信号处理的同步性以及低功耗运行。这些系统对时钟信号的稳定性、抗干扰性及环境适应性…

案例实践 | 招商局集团以长安链构建“基于DID的航运贸易数据资产目录链”

概览 案例名称 基于DID的航运贸易数据资产目录链 业主单位 招商局集团 上线时间 2024年10月 用户群体 供数用数企业和个人 用户规模 集团内20企业 案例背景 招商局集团深入落实“促进数据高效流通使用、赋能实体经济”精神&#xff0c;深化集团数字化水平&#xff0c…

【docker】docker-compose安装RabbitMQ

docker-compose安装RabbitMQ 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09;2、启动mq3、访问mq4、查看服务器映射目录5、踩坑5.1、权限不足 1、配置docker-compose.yml文件&#xff08;docker容器里面的目录请勿修改&#xff09; versi…

Maven工具学习使用(二)——Maven基础用法

pom常见属性说明 详细见官方文档说明 https://maven.apache.org/ref/3.8.6/maven-model/maven.html#class_releases <modelVersion>4.0.0</modelVersion> POM模型的版本 <groupId>org.apache.maven.plugins</groupId> 项目属于哪个组&#xff…

蓝桥杯高频考点——二分(含C++源码)

二分 基本框架整数查找&#xff08;序列二分的模版题 建议先做&#xff09;满分代码及思路solution 子串简写满分代码及思路solution 1&#xff08;暴力 模拟双指针70分&#xff09;solution 2&#xff08;二分 AC&#xff09; 管道满分代码及思路样例解释与思路分析solution 最…