为什么引入文件索引节点能大大加快目录检索速度

首先弄清楚什么是索引结点(inode)?

一般来说,面试不会问 inode 。但是 inode 是一个重要概念,是理解 Unix/Linux 文件系统和硬盘储存的基础。
理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息

再弄清楚操作系统从磁盘中加载数据到内存中的过程?

这一过程也是操作系统从文件的逻辑地址(逻辑上连续存放,表现为索引节点的磁盘地址表中的数据是连续存放的)转换到物理地址(物理上离散存放)的过程。
首先os会使用应用程序给定的路径(包含所要查找的文件名),一次一次的将对应级别的目录调到内存中来,直到找到目标文件对应的目录项(FCB),这时有两种情况:

  • 如果应用了索引结点,则一个FCB中只存放了文件名和一个指向文件索引结点的指针, 然后再根据这个指针,将这个64B的
    索引结点调入内存,然后定位至索引节点中的磁盘地址表,依据顺序取得文件数据存放的磁盘地址并且将相应的存放文件的磁盘数据调入内存中

  • 如果没有应用索引结点,则磁盘地址会拿到FCB后会直接从FCB中拿到相应的磁盘地址表,然后再依据这个磁盘地址表将磁盘中的数据依次调入内存中。

以上的步骤中是否给人一种加了索引结点后,反而os还要多一个步骤才能找到文件中的数据,实际上并非如此,请看以下的解析

为什么引入文件索引节点能大大加快检索速度

1 FCB

首先现代操作系统,比如linux采用的树形目录结构,其中的一个文件目录项由一个FCB(File Control Block)即文件控制块组成,每一个FCB即每一个目录项中包含了一些元数据信息,比如文件名该目录文件在磁盘中的位置,文件的类型,文件的开放权限,文件的大小,还有**磁盘地址表(存放该文件数据的磁盘块列表)**等等信息,其中最重要的是第一个属性,其次是第二个属性。

image.png

FCB

缺点:
当一个FCB很大时,则会导致磁盘I/O次过多,检索速度慢,为什么这么说,请看例一:

假如一个FCB有64B大小,一个文件夹中有640个目录项,一个页面大小为1KB,则一个页面只能存储1KB / 64B = 16个目录项,那么就需要 64B * 640 / 1 KB = 40 个磁盘块才能存放这些FCB,所以,如果按照文件名检索,即顺序检索,则平均需要查询320个目录项,因为每个盘块能存放16个目录项,所以评分需要读磁盘(读磁盘是指将磁盘中的需要的数据调入内存) 320 / 16 = 20 (次)

从以上例子中可以看出,当FCB越小,一个磁盘块中能存放的FCB也越多,从而减少磁盘I/O次数

2 改进

  1. 因为一个FCB中包含的信息太多,导致一个FCB会很大,不利于磁盘IO和检索,所以我们需要对其进行改进
  2. 我们知道一个文件目录项中最重要的是文件名(实现文件的按名存取必然需要文件名),所以我们可以把FCB中不重要的信息放到一个索引结点当中,让一个FCB只有两个分量组成,分别是文件名和指向该索引结点的指针,因此一个FCB占用的空间会小很多,会大大加快磁盘I/O速度

image.png

改进后的FCB

例二:

如果使用索引结点机制,一个FCB的只有两个分量,假设文件名占用14B,索引结点指针占2B,也就是说一个目录项占用16B,当一个磁盘块大小是1KB,则一个磁盘块能存放 1KB / 16B = 64个 FCB,如果一个文件中有640个目录项,则需要640 / 64 = 10个磁盘块存储,按文件名顺序查找,平均查找320次,因为每一个盘块能存放64个FCB,因此平均情况下,只需要进行5次磁盘I/O就能找到所需要检索的文件目录项。

显然,引入索引结点能大大提升文件检索速度

3 补充

3.1 为什么一个FCB中需要记录该目录文件在磁盘中的位置?

答:因为一个目录文件中也存放了多个子目录文件(也称为子FCB),而一个正常的目录项中不包含子FCB(因为一个目录文件中可能包含了几十个FCB,那样的话就不利于顺序读取),而是把他隐藏起来放到了磁盘中,然后在FCB中添加一个指向该文件位置的指针。

3.2 关于FCB索引结点的特别说明

当找到文件名对应的目录项时,才需要将索引结点调入内存,索引结点中记录了文件的各种信息,包括文件在外存中的存放位置,根据“存放位置”即可找到文件。
存放在外存中的索引结点称为“磁盘索引结点”,当索引结点放入内存后称为“内存索引结点”。
相比之下内存索引结点中需要增加一些信息,比如:文件是否被修改、此时有几个进程正在访问该文件等。

  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值