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.xdnf.cn/news/1421569.html

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

相关文章

【强训笔记】day21

NO.1 思路&#xff1a;第一个位置放最小的&#xff0c;其次放最大的&#xff0c;依次类推。 代码实现&#xff1a; #include<iostream>using namespace std; int n;int main() {cin>>n;int left1,rightn;while(left<right){cout<<left<<" &…

图片批量处理与格式转换:JPG转TIFF,轻松应对大量图片

在数字化时代&#xff0c;图片已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;当面对大量的图片文件时&#xff0c;如何高效地进行处理和格式转换&#xff0c;成为了许多人面临的挑战。幸运的是&#xff0c;借助现代的办公提效工具和技术&#xff0c;我们可以轻松…

vue2 报错 component name“Index“should always be multi-word

报错原因&#xff1a; 组件名称应该为俩个或俩个以上单词组成的&#xff0c;并且还要是大驼峰命名&#xff0c;例如&#xff1a;MyIndex&#xff0c;MyLogin等 解决方法一&#xff1a; 将组件名称改为俩个或俩个以上单词组成的名称&#xff0c;且为大驼峰命名&#xff0c;例如…

怎么用电脑接收手机文件 用备忘录传输更舒服

在这个数字化时代&#xff0c;手机已经成为我们随身携带的“百宝箱”&#xff0c;里面装满了各种重要的文件、资料和信息。然而&#xff0c;有时我们需要在电脑上处理这些文件&#xff0c;比如编辑文档、制作PPT或是查看照片。那么&#xff0c;如何在电脑与手机之间实现文件的顺…

计算机发展史故事【11】

爆发超新星 IBM 号称巨人&#xff0c;竟在巨型机领域败在小小的控制数据公司CDC 手下。在小型机领域&#xff0c;“霸主”DEC 公司的“后院”也曾“起火”&#xff0c;绝非一直风平浪静。 本世纪60 年代末&#xff0c;DEC 公司因开发小型电脑迅速崛起&#xff0c;赢得“小型机…

AI日报|OpenAI发布模型规范指南Model Spec,通义千问2.5发布,号称性能赶超GPT-4...

OpenAI发布“Model Spec”计划&#xff0c;旨在为人工智能行为设定指导原则 阿里云通义千问2.5正式发布&#xff0c;号称性能全面赶超GPT-4 Google DeepMind推出下一代蛋白质预测模型AlphaFold 3&#xff0c;预测所有生命分子结构和相互作用 Microsoft宣布在威斯康星州投资3…

栈的实现与OJ括号匹配

今日备忘录: "不破不立. " 本文索引 1. 前言2. 顺序表与链表的区别3. 什么是栈4. 栈的实现5. OJ括号匹配6. 总结 1. 前言 人总是在坍塌中重建, 有些东西必须摧毁, 才能迎来新生, 不管是那些消耗你的人, 还是令你感到焦虑的事情, 还是一份你觉得毫无意义并且又不喜欢…

python词云图形状修改

python词云图形状修改 词云图介绍wordcloud介绍修改形状参数效果代码 词云图介绍 词云图&#xff08;Word Cloud&#xff09;是一种文本数据的可视化表示形式&#xff0c;它通过字体大小、颜色、布局等视觉元素来展示文本中不同词汇的频率或重要性。词云图中&#xff0c;出现频…

南京中科微Ci24R1(DFN8)无线收发射频芯片性能介绍

Ci24R1是南京中科微研发的低成本高性能2.4GHz GFSK 无线收发芯片&#xff08;支持蓝牙版&#xff09;&#xff0c;专为低功耗无限场合设计&#xff0c;集成嵌入式ARQ基带协议引擎的无线收发器芯片。 工作频率为2400MHz-2525MHz&#xff0c;共有126个1MHz带宽的信道&#xff0c…

.NET 复现某多媒体中间件文件上传漏洞

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等&#xff08;包括但不限于&#xff09;进行检测或维护参考&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

