浅析Linux系统I/O模型

文章目录

    • 概述
    • 阻塞式I/O模型
    • 非阻塞式I/O模型
    • I/O多路复用模型
    • 信号驱动式I/O模型
    • 异步I/O模型
    • 相关参考

概述

在操作系统中,I/O类操作是相对慢速的,应用发起一个I/O操作,需要等待I/O资源就绪后,才能继续后面的处理。这种简单的请求-响应的IO模型,很明显是无法满足实际生产环境对高并发、高吞吐的要求,因此,系统通常会提供多种I/O模型,以提高I/O操作的效率。Linux系统中支持5种I/O模型:

  • 阻塞式I/O;
  • 非阻塞式IO;
  • I/O多路复用模型
  • 信号驱动式IO;
  • 异步IO。

POSIX依据I/O操作是否会导致请求进程阻塞,将I/O操作分成同步I/O和异步I/O,其中:

  • 同步I/O操作会导致请求进程阻塞,直到I/O操作完成;
  • 异步I/O操作不会导致请求进程阻塞。

阻塞式I/O模型

阻塞式I/O是最基本的I/O模型,POSIX提供的大部分I/O类系统调用接口默认行为都是阻塞式的。以recvfrom操作为例,当应用进程发起recvfrom调用时,如果当前的数据没有就绪,那么调用进程会被阻塞并一直等待数据准备完成。recvfrom成功返回后,应用进程开始处理数据。
在这里插入图片描述

阻塞式I/O模型会导致应用进程大部分时间都在消耗在等待I/O上,而无法去处理其它事务。为了提升并发能力,早期的应用通常都会采用多进程或者多线程的方式来配合阻塞式I/O模型使用,但多进程和多线程带来的资源开销也很大程度上制约了系统的能力。

非阻塞式I/O模型

通过将套接字设置成非阻塞式,应用进程在执行I/O操作时,如果当前数据尚未就绪,那么调用会直接返回一个错误,在Linux中,这个错误类型通常是EWOULDBLOCK,指示数据还未准备好。应用进程可以不断选择进行重试,直到数据准备完成。
在这里插入图片描述

非阻塞式I/O模型不会导致应用进程阻塞,但不断重试的方案也会带来很高的CPU开销,因此非阻塞式I/O模型通常都会配合系统的I/O多路复用机制一起使用。

I/O多路复用模型

I/O多路复用是目前网络服务器编程使用最广泛的I/O模型,Reactor编程模型就是基于I/O多路复用进行实现。I/O多路复用提供了一类接口,可以等待多个描述符就绪,这样的好处在于应用进程可以只阻塞在I/O多路复用的接口中,只要监听的描述符中有一个资源准备就绪,应用进程就会被唤醒进行处理。
在这里插入图片描述

在Linux系统中,提供了三类I/O多路复用接口,分别为select、poll以及epoll,其中select/poll在监听的描述符较少的场景下使用;对于高并发应用,通常会使用epoll机制。

信号驱动式I/O模型

信号驱动式I/O模型在实际使用中并不多见,它通过让Linux内核在描述符就绪时发送SIGIO信号,通知应用进程可以执行I/O操作获取数据,从而避免了无谓的等待。
在这里插入图片描述

异步I/O模型

异步I/O在POSIX的语义中被定义为是真正的异步I/O操作类型,与前面四种I/O模型相比,异步I/O接口不需要等待数据就绪,甚至连数据读取的动作都不需要进行。异步I/O接口只是简单地提交一个I/O请求,后续所有事情都交给内核进行处理,内核会执行实际的I/O操作,并将数据从内核复制到应用的缓冲区,完成后通知应用进程进行数据处理。
在这里插入图片描述

异步I/O模型与信号驱动式I/O的主要区别在于:信号驱动式I/O是由内核通知我们何时可以启动一个I/O操作,而异步I/O模型是由内核通知我们I/O操作何时完成。Linux系统最早提供的异步I/O接口主要是aio系列函数,在5.1内核版本,又引入了新的高性能异步I/O框架io_uring。

相关参考

  • 《Unix网络编程》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

详解MES中的四大现场执行管理模式

导 读 ( 文/ 3426 ) 制造业是全球经济中至关重要的一部分,随着市场竞争的加剧和客户需求的多样化,企业需要寻找合适的生产方式来提高生产效率、降低成本并保证产品质量。在这个背景下,制造执行系统(MES)作为连接管理层…

前端基础3——JavaScript基础用法

文章目录 一、基本使用1.1 内部方式1.2 外部导入方式1.3 css标签调用js脚本(触发事件) 二、Windows对象2.1 对象属性2.2 对象方法 三、数据类型3.1 字符串处理3.2 数组处理3.3 对象处理 四、流程控制4.1 操作符4.2 if判断语句4.3 for循环语句4.4 continu…

2018ECCV Can 3D Pose be Learned from2D Projections Alone?

摘要 在计算机视觉中,从单个图像的三维姿态估计是一个具有挑战性的任务。我们提出了一种弱监督的方法来估计3D姿态点,仅给出2D姿态地标。我们的方法不需要2D和3D点之间的对应关系来建立明确的3D先验。我们利用一个对抗性的框架,强加在3D结构…

【链表OJ 10】环形链表Ⅱ(求入环节点)

前言: 💥🎈个人主页:​​​​​​Dream_Chaser~ 🎈💥 ✨✨刷题专栏:http://t.csdn.cn/UlvTc ⛳⛳本篇内容:力扣上链表OJ题目 目录 leetcode142. 环形链表 II 1.问题描述 2.代码思路 3.问题分析 leetcode142. 环形链…

