linux驱动的IO 模型(高级字符设备一)

news2024/11/17 9:47:49

  IO 是英文 Input 和 Output 的首字母,代表了输入和输出。操作系统(Linux)负责对计算机的资源进行管理和对进程进行调度,应用程序运行在操作系统上,处于用户空间。应用程序不能直接对硬件进行操作,只能通过操作系统提供的API 来操作硬件。需要将进程切换到内核空间,才能进行 IO 操作,并且应用程序不能直接操作内核空间的数据,需要把内核空间的数据拷贝到用户空间。
  应用程序运行在用户空间,它不存在实质的 IO 过程,真正的IO 是在操作系统执行的。那么应用程序操作 IO 就会有两个动作:IO 调用和 IO 执行。IO 调用是应用程序向操作系统内核发起调用,IO 执行是操作系统内核完成的 IO 操作。
  IO 模型根据实现的功能可以划分为为阻塞 IO、非阻塞 IO、信号驱动IO,IO多路复用和异步 IO。根据等待 IO 的执行结果进行划分,前四个 IO 模型又被称为同步IO,如下图
在这里插入图片描述
  所谓同步,即发出一个功能调用后,只有得到结果该调用才会返回。异步的概念和同步相对。当一个异步过程调用发出后,调用者并不能立刻得到结果,实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。

一、阻塞 IO

  以阻塞读为例:进程进行 IO 操作时(如 read 操作),首先会发起一个系统调用,从而转到内核空间进行处理,内核空间的数据没有准备就绪时,进程会被阻塞,不会继续向下执行,直到内核空间的数据准备完成后,数据才会从内核空间拷贝到用户空间,最后返回用户进程,由用户空间进行数据的处理
  阻塞 IO 的优势与不足为:首先可以及时的获取结果,并立刻对获取到的结果进行处理,然而在获取结果之前,无法去处理其他任务,需要时刻对结果进行监听。

二、非阻塞 IO

  和阻塞 IO 模型不同,非阻塞 IO 进行 IO 操作时,如果内核数据没有准备好,内核会立即向进程返回 err,不会进行阻塞;如果内核空间数据准备就绪,内核会立即把数据返回给用户空间的进程
  非阻塞 IO 的优点是效率高,同样的时间可以做更多的事。但是缺点也很明显,需要不断对结果进行轮询查看,从而导致结果获取不及时(结果可能在两次轮询之间就已经准备完毕,但是只能在发起轮询的时候才能知道),如果要增加非阻塞IO的实时性,就要加快轮询的频率,但这样无疑也会增加 CPU 的负担。

三、IO 多路复用

  通常情况下使用 select()、poll()、epoll()函数实现 IO 多路复用。以select 函数为例,使用时可以对 select 传入多个描述符,并设置超时时间。当执行select 的时候,系统会发起一个系统调用,内核会遍历检查传入的描述符是否有事件发生(如可读、可写事件)。如有,立即返回,否则进入睡眠状态,使进程进入阻塞状态,直到任何一个描述符事件产生后(或者等待超时)立刻返回。此时用户空间需要对全部描述符进行遍历,以确认具体是哪个发生了事件,这样就能使用一个进程对多个 IO 进行管理
  这样的优点是一个进程/线程可以同时监听和处理多路 IO,效率成倍提高。但是IO多路复用也有缺点:虽然 IO 多路复用可以监听多个IO,但是实际上对结果的处理也只能依次进行,比较适合 IO 密集但是每一路 IO 数据量不多且到达时间分散的场合(如网络聊天)。
  另外 select 监听的描述符有上限(一般描述符最大不超过1024),而且需要遍历究竟是哪一个 IO 产生了数据。因此 IO 较多时,效率不高

四、信号驱动IO

  信号驱动 IO 顾名思义与信号相关。系统在一些事件发生之后,会对进程发出特定的信号,而信号与处理函数相绑定,当信号产生时就会调用绑定的处理函数。例如在Linux 系统任务执行的过程中可以按下 ctrl+C 来对任务进行终止,系统实际上是对该进程发送一个SIGINT信号,该信号的默认处理函数就是退出当前程序。
  具体到 IO 模型上,可以对 SIGIO 信号注册相应的信号处理函数,并打开对应描述符的信号驱动。每当有 IO 数据产生时,系统就会发送一个 SIGIO 信号,进而调用相应的信号处理函数,从而在这个处理函数中对数据进行读取

五、异步 IO

  aio_read 函数常常用于异步 IO,当进程使用 aio_read 读取数据时,如果数据尚未准备就绪就立即返回,不会阻塞。若数据准备就绪就会把数据从内核空间拷贝到用户空间的缓冲区中,然后执行定义好的回调函数对接收到的数据进行处理。

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

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

相关文章

uniapp把文件中的内复制到另一个文件中

使用的是Html 5的plus.io.resolveLocalFileSystemURL方法,文档:HTML5 API Reference var soursePath file:///storage/emulated/0/a/;//用于读取var removePath file:///storage/emulated/0/w/;//用于移除w这个文件夹var targetPath file:///storage/…

03初始Docker

一、初始Docker 1.什么是Docker 问题 ①大型项目组件复杂,运行环境复杂,部署时依赖复杂,出现兼容性问题。 ②开发,测试,生产环境有差异。不同的环境操作系统不同 解决 ①Docket将应用、依赖、函数库、配置一起打…

ChatGPT AIGC 完成 Excel多条件求和操作

