文件I/O基础

news2024/11/15 17:52:57

一、传统I/O数据传输过程

  • 用户进程调用 read() 函数,发送上下文切换,用户进程由用户态切换成内核态,CPU向磁盘发起数据读取IO请求,然后返回;
  • 磁盘控制器收到请求,就开始准备数据,把数据放入磁盘控制器的内存缓冲区中,然后产生一个中断
  • CPU收到中断信号,停下手头工作,开始把磁盘控制器缓冲区的数据一次一个字节地读入自己的内存缓冲区(磁盘高速缓存,PageCache),然后再把内核缓冲区中的数据拷贝到用户缓冲区,数据传输过程中CPU无法执行其他任务

整个数据传输过程,都需要CPU参与,而且这个过程CPU是不能做其他事情的。如果只是少数几个字符传输是没问题,但是如果传输大量数据,就会异常繁忙,而且对其他程序而言,其长期占用CPU会导致其他程序无法正常运行。

二、DMA(Direct Memory Access,直接内存访问)技术

DMA技术:在进行I/O设备和内存的数据传输过程中,数据搬运工作全部交给DMA控制器,而CPU不再参与任何与数据搬运相关的工作,这样就可以让CPU去处理其他事务。

使用DMA技术IO数据传输过程

  • 用户进程调用 read() 函数,向操作系统发起IO请求,请求读取数据到自己的内存缓冲区,进程进入阻塞状态;
  • 操作系统受到请求后,进一步将IO请求发送给DMA,然后CPU可以执行其他任务
  • DMA进一步将IO请求发送给磁盘
  • 磁盘收到DMA的IO请求,把数据从磁盘读取到磁盘控制器缓冲区,当磁盘控制器缓冲区被写满后,向DMA发送中断信号,告知自己缓冲区已满;
  • DMA收到磁盘中断信号,将磁盘控制器缓冲区数据拷贝到内核缓冲区
  • 当DMA读取到足够多的数据,就会向CPU发送中断信号,告知数据已读完
  • CPU收到DMA的信号,就知道数据已准备好,于是将数据从内核缓冲区拷贝到用户缓冲区,然后系统调用返回。

整个数据传输过程&#x

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

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

相关文章

linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。

一 sar 指令介绍 在 Linux 系统中,sar 是 System Activity Reporter 的缩写,是一个用于收集、报告和保存系统活动信息的工具。它是 sysstat 软件包的一部分,提供了丰富的系统性能数据,包括 CPU、内存、网络、磁盘等使用情况&am…

802.11 Omnipeek 抓包

802.11 Omnipeek 抓包 前言Omnipeek安装软件配置 前言 设备准备环节和前面一样,本文不再赘述,参考前面的文章:https://blog.csdn.net/m0_55334946/article/details/140671901 采用 Omnipeek 抓包分析,我可以说比起 wireshark 已…

计算一段英文句子的最后一个单词的长度,单词间以空格隔开。

# 计算一段英文句子的最后一个单词的长度,单词间以空格隔开。 # 例如:输入”how are you“,输出:3EnglishStr:str str(input("请输入你的英文句子:")) EnglishList:list EnglishStr.split( ) strLength len(EnglishL…

走难而正确的路并持之以恒

走难而正确的路并持之以恒 接近八月,台风频繁。气象台说台风“格美”今夜将至,往粤北走,而留在粤东的将是持续的高温。高温的广州,这几晚的天空惊喜不断,成片的火烧云,站在猎德大桥观望,丹红的凤…

ModelArts中sinh算子的开发

一、环境配置 1、创建notebook并连接 使用ModelArts新建一个notebook,我这里镜像选择第一个,里面含有cann和Ascend910处理器,我这里环境只能使用ssh连接,创建一个密钥对,保存到C盘中的user/Administrator/目录下。 在网页中选择使用vscode接入,等待vscode打开后,选择密…

LangChain的数据增强

吾名爱妃,性好静亦好动。好编程,常沉浸于代码之世界,思维纵横,力求逻辑之严密,算法之精妙。亦爱篮球,驰骋球场,尽享挥洒汗水之乐。且喜跑步,尤钟马拉松,长途奔袭&#xf…

给Windows系统中注入服务,即windwos守护进程

最近总是在windwos环境下测试nginx,总是需要频繁重启nginx服务。于是考虑有没有可能把nginx加入到系统服务的操作。在网上找了一大堆资料,现在来总结一下! 方法1:利用nssm工具实现 这是一个守护进程的软件,可以在win…

初阶数据结构——二叉树大汇总

