首页/新闻资讯/正文详情

Linux 学习笔记(五十五):五种 IO 模型与非阻塞 IO 实战

发布时间:2026/11/5 3:47:17 来源:云帆数科 栏目:资讯中心
Linux 学习笔记(五十五):五种 IO 模型与非阻塞 IO 实战
核心结论TL;DR阻塞 vs 非阻塞阻塞是死等结果非阻塞是立刻返回并轮询。五种 IO 模型阻塞 IO、非阻塞 IO、信号驱动 IO、IO 多路复用epoll、异步 IO。fcntl函数用于修改文件描述符的属性通过设置O_NONBLOCK标志可以将阻塞 IO 变为非阻塞。非阻塞 IO 的陷阱如果在循环中频繁调用非阻塞read会导致 CPU 占用率飙升忙等待通常需要配合epoll等机制使用。一、 为什么说 IO 是后端开发的瓶颈任何 IO 操作都分为两个阶段等待数据就绪和数据拷贝。在实际应用中“等待数据”消耗的时间远大于“拷贝数据”。要想提高 IO 效率核心就是减少程序在“等待”时对 CPU 的占用。二、 五种 IO 模型的“钓鱼”比喻阻塞 IO死盯浮漂鱼不上钩不动弹默认的 read/write。非阻塞 IO扔下鱼竿去干别的过一会看一眼轮询极度耗费体力CPU。信号驱动 IO浮漂上挂铃铛铃响去收杆。IO 多路复用同时看多根鱼竿select/poll/epoll哪一个有动静收哪个高并发服务器的标配。异步 IO雇人钓鱼钓好了直接送嘴边内核把数据拷贝完才通知。三、 实战把阻塞 IO 变成非阻塞void SetNoBlock(int fd) { int fl fcntl(fd, F_GETFL); // 获取状态 fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 设置非阻塞 }利用fcntl修改文件描述符属性后read如果读不到数据就不会死等而是立刻返回-1并设置errno为EAGAIN。我们通过在死循环里判断这个错误码就实现了非阻塞的读取。四、 踩坑记录非阻塞 IO 的忙等待如果在循环里去掉了usleep程序会疯狂地请求 CPU 去查有没有数据导致 CPU 占用率瞬间跑满。为了解决这个问题同时又能在非阻塞的情况下监听多个 socketIO 多路复用epoll应运而生它既能一次监听上万个连接又能在没有数据时让出 CPU。自我实战操作cd ~/linux_study/network_test实战 1体验默认的阻塞 IObashvim io_block.c(输入以下代码)#include stdio.h #include unistd.h int main() { char buf[1024]; printf(请输入内容我会在这里一直死等\n); // read 默认是阻塞的如果没有输入主线程会一直挂起 read(0, buf, sizeof(buf)); printf(你输入了: %s\n, buf); return 0; }(编译并运行gcc io_block.c -o io_block ./io_block)现象程序运行后如果你不敲键盘它就一直卡在那里。这就叫阻塞。实战 2用fcntl将标准输入改为非阻塞vim io_nonblock.c(输入以下代码)#include stdio.h #include unistd.h #include fcntl.h #include errno.h #include string.h // 核心函数将文件描述符设置为非阻塞 void SetNoBlock(int fd) { int fl fcntl(fd, F_GETFL); // 1. 获取当前文件描述符的属性 if (fl 0) { perror(fcntl); return; } fcntl(fd, F_SETFL, fl | O_NONBLOCK); // 2. 在原有基础上加上非阻塞属性 } int main() { SetNoBlock(0); // 0 代表标准输入键盘 char buf[1024]; while (1) { memset(buf, 0, sizeof(buf)); ssize_t n read(0, buf, sizeof(buf) - 1); if (n 0) { printf(你输入了: %s, buf); } else if (n 0) { // 如果没有数据read 会返回 -1并把 errno 设置为 EAGAIN 或 EWOULDBLOCK if (errno EAGAIN || errno EWOULDBLOCK) { // 这里就是经典的“轮询”过程 // 为了不在终端疯狂刷屏我们睡 1 秒 usleep(1000000); } else { perror(read); break; } } } return 0; }(编译并运行gcc io_nonblock.c -o io_nonblock ./io_nonblock)现象程序运行后终端不再卡死而是处于一个“活”的状态。当你敲下键盘并回车它能立刻捕捉到并打印出来。这就是非阻塞 IO。⚠️ 实战排坑别在非阻塞 IO 里写死循环如果你把上面代码里的usleep删掉程序会变成一个死循环CPU 占用率瞬间飙升到 100%这就是经典的“忙等待”。这就引出了我们下一课的重点IO 多路复用epoll它可以在不浪费 CPU 的情况下等待多个文件描述符。

相关推荐

Win7下成功安装深度学习库的完整教程
Win7下成功安装深度学习库的完整教程

这两天我忙着安装那个深度学习库。我是真的尝试了好多遍。CMake、MinGW、BLAS这些东西, 我全部都装了。然后自己试着去编译, 在网上也搜索了一大堆教程。但是不管怎么弄, 就是都没有成功。一直到昨晚的晚上, 我回家把电脑清理干净了。接着我又小心翼翼地重装了一遍。这一次是成… · 2026/11/5 3:47:17

深入讲解底盘KC:给车辆动力学与电控工程师的底盘课|第二篇:从四轮定位到KC(1.前束与外倾)
深入讲解底盘KC:给车辆动力学与电控工程师的底盘课|第二篇:从四轮定位到KC(1.前束与外倾)

上一篇我们聊了 KC 的底层逻辑,以及它为什么是底盘从业者的必修课。很多朋友说 KC 概念还是有点抽象,能不能从更熟悉的东西切入? 这一篇我们就从所有底盘人天天接触的四轮定位讲起 —— 你天天调的前束、外倾、主销参数,本质上都只… · 2026/11/5 3:47:17

一张照片出5种改造效果图:RoomGPT开源AI室内设计工具部署与使用指南
一张照片出5种改造效果图:RoomGPT开源AI室内设计工具部署与使用指南

一张照片出5种改造效果图:RoomGPT开源AI室内设计工具部署与使用指南 【免费下载链接】roomGPT Upload a photo of your room to generate your dream room with AI. 项目地址: https://gitcode.com/gh_mirrors/ro/roomGPT RoomGPT 是一个开源的 AI 室内设计工… · 2026/11/5 3:46:17

TED精读如何训练高阶英语思维与认知能力
TED精读如何训练高阶英语思维与认知能力

1. 项目概述:这不是一节普通英语课,而是一次认知升级的实操训练“跟TED演讲学英文:How AI can save our humanity by Kai-Fu Lee”——这个标题乍看是语言学习类内容,但真正懂行的人一眼就能看出,它根本不是在教“how … · 2026/11/5 4:39:54

PostgreSQL INSERT操作全面指南与性能优化
PostgreSQL INSERT操作全面指南与性能优化

1. PostgreSQL INSERT 操作深度解析PostgreSQL 作为一款功能强大的开源关系型数据库,其 INSERT 语句提供了远超基础数据插入的丰富功能。在实际开发中,合理运用这些特性可以显著提升数据操作效率和可靠性。1.1 基础语法与核心组件INSERT 语句的基础结构包… · 2026/11/5 4:39:54

Python在线考试系统开发:微服务架构与大数据分析实践
Python在线考试系统开发:微服务架构与大数据分析实践

1. 项目概述与设计背景在线考试系统作为教育信息化的重要载体,正在经历从传统纸质考试向智能化评估的转型。我们团队基于Python技术栈开发的这套系统,核心目标是解决三个行业痛点:一是人工阅卷效率低下,二是考试过程监管困难&… · 2026/11/5 4:39:54

MySQL执行机制解析与性能优化实战
MySQL执行机制解析与性能优化实战

1. 项目概述MySQL作为最流行的开源关系型数据库之一,其内部执行机制一直是开发者们关注的焦点。在实际工作中,我们经常遇到这样的困惑:为什么这条SQL执行这么慢?索引为什么没生效?连接池配置多少合适?要真正… · 2026/11/5 4:39:54

小波阈值去噪五种改进变体:原理、MATLAB实现与避坑指南
小波阈值去噪五种改进变体:原理、MATLAB实现与避坑指南

简介:面向信号处理初学者与工程实践者的MATLAB小波阈值去噪工具包,聚焦软阈值、硬阈值及五种改进阈值方法的快速实现。作者在wden、thselect与wthresh三个函数基础上进行改造,并进一步封装为filterWaveletTh函数,延续专栏一贯的代… · 2026/11/5 4:39:54

从NRZ到PAM4:SerDes高速链路调制选型、均衡与眼图调试
从NRZ到PAM4:SerDes高速链路调制选型、均衡与眼图调试

高速串行链路这个圈子,做得久了你会发现一个很有意思的现象:真正决定一个系统能不能跑通的,往往不是那几百页的协议栈,而是最底层那一对差分线上的信号到底长什么样。SerDes 系统里 NRZ 和 PAM4 这两种调制方式的取舍,… · 2026/11/5 4:38:47

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

多智能体协作系统架构设计与实践优化
多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中… · 2026/11/5 0:00:39

大模型系统性入门实战指南:从原理到部署微调的全链路路线
大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#… · 2026/11/5 0:00:39

鸿蒙文件系统沙箱机制解析与开发实践
鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的… · 2026/11/5 0:00:39

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码