阻塞式IO与非阻塞IO的区别

阻塞式IO与非阻塞IO的区别


1. 阻塞式IO (Blocking I/O)

  • 定义
    当程序发起一个I/O操作(如读取文件、网络数据)时,进程会被挂起(阻塞),直到操作完成或超时才会继续执行后续代码。在此期间,程序无法执行其他任务。

  • 工作流程

    python

    复制

    data = socket.recv()  # 调用recv()后,程序卡在这里等待数据
    print("收到数据:", data)  # 数据到达后才会执行
  • 特点

    • 优点:编程简单,代码直观。

    • 缺点:资源利用率低(等待期间CPU空闲),不适合高并发场景。

  • 典型场景

    • 简单的单线程脚本

    • 对实时性要求不高的低频操作(如命令行工具)


2. 非阻塞式IO (Non-blocking I/O)

  • 定义
    程序发起I/O操作后立即返回,无需等待结果。可以通过轮询或事件通知机制(如select/epoll)检查操作状态,实现并发处理多个I/O。

  • 工作流程

    python

    复制

    socket.setblocking(False)  # 设置为非阻塞模式
    try:data = socket.recv()  # 立即返回,若有数据则返回数据,否则抛异常print("收到数据:", data)
    except BlockingIOError:print("暂时无数据,继续处理其他任务")  # 程序继续执行其他逻辑
  • 特点

    • 优点:提高CPU利用率,支持高并发(如同时处理数千连接)。

    • 缺点:编程复杂,需配合多路复用或回调机制。

  • 典型场景

    • Web服务器(Nginx、Node.js)

    • 实时通信系统(WebSocket、游戏服务器)


3. 核心区别

维度阻塞式IO非阻塞式IO
行为调用后卡住,直到I/O完成调用后立即返回,需主动查询状态
CPU利用率低(等待期间闲置)高(可并行处理其他任务)
并发能力弱(依赖多线程/进程)强(单线程即可处理大量I/O)
实现复杂度简单复杂(需搭配多路复用或异步框架)
适用场景低频、简单任务高频、高并发场景

4. 技术实现

阻塞式IO示例(C语言)

c

复制

int fd = open("file.txt", O_RDONLY);
char buf[1024];
read(fd, buf, sizeof(buf)); // 阻塞在此,直到数据读取完毕
printf("Data: %s\n", buf);
非阻塞式IO示例(C语言)

c

复制

int fd = open("file.txt", O_RDONLY | O_NONBLOCK); // 设置非阻塞标志
char buf[1024];
while (1) {ssize_t n = read(fd, buf, sizeof(buf));if (n > 0) {printf("Data: %s\n", buf);break;} else if (n == -1 && errno == EAGAIN) {// 数据未就绪,处理其他任务usleep(1000); }
}

5. 如何选择?

  • 选阻塞式IO

    • 开发简单快速的小工具。

    • 无需高并发(如本地配置文件读取)。

  • 选非阻塞IO

    • 高并发服务器(如Web服务、实时聊天)。

    • 需要最大限度利用CPU资源的场景。


6. 扩展:同步 vs 异步IO

  • 同步IO:程序主动等待I/O结果(阻塞式、非阻塞式均属此类)。

  • 异步IO:程序发起I/O后无需等待,操作系统完成后主动通知(如Linux的io_uring、Windows的IOCP)。

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

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

相关文章

Gossip协议:分布式系统中的“八卦”传播艺术

目录 一、 什么是Gossip协议?二、 Gossip协议的应用 💡三、 Gossip协议消息传播模式详解 📚四、 Gossip协议的优缺点五、 总结: 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式&…

【C++初阶】----模板初阶

1.泛型函数 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 2.函数模板 2.1函数模板的概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型…

git-- github的使用--账户和本地连接

以下指令在git 执行bash 流程:先看有没有密钥; 没有的话,在电脑生成密钥对,公钥复制到github; 要想使用https,配置令牌,注意令牌有期限问题,连接不了有可能是期限问题 一个电脑对…

OTN(Optical Transport Network)详解

OTN(光传送网)是一种基于**波分复用(WDM)**的大容量光传输技术,结合了SDH的运维管理优势和WDM的高带宽特性,广泛应用于骨干网、城域核心层及数据中心互联(DCI)。 1. OTN 的基本概念 …

Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比

以下是 Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比分析,结合了核心特性、操作方式和应用场景的深度总结: 一、核心特性…

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示(tooltip)是一个常见的 UI 组件,用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本,所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

软件工程面试题(十五)

1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker环境

背景 本人使用 Ubuntu Server 22.04 服务器&#xff0c;所以没有图形界面&#xff0c;而 QNX Software Center 需要图形界面。为了保证服务器环境的整理&#xff0c;计划使用Docker部署QNX Software Center 一瓶安装图形界面。本方既是实现方案的记录。 资源 Dockerfile&…

C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

粘包问题解决方案

粘包问题详解&#xff1a;TCP协议中的常见问题及Go语言解决方案 一、什么是粘包问题&#xff1f; 粘包问题是指在TCP通信中&#xff0c;发送方发送的多个独立消息在接收方被合并成一个消息接收的现象。换句话说&#xff0c;发送方发送的多条消息在接收方被“粘”在一起&#…

vue:突然发现onok无法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果当前商品存在于商品活动库&#xff0c;则在商品活动库的状态会下架",onOk: function () {that.submitForm();}}); 突然发现 this.$confirm无法进入onok 最终发现是主题冲突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表实现中&#xff0c;index hash & dict->ht[0].sizemask 是计算键值对应存储位置的核心操作。这个操作看起来简单&#xff0c;但背后涉及哈希表的内存布局和性能优化策略。我们通过以下步骤逐步解析其原理&#xff1a; 一、哈希表的设计目标 快速定位…

Ruby 命令行选项

Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长…

Java 数据库连接池

HikariCP 老外开源的。 Spring Boot 2 之后默认选择的连接池。 号称性能最快的数据库连接池。 为什么性能好呢&#xff1f; ● 字节码级别的优化-尽量的利用 JIT 的内联手段 ● 字节码级别的优化-利用更容易被 JVM 优化的指令 ● 代码级别的优化-利用改造后的 FastList 代替…

Spring Boot中@Valid 与 @Validated 注解的详解

Spring Boot中Valid 与 Validated 注解的详解 引言Valid注解功能介绍使用场景代码样例 Validated注解功能介绍使用场景代码样例 Valid与Validated的区别结论 引言 在Spring Boot应用中&#xff0c;参数校验是确保数据完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能扩展说明&#xff1a; 图类封装&#xff1a;将图数据结构封装为类&#xff0c;提高代码复用性 最短路径查找&#xff1a;基于BFS实现未加权图的最短路径查找 路径重构&#xff1a;通过parent数组回溯构建完整路径 异常处理&#xff1a;当路径不存在时返回空向量 复杂度分析…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

CSS学习笔记6——网页布局

目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

sqlalchemy:将mysql切换到OpenGauss

说明 之前python的项目使用的mysql&#xff0c;近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;测试下来发现不用改代码&#xff0c;只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在&#xff1a;https:…