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

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

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

相关文章

想学精MySQL,得先捋一捋高可用架构

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

ARM day8

1.题目&#xff1a;主机获取从机里面的温湿度数据&#xff0c;并打印出来 结果&#xff1a; 代码&#xff1a; main.c #include "iic.h"#include "si7006.h"void delay(int ms){int i,j;for(i0;i<ms;i){for(j0;j<2000;j);}}int main(){short tem;…

关于“Python”的核心知识点整理大全11

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

【网络编程之初出茅庐】

前言&#xff1a;本章主要先讲解一些基本的网络知识&#xff0c;先把基本的知识用起来&#xff0c;后续会更深入的讲解底层原理。 网络编程的概念 网络编程&#xff0c;指网络上的主机&#xff0c;通过不同的进程&#xff0c;以编程的方式实现网络通信&#xff08;或称为网络数…

网络基础(九):VLAN的概述及配置

目录 前言 一、分割广播域的方法 二、VLAN 1、VLAN的概述及优势 1.1VLAN的概述 1.2VLAN的优势 2、VLAN的种类 3、VLAN的三种端口类型 4、VLAN 的工作原理 4.1VLAN数据帧 4.2VLAN的范围 4.2VLAN的access类型工作原理 4.3VLAN的trunk类型工作原理 4.4VLAN的Hybird类…

CentOS7安装MySQL8.0

一、使用Yum安装 1. 使用wget下载MySQL的rpm包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm2. 安装下载好的rpm包 yum localinstall mysql80-community-release-el7-3.noarch.rpm 3. 安装mysql&#xff08;该步可能出现问题&#xff09; yum…

JAVAEE-8-线程池

池 我们之前也接触过,比如说常量池,数据库连接池,线程池,进程池,内存池等等, 池的共性: 1.提前把要用的对象准备好 2.把用完的对象也不要立即释放,先留着以备下次使用 来提高效率!!! 最开始,进程能够解决并发编程的问题,因为频繁创建销毁进程的开销成本太大了,所以我们引…

新版Spring Security6.2案例 - Basic HTTP Authentication

前言&#xff1a; 书接上文&#xff0c;翻译官网Authentication的Username/Password这页&#xff0c;接下来继续翻译basic的这页&#xff0c;因为官网说的都是原理性的&#xff0c;这边一个小案例关于basic http authentication。 Basic Authentication 本节介绍 HTTP 基本身…

Unity 通过鼠标控制模拟人物移动和旋转视角

要通过鼠标控制并模拟人物移动和转换视角&#xff0c;将会使用射线检测、鼠标点击和鼠标水平移动&#xff0c;配合物体旋转和移动方法共同实现。 首先搭建个由一个Plane地板和若干cube组成的简单场景&#xff1a; 其次创建一个Capsule作为移动物体&#xff0c;并把摄像头拉到该…

腾讯云优惠券领取指南

腾讯云优惠券是降低云服务成本的有效手段&#xff0c;无论是新用户还是老用户&#xff0c;都可以通过下面方法领取到适合自己的优惠券。 1、腾讯云优惠券领取 领取入口&#xff1a;txy.ink 2、腾讯云优惠券介绍 腾讯云优惠券包括代金券和折扣券&#xff0c;代金券可以在结算…

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分

【CCF BDCI 2023】多模态多方对话场景下的发言人识别 Baseline 0.71 CNN 部分 概述CNN 简介数据预处理查看数据格式加载数据集 图像处理限定图像范围图像转换加载数据 CNN 模型Inception 网络ResNet 残差网络总结参数设置 训练 Train模型初始化数据加载训练超参数训练循环 验证…

Python 从入门到精通 学习笔记 Day04

Python 从入门到精通 第四天 今日目标 数据类型-又见str、数据类型-又见list 列表切片&排序&反转&循环、字典 数据类型 - 又见str 字符串定义 字符串是一个有序的字符的集合&#xff0c;用于在计算机里存储和表示文本信息 创建 a "Hello ,my name is Ha…

Android---Kotlin 学习005

substring 字符串截取。相加与 java&#xff0c;kt 里面的 substring 函数支持 IntRange 类型&#xff08;表示一个整数范围的类型&#xff09;的参数&#xff0c;until 创建的范围不包括上限值。 const val NAME "Jimmys friend" fun main(){val index NAME.ind…

TrustGeo代码理解(二)test.py

代码链接&#xff1a;https://github.com/ICDM-UESTC/TrustGeo 一、加载检查点&#xff08;checkpoint&#xff09;并进行测试 # -*- coding: utf-8 -*-"""load checkpoint and then test """ 该脚本的目的是加载之前训练过的模型的检查点&am…

【Linux】基于sed正则指令修改application.properties属性值

文章目录 背景sed介绍演示结果 背景 服务器上搭建了SpringCloud微服务&#xff0c;每个服务中都有application.properties文件&#xff0c;在部署过程中需要修改每个微服务的redis.ip和redis.port。如果手动去修改会很麻烦&#xff0c;所以下面写了一个shell脚本&#xff08;基…

idea的快捷键

1.调整字体的大小 文件夹的循序:setting-Editor-Font 界面: 2.删除当前行 文件夹的循序:setting-Keymap-DeleteLine 界面: 3.导入该行需要的类 文件夹的循序:setting-Editor-General-Auto import 界面: 4.格式化代码 文件夹的循序:setting-keymap-Reformat 界面: 5.快速…

大模型微调方法:冻结方法 Freeze、P-Tuning 系列、LoRA、QLoRA

大模型微调方法 冻结方法 FreezeP-Tuning 系列Prefix-TuningPrompt TuningP-Tuning v1P-Tuning v2 LoRAQLoRA 冻结方法 Freeze 方法意思是&#xff0c;只用少部分参数训练&#xff0c;把模型的大部分参数冻结。 只要设置微调层的参数&#xff1a; # 遍历模型的所有参数和名称…

程序员的养生之道:延寿健康的十大秘诀(下)

程序员的养生之道&#xff1a;延寿健康的十大秘诀&#xff08;上&#xff09;-CSDN博客 目录 6. 心理调节&#xff0c;减轻压力 6.1 程序员常见的心理问题 6.2 压力管理的重要性 6.3 放松技巧与应对策略 6.4 积极心态与心理健康 7. 正确坐姿&#xff0c;保护颈椎腰椎 …

VLAN协议与单臂路由

文章目录 VLAN协议与单臂路由一、VLAN的概念及优势1、分割广播域2、VLAN的优势3、VLAN数据帧 二、VLAN的种类1、静态VLAN2、动态VLAN3、VLAN划分方式 三、静态VLAN的配置1、VLAN的范围2、静态VLAN的配置2.1 配置静态VLAN的步骤2.2 vlan三种端口类型举例&#xff1a;配置静态VLA…

VR全景直播来临,沉浸式代入吸引百万人目光

如今&#xff0c;VR技术正在不断改变着直播行业的面貌&#xff0c;为观众提供沉浸式的观看体验。在5G技术的快速发展背景下&#xff0c;VR全景直播作为5G应用的场景&#xff0c;被广泛应用在体育赛事、新闻会议、演唱会、教育医疗等场景&#xff0c;通过VR技术进行全景直播&…