【OS】深入理解Linux的五种IO模型
最近逛论坛在知乎看到一篇非常不错的文章,遂收藏,分享给大家
又加深了对io模型的理解
知乎一篇文章:深入理解Linux的五种IO模型
Linux的五种IO模型
阻塞I/O (Blocking I/O)
• 特点:进程在数据准备和拷贝阶段均被挂起,直到操作完成
• 流程:
- 调用
recvfrom()后线程阻塞 - 内核等待数据到达内核缓冲区
- 数据从内核空间拷贝到用户空间
- 函数返回成功
• 优点:实现简单,适合低并发场景
• 缺点:每个连接需独立线程/进程,资源消耗大
非阻塞I/O (Non-blocking I/O)
• 特点:立即返回EWOULDBLOCK错误码,需轮询检查状态
• 流程:
- 调用
recvfrom()立即返回(无数据时返回错误) - 进程持续轮询检查数据状态
- 数据就绪后完成拷贝
• 优点:避免线程阻塞
• 缺点:CPU空转消耗高,实时性差
I/O多路复用 (I/O Multiplexing)
• 核心机制:通过select/poll/epoll监控多个文件描述符
• 工作流程:
- 将多个fd注册到监听集合
- 调用
select()阻塞等待任一fd就绪 - 遍历就绪fd进行数据读写
• 技术对比:
• select:位图管理,有1024fd限制
• poll:链表实现,无数量限制
• epoll:回调机制,性能最优
• 优点:单线程处理多连接,高并发场景首选
信号驱动I/O (Signal-driven I/O)
• 原理:通过SIGIO信号通知数据就绪
• 流程:
- 注册信号处理函数(如
sigaction) - 内核发送
SIGIO信号通知数据就绪 - 在信号处理函数中调用
recvfrom()
• 优点:避免轮询消耗
• 缺点:信号处理复杂,TCP适用性有限
异步I/O (Asynchronous I/O)
• 核心特征:内核完成全部操作后通知进程
• 流程:
- 调用
aio_read()立即返回 - 内核自主完成数据准备和拷贝
- 通过回调或信号通知进程
• 与同步I/O的本质区别:数据拷贝由内核发起
• 优点:完全非阻塞,性能最高
• 缺点:实现复杂,需内核支持(Linux 2.6+)
关键对比
| 模型 | 等待阶段是否阻塞 | 拷贝阶段是否阻塞 | 触发方式 |
|---|---|---|---|
| 阻塞I/O | 是 | 是 | 同步 |
| 非阻塞I/O | 否(轮询) | 是 | 同步 |
| I/O多路复用 | 是(select阻塞) | 是 | 同步 |
| 信号驱动I/O | 否 | 是 | 同步(信号) |
| 异步I/O | 否 | 否 | 异步 |
典型应用场景
• 阻塞I/O:简单客户端工具
• epoll多路复用:Nginx/Redis等高并发服务器
• 异步I/O:大规模存储系统(如数据库)
相关文章:
【OS】深入理解Linux的五种IO模型
最近逛论坛在知乎看到一篇非常不错的文章,遂收藏,分享给大家 又加深了对io模型的理解 知乎一篇文章:深入理解Linux的五种IO模型 Linux的五种IO模型 阻塞I/O (Blocking I/O) • 特点:进程在数据准备和拷贝阶段均被挂起ÿ…...
67 款 App 因违规收集个人信息被通报 隐私合规检测成重新上架门槛
4 月 22 日,国家网络与信息安全信息通报中心通报 67 款违法违规收集使用个人信息的移动应用,涉及教育、金融、政务等多个领域。此次通报是 2025 年个人信息保护专项行动的重要成果,依据《网络安全法》《个人信息保护法》等法律法规࿰…...
前端热门面试题day1
内容回答较粗糙,如有疑问请自行搜索资料 什么是vue中的slot?它有什么作用 Vue中的Slot(插槽)就像给组件预先留的“内容停车位”,让父组件能把自定义内容“塞”到子组件的指定位置。它的主要作用是: 灵活定…...
华为AR1200 telnet设置
华为路由配置TELNET登 📺 启动TELNET服务 在华为路由器上启动TELNET服务,执行以下命令: telnet server enable 🔑 配置AAA认证 进入AAA认证配置,创建一个路由器登录帐号admin123,并设置密码为huawei123&…...
基于ESP32 - S3的MD5校验算法的C语言例程
下面是一个基于ESP32 - S3的MD5校验算法的C语言例程。在ESP32 - S3上实现MD5校验,你可以使用ESP-IDF(Espressif IoT Development Framework)提供的功能。 步骤: 创建项目:使用ESP-IDF创建一个新的项目。编写代码&…...
django软件开发招聘数据分析与可视化系统设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
摘要 时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,招聘信息管理系统当然不能排除在外。软件开发招聘数据分析与可视化系统是在实际应用和软件工程的开发原理之上,运用Python语言…...
Maven中的(五种常用依赖范围)
Maven 定义了 五种常用依赖范围(scope),它们控制着: 哪些依赖会编译时参与哪些依赖会打包进 WAR/JAR哪些依赖会传递给其他模块哪些依赖只在测试中才有效 Maven 常用的依赖范围(scope) scope编译需要测试需…...
Python内置函数-aiter()
Python内置函数 aiter() 用于获取异步可迭代对象的异步迭代器,是异步编程中的核心工具之一。 1. 基本概念 异步可迭代对象:实现了 __aiter__() 和 __anext__() 方法的对象,支持 async for 循环。 异步迭代器:通过 aiter() 获取的…...
面试篇:Java并发与多线程
基础概念 什么是线程?线程和进程的区别是什么? 线程 是程序执行的最小单位,它是 CPU 调度和执行的基本单元。一个进程可以包含多个线程,这些线程共享进程的资源(如内存),但每个线程有自己的栈…...
Windows 同步技术-计时器队列和内存屏障
计时器队列 CreateTimerQueue 函数为计时器创建队列。 此队列中的计时器(称为 计时器队列计时器)是轻量级对象,可用于指定要在指定到期时间到达时调用的回调函数。 等待作由 线程池中的线程执行。 若要将计时器添加到队列,请调用…...
基于无障碍跳过广告-基于节点跳过广告
2025-04-22 一些广告的关闭是叉图标,获取到的信息也没什么特征,这种广告怎么跳过 用autojs无障碍的节点定位ui控件位置,点击...
内存管理(Linux程序设计)
内存管理 目录 内存管理 一.简单的内存分配 代码功能概述 代码流程图 变量声明 动态内存分配 内存分配错误检查 向内存写入字符串 设置退出状态并退出程序 二.请求全部的物理内存 代码功能概述 变量声明 三..可用内存 四.滥用内存 1.代码功能(预期 …...
element-ui、element-plus表单resetFields()无效的坑
一、基本前提: 1、form组件上必须要有ref 2、form-item上必须要有prop属性 二、新增/编辑用一个el-dialog时,先新增再编辑没问题,先编辑再新增未清空 原因 在没有点新增或着编辑时,我的el-dialog弹出框里的内容是空白的&…...
LeetCode 252 会议室 III(Meeting Rooms III)题解与模拟面试
1. 引言 在现代办公和协作中,会议室的高效利用至关重要。LeetCode 252 题“会议室 III”要求我们在给定一组会议的时间区间后,计算同一时间段内需要开的最少会议室数量,以保证所有会议能顺利进行。本题不仅是经典的区间调度问题变形…...
基于HPC的气候模拟GPU加速实践全流程解析
基于HPC的气候模拟GPU加速实践全流程解析 关键词:气候模型、GPU加速、CUDA编程、性能优化、分布式训练 摘要: 本文针对全球气候模拟中10^12级网格点实时计算需求,提出基于CUDA的并行计算架构。通过改进WRF模式的分块矩阵乘法算法,…...
【CSS】层叠,优先级与继承(三):超详细继承知识点
目录 继承一、什么是继承?2.1 祖先元素2.2 默认继承/默认不继承 二、可继承属性2.1 字体相关属性2.2 文本相关属性2.3 列表相关属性 三、不可继承属性3.1 盒模型相关属性3.2 背景相关属性 四、属性初始值4.1 根元素4.2 属性的初始值4.3 得出结论 五、强制继承5.1 in…...
计算机视觉算法实现——救生衣穿戴状态智能识别
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 一、救生衣穿戴状态识别领域概述 水上安全一直是全球关注的重大问题,据世界卫生组…...
URI、URL与URN详解概念介绍
URI (Uniform Resource Identifier) URI是统一资源标识符,是用于标识互联网上资源的字符串。它是一个用于区分资源的通用标识符,可以标识任何资源,包括文档、图像、服务等。 URI的特点 提供了一种标准方法来标识资源是最广泛的资源标识概念,URL和URN都是URI的子集格式通常…...
Science Robotics 新型层级化架构实现250个机器人智能组队,“单点故障”系统仍可稳定运行
近期,比利时布鲁塞尔自由大学博士生朱炜煦与所在团队提出了一种创新的机器人群体架构——“自组织神经系统”(SoNS,Self-organizing Nervous System)。 它通过模仿自然界中的生物神经系统的组织原理,为机器人群体建立了…...
手写深拷贝函数
在 JavaScript 中,深拷贝是指创建一个对象或数组的完全独立副本,包括其嵌套的对象或数组。这意味着修改副本不会影响原始对象。 以下是手写一个通用的深拷贝函数的实现: 深拷贝函数实现 function deepClone(target, map new WeakMap()) {//…...
React 性能优化三剑客实战:告别无效重渲染!
在 Vue 中我们可能依赖 Vuex computed 进行状态共享和性能优化,而在 React 里呢?不需要用 Redux,靠 useContext、memo、useMemo 三剑客就能构建高性能组件通信方案! 🧩 useContext 再回顾:状态共享不等于性…...
深度学习3.3 线性回归的简洁实现
步骤操作作用前向计算net(X)计算预测值 y_hat Xw b损失计算loss(y_hat, y)量化预测误差,驱动参数更新反向传播l.backward()计算参数梯度参数更新trainer.step()根据梯度调整参数,逼近最优解梯度清零trainer.zero_grad()防止梯度累积(必须放…...
复盘20250422
深度分析及个股推荐 1. 行业前景与个股逻辑梳理 从提供的股票信息来看,主要涉及以下行业:合成尼古丁(电子烟)、化工、跨境支付、跨境电商、农药、食品饮料、光刻机、电子商务、造纸等。需结合行业景气度、政策支持、公司核心竞争…...
从零开始学习MySQL的系统学习大纲
文章目录 前言第一阶段:数据库与 MySQL 基础认知数据库基础概念MySQL 简介 第二阶段:MySQL 安装与环境搭建安装前的准备MySQL 安装过程安装后的配置 第三阶段:SQL 基础语法SQL 概述数据库操作数据表操作数据操作 第四阶段:SQL 高级…...
APP动态交互原型实例|墨刀变量控制+条件判断教程
引言 不同行业的产品经理在绘制原型图时,拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说,高保真动态交互原型不仅可以在开发前验证交互逻辑,还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…...
基于控制台的小车导航游戏开发详解(C++实现)
本文将详细讲解一个基于C控制台的小车导航游戏项目。通过该项目可以学习二维数组操作、队列数据结构应用以及游戏循环控制等核心编程概念,特别适合刚接触游戏开发的初学者学习。 一、项目概述 1.1 游戏规则 玩家可创建多辆具有不同初始位置和移动速度的小车 每辆…...
色谱图QCPColorMap
一、QCPColorMap 概述 QCPColorMap 是 QCustomPlot 中用于绘制二维颜色图的类,可以将矩阵数据可视化为颜色图(热力图),支持自定义色标和插值方式。 二、主要属性 属性类型描述dataQCPColorMapData存储颜色图数据的对象interpol…...
大文件分片上传进阶版(新增md5校验、上传进度展示、并行控制,智能分片、加密上传、断点续传、自动重试),实现四位一体的网络感知型大文件传输系统
上篇文章我们总结了大文件分片上传的主要核心,但是我对md5校验和上传进度展示这块也比较感兴趣,所以在deepseek的帮助下,扩展了一下我们的代码,如果有任何问题和想法,非常欢迎大家在评论区与我交流,我需要学…...
oracle不同数据库版本的自增序列
-- 查看数据库版本 SELECT * FROM v$version WHERE banner LIKE Oracle%; 1. Oracle 12c及以上版本支持 id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) PRIMARY KEY, -- 语法 id NUMBER GENER…...
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试
【KWDB创作者计划】_针对KWDB时序数据库(多副本集群环境)进行压力测试 1. 概述2. 压测环境部署3. 生成测试数据4. 写入性能测试5. 查询性能测试7. 总结 1. 概述 KaiwuDB分布式多模数据库从物联网场景真实需求出发,针对性设计多模架构。物联网…...