企业产品销售额是企业在一定时间内通过销售其产品获取的收入总额。 这个指标通常用于衡量企业的销售能力、市场占有率以及企业的健康度。企业产品销售额具体的计算方法是将企业在销售商品或服务时所取得的所有收入加总而得出。 在这个过程中,通常会考虑到可能存在的退货、折…

基于nodejs+vue备忘记账系统mysql

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

上传和下载文件到google drive/Local pc

1 上传 参考:使用 Python 将文件上传到 Google 云端硬盘_迹忆客 Upload file to google drive using Python - CodeSpeedy (没起作用,但可以参考一下) 第 1 步:Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Pla…

Linux 开机启动一条PHP命令

当你开机的时候要自动的启动一条PHP命令场景:比如webman 你需要手动启动项目进程 你可以这样操作 流程: 1、准备好你要执行的命令 2、将命令写入一个服务文件 3、开机自启这个服务 实例: 1、比如这个命令 /usr/local/php/bin/php /ho…

Class类文件中的“咖啡宝贝”

Class文件是一组以8个字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件之中,中间没有添加任何分隔符,整个Class文件中存储的内容几乎全部是程序运行的必要数据,没有空隙存在。 字节码(Byte Code&am…

11、Python -- 列表去重的三种方法

目录 方法1:新列表搜集方法2:利用set集合方法3:使用itertools模块 新列表搜集法 使用set集合去重 使用itertools模块的groupby函数去重 方法1:新列表搜集 (1)创建新列表 (2)遍历源列…

Webpack 基础以及常用插件使用方法

目录 一、前言二、修改打包入/出口配置步骤 三、常用插件使用html-webpack-plugin打包 CSS 代码提取 CSS 代码优化压缩过程打包 less 代码打包图片文件 一、前言 本质上,Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时…

如何完善文件传输审批流程,降低企业文件安全风险?

在当今高度信息化的时代,数据的价值日益凸显。然而,如果在文件对外传输过程中缺乏必要的审批和留痕记录,可能会带来严重的安全隐患。企业面临巨额的经济损失;其次,企业的品牌形象也受到了严重损害;此外&…

FreeRTOS 任务调度和任务的状态

目录 什么是任务调度? FreeRTOS的任务调度规则是怎样的? 抢占式调度运行过程​编辑 时间片调度运行过程​编辑 任务的状态 任务调度和任务的状态案例分析 什么是任务调度? 调度器就是使用相关的调度算法来决定当前需要执行的哪个任务。…

NotePad格式化SQL语句

NotePad格式化SQL步骤 今日自己在进行导出一些后台执行的SQL语句,但是在NOTEPAD上是未排版的,想想有没有这个插件呢? 1.导入插件 进入后,输入PoorManT-SqlFormatt进行搜索 2.点击格式化SQL 3.执行效果

Constellation 介绍:Chainlink 黑客马拉松

在 2020 年,Chainlink 举办了其第一次线上黑客马拉松。当时,DeFi 作为一个类别刚刚开始蓬勃发展,而 NFT 也只是刚刚起步。这次黑客马拉松吸引了来自 45 个国家的 1,000 多名注册参与者,并收到了来自 70 个项目提交。 从那时起&am…

分库分表-ShardingSphere 4.x(2)

❤️作者简介:2022新星计划第三季云原生与云计算赛道Top5🏅、华为云享专家🏅、云原生领域潜力新星🏅 💛博客首页:C站个人主页🌞 💗作者目的:如有错误请指正,将…

软考机考 画图

文章目录 绘制 前导图绘制 双代号网络图绘制 双代号时标网络图绘制 七格图绘制 类图绘制 时序图绘制 ER 图ER模型 简介 绘制表格 绘制 前导图 第一步:先画出所有活动,将活动命名 第二步:如需调整大小,选中要调整大小的元件&#…

CSS 快速实现水平垂直居中

CSS 快速实现水平垂直居中 文章目录 CSS 快速实现水平垂直居中一、前言二、弹性布局普遍做法三、弹性布局的妙用参考资料💘推荐博文🍗 一、前言 本文探究的是如何快速实现水平垂直居中,重点在于快速两个字,我对于快速的理解&…

智慧公厕:细致入微的城市贴心服务与便捷方便的生活配套

在现代城市生活中,公厕作为重要的城市基础设施,一直是城市发展的关键环节之一。然而,传统的公厕常常存在着设施陈旧、管理不善和卫生状况差等问题,给市民的生活品质和城市形象带来了一定的影响。为了提供更好的城市公厕服务&#…

Pillow(PIL)库的主要方法介绍

Pillow(Python Imaging Library)是Python中一个强大的图像处理库,它允许你进行图像的创建、打开、编辑、保存和显示等操作。Pillow 是 PIL(Python Imaging Library)的分支,支持多种图像格式,并提…

VLOOKUP函数的使用方法

VLOOKUP是一个查找函数,给定一个查找的目标,它就能从指定的查找区域中查找返回想要查找到的值。它的基本语法为: VLOOKUP(查找目标,查找范围,返回值的列数,精确OR模糊查找)下面以一个实例来介绍…

Spring Cloud之微服务

目录 微服务 微服务架构 微服务架构与单体架构 特点 框架 总结 SpringCloud 常用组件 与SpringBoot关系 版本 微服务 微服务:从字面上理解即:微小的服务; 微小:微服务体积小,复杂度低,一个微服…