IO同步与异步

 公众号:I/O异步与同步

        我们的程序,如果要对I/O设备进行操作,比如通过一个socket发送数据,文件的读写,是怎么实现的呢? 要知道,为了保证系统安全以及抽象化(避免每个进程都需要对IO设备进行编码),进程是无法直接操作I/O设备的,必须通过系统调用请求Kernal来协助完成I/O操作。
        而在冯诺依曼架构下,I/O操作往往特别慢,为了降低延迟,提高吞吐量以及数据处理速率,内核就会为在内核空间每个I/O设备维护一个buffer。这样,进程对内核请求时,数据都通过内核buffer来交互,而内核与I/O交互过程中,I/O设备响应可能很慢,所以内核必须等待IO设备将数据复制到内核空间中。

        这样,数据从I/O设备复制到内核空间,内核需要进行一次等待,进程从内核buffer中获取数据,在内核缓冲区准备好之前,进程也需要一次等待。根据等待模式的不同,I/O模式分为五种:

  • 阻塞I/O (blocking I/O)

  • 非阻塞I/O (nonblockong I/O)        

  • I/O复用 I/O (multiplexing)       

  • 信号驱动I/O (signal driven I/O)

  •  异步I/O (Asynchronous I/O) 

  1. 阻塞I/O

      阻塞I/O执行的系统调用可能因为无法立刻完成,导致被请求的进程被系统挂起,直到I/O完成为止。比如,connect发起连接时,connect首先发送同步报文给服务器,等待服务器返回确认报文。如果服务器的确认报文没有立即到达,connect调用被系统挂起,直到客户端收到确认报文并唤醒connect调用。

  2. 非阻塞I/O

      非阻塞I/O允许进程在请求 I/O 操作后,如果数据未准备好,立即得到一个错误返回,根据errno,通常是EWOULDBLOCK 或 EAGAIN,对connect来说,errno被设置为EINPROGRESS。这样,进程可以继续执行其他任务,不必阻塞等待 I/O 操作完成。

  3. I/O复用
     I/O复用允许单个进程同时等待多个I/O操作中的任何一个完成。通常通过 select(), poll(), 或 epoll() 系统调用实现。进程阻塞在这些调用上,直到一个或多个 I/O 操作完成,从而有效地监听多路 I/O 资源而不是只关注单一资源。

  4. 信号驱动 I/O(Signal-driven I/O)
      信号驱动 I/O 模式中,进程可以继续执行,直到内核某个时刻准备好数据并通过发送信号通知进程。这种模式下,进程不需要在调用期间阻塞,也无需频繁检查数据是否可用。比较适合事件驱动模式,减少轮询开销。

  5. 异步I/O(noblocking all the way(signal when I/O is completed)

      异步 I/O 模式下,进程发起 I/O 操作后可以立即执行后续指令,不需等待 I/O 操作的完成。内核会在整个 I/O 操作完成后通知进程,这包括数据从 I/O 设备复制到内核缓冲区,以及从内核缓冲区复制到进程缓冲区的过程。如windows的IOCP模式。

总结
        可以看出,IO操作的时候,进程可以等待IO操作完成(同步),也可以不等待IO完成直到内核完成后通知进程(异步),这就是同步和异步的区别。同步模型中,进程可以阻塞等待IO完成,也可以不阻塞而是通过轮询(如select)或者事件监听(如epoll)的方式来判断IO是否完成。
        当然,也可以通过数据从内核空间到用户空间的拷贝,是操作系统自己完成的,还是进程来操作,来判断是同步还是异步。

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

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

相关文章

c++的学习之路:26、AVL树

摘要 本章主要是说一下AVL树的实现,这里说的是插入的底层原理 目录 摘要 一、原理 二、四种旋转 1、左单旋 2、右单旋 3、左右双旋 4、右左双旋 三、代码实现 1、节点创建 2、插入 3、旋转 4、判断是否平衡 5、测试 四、代码 一、原理 前面说了搜索…

面试经典150题——H指数

面试经典150题 day11 题目来源我的题解方法一 排序从后往前遍历方法二 计数排序后缀和方法三 排序从左到右遍历 题目来源 力扣每日一题;题序:274 我的题解 方法一 排序从后往前遍历 先将数组升序排序,然后h从n到0开始遍历,计算…

为啥转化为可编辑面片后有这么多点和线

可以删一下 按住alt按移除可以删掉 选择你要删的那些线 按住alt点移除

一个typescript 5 + rollup 4 打包lib模板仓库实现

前言 昨天在写点什么东西的时候,发现有些逻辑可以搞成一个 npm 模块。 找了下看看,有没有什么好用现成模板用于开发。。发现并没有; 那有需求就解决需求。。 需求 基于当前的流行技术栈选型(rollup 4.x typescript 5.x)提供一个最小化模…

eBay、亚马逊自养号测评如何避免风控账号关联选择合适网络IP环境

在自养号下单中选择适合的网络环境至关重要。经过多次实践与测试,积累了大量的经验,希望能够与大家分享,帮助大家避开陷阱,顺利前行。 市面上的网络环境种类繁多,从纯IP类的Luminati、Rola,到纯环境类的VM…

编写Spark独立应用程序

执行本文之前,先搭建好spark的开发环境,我目前只搭建了standalone模式,参考链接 : Spark Standalone模式部署-CSDN博客 1. 安装sbt 1)下载sbt 网址:https://www.scala-sbt.org/download.html &#xff0c…

