五种IO模型与非阻塞IO目录五种IO模型与非阻塞IO一、五种IO模型1.1.IO效率问题1.2.五种IO模型1.3.同步与异步1.4.阻塞IO1.5.非阻塞IO1.6.信号驱动IO1.7.多路转接1.8.异步IO二、非阻塞IO2.1.fcntl函数2.2.实现阻塞与非阻塞读取一、五种IO模型1.1.IO效率问题IO 等待 拷贝read() → Input缓冲区 → 等待 拷贝write()→ Output缓冲区 → 等待 拷贝单位时间内传递的数据量越大IO效率越高等待时间久单位时间拷贝量少IO效率降低高效IO单位时间内减少IO中等待的比重1.2.五种IO模型钓鱼 等鱼上钩 提鱼进桶 IO人 进程鱼 数据鱼竿 网络套接字河 操作系统 桶 用户缓冲区张三专注钓鱼鱼漂不动他也不动阻塞IO李四不会因为鱼没有上钩而卡在检测鱼漂上非阻塞IO王五在鱼竿顶部装上铃铛鱼上钩反向通知我信号驱动IO赵六拉一卡车的鱼竿共100只在岸边来回等待多路复用/多路转接田七发起钓鱼过程让其他人钓鱼自己干自己的事情异步IO阻塞 VS 非阻塞IO条件不具备阻塞就会卡住直到条件就绪IO条件不具备非阻塞检测到后会出错返回在钓鱼效率上两者没有任何区别而非阻塞做了其他工作效率才高但IO效率一样谁的IO效率最高站在鱼的角度抬头看 100 / 104 个鱼竿是赵六的单位时间内等的比重很低提高了鱼上钩的效率王五是否要等待王五只是不需要检测但他需要参与钓鱼的过程需要提鱼进桶1.3.同步与异步同步IO阻塞、非阻塞、信号驱动、多路复用异步IO异步IO同步 VS 异步IO 等待 拷贝同步IO参与IO等待或者拷贝的任意一个或多个阶段异步IO只发起IO但IO的工作流与自身工作流无关线程同步 VS IO同步线程同步多执行流执行具有一定顺序性IO同步该执行流是否参与IO的任意过程1.4.阻塞IO在内核将数据准备好之前系统调用一直等待所有的套接字默认都是阻塞方式1.5.非阻塞IO如果内核数据没有准备好系统调用会直接返回EWOULDBLOCK错误码非阻塞IO往往需要以循环的方式反复地尝试读写文件描述符也称为非阻塞轮询1.6.信号驱动IO内核将数据准备好时使用SIGIO信号通知应用程序进行IO操作1.7.多路转接能够同时等待多个文件描述符的就绪状态传统接口read/write/recv/send/recvfrom/sendto......既负责等待又负责拷贝select专门负责等待数据准备好后再调用read/write/recv/send/recvfrom/sendto......拷贝select允许一次等待多个文件描述符1.8.异步IO由内核在数据拷贝完成时通知应用程序二、非阻塞IO2.1.fcntl函数作用设置一个文件描述符的属性cmd F_DUPFD复制一个现有的描述符cmd F_GETFD/F_SETFD获得/设置文件描述符标记cmd F_GETFL/F_SETFL获得/设置文件状态标记cmd F_GETOWN/F_SETOWN获得/设置异步IO所有权cmd F_GETLK/F_SETLK获得/设置记录锁2.2.实现阻塞与非阻塞读取阻塞IO#include iostream #include unistd.h int main() { char buffer[1024]; while(true) { ssize_t n read(0, buffer, sizeof(buffer)); if(n 0) { buffer[n - 1] 0; // 去掉回车 std::cout buffer std::endl; } //TODO } }非阻塞IO#include iostream #include cstdio #include unistd.h #include fcntl.h void SetNonBlock(int fd) { int fl fcntl(fd, F_GETFL); if(fl 0) { perror(fcntl); return; } fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 将fd设置为非阻塞 } int main() { SetNonBlock(0); char buffer[1024]; while(true) { // Linux中ctrl d表示读取结束, read返回值是0, 类似读到文件结尾 ssize_t n read(0, buffer, sizeof(buffer)); if(n 0) { buffer[n - 1] 0; // 去掉回车 std::cout buffer std::endl; } else if(n 0) { if(errno EAGAIN || errno EWOULDBLOCK) // 错误码 { // 1. 底层数据没有准备好 std::cout 数据还未准备好...... std::endl; sleep(1); // TODO continue; } else if(errno EINTR) { // 2. 读取被信号中断 continue; } else { // 3. 读取出错 } } else { break; } // sleep(1); // std::cout . : n std::endl; // C也有语言层缓冲区需要进行刷新才能打印 // TODO } }
企业数字化 ERP 产品动态
相关推荐
【C++三方组件】cpp-httplib:一个头文件起 HTTP 服务 【C三方组件】cpp-httplib:一个头文件起 HTTP 服务 【摘要】:cpp-httplib 为 C 提供易于嵌入的 HTTP 服务端与客户端。本文介绍它适合怎样的工具与服务,说明自行处理 HTTP 请求的维护成本,再通过路由、参数、JSON、上传下载、静态… · 2026/9/27 22:53:00
React状态管理这个坑,我是怎么翻车的 去年在做一个实时数据监控项目时,我差点被React的状态管理搞崩心态。项目要求每5秒刷新一次全量数据(约5000条记录),同时支持用户交互过滤。原以为用Redux Toolkit RTK Query能轻松搞定,结果页面在10分钟后就开始卡顿… · 2026/9/27 22:52:53
第03篇-GB-T47241技术导则落地-平台全景架构 第03篇-GB-T47241技术导则落地-平台全景架构 文章目录第03篇-GB-T47241技术导则落地-平台全景架构引言:平台架构的"验收标准"终于来了一、先看准入线:4 项指标 5 个数值的平台门槛二、总体框架:四要素 → 四层架构接入层࿱… · 2026/9/27 22:52:53
基于ROS与Gazebo的AGV工业运输系统仿真实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:30:07
硅碳相变:大模型API选型技术剖析,模型多为何项目更慢 硅碳相变:大模型API选型技术剖析,模型多为何项目更慢
如果你是一位后端工程师或AI应用开发者,大概率在某个深夜对着十几家AI API聚合平台的文档页反复切换过标签。每家都宣称自己接入了几百个模型,价格表长得像一份汇率牌价。真正… · 2026/9/27 23:30:07
Java面试被问Spring循环依赖,这样答加分 三级缓存不是重点,AOP代理才是二级缓存就能解决普通对象的循环依赖:A实例化后放入二级缓存,B创建时能从二级缓存拿到A的早期引用。那为什么还要第三级?因为如果A需要被AOP代理,早期引用必须是代理对象,而不… · 2026/9/27 23:29:54
ab173 JSON懒人工具:零配置、离线、高安全的格式化校验神器 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:54
Windows 10下CH340驱动安装与文件替换实战指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 23:29:54
wordpress做微商城设计对比评测:备案不卡壳的5条黄金法则 wordpress做微商城设计对比评测:备案不卡壳的5条黄金法则 很多老板一上来就问我:为什么我的wordpress做微商城,代码写得很漂亮,后台也配置好了,但就是没法正常访问?答案往往不在代码,而在 备案流程一头雾水 。… · 2026/9/27 23:29:54
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01