热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

首先弄清楚什么是索引结点(inode)?一般来说,面试不会问inode。但是inode是一个重要概念,是理解UnixLinux文件系统和
首先弄清楚什么是索引结点(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索引结点的特别说明

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


推荐阅读
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 【重识云原生】第四章云网络4.8.3.2节——Open vSwitch工作原理详解
    2OpenvSwitch架构2.1OVS整体架构ovs-vswitchd:守护程序,实现交换功能,和Linux内核兼容模块一起,实现基于流的交换flow-basedswitchin ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • 本文介绍了在Linux中执行.sh脚本时出现/bin/sh^M: bad interpreter: No such file or directory异常的原因分析,并提供了两种解决方法:在Windows下进行编码格式转换,或在Linux中修改文件格式和执行权限。具体操作步骤也在摘要中给出。 ... [详细]
  • 安装oracle软件1创建用户组、用户和目录bjdb节点下:[rootnode1]#groupadd-g200oinstall[rootnode1]#groupad ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • 进入配置文件目录:[rootlinuxidcresin-4.0.]#cdusrlocalresinconf查看都有哪些配置文件:[rootlinuxid ... [详细]
  • UNIX高级环境编程 第11、12章 线程及其属性
    第11章线程11.2线程概念线程资源:线程ID,一组寄存器,栈,调度优先级和策略,信号屏蔽字,e ... [详细]
author-avatar
蓝染
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有