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

news2024/12/25 0:29:51

操作系统的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?

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

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

相关文章

C++STL的list模拟实现

文章目录 前言 list实现push_back迭代器(重点)普通迭代器const迭代器 inserterase析构函数构造函数拷贝构造赋值 vector和list的区别 前言 要实现STL的list, 首先我们还得看一下list的源码。 我们看到这么一个东西,我们知道C兼容C,可以用struct来创建一…

基于QTreeWidget实现多级组织结构

基于QTreeWidget实现多级组织结构以及带Checkbox的选择树 采用基于QWidgetMingw实现的多级组织结构树 通过QTreeWidget控件实现的多级组织结构树。 Qt相关系列文章: 一、Qt实现的聊天画面消息气泡 二、基于QTreeWidget实现多级组织结构 三、基于QTreeWidget实现带Ch…

计算机视觉(P2)-计算机视觉任务和应用

一、说明 在本文中,我们将探讨主要的计算机视觉任务以及每个任务最流行的应用程序。 二、图像内容分类 2.1. 图像分类 图像分类是计算机视觉领域的主要任务之一[1]。在该任务中,经过训练的模型根据预定义的类集为图像分配特定的类。下图是著名的CIFAR…

MySQL之DQL语句

DQL语句 DQL(Data Query Language)查询数据 操作查询:select简单的查询,复杂的查询数据库中最核心的语言,最重要的语句使用频繁的语句 指定查询 查询全部 语法: select 全部字段(*&#x…

webpack学习-4.开发环境

webpack学习-4.开发环境 1.mode2.使用source map3.自动编译代码3.1 webpack 的 观察模式3.2 使用 webpack-dev-server3.3 使用 webpack-dev-middleware 4.总结 1.mode 本章的标题一看就是开发环境,那就要引入webpack配置文件的mode了。 mode 属性用于指定 Webpack …

解决前端VUE前端框架报错Error: error:0308010C:digital envelope routines::unsupported的几种方法

一、报错信息: Error: error:0308010C:digital envelope routines::unsupportedat new Hash (node:internal/crypto/hash:67:19)at Object.createHash (node:crypto:135:10)at module.exports (E:\Projects\platform-code\platform-cloud\ruoyi-ui\node_modules\we…

基于单片机智能自动浇花系统设计

**单片机设计介绍,基于单片机智能自动浇花系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能自动浇花系统是一种可以自动感知周围环境,并执行相应动作的系统。通过使用传感器检测土…

详解MySQL中一条SQL执行过程

MySQL基本架构 如下图所示,从宏观角度来说MySQL架构可以分为server层和存储引擎层,其中Server层包含如下: 连接器:进行身份认证和权限相关校验。查询缓存:MySQL8.0已废弃,查询缓存主要是用于提高查询效率而加的一层缓存。分析器:对SQL执行动…

QDialog子类的使用

背景: 我用Qt designer实现了如下效果: 但在实际使用的时候,发现OK和Cancel按钮点是点不动的。 解决方法: 需要手动添加相关信号槽函数: connect(ui.buttonBox, SIGNAL(accepted()), this, SLOT(accept()));connect…

QT多项目管理

.pro文件配置解释:​​​​​​ Qt 中的多项目管理_qt子目录项目-CSDN博客Qt 模块化开发之 pro 子项目开发_qt 子项目-CSDN博客关于Qt编译库(1):在子项目中编译动态库并且使用_qt编译动态库后配置qt-CSDN博客QT release下的编译…

批量生成标题文章:AI文章创作助力高效办公,提升办公效率

随着人工智能技术的不断发展,AI文章创作已经成为了高效办公的新趋势。这种技术可以快速生成高质量的文章,从而大大提高办公效率。相比传统的手写文章,AI文章创作具有更高的效率和准确性。在撰写文章时,往往要花费大量的时间和精力…

stm32学习:hal库usart+esp8266+tcp+onenet+可以远程监督家里情况

目录 准备材料 步骤 stm32f103c8t6 在stm32clube里创建项目 先配置调试接口SYS(博主用的是stlink,选的是SW),配置外部时钟源RCC,总线时钟频数72 配置串口(波特率为115200) ​编辑 看各自…

input 获取焦点后样式的修改

一、实现目标 1.没有获取焦点时样子 2.获取焦点时 代码&#xff1a; <input class"input"placeholder"请输入关键字" input"loadNode" />css .input {border-radius: 14px;border:1px solid #e4e4e4;margin: 5px;margin-top: 10px;wi…

编程应用实际场景:台球厅怎么样用电脑给客人计时,台球计时收费系统操作教程

一、前言 准确控制顾客在店内游玩的时间&#xff0c;从而控制店内的各项成本&#xff0c;并提升店内的客流量。在顾客享受计时项目的时候&#xff0c;可以同时添加其他食物消费&#xff0c;并将单据合并统一结账。软件中的会员功能可以为客户办理会员可以使用灯控器控灯&#…

【LeetCode刷题笔记(1)】【Python】【两数之和】【简单】

LeetCode: 两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;找出数组中和为目标值 target 的两个整数&#xff0c;并返回它们的数组下标。 输入&#xff1a;一个整数数组 nums 和一个整数目标值 target输出&#xff1a;返回一个包含两个整数下…

【大数据】详解 AVRO 格式

详解 AVRO 格式 1.Avro 介绍2.schema2.1 原始类型2.2 复杂类型2.2.1 Records2.2.2 Enums2.2.3 Arrays2.2.4 Maps2.2.5 Unions2.2.6 Fixed 3.Avro 的文件存储格式3.1 数据编码3.1.1 原始类型3.1.2 复杂类型 3.2 存储格式3.3 存储格式 4.小结 1.Avro 介绍 Apache Avro 是 Hadoop…

阿里云SMC迁移RedHat/CentOS 5 内核升级

阿里云SMC迁移RedHat/CentOS 5 内核升级 1. 起因 服务器需要迁移上阿里云,有几台服务器用的是Redhat 5.x,在使用SMC进行迁移时出现以下报错. [2023-12-13 09:50:55] [Error] Check System Info Failed, codeS16_111, msgGet OS Info Failed: [error] grub is too old for C…

Python——数据库操作

目录 &#xff08;1&#xff09;安装Flask-SQLAlchemy &#xff08;2&#xff09;使用Flask-SQLAlchemy操作数据库 &#xff08;3&#xff09;连接数据库 •创建数据表 •增加数据 •查询数据 •更新数据 •删除数据 Flask-SQLAlchemy是Flask中用于操作关系型数据库的扩展…

Linux中使用podman管理容器

本章主要介绍使用podman管理容器 了解什么是容器&#xff0c;容器和镜像的关系安装和配置podman拉取和删除镜像给镜像打标签导出和导入镜像创建和删除镜像数据卷的使用管理容器的命令使用普通用户管理容器 对于初学者来说&#xff0c;不太容易理解什么是容器&#xff0c;这里…

【Azure 架构师学习笔记】- Azure Databricks (3) - 再次认识DataBricks

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (2) -集群 前言 在对Databricks有了初步了解之后&#xff0c;如果要深入使用则需要对其进行更深层次的了解。 Databricks ADB 是一个统一的…