IO的阻塞和非阻塞浅析

在操作系统和网络编程中,IO(输入/输出)操作是一个非常重要的概念。

在处理IO的时候,阻塞和非阻塞都是同步IO。只有使用了特殊的API才是异步IO。 ——陈硕大神
各操作系统的特殊API

网络IO层面

典型的一次IO的两个阶段是什么?

数据准备 和 数据读写
数据准备: 根据系统IO操作的就绪状态
· 阻塞
· 非阻塞
数据读写: 根据应用程序和内核的交互方式
· 同步
· 异步

同步IO

同步IO是一种阻塞式的IO模型。在这种模型中,当应用程序发起一个IO操作时(例如,读取文件、从网络套接字接收数据等),它会被阻塞,直到IO操作完成。在此期间,应用程序无法执行其他任务,只能等待IO操作的结果。

以C++的网络IO为例,如果你使用同步的recv函数来从网络套接字接收数据,那么在调用recv时,应用程序会进入阻塞状态,直到有足够的数据可读或者发生错误。在此期间,应用程序的其他部分(如用户界面、其他计算任务等)将无法运行。当有足够的数据时,需要应用程序花费自己的运行时间来将数据从系统层面转移到自己所需的地址中。

异步IO

异步IO是一种非阻塞式的IO模型。在这种模型中,当应用程序发起一个IO操作时,它不会立即阻塞,而是可以继续执行其他任务。当IO操作完成时,操作系统会通过某种机制(如回调函数、信号、事件等)通知应用程序。
在C++中,标准的网络编程库(如Boost.Asio、Poco等)提供了异步IO的支持。这些库允许你注册一个回调函数,当数据准备好或者IO操作完成时,该回调函数会被调用。**此时操作系统已经将数据放入发起异步IO的程序所提供的地址之中。**这样,你就可以在等待数据到达的同时,执行其他任务。

一个典型的网络IO接口调用,分为两个阶段,分别是“数据就绪”和“数据读写”,数据就绪阶段分为阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。
同步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),数据的读写都是由请求方A自己来完成的(不管是阻塞还是非阻塞);异步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就可以处理其它逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结
果。

业务层面的同步和异步

业务层面的一个逻辑处理,是同步还是异步?
同步: A操作等待B操作做完事情,得到返回值,继续处理。
异步: A操作告诉B操作它感兴趣的事件以及通知方式,A操作继续执行自己的业务逻辑了;等B监听到相应事件发生后,B会通知A,A开始相应的数据处理逻辑。

总结

阻塞、非阻塞、同步、异步描述的都是IO的状态,一个典型的网络IO包含两个阶段:数据准备(数据就绪)和数据读写。
recv函数,传入sktfd,buf,bufsize,来举例:

在数据准备阶段

当IO(即sktfd)工作在阻塞模式下

当调用recv函数时,如果数据没有准备好,那么recv将会阻塞当前线程。

当IO工作在非阻塞模式下

当调用recv函数时,在非阻塞模式下,recv 函数会立即返回,而不会等待数据到达。这意味着,recv 的返回值和 errno 的状态可以用来判断数据的接收情况。以下是如何通过 recv 的返回值和 errno 来判断数据接收情况的方法:

  1. 返回值
    • 如果 recv 返回大于 0 的值,那么该值表示实际接收到的字节数。
    • 如果 recv 返回 0,这通常表示对端已经关闭了连接(即 TCP 的正常关闭)。
    • 如果 recv 返回 -1,则表示有错误发生或没有数据可读(在非阻塞模式下)。
  2. errno
    • recv 返回 -1 时,可以通过检查 errno 的值来获取更详细的错误信息。
    • 在非阻塞模式下,如果 recv 返回 -1 并且 errno 设置为 EWOULDBLOCKEAGAIN,则表示没有数据可读,这不是一个错误,只是告诉你现在无法读取数据。你应该稍后再次尝试读取。
      recv函数的返回值和错误码部分描述

当数据准备好后:

如果是同步IO应用程序会花费自己的运行时间来将数据搬到自己的缓冲区,然后才能继续执行逻辑。
如果是异步IO:操作系统会根据我调用时传入的buf地址,将数据搬到我想使用的地方,然后通过一定机制如回调函数、参数等方法,通知我来继续处理。即不需要应用程序花费自己的时间搬数据。

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

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

