【Linux取经路】文件中的数据是如何被写进磁盘的?

在这里插入图片描述

文章目录

  • 一、操作系统对物理内存的管理
    • 1.1 物理内存与磁盘的数据交换
    • 1.2 操作系统对物理内存的管理
  • 二、再来看文件打开和写入
    • 2.1 文件页缓冲区的引入
    • 2.2 向文件中写入的过程
  • 三、结语

一、操作系统对物理内存的管理

1.1 物理内存与磁盘的数据交换

物理内存与磁盘之间的数据交换一般是以 4KB(大小可改) 为单位进行的,其中物理内存中一个 4KB 大小的空间叫做页框,填入 4KB 内存中的内容叫做页帧。样做的好处有以下几点:

  • 减少 I/O 的次数,即减少 CPU 访问外设的次数以提高效率。一次访问 4KB 和分四次访问 1KB 相比,前者效率更高,因为前者 CPU 只和磁盘只打了一次交道,磁头和盘面只需要进行一次定位就可以读取出 4KB 的内容,而后者 CPU 和磁盘要打四次交到,并且这四次可能并不连续,意味着磁头和盘面要定位四次,大量的机械运动就伴随着效率的下降。

  • 基于局部性原理的预加载机制。即使当前 CPU 只需要访问100字节的内容,但操作系统和磁盘之间还是以 4KB 为单位将数据加载进来,一般认为,CPU 在访问当前磁盘中的代码和数据的时候,接下来有较大的可能性去访问附近空间的代码和数据。

小Tips:4KB 是科学家经过大量实现确定出来的一个较为合理的值。一个文件如果占用了多个数据块,那么只有最后一个数据块可能存在没用完浪费的情况。一个数据块只能被一个文件使用。加入有两个只有几个比特的小文件,那么会为他们俩一人分配一个数据块,他们两个不可能共享同一个数据块。

1.2 操作系统对物理内存的管理

首先操作系统一定是可以看到物理内存的。对物理内存的管理还是逃不脱先描述再组织,在内核中有一个 struct page 的结构体就是用来描述物理内存的,一个 struct page 对象就对应一个 4KB 的内存空间,该结构体里面记录了当前 4KB 的一些属性信息,例如:当前页框的状态,当前页框的引用计数等。操作系统将物理内存划分成一个个的 struct page 对象,然后用数组的形式组织起来,数组的下标就是对应的页号。随便给一个物理地址(一般一个物理地址对应一个字节)求它所在的页号,就是用该物理地址除以 (4KB*1024 = 4096字节)即可,也就是用该地址按位与上 0XFFFFF000,将低12位清零,就是该地址所在的页号。所有申请内存的动作都是在访问内存 page 数组,查看 struct page 里面的 flags 属性,通过 flags 属性判断当前页框的状态,得知该页框是否被使用,没被使用就去修改 flags,表示该页框已被申请。flags c除了可以表示当前页框是否被使用外,还可以用来表示该页框是只读的还是读写等状态。这里所说的操作系统对物理内存的管理只是一个雏形,真正的内存管理系统是非常复杂的,像伙伴系统算法、slab 分派器等。

二、再来看文件打开和写入

2.1 文件页缓冲区的引入

前面的文章中说到过 struct file 是内核中的一个数据结构,用来描述一个打开的文件。而 inode 是在介绍磁盘时引入的,磁盘上的一个文件对应一个 inode,它表示该文件的属性。struct fileinode 之间的关系是,struct file 中只记录了文件的少量属性,因此在内核中还有一个 struct inode 结构体专门用来记录一个文件的所有属性。在 struct file 中有一个指针字段指向该文件的 struct inode 对象。

在这里插入图片描述
而文件是包括内容加属性的,在磁盘上文件的属性用 inode 来存储,文件的内容用 block 来存储,上面说过在内核中用 struct inode 来存储文件属性,那一个文件的内容(数据)在内核中该如何表示呢?答案是采用文件页缓冲区。在 struct file 结构中有一个 struct address_space 字段的指针,该结构体里面有一个 struct radix_tree_root 结构体对象,这本质上是一个树状结构(基数数又或叫字典书),树中的每个节点都是 struct radix_tree_node 类型,该类型里面有一个名为 slotsvoid * 类型的数组,里面存的其实就是 struct page 对象的地址。总结一下就是在 struct file 结构体中有指向物理内存的指针,我们将这些物理内存就叫做文件页缓冲区

