文件系统原理

文章目录


1)一个文件,它是文件内容和文件属性的集合
文件=文件属性+文件内容
文件属性
在这里插入图片描述
文件内容
在这里插入图片描述
2)文件分为打开的文件和未打开的文件
3)打开的文件是谁打开的?
由进程打开!而研究一个被打开的进程本质就是研究进程和文件的关系。
而被打开的文件之后,必须先被加载到内存,而文件=文件属性+文件内容,那么是谁先被加载到内存?属性先被加载到内存,属性中有文件的编号,可以用来定位哪一个文件,然后再找到指定文件内容。
一个进程可能打开多个文件,而而操作系统中,注定不止存在一个进程,因此也注定存在了多个进程打开大量文件的现象,进而这些被打开的文件,操作系统要进行管理,那么怎么管理这些被打开的文件–先描述,再组织。在Linux内核中,一个被打开的文件,都必须有自己的文件打开对象,其中包含文件的很多属性也就是文件属性的集合,然后操作系统对文件对象的管理就转换成了对数据结构的增删查改!一般为链表。
4)那么没打开的文件,存储在哪里?
没有打开的文件,在磁盘上存储,而放着的这些文件,对于我们来说最关心的是什么?便是这些文件是如何存储的!在磁盘上没有被打开的文件是非常多的,那么这些文件是被如何放置在磁盘上的,也就是如何存储的?分区域进行存储,在磁盘上划分空间来对文件存储,磁盘上存储文件就是要存储文件的内容和文件的属性,在Linux中对文件内容的存储采用数据块的存储方式,文件属性用inode存储,而Linux中文件在磁盘上的存储,这两者是分开存储的!如何分开存储就先剖析磁盘的结构磁盘也就是以前像光盘一样的东西
在这里插入图片描述
磁盘它的盘面是近乎光滑的,磁盘它由一块一块的盘片构成,每一盘片两面都是光滑的,而文件就是存储在这样一块块盘片之上,一块盘片存储大量的文件,而磁盘容量越来越大是因为它的盘片越来越多,它有很多片构成
在这里插入图片描述
每一面都有一个磁头,磁头摆动是在磁盘上面读写数据,它会左右摆动就是在定位文件,然后进行读写,电脑在开机时,盘面会高速转动,而磁头会在不停的左右摆动,这是在读取数据的过程,盘面转动是在读取不同的数据。在磁头左右摆动的时候磁头和盘面是不会接触的尽管这样看着可能是接触的,但是根本没有接触,因为若是接触的话,会将磁盘上面的数据给损坏,然后可能会造成数据的丢失,磁头是悬浮在盘面上的!其实磁头在左右摆动的时候,就是在定位数据寻址。磁头和盘片之间若是存在灰尘那么就会影响磁头的寻址,影响数据的定位,所以要保证在真空技术下存储。保证真空的技术很难因此在磁盘一旦进入灰尘之后就会慢慢的使数据寻址丢失,然后慢慢变卡!磁盘存数据是在盘面上存储的,磁盘是一个永久性存储介质。磁盘的存储构成有盘面,扇区,柱头,磁头
在这里插入图片描述
一个盘面它由无数个同心圆组成,而每一个同心圆称为一个个磁道,从圆心向外划半径向外延伸半径之间形成的弧道为一个个扇区,这样一个个扇区在磁道上存在无数个,一个磁道上存在大量的扇区,数据就是存在在这样一个个的扇区之上,在操作系统中扇区默认最小单位为512字节一个扇区大小为512字节。所以存储大文件的时候就可能是多个扇区连续使用,这样便于磁头定位数据,然后使访问数据效率提升!扇区是磁盘上访问的最小单位(512字节),因此我们可以把磁盘看作由无数个扇区构成的存储介质,而要把数据写入到磁盘中就是要先在磁盘中找到扇区来存储数据,存储数据总得先找到能存放的地方然后再将数据给存放进去而一个盘面有无数个扇区,磁盘也有很多盘面所以要先知道在哪一个盘面而磁头是定位盘面的所有要知道在哪一个磁头,磁头有自己对应编号便于定位盘面,知道在那一面之后要确定磁道,再确定再哪一个扇区这些查找的存储定位都要带有自己的编号,这样以便于确认访问在哪?磁头在左右摆动的过程中是在定位磁道和柱面的过程,而盘面在高速旋转就是在定位扇区的过程
在这里插入图片描述
所有磁盘的效率取决去磁头的运动和盘面的高速旋转,是由寻址决定的效率而这样一个寻址动作寻址越少的话,效率就是越高的,若是寻址动作越多相应的效率就越低下。所有在软件设计上要尽可能的把相关的数据放在一起,就是在程序设计上也是,尽量把相同类型的数据定义在一起,然后在磁盘上访问寻址时,才能更尽可能的拿出更多的数据,并且不用做大量的寻址工作。
因此未被打开的文件在磁盘上扇区存储着的,以固定大小在扇区上一个个扇区存储!
磁盘的逻辑结构
对扇区的物理结构进行逻辑抽象抽象为逻辑结构,磁盘盘面抽象为线性的,也就是几个连续的盘片,然后每一个盘片上的磁道同样抽象为连续的线性延展开来的区间,每一个盘面有无数个磁道,同样一个磁道是无数个扇区的组合,最后逻辑化为一个线性的数组,数组的最小储存单元是扇区,一个扇区512字节,所以数组最小访问单位是512字节,这样就可以通过定位在数组什么位置从而确定在哪一个盘面继而确定在哪一个磁道的哪一个扇区!这样组成一个以扇区为单位的数组所以任意一个扇区都有下标不过磁盘对于地址寻找它要先确定磁头(Head)再磁道(Cylinder),最后扇区(Sector),这样的 确定方式为CHS寻址方式。下标可以用来推导所在位置。假设扇区编号28888,每一面有20000个扇区,50个磁道,每一个磁道400个扇区 28888/20000 = 1,在第二个盘面 28888%20000=8888 8888/400 = 22 ,在第22个磁道 8888%400 = =88,在第88个扇区,就可以通过扇区编号确定在盘面磁道和扇区逻辑扇区地址(LBA地址)转换为物理地址(CHS地址)。计算机中不仅仅cpu有寄存器,就连其他设备都有类似于寄存器的东西存在磁盘也有如状态寄存器(结果),控制寄存器(r/w),数据寄存器(数据),地址寄存器(LBA)。
文件系统
一个磁盘上肯定会存在很多的文件,而对于文件系统来说它会分区域来存储文件,就是划分区域,就如电脑上的C盘D盘之类的电脑分区
而一个个分区可能又是很大的那么对于每一个区域再分区,大的划分为N个小的可能这些小区域不是均匀的,分区嘛也就是在操作系统上以一个结构体来管理
start和end划分区间,每一个部分都是如此,每一个区域再划分为一个个小块,把这些小块管理好其他小块照着管理那么就可以将所有文件依葫芦画瓢管理好。而一个分区划分到后面再划分
划分为各个块

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例子。
一个Block group区块中有6个小块Data blocks块:存文件内容的区域,磁盘最小单位是扇区,然后以块的形式呈现,磁盘虽然是扇区为最小单位但是文件不一定按照扇区的标准来储存,文件常见是4KB的大小为基本单位1KB=1024字节,扇区基本单位为512字节,所以文件基本单位需要8个连续扇区储存。所以操作系统在访问磁盘时是以4KB方式以块访问磁盘—便于管理,不然一个扇区太小了,要分更多的精力管理!文件系统以4KB大小提取,而一个一个的块有自己的编号一个一个的数据块。
inode Table:inode:存放的是单个文件的所有属性一般是128字节,而一个扇区可以存储4个Inode,也就是4个文件的inode,一般而言一个文件一个inode,磁盘上存在很多文件会有很多的inode,因此存在inode表,用于存放所有文件的inode属性,而每一个文件有自己的inode编号,用于识别文件,inode和数据块可以建立连接,因此将属性和内容分开存储,再通过连接将他们连接起来。在Linux文件属性中,是没有包含文件的名称的,只有文件的编号通过ls -li可以查看文件inode编号
在这里插入图片描述
在linux中标识一个文件都是用的是inode编号。而在inode属性列表中有一个字段是int blocks[NUM],其中它是与文件的数据块对应,记载数据块的块号,可以通过数据块从而知道有没有数据内容,inode属性列表不仅仅只有这一属性字段还有很多如{文件类型、权限、引用计数、拥有者、所属组、ACM时间等等…}。
Block Bitmap:申请一个数据块然后用了之后又将其释放这一动作是十分频繁的,那么如何得知一个数据块的使用情况,用比特位图的标记方式,标记一个数据块是否被使用,没有被使用为0,被使用了标记为1,当将数据块释放之后只需要重新将比特位标记为0即可,不用频繁的将数据之类的由操作系统加载,用比特位图中的比特位和数据块块号映射,比特位图中的内容标识该块使用与否,所有当要删除一个文件的时候不需要把文件的块的内容清空只要把它映射到位图上的储存位由1改为0即可。Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
inode Bitmap:比特位的位置和inode的编号映射,比特位的内容表示一个inode是否可以被使用,就是这个文件是否是有效的。
Group Descriptor Table:块的使用情况,块组相关属性,与组有关的属性,表示整个分组的使用情况,由GDT管理。
Super Block:存放文件系统本身的结构信息,里面包含整个分区的基本使用情况(一共有多少个组、每个组大小、每个组的block数量、inode数量等等)。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。super block不一定在所有分组都存在但是又不能只存在于一个分组因为若是只存在于一个分组,一旦这个分组的超级快被破坏,那么整个文件系统就被破坏了,所有可以存在于几个分组,但是里面都是重复信息所有不用每一个分组都存在。
分组分区分块内容都提前写到了内存中,每一个分区在使用之前,都必须先将部分文件系统的属性信息提前设置进对应分区中,方便后续使用分区或者分组—>这是一个格式化的过程。inode Table和Data Blocks属于文件,在加载文件时要先将这两个清空(初始化),还要把其他的块写入,最后再把文件的属性和内容写入相应的块中,在使用之前要先将这些基本的属性都给写好,然后i建立文件时就是填写块。剩余的四个块是管理inode Table和Data Blocks块的属性信息,管理有对应的顺序(先描述,在组织).
而格式化重新写入整个分区,文件系统属性那些信息也会重新写入,每个组的划分也会写入。

