当前位置: 首页 > news >正文

文件系统(精讲)

目录

理解硬件

CHS寻址方式

 磁盘管理

引入文件系统 

 inode

Block Bitmap

inode Bitmap

GDT

Super Block

目录与文件名

 路径解析

路径缓存

软硬链接

软链接

硬链接 

 软硬链接的区别

理解硬件

在普通的计算机里用得最多的就是磁盘,只是现在的笔记本电脑用的基本上是固态硬盘,但是台式电脑和企业级还在用磁盘,因为容量大,便宜的优点。由这个图我们可以知道一个盘是由很多个磁道组成的,而且每个磁道围着主轴构成了一个个同心圆,而为了方便又给每个磁道划分了扇区,这样我们的磁头就可以快速定位到每个扇区,从而达到读写的目的。

CHS寻址方式

这个图很清晰,我们可以知道一个盘一个盘围着主轴旋转,而且每一面都是可以存储数据的,还有一个机械臂杆,控制所有磁头,用来读写数据,磁头都是一个需要转,其他都会跟着转的。硬盘存储的基本单位是扇区(512字节)。读的时候机械臂杆控制磁头寻找需要的扇区,然后连同一整个柱面的数据都会被磁头读取,修改之后,又会连同一整个柱面写回去。

问题:512字节写入到某一个扇区中,磁盘应该如何转动?

我们可以结合上面的图来看,就能知道磁盘的转动。首先,磁头随着机械臂杆的控制前后寻找需要的磁道(柱面),然后盘片朝着一个方向旋转,由磁头寻找到需要的扇区,找到扇区后,因为有很多个磁头,需要定位一个磁头。这样就精准找到了需要找到的磁头。柱面、磁头、扇区。由这三个变量定位找到扇区,这种寻址方法就叫做CHS寻址

 磁盘管理

 看图,这是我们小时候经常玩的磁带,它有一条一条的磁带,有时我们还经常把他拉出来,其实这里面就是保存的数据,我们拉出来之前在这个容器里面是一个一个的同心圆,但将他拉出来之后,就能被拉直成一条线,这样可以看出,他的本质就是一个线性结构,是个数组,磁盘其实也是一样的。

拉开之后就是一个数组,我们将他管理起来就是用一个数字----数组下标!!! 

 有一个小细节就是扇区并不和数组下标一样从0开始,而是从1开始的,但柱面和磁头就是从0开始的。

引入文件系统 

文件系统(OS)访问磁盘并不是以扇区为单位,而是以“块”为单位,一个块有8个扇区,一般是4KB(可以调整)。文件系统使用磁盘块,以4KB为单位。

 而分块管理又会有些难度,所以又在块里面分了组,以此类推,直到能够管理好为止。这种思想就是“分而治之”。我找到一个图,能够很形象地体现这种思想。基本单位数是4KB。文件由内容和属性构成的,内容就是Data Blocks。在Linux中,任何正常文件都有自己的文件属性集合。每个文件属性其实就是一个结构体,只是每个结构体的值不一样,但是都需要类型,大小,权限等属性,所以就创建了一个结构体,我们称这个结构体为inode,而且大小都是固定的,一般是128字节。

 inode

就是一个struct,里面存储着这个文件的信息,比如type、size、priority等等,而且每个文件的inode都是一样大的,只是储存的内容不同,但是文件名不会储存在inode中,因为每个文件的文件名不一样,这些文件名不一样的话就不能保证inode大小设置一样。如果我们得到一个inode,那就可以找到文件。

Block Bitmap

我们看这个就对应上面那副图来看,Block Bitmap就是“块位图”,而块的基本单位是4KB,在Data Block里面存储的就是文件的内容,而块位图就是记录Data Block里面每个块的存储情况。位图是与数据块一一对应的,如果数据块的块被占用,那么位图就会置1,表示已经占用。我这样一解释,应该还是很好理解的。

inode Bitmap

这个就是inode位图,记录着inode的使用情况,参照块位图,一样的,也是一一对应。每一个比特位标记一个inode的是否空闲。

GDT

块组描述符,描述块组属性信息,记录着每个块组描述符的信息,比如哪里开始是inode位图,哪里开始是Block位图,还有多少个空闲,有多少已经被占用。

Super Block

超级块,这个是记录着整个文件系统的所有信息,对于文件系统来说至关重要,所以,在一个区里面分组会有一部分前面都有超级块,如果有一个不小心被删除,那么其他的只需要复制粘贴覆盖他就好了。由此我们还能知道一些东西:格式化!格式化平常就知道不能格式化,否则数据就全没了,那是为什么呢?这是因为格式化的本质就是写文件系统的管理信息,比如让这些块组描述符全部为0,那数据不就全消失了嘛。