在这里插入图片描述

2.2 向文件中写入的过程

在这里插入图片描述

在调用 C/C++ 库函数向文件中写入,首先将内容写入到语言层面的用户缓冲区,然后再在合适的时机将内容写入到该文件对应的文件页缓冲区中,最后再在合适的时机将内容写入到外设。将物理内存中的数据刷新到磁盘是由 I/O 子系统来执行,进程并不会关心,在操作系统中一定会存在非常多的 I/O 操作,可能会有很多进程都要将数据写入磁盘,操作系统会将所有的 I/O 操作根据先描述再组织的形式管理起来。内核中的 struct request 结构就是专门用来描述一个 I/O 操作的。为了提高 I/O 的效率,操作系统还会进行 I/O 排序和 I/O 合并,以减少磁头和盘面的定位次数。

总结:Linux 中,我们的每一个进程,打开的每一个文件都要有自己的 struct inode 对象和自己的文件页缓冲区(就是所谓的内核缓冲区)。

三、结语

今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,春人的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是春人前进的动力!

在这里插入图片描述

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

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

相关文章

专业的服贸会服务团队-媒体邀约宣传

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 2024服贸会开展在即,许多企业都做好了的参展的准备,北京麦塔文化提供专业的展览展会服务,下面做个简单介绍。 、会场搭建团队: 负责整个活…

如何完美实现文件外发防泄漏,保护核心数据资产?

不管是大型企业,还是小型创业公司,不论企业规模大小,每天都会有大量的文件要进行内部传输协作和对外发送使用,数据的生产也是企业业务生产力的体现之一。因此文件外发防泄漏是企业信息安全中的一个重要议题,为了防止企…

MTATLAB--一元线性回归分析

一文让你彻底搞懂最小二乘法(超详细推导) 在进行一元线性回归分析时,使用最小二乘法进行解题,关于最小二乘法具体看上述文章。 数据文件在文章顶部可见,将第一列数据作为自变量x,第二列数据作为应变量y。建…

软件设计师备考笔记(四):操作系统知识

文章目录 一、操作系统概述(一)操作系统的基本概念(二)操作系统分类及特点 二、进程管理(一)基本概念(二)进程的控制(三)进程间的通信(四&#xf…

C语言易错提醒选择题精选

Ⅰ 易错题 1.设有double p;&#xff0c;为变量p声明一个引用名称rp,则定义语句为 double& rpp; 2.已知‘A’一‘Z’的ASCII码为65—90&#xff0c;当执行“char ch14*52&#xff1b;cout<<ch<<endl;”语句序列后得到的输出结H &#xff0c;72对应ASCII码中…

研发管理-选择研发管理系统-研发管理系统哪个好

选择研发管理系统-研发管理系统哪个好 选择研发管理系统时&#xff0c;并没有一个绝对的“最好”的系统&#xff0c;因为每个企业的需求和情况都是独特的。然而&#xff0c;我可以向您介绍一些在市场上广受欢迎且功能强大的研发管理系统&#xff0c;供您参考&#xff1a; 1、彩…

答辩PPT快速生成工具有哪些?笔灵AI答辩PPT,一键搞定

很多快要毕业的同学在做答辩PPT的时候总是感觉毫无思路&#xff0c;一窍不通。但这并不是你们的错&#xff0c;对于平时没接触过相关方面&#xff0c;第一次搞答辩PPT的人来说&#xff0c;这是很正常的一件事。一个好的答辩PPT可以根据以下分为以下几部分来写。 1.研究的背景和…

微信小程序发送订阅消息sendMessage

微信小程序发送订阅消息sendMessage 请注意订阅消息一次性订阅只只能授权一次接受一条消息多次授权会累加接受次数&#xff0c;wx.requestSubscribeMessage调用授权 目前长期性订阅消息仅向政务民生、医疗、交通、金融、教育等线下公共服务开放 //授权弹框&#xff0c;只弹出…

大语言模型的数据预处理

文章目录 质量过滤敏感内容过滤数据去重 当收集了丰富的文本数据之后&#xff0c;为了确保数据的质量和效用&#xff0c;还需要对数据进行预处理&#xff0c;从而消除低质量、冗余、无关甚可能有害的数据。一般来说&#xff0c;需要构建并使用系统化的数据处理框架&#xff08;…

AI浪潮再起,2024年中国大模型产业深度解析

国内 AI大模型产业发展深度分析 2024 人工智能技术的迅猛发展&#xff0c;使AI大模型成为科技竞争的核心、产业变革的先锋、经济增长的新动力。我国已将人工智能列为国家战略&#xff0c;出台系列政策扶持其发展&#xff0c;为AI大模型产业创造优越环境&#xff0c;展现巨大潜力…

手撕C语言题典——链表的中间节点

目录 前言 一.思路 1)用指针遍历链表&#xff0c;创建 count 计数&#xff0c;返回 count/2->next 即为中间节点 2&#xff09;快慢指针 二.代码实现 1&#xff09;思路一 2&#xff09;思路二 搭配食用更佳哦~~ 数据结构之单单单——链表-CSDN博客 数据结构之单链表的…