ls -l读取储存在磁盘上的文件信息
在这里插入图片描述
在这里插入图片描述
查看一个文件在磁盘上存储的详细信息,用stat查看
在这里插入图片描述
所以用stat查看文件属性时,可以查看到各种信息。

当新建一个文件时,系统要做什么?新建一个文件,系统会将文件的内容先拷贝到磁盘中去并且修改对应位图中的比特位,将block编号映射的位图比特位由0改1,并且inode编号对应的位图比特位也会由0改1.删除一个文件要先找到文件Inode(文件所处目录、确定分区,inode确定分组,然后再inode bitmap中把相应比特位映射由1改0。
所有拷贝慢,删除快!就比如下载一个大型游戏,下载的时候很慢,是因为要将这个游戏的所有内容都要加载到你的手机上,然后设置对应分区快组,不过在删除时又很快是因为只需要把位图对应的映射由1改0就行了!
LInux中一个文件一个inode,每一个inode有自己的inode编号(inode的设置是以分区为单位的,不能跨分区设置),所以inode编号不用担心重复问题。而inode表示文件的所有属性,但是文件名并不属于inode的属性,它是数据块中的内容。
Linux中无文件名那么它的文件名在哪里?在文件的内容中,而且我们知道一个文件的编号但是在使用的时候都是使用的是文件名相反而不是文件inode编号,这是为什么?在一个文件目录中,文件目录也是一个文件,他有自己的文件inode编号。
在这里插入图片描述

目录也有自己的属性,那么目录中有内容吗?目录的内容是文件名称,目录也有自己的数据块里面存放的就是文件名称,而改目录下文件的文件名和对应文件的inode的映射关系,所以一个目录下不能有两个同名文件,因为一个文件名映射一个inode编号,一个文件又只有一个Inode编号,因此不存在同一目录下同名文件。
一个目录下,没有w是无法创建文件的(因为即使创建出了文件,也无法加那个inode和文件名写入数据块形成映射)。
目录下没有r权限,是无法查看文件的因为看不到数据块。
目录是文件有自己的inode编号(目录名与inode编号形成映射关系存放在上一级目录下)向上递归查找对应映射!

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值