IO的阻塞和非阻塞浅析

news2024/11/29 10:36:48

在操作系统和网络编程中,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.coloradmin.cn/o/1670417.html

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

相关文章

大数据项目中的拉链表(hadoop,hive)

缓慢渐变维 拉链表 拉链表,可实现数据快照,可以将历史和最新数据保存在一起 如何实现: 在原始数据增加两个新字段 起始时间(有效时间:什么时候导入的数据的时间),结束时间(默认的结束时间为99…

CUDA-基于累计直方图和共享内存的中值滤波算法

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 实现原理 基于累计直方图的中值滤波算法详情参见: OpenCV-基于累计直方图的中值滤波算法-CSDN博客 为了进一步提升算…

06、SpringBoot 源码分析 - SpringApplication启动流程六

SpringBoot 源码分析 - SpringApplication启动流程六 初始化基本流程SpringApplication的prepareEnvironment准备环境SpringApplication的getOrCreateEnvironment创建环境configureEnvironment配置环境ApplicationConversionService的getSharedInstance配置转换器 SpringApplic…

C# WinForm —— 17 MaskedTextBox 介绍

1. 简介 本质是文本框,但它可以通过掩码来区分输入的正确与否,可以控制输入的格式、长度 主要应用场景是:需要格式化输入信息的情况 2. 常用属性 属性解释(Name)控件ID,在代码里引用的时候会用到,一般以 mtxt 开头AsciiOnly是否…

Ansible常用变量【下】

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 前言 在上一篇文章《Ansible常用变量【上】》中,学习了Ansible常用变量的前半部分,放了个五一假&#x…

USB转串口芯片CH341、CH372、CH374、CH375等的电路及 PCB 设计的重要注意事项

前言 USB芯片的电路和PCB设计参考及注意事项,含CH34X、CH37X等系列芯片的电路设计说明。涉及工作稳定性和抗干扰以及USB-HOST带电热插拔。基于 USB 芯片的电路及 PCB 设计的重要注意事项 版本:2E 1、摘要 本文主要针对以下因电路及 PCB 设计不佳而引起…

浮点数的由来及运算解析

数学是自然科学的皇后,计算机的设计初衷是科学计算。计算机的最基本功能是需要存储整数、实数,及对整数和实数进行算术四则运算。 但是在计算机从业者的眼中,我们知道的数学相关的基本数据类型通常是整型、浮点型、布尔型。整型又分为int8&a…

点是否在三角形内C++源码实现

原理 思路: 面积和: abc obcaocabo,应该有更简洁的方法,但是这个方法思路更简单 代码实现: 注意二维向量的叉乘后,是垂直于平面的向量,相当于z为0三维向量叉乘,所以只有z维度有值,xy0. flo…

【Nginx <一>⭐️】Nginx 的初步了解以及安装使用

目录 👋前言 👀一、 Nginx 介绍 🌱二、 安装使用 💞️ 三、 总结 📫四、 章末 👋前言 小伙伴们大家好,前段时间主要在学习 Elasticsearch 相关的知识,花了两周的时间吧&#x…

排序-冒泡排序(bubble sort)

冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历待排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成…

JavaWeb--13Mybatis(2)

Mybatis(2) 1 Mybatis基础操作1.1 需求和准备工作1.2 删除员工日志输入参数占位符 1.3 新增员工1.4 修改员工信息1.5 查询员工1.5.1 根据ID查询数据封装 1.5.3 条件查询 2 XML配置文件规范3 MyBatis动态SQL3.1 什么是动态SQL3.2 动态SQL-if更新员工 3.3 …

决策树学习记录

对于一个决策树的决策面: 他其实是在任意两个特征基础上对于所有的点进行一个分类,并且展示出不同类别的之间的决策面,进而可以很清楚的看出在这两个特征上各个数据点种类的分布。 对于多输出的问题,在利用人的上半张脸来恢复下半…

排序-选择排序(selection sort)

选择排序(selection sort)的工作原理非常简单:开启一个循环,每轮从未排序区间选择最小的元素,将其放到已排序区间的末尾。选择排序的主要特点包括: 时间复杂度: 无论最好、最坏还是平均情况&…

UE5 FARFilter筛选器使用方法

UE5 查找资源时可以用FARFilter进行筛选,之前可以用ClassNames进行筛选,但是5.1之后就弃用这个属性改成ClassPaths属性 构造一个FTopLevelAssetPath对象需要两个FName参数,但是没找到应该传什么 查找官方文档,明显是错误的&#x…

企业级WEB服务Nginx安装

企业级WEB服务Nginx安装 1. Nginx版本和安装方式 Mainline version 主要开发版本,一般为奇数版本号,比如1.19Stable version 当前最新稳定版,一般为偶数版本,如:1.20Legacy versions 旧的稳定版,一般为偶数版本,如:1.18Nginx安装可以使用yum或源码安装,但是推荐使用源码编译安…

苹果cms:伪静态设置教程

官方默认的网站模式是动态模式,动态模式下链接中自带有“index.php”想要去除网站链接中的index.php,首先需要开启网站的模式为伪静态模式。这样比动态模式那一长串的链接看着也舒服一些,最重要的是迎合搜索引擎的喜好加快收录提高排名。 1、…

Docker:1Panel安装及使用

1、简述 1Panel是一款现代化、开源的Linux服务器运维管理面板,于2023年3月推出,深度集成WordPress和Halo,一键完成域名绑定、SSL证书配置等操作,帮助用户实现快速建站,支持用户通过Web浏览器轻松管理Linux服务器&…

SpringBoot集成Curator实现Zookeeper基本操作

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 Zookeeper是一个Ap…

全场景智能终端RK3288主板在智能垃圾回收项目的应用,支持鸿蒙,支持全国产化

全场景智能终端主板AIoT-3588A推出的智能化垃圾回收项目,旨在解决城市化进程中日益突出的垃圾处理问题。智能垃圾分类箱具备触屏操作、自动称重、分类投放以及电子语音播报提示等多项功能,居民能够经过分类积分卡、手机扫码、人脸识别等多种途径进行投放…

新书首发 |《低代码在制造行业数字化实践》正式出版!

得帆云出书了! 得帆云团队编写的《低代码在制造行业数字化实践》正式出版! 毫无疑问,对传统开发技术而言,低代码技术是一场技术革命,低代码技术将深刻地影响和改变企业的数字化转型和发展道路。 《低代码在制造行业…