CorelDRAW2024新特性全解析!

CorelDRAW2024是一款备受赞誉的图形设计软件&#xff0c;它以其强大的功能和用户友好性赢得了全球数百万设计师的青睐。该软件提供了丰富的绘图、排版、图像处理、矢量编辑以及网页设计工具&#xff0c;无论是初学者还是专业设计师&#xff0c;都能在这款软件中找到满足自己需求…

openai春季发布会:GPT-4o(更快,更强,更便宜)

人工智能学习网站 https://chat.xutongbao.top

计算机毕业设计 | springboot+vue电影院会员管理系统 影院后台管理(附源码)

1&#xff0c;项目背景 随着互联网时代的到来&#xff0c;同时计算机网络技术高速发展&#xff0c;网络管理运用也变得越来越广泛。因此&#xff0c;建立一个B/S结构的电影院会员管理系统&#xff1b;电影院会员管理系统的管理工作系统化、规范化&#xff0c;也会提高影院形象…

江苏省人大财经委主任委员谢志成一行莅临聚合数据走访调研

4月18日&#xff0c;江苏省人大财经委主任委员谢志成莅临聚合数据展开考察调研。省人大财经委副主任委员&#xff08;正厅&#xff09;周毅、省人大常委会办公厅一级巡视员吕小鹏、外事委委员赵正驰、省数据局副局长王万军&#xff1b;苏州市人大常委会副秘书长毛元龙、数据局副…

vue2 报错,警告 解决方法 component name“Index“should always be multi-word

报错原因&#xff1a; 组件名称应该为俩个或俩个以上单词组成的&#xff0c;并且还要是大驼峰命名&#xff0c;例如&#xff1a;MyIndex&#xff0c;MyLogin等 解决方法一&#xff1a; 将组件名称改为俩个或俩个以上单词组成的名称&#xff0c;且为大驼峰命名&#xff0c;例如…

钽酸锂集成光子芯片:引领光电集成新纪元

在信息技术飞速发展的今天&#xff0c;光电集成技术已成为推动全球集成电路产业持续创新的重要力量。随着全球集成电路产业发展步入“后摩尔时代”&#xff0c;芯片性能提升的难度和成本不断攀升&#xff0c;业界急需寻找新的技术突破口。在这一背景下&#xff0c;中国科学院上…

【高级程序设计语言C++】vector的使用及模拟实现

1. vector概述2. vector的数据结构2.1. vector的模拟实现2.2. vector的构造函数2.3. vector 的扩容 3. vector的增删查改3.1. 增3.2. 删3.3. 查3.4. 改 4. 总结 1. vector概述 vector是动态空间&#xff0c;随着元素的加入&#xff0c;它的内部机制会自动扩充空间以容纳新元素…

鸿蒙系统编译方式

鸿蒙系统编译 编译原理编译方式概述hb编译ohos-buildhb安装编译使用build脚本hpmhpm介绍编译举例说明综合应用举例虚拟机中编译docker中使用hpm编译编译原理 编译构建指导:https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/subsystems/subsys-build-all.md,文档介绍…

Comau柯马机器人维修故障分类

在柯马机器人的使用过程中&#xff0c;常见的是Comau机械手减速器故障。那么&#xff0c;我们一起来探讨一下柯马机械臂维修减速机故障的问题。Comau工业机械手减速器故障分类 1. 异响 机器人在工作过程中发出异常声响&#xff0c;可能是柯马机械臂减速器内部磨损或零件松动引起…