【操作系统的IO模型有哪些?】

操作系统的IO模型有哪些?

  • 操作系统中的IO模型
  • 逐一拓展
    • 同步阻塞IO模型
    • 同步非阻塞IO模型
    • IO复用模型
    • 信号驱动IO模型
    • 异步IO模型

操作系统中的IO模型

为了保护操作系统的安全,通过缓存加快系统读写,会将内存分为用户空间和内存空间两个部分。如果用户想要操作内核空间的数据则需要把数据从内核空间拷贝到用户空间(数据会放到内核空间的page cache中,这种也叫做缓存IO)。

举个栗子:
如果服务器收到了从从客户端过来的请求,并且想要进行处理,那么需要经过这几个步骤:

  • 服务器的网络驱动接收到消息之后,向内核申请空间,并在收到完整的数据包(这个过程会产生延时,原因是有可能是通过分组传送过来的)后,将其复制到内核空间;
  • 数据从内核空间拷贝到用户空间;
  • 用户程序进行处理

在这里插入图片描述

我们再详细的探究服务器中的文件读取,对于Linux来说,Linux是一个将所有的外部设备都看作是文件来操作的操作系统,在它看来:everything is a file,那么我们就把对外部设备的操作都看作是对文件进行操作。而且,我们对一个文件进行读写,都需要通过调用内核提供的系统调用。

而在Linux中,一个基本的IO会涉及到两个系统对象:一个是调用这个IO的进程对象(用户进程),另一个是系统内核。也就是说,当一个read操作发生时,将会经历以下阶段:

  • 通过read系统调用,向内核发送读请求;
  • 内核向硬件发送读指令,并等待读就绪;
  • DMA把将要读取的数据复制到指令的内核缓冲区;
  • 内核将将数据从内核缓冲区拷贝到用户进程空间中

在这里插入图片描述

正是由于上面的几个阶段,导致了file中的数据被用户进程消费是需要过程的,这也就是延伸出了5中IO方式,分别是同步阻塞型IO模型、同步非阻塞型IO模型、IO复用模型、信号驱动模型、以及异步IO模型

逐一拓展

通过一个例子来分别说明这五种IO模型:

eg:假设小A需要去社保局柜台办事,拿号排队的例子

同步阻塞IO模型

**从系统调用recv到将数据从内核复制到用户空间并返回,在这段时间内进程始终阻塞。**就相当于,小A想去柜台办理业务,假如现在柜台业务繁忙,他也要排队,直到排到他办理完业务,才能去做别的事情。显然,这个IO模型是同步且阻塞的。

在这里插入图片描述

同步非阻塞IO模型

在这里recv不管有没有获得到数据都要返回,如果没有数据的话就过段时间再调用recv来看一看,如此循环。 就像是小A来柜台办理业务,发现柜员休息,挂出来暂停服务的牌子,这个时间小A就离开了,小A出去买了一根火腿肠吃上一吃,吃完小A就又回来看看柜员开始营业了没有,直到终于碰到柜员营业了,这才办理业务。我们可以看到,在小A中间离开的这段时间,他可以做自己的事情。回到正题,但是这个模型只有在检查无数据的时间是非阻塞的,在数据到达的时候依然要等待复制数据到用户空间(办理业务),因此它还是同步IO。

在这里插入图片描述

IO复用模型

在IO复用模型中,调用recv之前会先调用select或者poll,这两个系统调用都可以在内核准备好数据(网络数据已经到达内核了)时告知用户进程,它准备好了,这个时候再调用recv时是一定有数据的。因此,在这个模型中,进程阻塞于select或者poll,而没有阻塞在recv上。 就相当于,小A来柜台办理业务,大厅保安告诉他,现在没有空闲的柜台,所有柜台都有人在办理业务,等有空位的时间会告诉他。于是小A就等呀等(select或者poll调用中……),过了一会大厅保安告诉他有柜台空闲出来了,可以办理业务了,但是具体是几号柜台,你自己去找一下吧,于是小A就只能挨个柜台找呀找。

在这里插入图片描述