目录与文件名

上面交代了只要知道inode就能找到文件,可是在平时,我们都是用文件名来找文件的啊,没有谁用inode寻找文件吧,目录是文件吗???其实目录也是文件,在磁盘上是没有目录的概念的,在它看来,所有文件都是文件内容加属性。而且文件内容保存的是文件名与inode的映射关系。所以我们打开一个文件就必须要找到他的目录,然后访问内容,通过文件名映射到inode,拿到inode再去找文件。

 路径解析

通过上面的分析我们可以知道我们需要打开一个文件的话,必须要打开它的目录,那打开它的目录也要打开它目录的目录,以此类推..我们需要通过路径打开所有目录,才能打开这个文件。都要从根目录开始,依次打开每⼀个目录,根据目录名,依次访问每个目录下指定的目录,直到访问 到目标文件。这个过程就是路径解析。

路径缓存

我们可以了解到,要找到文件的话必须从根目录开始进行解析,原则上是这样的,但是太慢了,所以Linux会缓存历史路径为一个树状的结构,这个结构体是struct dentry。

软硬链接

软链接

话不多说,我们看代码就明白了。

由此可以看出code-soft就是code.c的软链接,那么软链接有什么用呢?我们再看个图 

我们可以看到这两个文件的inode是不一样的,这代表着这两个文件时单独的两个文件, 在生活中的应用其实就是快捷方式,快捷方式就是单独的文件。但是软链接只是源文件的一个标记,如果源文件被删除,那么这个链接文件就不能独立存在,虽然文件名保留了,但里面的内容却不能执行了。

硬链接 

看图:

我们通过这个命令创建了一个文件的硬链接。我们在用ls来看看细节的东西。 

我们看到源文件和链接文件他们的inode是一样的,他们共用一个inode,而且可以看到权限位后面的那一位变成了2。其实,硬链接文件就是源文件的别名,一个源文件有几个别名,硬链接数就是几。code.c这个文件有两个别名,硬链接数就是2。与软连接不同的是,当硬链接的源文件被删除后,硬链接文件仍能正常执行,只是文件的链接数减少了一个,因为此时该文件的文件名少了一个。能够起到文件备份的作用。

这个代码我们创建了一个目录,为什么只是创建了一个目录,他的硬链接数就是2呢?

我们进入dir目录,发现每个目录下都有.和..这两个隐含文件,分别代表当前目录和上级目录。

小tips:一个目录下相邻的子目录数等于该目录的硬链接数减2。 

 软硬链接的区别

  • 软链接文件是独立的文件,有单独的inode,但是硬链接没有。
  • 软链接相当于快捷方式,而硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并且写入了当前目录。
http://www.dtcms.com/a/276758.html

相关文章:

  • JVM与系统性能监控工具实战指南:从JVM到系统的全链路分析
  • 【每日刷题】阶乘后的零
  • SOEM build on ubuntu
  • Golang实战:使用 Goroutine 实现数字与字母的交叉打印
  • 使用bp爆破模块破解pikachu登录密码
  • 使用frp内网穿透:将本地服务暴露到公网
  • 张量类型转换
  • 深入探讨Java的ZGC垃圾收集器:原理、实战与优缺点
  • 格密码--数学基础--08最近向量问题(CVP)与格陪集
  • Mentor软件模块复杂,如何分角色授权最合理?
  • 【PTA数据结构 | C语言版】阶乘的递归实现
  • 串口屏的小记哦
  • 鸿蒙进程通信的坑之ServiceExtensionAbility
  • Datomic数据库简介(TBC)
  • Ntfs!LfsFlushLfcb函数分析之Ntfs!_LFCB->LbcbWorkque的背景分析3个restart页面一个普通页面的一个例子
  • 如何在IEEETrans格式的latex标题页插入图像
  • CCS-MSPM0G3507-4-基础篇-串口通讯-实现收和发
  • Java SE--抽象类和接口
  • 面试150 对称二叉树
  • Waiting for server response 和 Content Download
  • 嵌入式程序调试工具
  • 《人件》阅读笔记
  • 【Flask】基础入门
  • 华为业务变革项目IPD基本知识
  • nodejs获取可用cpu数
  • 前端弹性布局全解析
  • 20250712-2-Kubernetes 应用程序生命周期管理-部署应用的流程_笔记
  • PyVision:基于动态工具的具身智能体
  • 剑指offer——队列栈:用两个栈实现队列
  • 模型驱动的架构MDA的案例