打开文件 和 文件系统的文件产生关联

news2024/11/25 0:40:05

补充1:硬件级别磁盘和内存之间数据交互的基本单位
OS的内存管理
内存的本质是对数据临时存/取,把内存看成很大的缓冲区

物理内存和磁盘交互的单位是4KB,磁盘中未被打开的文件数据块也是4KB,所以磁盘中页帧也是4KB,内存中叫页框
在这里插入图片描述

我这个文件可能没有4KB,就一个字节,但不好意思加载4KB
我这个文件4KB,想修改1字节,也得加载4KB

为什么它不是要多少加载多少,而是一个固定大小4KB呢?
1、和磁盘交互比较慢,一共4KB每次要1KB的效率不如一气直接4KB,因为磁盘只需要定位一次
2、如果4KB文件你只要100字节,你能保证你下一次不用这文件上下文的其他数据吗?反正拿100字节还是4KB效率差不多,因为估摸着你后面的字节大概率也要用
局部性原理:正在访问代码区域附近也大概率会有数据代码被访问
这是一种预加载机制

那系统中向文件写了100字节,实际上保存100字节需要4KB?把数据交换的物理内存也要花4KB?
是的,文件大小从中做了一些事情
不用担心浪费问题,文件特别大前面那些内容把4KB都写满了,只有最后一个块被浪费了,小文件的就更不用说了

补充2:操作系统如何管理内存
在这里插入图片描述

操作系统必须能看到内存的物理地址
操作系统如何管理内存呢?
内存已经是一个一个4KB大小,非常多
我怎么知道哪些4KB被用到了,那些没被用
先描述,在组织!
struct page
{
//page页必要的属性信息
}
描述其中一个4KB
物理内存4G B 就有100多万的页
在这里插入图片描述
struct page mem_array[1048576];
对内存的管理变成了对数组的管理!!
数组天然是有下标的,所以每一个page天然有了页号的概念
如果此时任意一个地址0x11223344 & 0xFFFF F000,相当于求的是这个页的4KB对齐的起始地址
有了这个任意页的地址,应该就能通过找到对应的page数组对应的下标(我猜就是页地址也就是&完的地址减去第一个Page地址然后除以4就能得到下标)(都拿到地址了还有啥找不到的),进行物理内存管理
结论:
所有申请内存的动作,都是在访问内存page数组,都是对这个数组增删查改
在这里插入图片描述
在这里插入图片描述

struct page mem_array[1048576] 一定像链表一样有对应的数据结构方法,调算法申请内存

补充3:Linux中,我们的每一个进程、打开的每一个文件都要有自己的inode属性和自己的文件页缓冲区(内核缓冲区)

在开机时,把文件系统中的管理属性已经预加载到内存中了,尤其是super block GDT等文件系统方面的信息
比如这个分区上面就是操作系统文件,都要读,所以OS提前预加载到内存中
每个分区可能用的不同文件系统,OS中存在把所有的super block用双链表链接起来,OS知道每个分区大概在哪,每个分区文件系统什么样
在这里插入图片描述
关于打开一个文件时,OS要做什么工作,理解内核文件级缓冲区概念

打开一个文件时,struct file只保存了少数的文件属性,OS要为struct file构建一个数据结构struct inode才会保存文件的大部分属性,当打开文件时,根据对应目录中的数据块文件名映射找到inode编号,在已经预加载到物理内存中 的inode bitmap确认文件存在,然后在inode table 把对应的inode属性填入struct inode里

struct file 通过指针要能找到对应的struct inode,文件属性也就有了
在这里插入图片描述
内核中的struct file 与struct inode指针
在这里插入图片描述

文件属性其实不难找,文件内容呢?
C语言提供缓冲区,通过fprintf把数据写到缓冲区,通过fd我这个进程找到对应文件struct file
最终又怎么把数据写到对应磁盘上呢?
struct file中存在 address_space结构指针,这个结构包含一颗树page_tree,可以想象成一颗多叉树,树的节点中保存了指针数组,在叶子节点中保存了一个一个的struct page对象,而一个struct page对应物理内存4KB大小页框,所以应用层数据按照顺序从用户级缓冲区-> fd -> struct file -> address_space -> page_tree->叶子结点中的struct page然后再往物理内存中4KB中写入,就写到物理内存中了
我们看待物理内存时,只要找到对应的page,就能把数据写到物理内存里了
在这里插入图片描述
这颗树就叫文件的页缓冲区,此时我们把数据从应用层写到了由page管理的一个个内存中