信号驱动IO模型

此处会通过调用sigaction注册信号函数,在内核数据准备好的时候,系统就会中断当前程序,执行信号函数(在这里调用recv)。 相当于,小A让大厅保安在柜台有空位的时候通知他(注册信号函数),等没多久大厅保安通知他,因为他是人才,所以专门给他开了一个柜台来办理业务,小A就去特席柜台办理业务了,但即使在等待的过程中是非阻塞的,但在业务办理的过程中依然是同步的。

在这里插入图片描述

异步IO模型

调用aio_read指令,内核把数据准备好,并且复制到用户进程空间后执行事先指定好的函数。 也就是说,小A交代大厅保安,我是人才,你把业务给我办理好了再通知我来验收,在这个过程中小A可以去做自己想做的事情。这就是真正的异步IO模型。

在这里插入图片描述
我们可以看到,前四种模型都是属于同步IO模型,因为在内核数据复制到用户空间这一个过程都是阻塞的。而最后一种异步IO,是通过将IO操作交给操作系统处理,当前的进程不关心具体IO的实现,后来再通过回调函数,或信号量通知当前进程直接对IO返回结果进行处理。

上一篇介绍: 如何理解select、poll、epoll?

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

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

相关文章

自动反冲洗过滤器直通式工作原理介绍和附反冲洗原理图动画讲解

​ 1:自动反冲洗过滤器直通式设备介绍 自动反冲洗过滤器是一种先进、高效且易操作的精密设备,广泛应用于冶金、化工、石油、造纸、医药、食品、采矿、电力、城市给水等领域。 在过滤过程中,待过滤的水由进水口进入过滤器机体,流…

beanshell、jcef

BeanShell BeanShell是一个小型嵌入式Java源代码解释器,具有对象脚本语言特性,能够动态地执行标准JAVA语法。 BeanShell不仅仅可以通过运行其内部的脚本来处理Java应用程序,还可以在运行过程中动态执行你java应用程序执行java代码。因为Bea…

C/C++ 表达式求值(含多位数)

个人主页:仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客 专题分栏:算法_仍有未知等待探索的博客-CSDN博客 目录 一、前言 二、解析 分析 最后直接上代码! 一、前言 表达式求值是一个比较基础的代码关于栈的使用。在写的时候充分锻炼…

Kubernetes版本升级到v1.18.0方法

升级k8s版本才能使用kube-prometheus安装监控 1、查看集群状态 [rootk8s-master k8s-script]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master Ready master 5d22h v1.18.0 k8s-slave1 Ready <none> 4d10h v1.18.0 k…

js Array.every()的使用

2023.12.13今天我学习了如何使用Array.every()的使用&#xff0c;这个方法是用于检测数组中所有存在的元素。 比如我们需要判断这个数组里面的全部元素是否都包含张三&#xff0c;可以这样写&#xff1a; let demo [{id: 1, name: 张三}, {id: 2, name: 张三五}, {id: 3, name…

物奇平台MIC配置与音频通路关系

物奇平台MIC配置与音频通路关系 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;可加我微信hezkz17, 本群提供音频技术答疑服务&#xff0c;群赠送语音信号处理降噪算法&#xff0c;蓝牙耳机音频&#xff0c;DSP音频项目核心开发资料, 1 255代表无效&am…

第31期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大型语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以…

电子学会C/C++编程等级考试2022年12月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:漫漫回国路 2020年5月,国际航班机票难求。一位在美国华盛顿的中国留学生,因为一些原因必须在本周内回到北京。现在已知各个机场之间的航班情况,求问他回不回得来(不考虑转机次数和机票价格)。 时间限制:1000 内存限制:655…

CTD测试流程

连接 连接17Plus&#xff0c;用usb转232线&#xff0c;db9公针2、3分别接Data I/O的2、3。DB9的5接Data I/O的1。尼龙塞子打开状态。不用闭合。 软件连接 打开SeaTermAF V2&#xff0c;注意打开前先把串口插上&#xff0c;否则软件读不到串口。如果读不到&#xff0c;就在插…

