文件控制块(FCB,File Control Block)
linux文件系统使用目录来组织文件。目录也被组织成文件存放在磁盘上,成为目录文件。每个文件都在它属于的目录文件中登记一个
文件目录项,这个文件目录项就是
文件控制块。下图就是一个目录文件的物理结构示意图。遍历该结构,就可以找到该目录下的所有文件的
文件控制块。
文件控制块包含了文件除数据以外的控制信息,例如有关文件存取控制的信息(文件名、存取权限等)、有关文件逻辑结构和物理结构的信息、有关文件管理的信息(创建时间等)。因此,一个文件控制块的存储空间还是很大的。如果将文件控制块都直接保存在目录文件中,那么目录文件将会占据较多的物理块。遍历目录时就会读取多个物理快,从而降低了检索文件的速度。为了解决这个问题,linux引入了名为
索引节点的数据结构。
索引节点(inode)
为了减少目录文件所占的物理块,linux将
文件控制块一分为二,第一部分是文件名,第二部分是其他信息。其他信息被组织成定长的数据结构,称为
索引节点。每个
索引节点都有一个编号,称为
索引号。每个
文件目录项只保存文件名及文件名对应的
索引号。这样
文件目录项中只剩下14字节的文件名和2字节的
索引号,一个512字节的物理块就可以保存32个
文件目录项。也就是说,一个包含32个文件或子目录的目录,只占据1个物理块。可见,目录文件占据的物理块被大大减少。下图是使用了索引节点的物理文件的物理结构示意图。
文件名1
|
索引号1
|
文件名2
|
索引号2
|
...
|
...
|
文件名n
|
索引号n
|
提高文件访问速度,关键在于减少访问磁盘的次数,即减少访问读取物理块的数量。
外存索引节点
索引节点被保存在外存中,称为外存索引节点。
内存索引节点、内存索引节点表
索引节点存放在外存中。对某个文件的访问,会经常使用到它的
索引节点,这样就会频繁地在内存和外存之间来回拷贝
索引节点,效率较低。为了避免这个问题,linux在系统主存中开辟了一张
内存索引节点表,该表共有100个表项,每个表项就是一个索引节点,称为
内存索引节点。需要使用文件信息时,先到
内存索引节点表中查找,如果找到则直接使用,否则将外存中的索引节点拷贝到
内存索引节点表中,并使用之。使用内存索引节点表,不但能够加快文件访问速度,而且便于实现文件共享,这点在后面会提到。下图是内存索引节点表的示意图
内存索引节点表又被称为
活动索引节点表,
内存索引节点又被称为
活动索引节点。
系统打开文件表
用户使用文件系统提供的API,按名访问文件,而不是直接访问
索引节点。访问索引节点是文件系统的事情。文件系统必须根据文件名,在目录中查找到该文件的
索引号,找到
索引号后才能从
内存索引节点表中查找索引节点。虽然
索引节点可能被缓存在
内存索引节点表中,但是在目录中查找
索引号需要访问磁盘,效率是低下的。
为了解决这个问题,文件系统在内存中建立了一张
系统打开文件表,该表共有100个表项。每个表项中存放了一个已打开的文件的
索引号和其它信息。在文件被打开的时候,文件系统会在
系统打开文件表中登记相应的表项。如果以后需要访问该文件,文件系统会首先在
系统打开文件表中查找该文件的
索引号。下图是
系统打开文件表的示意图。
索引号1
|
其它信息1
|
索引号2
|
其它信息2
|
...
|
...
|
索引号n
|
其它信息n
|
系统打开文件表不但能提高文件访问效率,还便于实现文件共享,这点在后面会提到。
用户打开文件表
每个进程拥有一张
用户打开文件表,该表有15个表项。它的表项类似于指针,指向
系统打开文件表的表项。下图是用户打开文件表的示意图。
文件号1
|
指针1
|
文件号2
|
指针2
|
...
|
...
|
文件号n
|
指针n
|
这里没有使用文件名来标识一个文件,而是使用了文件号。
用户打开文件表便于实现文件共享,这点在后面提到。
索引表
那么,索引节点是怎么描述文件数据的物理存储的呢?我们知道,文件数据存放在一个或多个物理块中,索引节点必须维护这些物理块的块号,才能真正找到文件数据。linux使用
索引表来管理存放文件数据的物理块。
索引表的每个表项都是一个物理块号。遍历
索引表,就可以访问存放文件数据的所有物理块。那么,索引表是如何存放的呢?
索引表同文件数据一样,也存放在物理块中。
索引节点中包含了
索引表所在物理块的块号,因此通过
索引节点就可以访问到
索引表,从而访问到文件数据。
如果文件很大,文件数据占用的物理块可能很多,索引表也会很大,那么,如果一个物理块不足以存放索引表怎么办?linux采用了多重索引表。
多重索引表是这样的。
- 每个文件的索引表规定为13个索引项,每个项4个字节,登记一个物理块。
- 索引项0-9中登记的是存放文件数据的物理块号。
- 索引项10登记的是存放一张二级索引表的物理块号。二级索引表拥有128个索引项,每个索引项登记的是存放文件数据的物理块号。
- 索引项11登记的是存放一张三级索引表的物理块号。三级索引表拥有128个索引项,每个索引项登记的是存放一张二级索引表的物理块号。二级索引表的内容同上。
- 索引项11登记的是存放一张四级索引表的物理块号。四级索引表拥有128个索引项,每个索引项登记的是存放一张三级索引表的物理块号。三级索引表的内容同上。
根据多重索引表的结构,我们可以计算出linux支持的最大文件体积。(10+128+128*128+128*128*128)*512字节 约等于128*128*128*512,即2的30次方,大约1G字节。
文件系统在外存上的组织安排。
磁盘被分成几个分区,每个分区称为一个文件卷。文件系统管理一个文件卷。文件卷被分成若干柱面、磁道和扇区。每个扇区为512字节,又称为物理块。0号物理块用于系统引导,1号物理块为超级块(super block),用于记录文件系统管理所需的信息。2-k块,用于存放
外存索引节点表,k+1-n块,用于存在文件数据,n+1块的用途还不清楚。
文件的共享
linux上的文件共享分为两种:静态共享和动态共享。静态共享是指多个文件对应同一个物理存储。这可以通过文件连接和符号连接来实现。动态共享,是指不同进程并发地访问同一文件。动态共享是运行时的概念,进程结束了,共享关系也就消失了。
文件连接和普通文件一样被登记在目录文件中,他们的区别在于,文件连接会登记被链接文件的索引号,而符号连接只是登记被链接的文件的路径。
下面重点看看动态共享是如何实现的。
动态共享又分为两种情况:共享读写指针和不共享读写指针。如果两个进程合作访问一个文件,那就需要共享读写指针,这种情况常见于父子进程中。如果两个进程需要独立地、互不影响地访问一个文件,那就需要各自拥有独立的读写指针。
文件的读写指针是保存在系统打开文件表项中的。两个进程如果需要共享某个文件的读写指针,那么该文件在它们的用户打开文件表中的表项,应该都指向系统打开文件表的同一表项。 相反,则指向系统打开文件表的两个不同表项,只不过这两个表项都指向同一个索引节点。
系统打开文件表的表项中除了含有读写指针f_offset,还有文件的访问计数f_count和内存索引节点的指针f_inode。f_count指出使用同一系统打开文件表项的进程数,注意不是使用同一文件的进程数。f_count是系统打开文件表项能够释放的标志。
分享到:
相关推荐
在Linux操作系统中,文件系统是组织和存储数据的基础架构,它负责管理磁盘上的文件和目录,使得用户和进程能够高效地访问、...希望《Linux文件系统结构分析》文档能提供更深入的探讨,帮助读者进一步理解这一核心概念。
Linux 文件系统源码是了解操作系统核心机制的重要组成部分,特别是对于那些想要深入理解Linux内核以及文件系统工作原理的开发者和研究者来说。在这个压缩包中,包含了一系列的源码文件,涉及到了多种不同的文件系统...
### Linux文件系统浅谈 #### 文件系统概述 文件系统作为操作系统的重要组成部分,承载着管理和组织存储设备上的数据的责任。在Linux环境下,用户可以通过文件系统进行文件的创建、删除、读写以及目录的操作等一...
【I节点】是Linux文件系统中的一个重要概念,它在文件系统中存储了关于文件的所有元数据,包括文件的大小、创建时间、修改时间、访问权限、所有者信息、链接数等。I节点是Linux实现文件系统的核心机制之一,用于快速...
Linux文件系统的写放大作用是指在对文件进行写入操作时,由于文件系统内部的元数据管理、日志记录等因素,实际写入磁盘的数据量往往大于用户实际写入的文件内容,这会增加存储设备的写操作次数,尤其是对寿命有限的...
"嵌入式Linux系统中Overlay文件系统的实现" 概述: 嵌入式Linux系统中Overlay文件系统的实现是指在嵌入式Linux系统中引入Overlay文件系统,以满足对系统软件的升级和对系统程序的维护需求。Overlay文件系统是指在...
理解ELF文件对理解一些重要的系统概念非常有帮助,例如程序的编译和链接、程序的加载和运行等。 ELF文件主要有三种类型:可重定位文件、可执行文件和共享目标文件。可重定位文件包含代码和数据,可以与其他ELF文件...
在深入探讨Linux根文件系统的挂载过程之前,我们需要先明确几个概念。Linux操作系统启动时,内核需要加载并初始化一系列组件和服务,其中最关键的一个步骤就是挂载根文件系统(Root File System, 简称 RootFS)。根...
本项目"模拟Linux文件系统含源码及报告"旨在深入理解和实现一个类似Linux的命令行文件系统,这对于学习操作系统的原理和实践编程技能具有极大的价值。 在描述中提到的“高度模仿Linux命令行”,意味着这个项目可能...
在嵌入式Linux系统中,根文件系统是其中一个重要组件。随着数字终端和信息家电的普及,嵌入式Linux得到了广泛的应用。然而,传统的嵌入式Linux根文件系统多是只读的,這对于一些需要频繁安装软件和升级系统的设备来...
Linux FS是HDFS的底层文件系统,这意味着HDFS的每次读写操作都是通过Linux文件系统的读写操作来完成的。 4. 文件系统的比较:HDFS与Linux FS在目录树、数据块等结构上的不同,以及它们在组织文件方式上的差异。具体...
Linux内核中的文件系统操作和设备操作涉及到许多核心概念,如VFS(Virtual File System)、inode、dentry等。在Linux内核中,文件系统和设备驱动都通过VFS进行抽象,提供统一的操作接口。接下来,我们将逐一解答给定...
总的来说,虚拟文件系统 (VFS) 是 Linux 内核中的一项关键技术,它不仅为应用程序提供了统一的文件系统接口,还支持了多种文件系统的共存以及跨文件系统的文件操作。通过 VFS,Linux 实现了“一切皆文件”的哲学,并...
本文将深入分析Linux文件系统实现的一些关键概念和技术,特别是inode和super_block的角色。 首先,inode(索引节点)是文件系统中每个文件或目录的关键数据结构,它包含了关于文件的各种元数据,如文件的所有者...
在Linux操作系统中,/proc文件系统是一个非常特殊的虚拟文件系统,它并不占用磁盘空间,而是作为内核与用户空间之间的一个接口,用于提供运行时的系统信息。这个特殊的文件系统允许用户通过读取其中的文件来获取关于...
Linux 文件系统是Linux操作系统的核心组成部分,它负责组织和管理存储设备上的数据,为用户提供一致的接口来访问和操作...通过对这些核心组件的源代码分析,我们可以更深入地理解Linux文件系统的工作原理和实现细节。