文件系统部分(1)

一、文件系统的基本组成

对于每一个文件,操作系统会为其分配两个数据结构——索引结点和目录项,二者的功能如下:

- 索引节点,⽤来记录⽂件的元信息,⽐如 inode 编号、⽂件⼤⼩、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是⽂件的唯⼀标识,它们之间⼀⼀对应,也同样都
会被存储在硬盘中,所以索引节点同样占⽤磁盘空间
- ⽬录项,⽤来记录⽂件的名字、索引节点指针以及与其他⽬录项的层级关联关系。多个⽬录项关联起来,就会形成⽬录结构,但它与索引节点不同的是,⽬录项是由内核维护的⼀个数据结构,不存放于磁盘,⽽是缓存在内存

目录项和索引结点之间是多对一的关系,因为同一个文件可以保存在多个目录下。

目录也是文件,也同样需要维护一个索引结点来记录元信息。但对于普通文件,其在磁盘中保存的是文件中的内容,而对目录,它保存的是它的子目录或者目录下的文件

目录并不是目录项,目录是一个文件,持久化存储在磁盘中,目录项是一个数据结构,用来记录目录之间的关系,维护在内存中。目录维护在磁盘中,每次从磁盘中读目录的效率很低,因此,对于一个读过的目录,会把它记录在内存的目录项中,下次再读的时候,直接从内存目录项中找即可,加快文件读取效率。

另外磁盘读写的最小单位是512KB,但是每次都读取这么小的数据块,那么读写效率将会非常低。因此,操作系统将4KB作为一个逻辑块,作为每次读取的单位,可大大提高读写效率。

文件,目录,目录项,逻辑块直接的关系,可以参照这张图

 补充:超级块区用来存储文件系统的详细信息,如块的个数,块的大小,空闲块数。

二、虚拟文件系统

虚拟文件系统操作系统提供给用户的接口,即在用户层与文件层中引入一个中间层,这个中间层就是虚拟文件系统。在这种情况下,我们不需要了解文件系统的具体结构,只需要了解操作系统提供给我们的接口就行。

根据存储位置的不同,虚拟文件系统可分为三类:

1)磁盘的⽂件系统 ,它是直接把数据存储在磁盘中,⽐如 Ext 2/3/4、XFS 等都是这类⽂件系统。
2)内存的⽂件系统 ,这类⽂件系统的数据不是存储在硬盘的,⽽是占⽤内存空间,我们经常⽤到的/proc 和 /sys ⽂件系统都属于这⼀类,读写这类⽂件,实际上是读写内核中相关的数据。
3)⽹络的⽂件系统 ,⽤来访问其他计算机主机数据的⽂件系统,⽐如 NFS、SMB 等等。

当然文件系统必须要挂载到某个目录下才可以使用,比如linux系统在启动的时候会将文件系统挂载到根目录下

通过虚拟文件系统,我们可以更方便地实现对文件的操作

 以上面这张图为例,对文件的操作步骤如下:

1.将文件路径和文件名作为参数传入open()方法中,打开相应的文件。

2.使用write()方法,对刚才打开的文件进行修改

3.修改完输入后,文件的最新数据会暂时存在缓存中,若需要持久化到磁盘中,则需要使用save()方法,将内存中的数据写入磁盘中

4.调用close()方法关闭文件

三、打开文件的维护

操作系统维护着一个打开文件表,用于记录当前打开的文件的信息

在文件打开列表中需要维护以下的信息:

1)⽂件指针:系统跟踪上次读写位置作为当前⽂件位置指针,这种指针对打开⽂件的某个进程来说是唯⼀的;
2)⽂件打开计数器:⽂件关闭时,操作系统必须重⽤其打开⽂件表条⽬,否则表内空间不够⽤。因为多个进程可能打开同⼀个⽂件,所以系统在删除打开⽂件条⽬之前,必须等待最后⼀个进程关闭⽂件,该计数器跟踪打开和关闭的数量,当该计数为 0 时,系统关闭⽂件,删除该条⽬;
3)⽂件磁盘位置:绝⼤多数⽂件操作都要求系统修改⽂件数据,该信息保存在内存中,以免每个操作都从磁盘中读取;
4)访问权限:每个进程打开⽂件都需要有⼀个访问模式(创建、只读、读写、添加等),该信息保存在进程的打开⽂件表中,以便操作系统能允许或拒绝之后的 I/O 请求;

四、文件的存储方式

文件的存储方式分为两种:

1)连续存储方式:

可以参考数组的存储方式,这种方式要求文件的数据在磁盘中存放的物理地址必须是连续的。

文件头会记录起始块和长度,通过起始块的位置+长度两个字段确定文件在磁盘中的存储地址。

优点:

读写效率高

缺点:

1.需要事先知道文件的大小,以便操作系统给文件分配一块连续的空间。 

2.文件被删除时,会留下磁盘碎片(类似内存碎片),影响其他文件的存储,造成不必要的磁盘空间的浪费

2)非连续存储方式

可分为链表存放和索引存放两种

链表存放:参考链表的数据结构,结点之间通过next指针相连,一个结点的next指针用于记录下一个结点的存储地址

按照这种方式,在文件头中需要记录起始块的存储地址和末尾块的存储地址,在每个磁盘块中会记录下一个数据块的存储地址,通过next指针找到目标的数据块。

 优点:

1.解决了磁盘碎片的问题

2.对文件的空间分配更为方便

缺点:

1.需要通过指针遍历链表,读写效率降低

2.如果链表中的某个指针丢失或损坏,会导致整个链表的数据丢失

3.维护指针需要消耗一定的内存空间,占用了一部分本该用于存储数据的空间

为解决上面链表存储的问题,采用了索引存放的方式

即操作系统把各个数据块中的指针显示地存放在一张连接表中

连接表的结构可以参考这张图,以这张表为例,对于文件A,依次读取4,7,2,10,12磁盘块中的数据,对于文件B,依次读取6,3,11,14磁盘块中的数据

在文件头中需要维护一个包含指向对应数据块的指针,在通过连接表知道文件所在的磁盘块的索引之后,通过文件头中的指针,读出每个磁盘块中的数据。

 优点:

1.文件的创建,增大,缩小很方便

2.索引占用的空间远小于链表指针

3.文件读取效率高于链表存储

不过索引还是存储在磁盘中,对索引的存储同样也会带来一定的磁盘空间的开销。

索引+链表存储:

这种存储方式不需要维护连接表,而是在磁盘中维护一定的空间专门用来存放所有索引,称为索引数据块,每个索引数据块中,需要分配一定的空间,用于维护指向下一个索引数据块的指针,当当前的数据索引块用完时,使用下一个索引数据块,文件头中需要记录第一个索引数据块的位置。

 但这种方式同样存在前面所说的一个指针丢失,造成后续数据无法正常访问的缺点。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值