补充4:
你说这玩意是个树,那是个什么树呢?
在这里插入图片描述
基数树 or 基树 本质是 字典树
数组有3个,那么这颗树就干上3层
void* slot[3]数组下标是数字,当我把他当成字母
每个数组又指向一个节点,就形成了这么一棵树
如果key是bca ,那么按照key的顺序就从根节点从上往下找
各种三个字母的组合就能根据这颗树找到某个底层叶子对象了
在这里插入图片描述

文件的内容是有偏移量的
假设文件大小10MB,也就是10x1024x1024字节
按照[0,1010241024]字节范围空间来看待
按照4KB来划分成一个一个的块
一共有多少个块呢?
1010241024/4*1024 = 2560个块
也就是说整个文件在磁盘上占2560个数据块
磁盘中每个块也就有了编号,从【1,2560】
每个数字乘以4096就是编号对应4KB在原始文件中的偏移量
所以把【1,2560】的编号按照Int来看待,有32bit位
假设0xFF FF FF FF 每八个bit看做一个字母Key = b,c ,a…
在这里插入图片描述

如果我们构建出这样的字典树,我们就可以拿着文件内容把文件内容的偏移量按照比特位分成特定的几个区域,八个bit为看成第一个字母b,后面依次类推,然后对应的字典树中就能找到整个文件中的偏移量和内存中page的映射关系
在这里插入图片描述
拿着文件的内容偏移量和内存的page建立映射关系,当我进行读写文件时,从开头读,结尾读,读写哪里,每一个读写都有偏移量,有偏移量找这颗树中偏移量对应的内存中某一个page,这样就能把数据保存到page里

其实最终想说的是文件写入把用户缓冲区的数据通过内核数据结构找到对应的Page对象把数据刷新到物理内存中了
接下来的工作就是OS要定期把数据刷到文件系统data blocks里面
在这里插入图片描述
此时数据已经写在物理内存中了,树里面的struct page就可以对应到物理内存中的page了
写完进程还管不管心数据刷到磁盘这个过程呢?
他就不关心了
所以这个数据刷新不刷新完全由OS决定,从这开始就往驱动层面走了
在这里插入图片描述

总结:
1、一个磁盘对应的文件它在访问之前部分对应文件系统中的属性已经加载内存了
2、进程打开文件时,本质就是把磁盘中的属性往struct inode 放
内容blocks通过struct file也能找到,以page的形式保存好
3、用户层写入时,通过fd-》 struct file-》 address-》 找到管理基树 找到物理内存中对应的page
然后把数据刷新到对应page页里,最后由OS调用IO子系统,把数据通过IO队列刷新到硬件上

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

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

相关文章

JMeter之HTTP压测详解

一、创建线程组 右击-->添加-->Threads(Users)-->线程组 下面对比较重要的几个参数,讲解下: 名称: 就是给你这个线程组起名字。 线程数:指压力测试时候模拟几个用户测试接口。 Ramp-Up:这里指几秒运行完上…

Windows环境VSCode配置OpenCV-项目配置(二)

