IO操作同步、异步、阻塞、非阻塞之间的联系

news2024/10/7 1:43:43

        本质来说,同步,异步,阻塞、非阻塞没有什么必要的关系。同步可以是阻塞的,也可以是非阻塞的;异步也可以是非阻塞的,(也可以是阻塞的, 异步IO其实本质上是非阻塞的,但在特殊情况下,比如系统资源不足或底层实现的问题,可能会出现阻塞的现象)

1. 同步 I/O 和 异步 I/O

  • 同步 I/O:在发起 I/O 操作后,调用方必须等待操作完成,才能继续执行后续的逻辑。换句话说,调用方需要“同步”到 I/O 完成的时刻,才能继续工作。
  • 异步 I/O:调用方发起 I/O 操作后,不需要等待其完成,系统会在 I/O 完成后通过某种方式(如回调、通知)告知调用方结果。调用方在 I/O 处理过程中可以继续执行其他任务。

2. 阻塞 I/O 和 非阻塞 I/O

  • 阻塞 I/O:调用方发起 I/O 操作时,如果数据还没准备好,调用方会被“阻塞”,直到数据准备好为止,期间调用方处于等待状态。
  • 非阻塞 I/O:调用方发起 I/O 操作时,如果数据还没准备好,调用方立即得到一个通知(如错误码 EAGAIN),表示没有数据可读或写,调用方可以去做其他事情,不会被阻塞。

3. 同步 I/O 可以是非阻塞的吗?

答案是:可以。

虽然同步 I/O 通常是阻塞的,但并不是绝对的。我们可以通过设置文件描述符为 非阻塞 模式,使得同步 I/O 操作变为 非阻塞 I/O。在非阻塞模式下,如果 I/O 操作(例如 readwrite)不能立刻完成,系统会返回一个错误(如 EAGAINEWOULDBLOCK),而不是让调用方阻塞等待。

例如,使用 fcntl 设置套接字为非阻塞模式:

int flags = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flags | O_NONBLOCK);

这样即使在进行同步 I/O 操作时,也不会因为数据未准备好而阻塞。

4. 异步 I/O 可以是阻塞的吗?

答案是:一般来说不会

异步 I/O 的核心特性就是调用方不需要等待 I/O 操作完成后再继续执行,因此异步 I/O 本质上是 非阻塞 的。发起 I/O 请求时,系统会立即返回,随后通过回调函数或信号等方式通知调用方 I/O 操作的结果。所以异步 I/O 本质上不会阻塞,它始终意味着调用方无需在发起 I/O 操作时等待结果。

但是也可以阻塞,通知以后依然可以自己阻塞

5.总结:

  • 同步 I/O 可以非阻塞,通过设置文件描述符为非阻塞模式,尽管 I/O 操作需要调用方处理返回值来决定是否再次尝试。
  • 异步 I/O 一般不能阻塞,因为它的定义决定了调用方不需要等待 I/O 完成,始终会立即返回。

常见的IO模型如select,poll,epoll(LT模式)都是同步阻塞的,epoll的ET模式可以设置套接字非阻塞,所以是同步非阻塞的,异步IO是非阻塞的,比如windows下的IOCP就是,但在特殊情况下,比如系统资源不足或底层实现的问题,可能会出现阻塞的现象。

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

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

相关文章

系统设计,如何设计一个秒杀功能

需要解决的问题 瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法 前端设计 利用 CDN 缓存静态资源,减轻服务器的压力在前端随机限流按钮防抖,防止用户重复点击 后端设计 Nginx 做统一接入,进行负载均衡与限流用 sentinel 等…

Kron Reduction消去法如何操作,矩阵推导过程

