[计算机网络]网络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.rhkb.cn/news/42397.html

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

相关文章

MyBaitis-Plus 使用动态表名 selectPage 不生效

在使用 MyBatis-Plus 时,采用动态表名策略后,selectPage 方法无法正常生效。 MyBatis-Plus动态表名插件配置MyBatis-Plus动态表名失效原因MyBatis-Plus动态表名失效解决办法 MyBatis-Plus动态表名插件配置 以下是我项目中 MyBatis - Plus 的插件配置&am…

C语言基础—构造类型

数据类型 1.基本类型/基础类型 整型 短整型:short[int] --2字节 基本整型:int --4字节 长整型:long[int] --32位4字节/64位8字节 长长整型:long long [int] (C99) 注意:以上类型又都分为sig…

交流电机类型及其控制技术

交流电机可分为同步电机和异步电机两大种类,如果电机转子的转速与定子旋转磁场的转速相等,转子与定子旋转磁场在空间同步地旋转,这种电机就称为同步电机。如果电机转子的转速不等于定子旋转磁场的转速,转子与定子旋转磁场在空间旋…

「HTML5+Canvas实战」星际空战游戏开发 - 纯前端实现 源码即开即用【附演示视频】

纯前端实现星际空战游戏【简易版】 博主上次分享的简易版飞机大战收到了不少建议,今天再给大家来一波福利!带来全新升级的飞机大战进阶版!不仅拥有更丰富的游戏机制和更精美的游戏画面,还加入了超燃的BOSS战斗系统。源码完全免费开放,拿来即用无门槛,欢迎感兴趣的小伙伴…

7-项目负责人-添加产品

点击一个项目集,进入项目集的页面。可以进行产品、项目、人员和干系人的管理。 点击“添加产品”,为该项目集添加关联产品。一个项目集可以关联多个产品。还可以通过“产品线”管理一些列产品。 产品。

深度赋能!北京智和信通融合DeepSeek,解锁智能运维无限可能

在数字化飞速发展的今天,传统运维模式面临着设备规模激增、故障复杂度攀升、人工响应滞后等多重挑战。随着DeepSeek、腾讯元宝等AI大模型的兴起,为传统运维模式带来了新的变革。 北京智和信通基于DeepSeek大模型技术,将AI和运维场景深度融合&…

flex和bison笔记

文章目录 flex语法:定义部分:规则部分:flex全局变量:yyin: bison和flex联合编译: flex词法分析 bison语法分析 flex有两种使用方式,一种是flex单独做一个词法分析程序,另一种是flex和bison协同构建一个词法语法分析程序 我们在北…

rbpf虚拟机-call指令

文章目录 一、概述背景知识 二、call 指令的主要方法2.1 注册辅助函数2.2 执行辅助函数 三、完整代码示例与详解3.1 示例辅助函数3.2 测试虚拟机的 call 指令测试代码代码解析 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [rbpf虚拟机-call指令] ❤博主广交技术…

Java构造函数与普通函数

1.概解 tips: 1.声明函数主要用public/private,public可以在其他函数中访问。 2.public后面跟函数返回类型,void表示无返回值。 3.main函数是自动执行的构造函数,而其他函数除非被调用则不会被自动执行 运行结果&#xff1a…

MySQL: 创建两个关联的表,用联表sql创建一个新表

MySQL: 创建两个关联的表 建表思路 USERS 表:包含用户的基本信息,像 ID、NAME、EMAIL 等。v_card 表:存有虚拟卡的相关信息,如 type 和 amount。关联字段:USERS 表的 V_CARD 字段和 v_card 表的 v_card 字段用于建立…

A2 最佳学习方法

记录自己想法的最好理由是发现自己的想法,并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈: 做培训或者写文章&#xff…

六十天前端强化训练之第三十二天之Babel 转译配置大师级深度讲解

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、核心概念与知识体系详解 1. Babel 工作原理全景解析 二、完整配置方案(带详细注释) 1. 进阶版 .babelrc 配置 2. Webpack 集成配置&#xff08…

Linux 下安装和使用 Jupyter Notebook

Jupyter Notebook / Lab 是 Python 开发和数据分析中不可或缺的工具。为了避免环境污染,推荐使用虚拟环境方式安装并启动它。本教程将教你如何: 安装 Python、pip、venv使用虚拟环境安装 Jupyter设置登录密码启动并远程访问编写一个一键启动脚本&#x…

【云成本优化案例】K8s计费探针让跨境电商企业节省30%云预算

01. 财务“谜案”:消失的30%云预算 "我们的K8s集群资源利用率高达78%,但业务部门总说云账单对不上。"某跨境电商企业CTO的报案记录,揭开了一场云原生时代的财务谜案。该企业技术团队自查了所有资源配额和HPA配置,却始…

PyTorch 分布式训练(Distributed Data Parallel, DDP)简介

PyTorch 分布式训练(Distributed Data Parallel, DDP) 一、DDP 核心概念 torch.nn.parallel.DistributedDataParallel 1. DDP 是什么? Distributed Data Parallel (DDP) 是 PyTorch 提供的分布式训练接口,DistributedDataPara…

蓝桥杯[每日一题] 真题:连连看

题目描述 小蓝正在和朋友们玩一种新的连连看游戏。在一个 n m 的矩形网格中,每个格子中都有一个整数,第 i 行第 j 列上的整数为 Ai, j 。玩家需要在这个网格中寻找一对格子 (a, b) − (c, d) 使得这两个格子中的整数 Aa,b 和 Ac,d 相等,且它…

Linux环境下安装部署Docker

windows下连接Linux: 打开终端: //ssh远程连接 ssh root192.168.xx.xx//输入账号密码 root192.168.xx.xxs password: ssh连接成功! 安装Docker: //安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 …

k近邻算法K-Nearest Neighbors(KNN)

算法核心 KNN算法的核心思想是“近朱者赤,近墨者黑”。对于一个待分类或预测的样本点,它会查找训练集中与其距离最近的K个样本点(即“最近邻”)。然后根据这K个最近邻的标签信息来对当前样本进行分类或回归。 在分类任务中&#…

Appium中元素定位之一个元素定位API

应用场景 想要对按钮进行点击,想要对输入框进行输入,想要获取文本框的内容,定位元素是自动化操作必须要使用的方法。只有获取元素之后,才能对这个元素进行操作。 在 Java 中使用 Appium 定位元素时,可以通过多种方式…

Dify 服务器部署指南

1. 系统要求 在开始部署之前,请确保你的服务器满足以下要求: 操作系统:Linux(推荐使用 Ubuntu 20.04 或更高版本)内存:至少 4GB RAM存储:至少 20GB 可用空间网络:稳定的互联网连接…