相关文章

Today At Apple 2024.04.20 ipad 绘画 图片管理

文章目录 recreate 软件 绘画图片管理 官网: https://www.apple.com/today/Apple 亚洲第一大商店:Apple 静安零售店现已在上海开幕如下预约课程:下载 Apple Store(不是app store),点击课程预约笔记&#xf…

Operations Research课程之非线性规划(梯度下降|牛顿法|Gurobi+Python)

目录 1.非线性规划介绍 2.梯度下降法(Gradient descent) 2.1 梯度和Hessians矩阵 2.2 梯度下降算法 2.3 算法举例 3. 牛顿法(Newton’s method) 3.1 适合单变量的牛顿法 3.2 适合多变量的牛顿法 3. 实例(GurobiPython) 3.1 Agricultural Pricing问题描述 3.2 Gurobi…

第五百零三回

文章目录 1. 概念介绍2. 使用方法2.1 普通路由2.2 命名路由 3. 示例代码4. 内容总结 我们在上一章回中介绍了"使用get显示Dialog"相关的内容,本章回中将介绍使用get进行路由管理.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

C++:STL-string

前言 本文主要介绍STL六大组件中的容器之一:string,在学习C的过程中,我们要将C视为一个语言联邦(摘录于Effective C条款一)。如何理解这句话呢,我们学习C,可将其分为四个板块;分别为…

7天精通Web APIs——正则阶段案例(理论+实战)(第六天)

正则表达式的定义和使用 定义:是一种匹配模式,用于匹配字符串中字符组合 作用:表单验证(匹配)、过滤敏感词(替换)、字符串中提取我们想要的部分(提取) 使用分为两步&…

AI翻唱+视频剪辑全流程实战

目录 一、AI翻唱之模型训练 (1)模型部署 (2)数据集制作——搜集素材 (3)数据集制作——提升音频质量 方法一:使用RVC提供的音频处理功能。 方法二:可以使用音频剪辑工具Ad…

如何开通微软必应bing国内竞价广告账户?

微软必应Bing作为全球第二大搜索引擎,凭借其特有的用户群和市场定位,为中国广告主开辟了一片潜力无限的蓝海市场。云衔科技通过专业实力,为广告主提供全方位支持,从开户到代运营,助力企业扬帆起航。 一、微软必应bing…

计算机网络(第八版 谢希仁 编著) 期末复习大纲

一.每章总结 第一章:分组交换,计网定义、范围划分,性能指标,五层体系结构,TCP/IP体系结构 第二章:物理层,码元,基带调制(数字信号->数字信号,也叫编码),带…

yum、rpm相关命令-工具手册

1.rpm文件: 1.1安装rpm文件: rpm -ivh kde-select.rpm23 #--nodeps强制安装,无视环境缺少依赖的检查 rpm -ivh --nodeps kde-select.rpm #--force --replacefiles可以无视rpm的冲突去强制替换(如两个rpm的安装路径相同了会有冲突) rpm -ivh --nodeps --force --replacef…

JUC下的ThreadLocalRandom详解

ThreadLocalRandom 是Java并发包(java.util.concurrent)中提供的一个随机数生成器类,它是从Java 7开始引入的。相较于传统的Math.random()或Random类,ThreadLocalRandom更适用于多线程环境,因为它为每个线程维护了一个…

前端css中线性渐变(linear-gradient)的使用

前端css中线性渐变 一、前言二、关键词句三、主要内容说明(一)、线性渐变方向1.角度调整方向2.负值角度,源码13.源码1运行效果4.关键字调整方向5.to right向右线性渐变,源码26.源码2运行效果 (二)、线性渐变…

八、e2studio VS STM32CubeIDE之内存使用情况窗口

目录 一、概述/目的 二、STM32CubeIDE Build Analyzer 三、e2studio Memory Usage 八、e2studio VS STM32CubeIDE之内存使用情况窗口 一、概述/目的 1、嵌入开发最大特点之一就是资源受限,关注芯片资源使用详情是优秀工程师的技能之一 2、Keil和IAR都不支持内存…