【云原生 • Docker】 ELK 8.4.3 docker 保姆级安装部署详细步骤

文章目录 ELK简介二、版本说明三、安装部署3.1 创建docker网络3.2 Elasticsearch拉取docker镜像,版本:8.4.3第一次执行docker脚本可以看到控制台的信息,找到这个信息并保存下来创建Elasticsearch挂载目录给创建的文件夹授权将容器内的文件复制到主机上删除容器修改docker脚本…

【GPTs分享】GPTs分享之Image Recreate | img2img​

简介 该GPT是一个专门用于图像编辑、重建和合并的工具。它通过详细的自动图像描述和生成,帮助用户从源图像中重现或修改图像。此工具设计用于为视障用户提供图像内容的详细描述,并生成全新的图像,以满足特定的视觉需求。 主要功能 \1. 图像…

Python基础:【练手小实验系列】列表、元组、字典、集合

文章目录 题目练习题1: 列表合并和排序练习题2: 元组元素计数练习题3: 字典键值互换练习题4: 集合的交集与并集参考答案练习题1: 列表合并和排序练习题2: 元组元素计数练习题3: 字典键值互换练习题4: 集合的交集与并集题目 练习题1: 列表合并和排序 题目描述: 给定两个已经排…

webpack源码分析——enhanced-resolve库之cdUp函数

一、 cdUp函数 函数功能 该函数寻找上层目录,每次调用函数时对输入的路径进行一次寻找上级目录。如果没有找到返回null 二、函数分析 传入的directory判读是否为‘/’如果是直接返回nullif (directory "/") return null;获取‘/’和‘\’在directory 中…

Unity开发holoLens2应用时的ProjectSettings配置

正确的进行Unity工程配置,才能进行后续的【发布】和【部署】操作… 本案例开发环境说明: Unity2021.3.18Win10VS2022HoloLens2 一、平台设置 二、Quality画面质量设置 三、Player玩家设置 四、XR-Plug设置 五、环境测试 导入一个官方demo&#xff0c…

基于C语言的贪吃蛇实现

头文件 #pragma once #include<stdio.h> #include<Windows.h> #include<stdbool.h> #include<locale.h> #include<time.h> #define KEY_PRESS(vk) ( (GetAsyncKeyState(vk) & 1) ? 1 : 0) #define POS_X 24 #define POS_Y 5 #define FOOD …

网址分类-杂项

网址分类 Python可视化库matplotlibplotnineseaborn 科学计算库numpy scipy数据分析库pandas 人工智能opencvkeras 工具网站电子工具 Python 可视化库 matplotlib matplotlib官网 plotnine plotnine seaborn seaborn 科学计算库 numpy numpy官网 scipy scipy官网 …

ORAN C平面 Section Extension 23

ORAN C平面Section扩展23用于任意symbol模式的调制压缩参数。此section扩展允许为一个或多个“SymPrbPatterns”指定多组“mcScaleReMask、csf和mcScaleOffset”值。“SymPrbPattern”用于指定一组PRB&#xff0c;这些PRB可以跨越使用prbPattern指定的整个PRB范围&#xff08;频…

重生奇迹mu坐骑怎么升级

重生奇迹mu坐骑怎么升级 1、前期&#xff0c;都是主线任务&#xff0c;我们必须要跟着主线任务走&#xff0c;前面的话升级一次需要的经验很少的&#xff0c;一天下来可以升级100级是轻轻松松的&#xff0c;主线任务是比较多的&#xff0c;我们跟着任务一直做差不多可以到150级…

dspbuilder中使用signalcompiler时报错Error during compilation: Fitter failed,如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

计算机组成原理【CO】Ch7 I/O大题

目录 I/O大题解题方法 I/O接口 各种I/O方式的特点 I/O端口编址 程序查询方式 中断控制方式 DMA控制方式 程序中断的工作流程 程序中断的工作流程 DMA方式和中断方式的区别 I/O大题解题方法 CPU 程序查询中断DMA I/O接口的类型 按字传输&#xff1a;每次传输一个字 程…

【C++】日期类Date(详解)

&#x1f525;个人主页&#xff1a;Forcible Bug Maker &#x1f525;专栏&#xff1a;C 目录 前言 日期类 日期类实现地图 获取某年某月的天数&#xff1a;GetMonthDay 检查日期合法&#xff0c;构造函数&#xff0c;拷贝构造函数&#xff0c;赋值运算符重载及析构函数…

【数据结构2-线性表】

数据结构2-线性表 1 线性表-数组2 线性表-单链式结构2.1 前插顺序单链表2.2 后插顺序单链表2.3 循环单链表2.4 双向链表 总结 线性表、栈、队列、串和数组都属于线性结构。 线性结构的基本特点是除第一个元素无直接前驱&#xff0c;最后一个元素无直接后继之外&#xff0c;其他…

linux实用C++库之json

目录 1 介绍2 内容 1 介绍 本博客用来记录linux下json库的基本使用。 2 内容 安装&#xff1a; 使用&#xff1a; CMakeLists.txt编写&#xff1a;