如何挑选“好用”的工业APP

我们日常生活中每天都在使用各种生活类的APP,然而&#xff0c;当我们谈到工业APP时&#xff0c;很多人可能并不那么熟悉。工业APP&#xff0c;虽然不像生活类APP那样直接面向广大消费者&#xff0c;但在工业领域却扮演着至关重要的角色。 先简单认识下啥是工业APP? 工业APP是…

“交个朋友”申请注册商标都已被驳回!

“ 交个朋友”在直播带货界非常有名&#xff0c;普推知产老杨在商标局官网上检索发现&#xff0c;“交个朋友”主体申请了以“交个朋友”四百多个相关商标&#xff0c;基本上都被驳回&#xff0c;其实这样的名称不应提报商标&#xff0c;专业商标人员一看就过不了&#xff0c;还…

水经微图万能版、专业版与企业版的区别?

水经微图&#xff08;以下简称“微图”&#xff09;的版本&#xff0c;主要分为万能版、专业版和企业版三个版本。 什么是万能版&#xff1f; 万能版是指“水经注万能地图下载器”软件功能的授权&#xff0c;虽然该软件已经停止更新&#xff0c;但购买过该软件的用户&#xf…

成都数字产业园深度链接校企双方,共建产学研合作研发中心

在数字经济的浪潮中&#xff0c;企业与学院之间的深度链接显得尤为关键。作为人才输送的源头&#xff0c;学院承载着为社会培育高素质人才的使命&#xff1b;而作为创新与实践的基地&#xff0c;企业则渴望吸引这些新鲜血液&#xff0c;为自身的持续发展注入新的活力。近日&…

MQTT学习(一)

MQTT是一种与HTTP类似的应用层协议。 在某些物联网应用中&#xff0c;MQTT优于HTTP。 首先&#xff0c;HTTP是用于客户端服务器计算的以文档为中心的请求-响应协议。 HTTP是万维网的基础&#xff0c;但它不是专门为机器之间通信而设计的。 MQTT是一种机器对机器、以数据为中…

netty配置SSL、netty配置https(生产环境)

netty配置SSL、netty配置https&#xff08;生产环境&#xff09; 上一篇提到了如何在开发环境使用SSL&#xff1a;https://lingkang.top/archives/netty-pei-zhi-ssl 转自&#xff1a;https://lingkang.top/archives/netty-pei-zhi-https 那么netty如何使用可信任的证书呢&a…

运筹系列92:vrp算法包VROOM

1. 介绍 VROOM is an open-source optimization engine written in C20 that aim at providing good solutions to various real-life vehicle routing problems (VRP) within a small computing time. 可以解决如下问题&#xff1a; TSP (travelling salesman problem) CVRP …

Linux提权--SUDO(CVE-2021-3156)Polkit(CVE-2021-4034)

免责声明:本文仅做技术学习与交流... 目录 SUDO(CVE-2021-3156) 影响版本 -判断&#xff1a; -利用&#xff1a; Polkit(CVE-2021-4034&#xff09; ​ -判断&#xff1a; -利用: 添加用户 SUDO(CVE-2021-3156) another: SUDO权限配置不当. 影响版本 由系统的内核和发…

MODIFY DUMP

写了一个modify的语句&#xff0c;但是dump了 查阅资料 参考一下链接 ABAP 内表修改 MODIFY 和 MODIFY table 的区别-CSDN博客

品鉴中的风味轮:如何运用专业工具解读红酒的复杂风味

品鉴云仓酒庄雷盛红酒时&#xff0c;我们常常会遇到各种各样复杂的味道。为了更好地理解和描述这些风味&#xff0c;专业工具——风味轮被引入到红酒品鉴中。通过运用风味轮&#xff0c;我们可以更科学、更具体地解读红酒的复杂风味。 风味轮是一种包含一系列风味和味道描述的圆…