三阶矩阵消去单节点 在电力系统中,母线上的电流注入始终为0,这样的节点可以通过一定的方法消除。以三节点为例,假设注入节点3的电流为0,则: [ I 1 I 2 I 3 ] = [ I 1 I 2 0 ] = [ Y 11 Y 12 Y 13 Y 21 Y 22 Y 23 Y 31 Y 32 Y 33 ] [ V 1 V 2 V 3 ] \left[\begin{array}{…

交叉熵的数学推导和手撕代码

交叉熵的数学推导和手撕代码 数学推导手撕代码 数学推导 手撕代码 import torch import torch.nn.functional as F# 二元交叉熵损失函数 def binary_cross_entropy(predictions, targets):# predictions应为sigmoid函数的输出,即概率值# targets应为0或1的二进制标…

一个值得关注的3D生成新算法:速度和图像生成平齐,能生成合理的展开贴图和高质量mesh

今天跟大家介绍的GIMDiffusion是一种新的Text-to-3D模型,利用几何图像(Geometry Images)来高效地表示3D形状,避免了复杂的3D架构。通过结合现有的Text-to-Image模型如Stable Diffusion的2D先验知识,GIMDiffusion能够在…

系统架构设计师论文《论NoSQL数据库技术及其应用》精选试读

论文真题 随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0 网站,特别是超大规模和高并发的web2.0纯动态SNS网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展…

LeetCode讲解篇之139. 单词拆分

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个数组记录字符串s在[0, i)区间能否使用wordDict组成 我们使用左右指针遍历字符串s的子串,左指针 j 为子串的左端点下标,右指针 i 为右端点下标的下一个 遍历过程中如果字符串s…

利士策分享,哀牢山:网红打卡地背后的探险风险

利士策分享,哀牢山:网红打卡地背后的探险风险 最近,云南的哀牢山因其独特的自然风光和神秘探险氛围而迅速走红网络。许多游客,特别是户外探险爱好者,纷纷涌入这片神秘的山脉,想要亲身体验那份原始与野性的…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-06

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-06 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-06目录1. A LLM-Powered Automatic Grading Framework with Human-Level Guidelines Optimization摘要:研究背景&…

MATLAB智能优化算法-学习笔记(4)——灰狼优化算法求解旅行商问题【过程+代码】

灰狼优化算法(Grey Wolf Optimizer, GWO)是一种基于灰狼社会行为的元启发式算法,主要模拟灰狼群体的捕猎行为(包括围攻、追捕、搜寻猎物等过程)。多旅行商问题(Multi-Traveling Salesman Problem, mTSP)是旅行商问题(TSP)的扩展,它涉及多个旅行商(车辆)从一个起点城…

超好用的element的el-pagination分页组件二次封装-附源码及讲解

前言:在很多后台管理系统开发时总会有很多分页组件的使用,如果我们每次都用elementui官网的el-pagination去写的话,调整所有分页的样式就会很麻烦,而且页面内容也会很累赘繁琐。 讲解一个我经常使用的二次封装el-pagination组件&…

产品经理产出的原型设计 - 需求文档应该怎么制作?

需求文档,产品经理最终产出的文档,也是产品设计最终的表述形式。本次分享呢,就是介绍如何写好一份需求文档。 所有元件均可复用,可作为管理端原型设计模板,按照实际项目需求进行功能拓展。有需要的话可分享源文件。 …

免费版U盘数据恢复软件大揭秘,拯救你的重要数据

我们的生活和工作越来越离不开各种存储设备,其中优盘因其小巧便携、方便使用的特点,成为了我们存储和传输数据的重要工具之一。为了防止你像我一样会遇到数据丢失抓狂的情况,我分享几款u盘数据恢复软件免费版工具来即时补救。 1.福昕U盘数据…

DDR6 或将出炉 (含 LPDDR6, CAMM)

前记:目前DDR6 尚未问世,文中较多信息是“据说”,笔者也无法考证,请大家后期以JEDEC官方为准。 很多朋友可能还没用上DDR5,但不好意思的是,DDR6 可能马上就要出现了。 三星和海力士较早开始DDR6 的设计,预计2025年商业化。 DDR6 速度 来源: 半导体观察 DDR6的速度…

VL53L4CD液位监测(2)----液位检测

VL53L4CD液位监测.2--液位检测 概述视频教学样品申请完整代码下载硬件准备STSW-IMG039容器特性包含必要的头文件变量定义测距函数 Ranging()液位误差补偿函数 Liquidlevelmeasureerrorcomponsate()数据轮询函数 get_data_by_polling()演示 概述 液位检测在工业自动化、环境监测…

[git] github管理项目之环境依赖管理

导出依赖到 requirements.txt pip install pipreqs pipreqs . --encodingutf8 --force但是直接使用pip安装不了torch,需要添加源!! pip install -r requirements.txt -f https://download.pytorch.org/whl/torch_stable.htmlpython 项目中 …

使用树莓派搭建音乐服务器

目录 引言一、搭建Navidrome二、服务穿透三、音流配置 引言 本人手机存储空间128G,网易云音乐6个G,本就不富裕的空间更是雪上加霜,而且重点是,我根本没有听几首歌,清除缓存后,整个软件都还是占用了5个G左右…

5 个PPT设计技巧,让你的开题答辩脱颖而出!

AIPaperGPT,论文写作神器~ https://www.aipapergpt.com/ 开题答辩是论文写作的第一道关键关卡,开题报告不仅展示了你的研究计划和方向,还要让评审老师理解你的研究背景和目的。一个设计精良的开题答辩PPT,不仅可以帮助你更好地陈…

LeetCode Hot100 | Day1 | 二叉树:二叉树的直径

LeetCode Hot100 | Day1 | 二叉树:二叉树的直径 主要学习内容: 二叉树深度求法 深度的 leftright1 得到的是从根结点到叶子结点的节点数量 543.二叉树的直径 [543. 二叉树的直径 - 力扣(LeetCode)](https://leetcode.cn/prob…

二分查找算法——山脉数组的峰顶索引&寻找峰值

1.题目解析 题目来源:852.山脉数组的峰顶索引 测试用例 题目来源:162.寻找峰值 测试用例 2.算法原理 山脉数组的峰顶索引 根据二段性将山脉数组分为两段:上升段与下降段 1.当mid指针落入上升段,说明峰值在mid指针后,要…

Linux 系统五种帮助命令的使用

Linux 系统五种帮助命令的使用 本文将介绍 Linux 系统中常用的帮助命令,包括 man、–help、whatis、apropos 和 info 命令。这些命令对于新手和有经验的用户来说,都是查找命令信息、理解命令功能的有力工具。 文章目录 Linux 系统五种帮助命令的使用一…