阻塞,非阻塞,同步,异步的理解

典型的IO分为两个阶段:

数据的准备:根据系统IO操作的就绪状态,阻塞,非阻塞(从外部向内核缓冲区拷贝数据,应用进程的状态
内核缓冲区上是否有数据可读,数据没有准备好,应用调用recv阻塞住,应用调用函数立即返回非阻塞
socket上没有数据阻塞住,直到有数据
数据读写:根据应用程序和内核的交互方式,同步,异步
业务层面的一个逻辑处理,业务层面也有同步和异步之分

应用程序调用recv函数向内核发送IO请求时,内核缓冲区的数据还没有准备好,此时应用程序阻塞在请求的状态,等待recv函数返回就是“阻塞”。随后当内核缓冲区中的数据准备好以后,应用程序再通过recv函数将数据搬运到用户态就是“同步”。

关于 “阻塞” 的理解:正确

当应用程序调用 recv 函数时,如果内核缓冲区中没有数据(或数据不足),内核会让当前进程进入阻塞状态(暂停执行,让出 CPU 资源),直到内核缓冲区中有足够数据后,才会唤醒进程继续执行 recv 操作。这个 “暂停等待” 的状态,就是阻塞

简单说:“阻塞” 描述的是进程在等待 IO 事件(数据就绪)时的状态—— 是否会暂停执行、让出 CPU。

关于 “同步” 的理解:正确,但需明确核心

当内核缓冲区数据准备好后,recv 函数会负责把数据从内核态缓冲区拷贝到用户态缓冲区,这个拷贝过程需要应用程序 “主动参与”(通过 recv 调用触发,并且进程会等待拷贝完成后才继续执行)。这种 “IO 操作的完成(包括数据拷贝)需要应用程序主动等待并参与” 的模式,就是同步 IO

核心点:“同步” 的关键是数据从内核到用户态的拷贝过程,需要应用程序等待并主导完成recv 是典型的同步 IO 函数,因为它不仅要等数据就绪,还要亲自完成数据拷贝,整个过程需要应用程序阻塞(或轮询)等待。

额外澄清:阻塞 vs 同步的关系

两者不是同一维度的概念,但常被一起讨论:

  • 阻塞 / 非阻塞:描述进程在等待 IO 事件(如数据就绪)时的状态(是否暂停执行)。
  • 同步 / 异步:描述 IO 操作的完成方式(是否需要应用程序参与数据拷贝,以及是否需要等待整个过程完成)。
  • recv 在默认情况下是 “阻塞同步 IO”:既会阻塞等数据,又需要应用程序参与拷贝。
  • 如果用非阻塞模式调用 recv(通过 fcntl 设置),则是 “非阻塞同步 IO”:数据没准备好时不阻塞(直接返回错误),但数据就绪后仍需应用程序通过 recv 完成拷贝(同步特性不变)。
  • 异步 IO(如 Linux 的 io_uring 或 Windows 的 IOCP)则不同:应用程序发起 IO 请求后就可以做其他事,内核会自己完成 “等数据 + 拷贝数据”,最后通过回调 / 信号通知应用程序 “操作已完成”,全程不需要应用程序等待或参与拷贝 —— 这才是 “异步”。

应用程序调用recv函数向内核发送IO请求时,内核缓冲区的数据还没有准备好,此时应用程序判断recv函数的返回值,不阻塞在请求的状态,就是“非阻塞”。随后当内核缓冲区中的数据准备好以后,内核通过应用程序注册的函数将数据拷贝到用户态通知应用程序拿走,这就是“异步”。

关于 “非阻塞” 的理解:

当应用程序以非阻塞模式调用 recv 时,如果内核缓冲区没有数据,recv 不会让进程进入阻塞状态(不会 “卡住等待”),而是立即返回一个错误码(比如 Linux 中的 EAGAIN 或 EWOULDBLOCK),告诉应用程序 “当前没数据,你先去忙别的”。

这种 “不等数据就绪,直接返回状态” 的模式,就是非阻塞。它的核心是:进程在 IO 操作未就绪时,不会暂停执行,而是可以继续处理其他任务(比如隔一会儿再重试 recv,或处理其他逻辑)。

关于 “异步” 的理解:完全正确

异步 IO 的核心是 “内核全程包办,应用程序彻底不参与等待和拷贝”:

  1. 应用程序通过特定接口(如 aio_read 或 io_uring)发起 IO 请求,并注册一个回调函数(告诉内核 “数据准备好并拷贝完成后,就调用这个函数通知我”);
  2. 发起请求后,应用程序可以立即去做其他事,完全不需要等待(既不阻塞,也不用轮询);
  3. 当内核缓冲区数据就绪后,内核会主动将数据从内核态拷贝到用户态缓冲区,然后通过回调函数(或信号)通知应用程序 “数据已经备好,你可以直接用了”。

整个过程中,应用程序既不用等待数据就绪,也不用参与数据拷贝,只是在最后接收 “完成通知”—— 这就是异步的本质。

一句话总结区别:

  • 非阻塞:IO 未就绪时不阻塞,但数据就绪后仍需应用程序主动调用 recv 完成拷贝(同步特性不变);
  • 异步:应用程序发起请求后彻底 “不管”,内核自己搞定 “等数据 + 拷贝数据”,最后通知结果(全程无需应用程序参与等待或拷贝)。

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

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

相关文章

uniapp监听物理返回按钮事件

1. uniapp监听物理返回按钮事件uniapp 监听页面返回功能有使用onBackPress方法和使用onUnload方法。 1.1. 使用onBackPress方法在uniapp中,可以使用onBackPress方法来监听页面返回事件。这个方法与onLoad等生命周期方法同级,可以监听左上角返回按钮或and…

Windows server 2012安装步骤

单机文件,选择新建虚拟机如果分配太少的话会影响后续系统使用的流畅度,但是后续都是可以更改的这里选择第一个即可选择自定义安装,然后点击下一步即可然后点击下一步,这里要等一段时间大小写加数字组合,记录一下密码避免后面使用的…

【开题答辩全过程】以 “与我同行”中华传统历史数字化平台的设计和分析-------为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Fortran二维数组去重(unique)算法实战

Fortran: 去重unique算法实现对二维数组的快速去重 1 引言 2 结语 1 引言 本篇介绍去重算法unique,目的是为了保留数组中的唯一值。算法原理:首先将二维数组的每一行转换成一个整数,然后对新构成的一维数组进行排序去重,最终得到正反索引。本程序与Matlab的Unique函数进行过…

小迪安全v2023学习笔记(七十四讲)—— 验证机制篇验证码绕过思路SRC挖掘演示

文章目录前记WEB攻防——第七十四天机制验证篇&重定向发送&响应状态码&跳过步骤&验证码回传&枚举验证码突破 - 回传显示&规律爆破漏洞原理案例演示回传显示规律爆破验证目标 - 重定向发送&重定向用户漏洞原理案例演示重定向发送重定向用户验证逻辑…

福彩双色球第2025100期篮球号码分析

福彩双色球第20250100期篮球号码分析,上期开出数字14,数字形式是2路球,合数偶数,大号区域数字!最近十几期篮球明显大号区域得数字比较多,本期直接排除大号区域数字10-11-12-13-14-15-16。最近十几期篮球出合…

【74LS112JK触发器三进制】2022-10-8

缘由双jk触发器的工作原理是什么-其他-CSDN问答 JK触发器和触发器中最基本的RS触发器结构相似,其区别在于,RS触发器不允许R与S同时为1,而JK触发器允许J与K同时为1。当J与K同时变为1的同时,输出的值状态会反转。也就是说&#xff…

ABAP - CPI - pass header parameter and filter parameter to odata service

e.g. call the cpi service from postman, and pass the header parameter and filter parameter to it:in the CPI integration flow (iflow), create the iflow as below:deploy this iflow, then use postman to test it, set breakpoint in backend odata service:

大规模数据抓取挑战:Python反爬虫策略与数据去重技术全面解析

引言 在进行大规模数据抓取时,爬虫面临的两大挑战是:反爬虫技术和数据去重。随着网络爬虫的广泛应用,网站和平台越来越注重保护其数据,采取了各种反爬虫措施,防止数据被恶意抓取。而在抓取过程中,如何有效去…

【Python学习笔记】whl包打包

将python代码、文件、数据打成一个whl包,可以直接pip 安装到系统中,有两种方法:(1)setup.py;(2)pyproject.toml1. 使用setup.py├── CHANGELOG.md ├── README.md ├── build …

Mac Pro M4芯片 安装 VMware Fusion 和 windows

Mac Pro M4芯片 安装 VMware Fusion 和 windows 吐槽: 第一次从Intel芯片换成M芯片Mac…虚拟机坑了我一把!搞了很久! 1、安装 VMwareFusion Pro 这个软件已经正式免费提供给个人用户使用! 【官网】 VMware Fusion Pro Download 1. 注册登录 省略…进入管理后台 2. 下载虚…

Carrier Aggregation Enabled MIMO-OFDM Integrated Sensing and Communication

文章目录C. Sensing ModeII. A NOVEL CA-ENABLED MIMO-OFDM ISAC SIGNAL PROCESSING METHODA. Signal Preprocessing StageB. Sensing Performance Analysis对支持 CA 的 ISAC 系统的研究可分为两类:带内 CA 和带间 CA。支持 CA 的 ISAC 系统的主要挑战在于信号设计…

Linux 下 Docker 容器部署指南(Java + Redis 示例)

Linux 下 Docker 容器部署指南(Java Redis 示例)一、Docker 镜像源配置二、构建 Docker 镜像三、运行 Docker 容器四、查看容器日志五、实践思考与扩展在 Linux 上部署 Java 应用到 Docker 容器中,并访问宿主机的 Redis 服务,是一…

智能聊天机器人-基于Spring AI实现

项目背景随着⼈⼯智能技术的快速发展和⼤模型开源趋势的兴起,智能聊天机器⼈在客服、知识问答、⽣活助⼿ 等领域得到了⼴泛应⽤,我们接下来模仿这些应用实现一个智能的聊天机器人核心功能1.对话支持用户和机器人之间的对话实时响应用户的输入,进行回答2.…

广东省省考备考(第九十天8.30)——判断推理(强化训练)

判断推理:类比推理(训练1) 错题解析 第一步:判断题干词语间逻辑关系。 绫、罗、绸、缎表示的是四种不同的丝织物,四者为并列关系,且分别都与丝织物构成包容关系中的种属关系。 第二步:判断选项词…

DFS 回溯 【各种题型+对应LeetCode习题练习】

目录 什么是深度优先搜索(DFS) DFS题型分类 DFS和回溯的关系 排列与组合 LeetCode 46 全排列 LeetCode 47 全排列 II LeetCode 39 组合总和 LeetCode 40 组合总和 II 子集 LeetCode 78 子集 LeetCode 90 子集 II 分割问题 LeetCode 131 分割…

大模型备案、算法备案补贴政策汇总【广东地区】

广州海珠 《广州市海珠区建设人工智能大模型应用示范区实施细则的通知》规定,自 2024 年 6 月 18 日起至 2027 年 3 月 20 日,大规模企业首次完成国家级生成式人工智能(大语言模型)上线备案的,可获得最高 100 万元一次…

鸿蒙服务端开发资料汇总

文章目录鸿蒙服务端开发资料汇总一、核心概念1.1 分布式架构1.2 微内核设计1.3 元服务架构二、技术栈2.1 开发语言2.2 开发框架与工具2.3 核心技术能力三、官方文档与资源3.1 官方文档3.2 示例代码与开源资源四、应用案例4.1 政务领域4.2 金融领域4.3 交通出行4.4 企业办公五、…

基于51单片机霍尔测速仪表测转速调速系统设计

1 系统功能介绍 本设计为 基于51单片机霍尔测速仪表测转速调速系统。系统以STC89C52单片机为核心,结合霍尔传感器、LCD1602显示模块、电位器调速电路与电机驱动模块,实现了对旋转装置的转速检测、数据显示以及实时调节电机转速的功能。 系统主要功能包括…

前端-初识Vue实例

一.准备容器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head>…