修改c_cpp_properties.json {"configurations": [{"name": "windows-gcc-x64","includePath": ["${workspaceFolder}/**","D:/mingw64/mingw64/include","D:/openCV_win/build/install/include","…

【linux】htop 命令行工具使用

htop是一个跨平台的交互式流程查看器。 htop允许垂直和水平滚动进程列表,以查看它们的完整命令行和相关信息,如内存和CPU消耗。还显示了系统范围的信息,如负载平均值或交换使用情况。 显示的信息可以通过图形设置进行配置,并且可…

Python与ArcGIS系列(八)通过python执行地理处理工具

目录 0 简述1 脚本执行地理处理工具2 在地理处理工具间建立联系0 简述 arcgis包含数百种可以通过python脚本执行的地理处理工具,这样就通过python可以处理复杂的工作和批处理。本篇将介绍如何利用arcpy实现执行地理处理工具以及在地理处理工具间建立联系。 1 脚本执行地理处理…

python接口自动化-参数关联

前言 我们用自动化发帖之后,要想接着对这篇帖子操作,那就需要用参数关联了,发帖之后会有一个帖子的id,获取到这个id,继续操作传这个帖子id就可以了 (博客园的登录机制已经变了,不能用账号和密…

C语言加密字符(ZZULIOJ1064:加密字符)

题目描述 从键盘输入一批字符,以结束,按要求加密并输出。 输入:从键盘输入一批字符,占一行,以结束。 输出:输出占一行 加密规则: 1)所有字母均转换为小写。 2)若是字母a到y&#xff…

最新版仿东郊到家小程序源码 上门服务小程序源码

最新版仿东郊到家小程序源码 上门服务小程序源码 1、数据概况(新增业务城市用户投票功能,更加直观的查看业务城市的关注度、人气和影响力,促进业务开展) 2、数据概况 (增加可视化数据大盘,代理商端可查看自己下面的技…

虚幻C++ day5

角色状态的常见机制 创建角色状态设置到UI上 在MainPlayer.h中新建血量,最大血量,耐力,最大耐力,金币变量,作为角色的状态 //主角状态UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "Playe Stats&…

【Gitpod】云部署Stable Diffusion并且可以本地访问

文章目录 前言项目部署 项目启动参考文献 前言 本文介绍如何使用 Gitpod 部署 Stable Diffusion web UI。Gitpod 是一个基于云的开发环境,通过与 GitHub 集成,可以在浏览器中轻松进行代码开发和部署;Stable Diffusion 是 GitHub 上面的开源 …

2023 OPPO开发者大会正式开幕,ColorOS 14亮相,手机流畅进入「最后一公里」比拼

2023年11月16日,OPPO开发者大会正式开幕,万众期待的ColorOS 14正式发布,并且已经确定,将由OPPO Reno11系列首发。 本次的ColorOS 14将OPPO之前布局的AndesGPT、潘塔纳尔自研系统、超算平台三大技术全面整合,带来全新智慧新体验。智慧互融,化繁为简;软硬芯协同,设备流畅度全面进…

SDL音视频渲染

01-SDL简介 官网:https://www.libsdl.org/ 文档:http://wiki.libsdl.org/Introduction SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函…

数字化转型的“支点”是什么?

​当前,数字化转型在推动各行各业降本增效的过程中扮演着越来越重要的角色,数字化转型不仅可以提高企业的生产效率和降低企业生产经营成本,也成为了推动经济发展的新引擎。对于企业而言,想要成功推动企业数字化转型,不…

【路径穿越】vulfocus/apache-cve_2021_41773

1.1漏洞描述 漏洞编号cve_2021_41773漏洞类型路径穿越漏洞等级高危漏洞环境vulfocus攻击方式 1.2漏洞等级 高危 1.3影响版本 Apache HTTP Server 2.4.49、2.4.50 1.4漏洞复现 1.4.1.基础环境 靶场VULFOCUS工具BurpSuite 1.4.2.前提 1.5深度利用 1.5.1漏洞点 利用网上爆出…

干货分享!各大跨境电商平台入驻指南及跨境电商实用工具推荐!

当跨境电商成为一个所有人都耳熟能详的名词,各类跨境电商平台和软件都一拥而上,跨境电商平台和工具千千万,那么很多人就在问了,该怎么入驻这些电商平台呢?又该选择什么样的跨境电商软件呢?今天这期干货分享…

event事件分发器||静态类型转换

由于类型不一样在event事件分发器中要进行静态类型转换,将基类转换为派生类进行处理 对event事件分发器拦截后最后要将其他函数交给父类处理,否则不会运行

Confluence的安装部署

先介绍一下confluence Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 confluence是Atlassian公司的&#x…

Mysql分组查询每组最新的一条数据

在工作中遇到一个问题,需要查出每个公司最新的那条数据。 所以需根据公司进行分组: 未进行分组时: select a.id, b.name companyName, result_asset ,result_liability ,result_net_asset, a.create_time ,a.is_deleted from bus_proper…

【Git操作】Author identity unknown Please tell me who you are

前言 这错误主要是在上传到Gitee的时候,我们没有设置用户名和和邮箱,原因有很多,更换设备,或者第一次提交的时候都会遇到这个问题,我们只需要在终端简单的输入两行指令就可以解决。 git config --global user.email &q…

都有哪些大厂有自己的Web组件库?

有TDesign、ArcoDesign、AntDesign、随着Materialdesign等优秀web组件库的发布,设计师可能会觉得大厂之间的web组件库差别不大。其实大厂的产品线很多,业务复杂。设计系统是对以往项目经验的深刻沉淀,可以支撑业务逻辑,保证设计系…

个人简历管理系统winform

说明文档 运行前附加数据库.mdf(或sql生成数据库) 主要技术: 基于C#winform架构和sql server数据库 功能模块: 个人简历管理系统 简历信息添加 修改 删除 查询简历 运行环境: 运行需vs2013或者以上版本&#xff0…