安全开发-JS应用NodeJS指南原型链污染Express框架功能实现审计WebPack打包器第三方库JQuery安装使用安全检测

文章内容 环境搭建-NodeJS-解析安装&库安装安全问题-NodeJS-注入&RCE&原型链案例分析-NodeJS-CTF题目&源码审计打包器-WebPack-使用&安全第三方库-JQuery-使用&安全 环境搭建-NodeJS-解析安装&库安装 Node.js是运行在服务端的JavaScript 文档参考…

Java 大厂八股文面试专题-设计模式 工厂方法模式、策略模式、责任链模式

面试专题-设计模式 前言 在平时的开发中,涉及到设计模式的有两块内容,第一个是我们平时使用的框架(比如spring、mybatis等),第二个是我们自己开发业务使用的设计模式。 面试官一般比较关心的是你在开发过程中&#xff…

javaee之黑马乐优商城2

简单分析一下商品分类表的结构 先来说一下分类表与品牌表之间的关系 再来说一下分类表和品牌表与商品表之间的关系 面我们要开始就要创建sql语句了嘛,这里我们分析一下字段 用到的数据库是heima->tb_category这个表 现在去数据库里面创建好这张表 下面我们再去编…

剑指 Offer 44. 数字序列中某一位的数字(中等)

题目: class Solution { //本题单纯找规律,要注意通过n%digits来判断有几个位数为digits的数 public:int findNthDigit(int n) {long base 9, digits 1; //digits代表位数while(n-base*digits>0){ //该循环是为了确定目标数字所在…

JZ12 矩阵中的路径

剑指Offer编程链接:JZ12 题目描述: 思路:递归回溯的方法,总结一下什么情况需要使用递归: 递归在解决问题时,通常涉及以下情况: 问题可被分解为较小的相似子问题。子问题与原问题具有相同的结…

记录--前端使用a链接下载内容增加loading效果

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 问题描述:最近工作中出现一个需求,纯前端下载 Excel 数据,并且有的下载内容很多,这时需要给下载增加一个 loading 效果。 代码如下: // util…

[dasctf]misc3 chrchrchr.pcapng

webshell 流量分析 php代码部分没啥看的,主要在标黄的部分,裁剪掉前面的字符可base解码 能看到在向a.txt中写入数据 wp # tshark.exe -r chrchrchr.pcapng -T fields -e urlencoded-form.value -Y "urlencoded-form.keyzd2ebbfb26dd" >…

【设计模式】Head First 设计模式——桥模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 设计思想 桥模式。将抽象部分(业务功能)与实现部分(平…

vr健康管理服务情景化教学弥补现代医学教学中的诸多不足之处

高职高专临床医学院校以培养岗位胜任力为目的,该专业是一门专业性、实践性较强的医学学科,要求培养出来的学生具有较强的临床实践能力,医学生所学的全部知识,都应与实践相结合,解决临床的实际问题,为患者解…

Android 手游聚合SDK小知识(一)

Android 手游聚合SDK小知识(一) Android 手游聚合SDK小知识(二) 聚合分包 前言 回头想想,在安卓游戏SDK这个领域,我也呆了4年了,从啥都不懂的小菜鸟,逐渐靠自己不断学习,对这个行业也算有了一些理解,趁着…

Qt应用开发(基础篇)——颜色选择器 QColorDialog

一、前言 QColorDialog类继承于QDialog,是一个设计用来选择颜色的对话框部件。 对话框窗口 QDialog QColorDialog颜色选择器一般用来让用户选择颜色,比如画图工具中选择画笔的颜色、刷子的颜色等。你可以使用静态函数QColorDialog::getColor()直接显示对…

vue集成mars3d后,basemaps加不上去

首先&#xff1a; <template> <div id"centerDiv" class"mapcontainer"> <mars-map :url"configUrl" οnlοad"onMapload" /> </div> </template> <script> import MarsMap from ../component…

Golang:微服务常用代码分层结构

1.代码结构 代码分层结构是一个老生常谈的话题&#xff0c;好的代码结构能够使得系统易于理解、开发及维护&#xff0c;如果代码结构很混乱就会使得不同层级的代码块耦合&#xff0c;导致难以维护和拓展。 比较经典的代码结构&#xff08;宏观&#xff09;有Web的MVC模式分层结…

Spring Cloud Foundry上使用通配符模式匹配进行的安全绕过漏洞 CVE-2023-20873

文章目录 0.前言1.参考文档2.基础介绍描述如果满足以下任一条件&#xff0c;应用程序就不会有太大风险&#xff1a;受影响的Spring产品和版本 3.解决方案3.1. 升级版本3.2. 替代方案 0.前言 背景&#xff1a;公司项目扫描到 Spring Cloud Foundry上使用通配符模式匹配进行的安全…

tp5使用redis及redis7.2安装到window系统上面

redis安装教程 redis7.2安装到window系统上面 https://download.csdn.net/download/qq_39161501/88269037 解决方案&#xff1a;修改配置php.ini文件 打开Apache目录下的php.ini文件&#xff0c;搜索extension&#xff0c;在空白处加上下列代码&#xff1a; 注&#xff1a;e…

2019CVPR Semantic Graph Convolutional Networks for 3D Human Pose Regression

基于语义图卷积网络的三维人体姿态回归 源码 https://github.com/garyzhao/SemGCN 摘要 在本文中&#xff0c;我们研究了学习图卷积网络&#xff08;GCN&#xff09;回归的问题。GCN的当前体系结构受限于卷积滤波器和共享的变换矩阵为的小感受野。为了解决这些限制&#xff…