攻防世界-web-upload

1. 题目描述 打开链接&#xff0c;是这样的一个注册界面 先试着注册一个账号看看&#xff0c;这里简单操作&#xff0c;注册test/test&#xff0c;注册完后进行登录 登录成功后进入到这样一个文件上传界面。当前从界面上得到的信息暂时就是这些了。 2. 思路分析 既然存在上传…

基于FFmpeg,实现播放器功能

一、客户端选择音视频文件 MainActivity package com.anniljing.ffmpegnative;import android.Manifest; import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Ur…

sentinel整合nacos配置中心持久化

在网上找了很多的资料&#xff0c;发现sentinel整合nacos持久化的博文和视频大多数都只有改造限流部分的教程&#xff0c;并且都需要修改前端&#xff0c;略显麻烦&#xff0c;至于剩下的熔断、热点流控、授权的更是没有相关的改造教程&#xff0c;最后在知乎的看到一篇文章后让…

表单参数绑定(如何解决一个输入框绑定两个参数)

表单参数绑定(如何解决一个输入框绑定两个参数) 问题复现 <el-form-item label"会议编号" prop"meetingNum"><el-select v-model"form.meetingNum" placeholder"请选择会议编号" style"width: 100%;":disabled&quo…

selenium+python自动化测试 —— 解决无法启动IE浏览器及报错问题!

前言&#xff1a;记录启动IE浏览器的报错及解决方法。 错误1&#xff1a; selenium.common.exceptions.WebDriverException: Message: IEDriverServer.exe executable needs to be in PATH. Please download from http://selenium-release.storage.googleapis.com/index.html…

SQL Server 服务启动报错:错误1069:由于登录失败而无法启动服务

现象 服务器异常关机以后&#xff0c;SQL Server服务无法启动了。 启动服务时报错&#xff1a; 错误1069:由于登录失败而无法启动服务 解决办法 我的电脑–控制面板–管理工具–服务–右键MSSQLSERVER–属性–登录–登陆身份–选择"本地系统帐户" 设置完成后&am…

springboot整合日志框架log4j2

springboot整合日志框架log4j2 前言&#xff1a;springboot提供了默认的日志框架logback&#xff0c;结合slf4j门面&#xff0c;基于简单配置即可实现日志输出记录。但是实际开发中很多项目会使用log4j2&#xff0c;log4j2是log4j的升级版本&#xff0c;性能和安全性上比log4j…

【视觉SLAM十四讲学习笔记】第四讲——指数映射

专栏系列文章如下&#xff1a; 【视觉SLAM十四讲学习笔记】第一讲——SLAM介绍 【视觉SLAM十四讲学习笔记】第二讲——初识SLAM 【视觉SLAM十四讲学习笔记】第三讲——旋转矩阵 【视觉SLAM十四讲学习笔记】第三讲——旋转向量和欧拉角 【视觉SLAM十四讲学习笔记】第三讲——四元…

ffmpeg编解码——数据包(packet)概念(如何正确处理数据包中的显示时间戳pts与解码时间戳dts关系?)

文章目录 FFmpeg编解码——数据包&#xff08;Packet&#xff09;概念1. 数据包&#xff08;Packet&#xff09;简介2. 数据包&#xff08;Packet&#xff09;在FFmpeg中的应用2.1 从媒体文件读取数据包2.2 向媒体文件写入数据包 3. 数据包&#xff08;Packet&#xff09;相关问…

C语言指针基础题(二)

目录 例题一题目解析及答案 例题二题目解析及答案 例题三题目解析及答案 例题四题目解析及答案 例题五题目解析及答案 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f…

使用Microsoft Dynamics AX 2012 - 8. 财务管理

财务管理的主要职责是控制和分析与货币金额有关的所有交易。这些事务发生在整个组织的业务流程中。 因此&#xff0c;财务管理是企业管理解决方案的核心领域。在Dynamics AX中&#xff0c;支持所有部门业务流程的应用程序的深度集成可立即提供准确的财务数据。 分类账交易的原…