这篇博客将会讲到二叉树的部分内容及堆的相关知识~ 这里将会涉及到大量的递归(头大) 目录 1.树 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树的实际应用 2.二叉树 2.1二叉树的概念 2.2特殊的二叉树 2.2.1 满二叉树 2.2.2 完全二叉树 2.2…

【昇腾AI创新大赛集训营南京站学习笔记】-Ascend算子开发课程

昇腾AI创新大赛训练营 14:00-14:30 基础知识-理论课 一、CANN 、达芬奇架构和算子 1.AI Core逻辑架构 达芬奇架构包含三部分: 1)计算类:矩阵计算单元(两个矩阵扔进去相乘)、向量计算单元、标量计算单元 2)控…

一天搞定React(4)——Redux

Hello!大家好,今天带来的是React前端JS库的学习,课程来自黑马的往期课程,具体连接地址我也没有找到,大家可以广搜巡查一下,但是总体来说,这套课程教学质量非常高,每个知识点都有一个…

鸿蒙OpenHarmony Native API【drawing_path.h】 头文件

drawing_path.h Overview Related Modules: [Drawing] Description: 文件中定义了与自定义路径相关的功能函数 Since: 8 Version: 1.0 Summary Functions FunctionDescription[OH_Drawing_PathCreate] (void)[OH_Drawing_Path] * 函数用于创建一个路径对象OH_Drawin…

前端页面:用户交互持续时间跟踪(duration)user-interaction-tracker

引言 在用户至上的时代,精准把握用户行为已成为产品优化的关键。本文将详细介绍 user-interaction-tracker 库,它提供了一种高效的解决方案,用于跟踪用户交互的持续时间,并提升项目埋点的效率。通过本文,你将了解到如…

EXO-chatgpt_api 解释

目录 chatgpt_api 解释 resolve_tinygrad_tokenizer 函数 resolve_tokenizer 函数 调试和日志记录​​​​​​​ 参数 返回值 初始化方法 __init__ 异步方法 注意事项 chatgpt_api 解释 展示了如何在一个项目中组织和导入各种库、模块和类,以及如何进行一些基本的We…

双向链表(C语言版)

1. 双向链表的结构 注意:这里的“带头”跟单链表的“头结点”是两个概念,实际上在单链表阶段称呼不太严谨,但是为了更好地理解就直接称为单链表的头结点。带头链表里的头结点,实际为“哨兵位”,哨兵位结点不存储任何有…

rsync文件远程同步

目录 一、什么是rsync远程同步 二、实操rsync远程文件同步 1、配置rsync同步源 2、客户端部署 3、增量备份​编辑 4、删除文件 5、如何实现免交互登录 6、crontab rsync 实现定时同步 7、使用ssh实现rsync数据同步【☆】 如何使用ssh免交互实现数据同步?…

C++ Map Set的模拟实现

C Map Set的模拟实现 文章目录 前言一、Map 和 Set是什么?1.Set2.Map 二、困难点困难一、set和map中值的类型不同困难二、Map和Set中值不可修改困难三、红黑树中迭代器的和--1.2.- - 困难四、map中[ ] 运算符重载的实现1.修改红黑树以及Map和Set中insert的返回值1.修…

Spring Boot入门指南:轻松构建高效Spring应用(四)

Spring Boot入门指南:轻松构建高效Spring应用(三)-CSDN博客 一.传递参数 7.传递数组 1.在IDEA中写出处理代码 2.打开postman 或者这样:key相同时,也会组成一个数组。 8. 传递集合 如果像数组传参一样传递集合,可能…

Transformer合集

资料 位置编码:https://zhuanlan.zhihu.com/p/454482273 自注意力:https://zhuanlan.zhihu.com/p/455399791 LN:https://zhuanlan.zhihu.com/p/456863215 ResNet:https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

重生之我们在ES顶端相遇第5章-常用字段类型

思维导图 前置 在第4章,我们提到了 keyword(一笔带过)。在本章,我们将介绍 ES 的字段类型。全面的带大家了解 ES 各个字段类型的使用场景。 字段类型 ES 支持以下字段类型(仅介绍开发中常用,更多内容请自…

接口自动化测试框架实战-4-日志方法封装

上一小节我们讲解了文件读写方法的封装方法,本小节我们完成一下框架日志的封装方法。 首先我们讲解一下日志封装和日志记录有哪些用处? 更加方便的设置日志的格式和输出方式全局方法可以各个类/函数中都能统一调用分类记录接口用例执行日志,方便嵌入测试报告错误日志提示,…