浅析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网络编程》

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

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

相关文章

【八股】2023秋招八股复习笔记5(计算机网络-CN)

文章目录 八股目录目录1、应用层 & HTTP一些http题HTTPS 加密原理(问过)HTTP/1.1 新特性HTTP/2.0 与 RPC(问过)GET 和 POST 比较 2、传输层 & TCPTCP三次握手 & 四次挥手(问过)为什么每次TCP 连…

一百六十八、Kettle——用海豚调度器定时调度从Kafka到HDFS的任务脚本(持续更新追踪、持续完善)

一、目的 在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分。而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件? 为了测试实际项目中的海豚定时调度从…

Qt使用Json

包含目录&#xff1a; #include <QJsonObject> #include <QJsonDocument> #include <QByteArray> #include <QFile> #include <QJsonArray>基本结构&#xff1a; 写json QJsonObject studentobj;QJsonArray arrarydata;QJsonObject subdata;…

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

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

【Terraform学习】使用 Terraform创建Lambda函数启动EC2(Terraform-AWS最佳实战学习)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

Netty-ChannelPipeline

EventLoop可以说是 Netty 的调度中心&#xff0c;负责监听多种事件类型&#xff1a;I/O 事件、信号事件、定时事件等&#xff0c;然而实际的业务处理逻辑则是由 ChannelPipeline 中所定义的 ChannelHandler 完成的&#xff0c;ChannelPipeline 和 ChannelHandler应用开发的过程…

专门针对开发人员,攻击者利用Rust获取操作系统信息

近日&#xff0c;研究人员在 Rust 编程语言的 crate 注册表中发现了一些恶意软件包&#xff0c;专门针对开发人员。 Phylum 在上周发布的一份报告中称&#xff0c;这些库是由一个名为 "amaperf "的用户在 2023 年 8 月 14 日至 16 日之间上传的。现已删除的软件包名…

【kubernetes系列】Calico原理及配置

概述 Calico是针对容器&#xff0c;虚拟机和基于主机的本机工作负载的开源网络和网络安全解决方案。 Calico支持广泛的平台&#xff0c;包括Kubernetes&#xff0c;OpenShift&#xff0c;Docker EE&#xff0c;OpenStack和裸机服务。 Calico在每个计算节点都利用Linux Kernel实…

改革企业治理结构,建立国有企业全面预算管理制度

随着我国市场经济的推广&#xff0c;国有企业进入到改革发展的必经之路上&#xff0c;企业应当结合自身实际情况加强成本管控&#xff0c;提高管理效率&#xff0c;为企业的发展提供有力保障。近年来&#xff0c;全面预算管理的理念在国有企业实施范围内不断扩大&#xff0c;加…

企业知识管理的解决方案

人们发现&#xff0c;挖掘知识、创造知识、生产知识&#xff0c;用知识为自己的产品赋予高附加值&#xff0c;才是企业和社会可持续发展的动力之源。所以知识管理越来越受到重视。 知识管理作为一个新兴的管理概念&#xff0c;已经被学术界所接受&#xff0c;但尚未形成一个…

python3+requests:接口自动化测试(二)

前言&#xff1a;上篇文章python3requestsunittest&#xff1a;接口自动化测试&#xff08;一&#xff09;&#xff1a;已经介绍了基于unittest框架的实现接口自动化&#xff0c;但是也存在一些问题&#xff0c;比如最明显的测试数据和业务没有区分开&#xff0c;接口用例不便于…

Android OTA 相关工具(八) 使用 lpadd 添加镜像到 super.img

文章目录 1. lpadd 的编译2. lpadd 的帮助信息3. lpadd 的用法3.1 准备工作empty 的 super 设备镜像raw 格式的 super 设备镜像sparse 格式的 super 设备镜像 3.1 lpadd 分区操作示例 4. 其它 我一直以为没有人会使用 lpadd 工具&#xff0c;就像我以为没有人会去使用 lpmake 手…

Netty源码NioEventLoop解析

带着问题源码 Netty 的 NioEventLoop 是如何实现的&#xff1f;它为什么能够保证 Channel 的操作是线程安全的&#xff1f;Netty 如何解决 JDK epoll 空轮询 Bug&#xff1f;NioEventLoop 是如何实现无锁化的&#xff1f; 一、作用与设计原理 Netty的NioEventLoop并不是一个存…

无涯教程-Android - 应用组件

应用程序组件是Android应用程序的基本组成部分&#xff0c;这些组件需要在应用程序清单文件 AndroidManifest.xml 注册&#xff0c;该文件描述了应用程序的每个组件以及它们如何交互。 Android应用程序可以使用以下四个主要组件- Sr.NoComponents & 描述1 Activities 它们…

2023-9-2 Kruskal算法求最小生成树

题目链接&#xff1a;Kruskal算法求最小生成树 #include <iostream> #include <algorithm>using namespace std;const int N 200010;// 与并查集中的p含义相同 int p[N];struct Edge {int a, b, w;bool operator< (const Edge & W)const{return w < W.w…

浅析Linux SCSI子系统:错误恢复

文章目录 概述SCSI错误恢复处理添加错误恢复命令错误恢复线程scsi_eh_ready_devs IO超时处理相关参考 概述 IO路径是一个漫长的过程&#xff0c;从SCSI命令请求下发到请求完成返回&#xff0c;中间的任何一个环节出现问题都会导致IO请求的失败。从SCSI子系统到低层驱动&#x…

【快手小玩法-弹幕游戏】开发者功能测试报告提交模板

背景 快手有明确的要求&#xff0c;准入和准出更加严格&#xff0c;要求有明确的测试报告。格式如下&#xff1a; *本文参考字节wiki&#xff1a;CP侧测试报告模板(复制填写轻雀文档) 其他文章推荐&#xff1a;【抖音小玩法-弹幕游戏】开发者功能测试报告提交模板 一、前言…

Java后端开发面试题——集合篇

ArrayList底层的实现原理是什么 底层数据结构 ArrayList底层是用动态的数组实现的 初始容量 ArrayList初始容量为0&#xff0c;当第一次添加数据的时候才会初始化容量为10 扩容逻辑 ArrayList在进行扩容的时候是原来容量的1.5倍&#xff0c;每次扩容都需要拷贝数组 添加逻…

MMSegmentation训练自己的语义分割数据集

全流程&#xff0c;训练语义分割数据集 数据标注json转mask 运行源码MMSegmentation模型选择运行部分 数据标注 # 安装 pip install labelme # 启动labelme labelme然后 ctrl N 开启多边形标注即可&#xff0c;命名类为person 之后会保存到同目录下json文件&#xff1a; js…

WordPress(6)网站侧边栏倒计时进度小工具

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 效果图在这里插入图片描述一、添加位置二、主题style.css文件中添加美化1.引入库2.添加自定义的HTML模块效果图 提示:以下是本篇文章正文内容,下面案例可供参考 一、添加位置 在主题中 child.js…