一、文件的数据结构
文件目录项/FCB
一个FCB就是一个文件目录项
FCB的有序集合称为"文件目录"
FCB实现了文件名和文件之间的映射。使用户(用户程序)可以实现“按名存取”。
FCB主要记录⽤来记录⽂件的名字,索引节点指针以及其他⽬录项的层级关联关系
索引节点 (简称i结点 inode)
索引节点是⽤来记录⽂件的元信息,是⽂件的唯⼀表示
将⽂件描述信息从⽬录项中分离,即应⽤了索引节点的⽅法:
在检索目录时,文件的其他描述信息不会用到,也不需要调入内存,只会用到文件名。因此UNIX系统采用了文件名与文件描述信息分开的方式,文件描述信息就是索引节点
索引结点分为了
1、磁盘索引结点
指存放在磁盘上的索引节点,每个文件有一个唯一的磁盘索引节点
2、内存索引结点
指存放在内存中的索引节点,⽂件打开后,将磁盘索引节点复制到内存中
二、文件操作
⽂件打开就是调⽤open,根据⽂件名搜索⽬录,将指明⽂件的属性(包括该⽂件在外存上的物理地址)从外存复制到内存打开⽂件表的⼀个表⽬中,并将该表⽬的编号(也叫引)返回给⽤户
打开⽂件操作的主要⼯作就是把指定⽂件的⽬录复制到内存指定的区域
注:open操作会把⽂件的FCB调⼊内存,⽽不会把⽂件内容读到内存,只有进程希望获取⽂件内容时才会读⼊⽂件内容
三、打开文件表
打开文件表有两种,一种是系统的打开文件表,一种是进程的打开文件表
系统文件打开表设有计数器,每当一个进程打开一个文件时,其进程打开文件表就会包含一个指向文件打开表的指针
四、文件的逻辑结构
什么是文件的逻辑结构呢?我们在用电脑的时候无时不刻不再接触文件,比如一个word文档,一个txt文档,或者一张图片,或者我们C语言写的一句printf(f所指的就是文件)。甚至我们用的键盘,鼠标都被操作系统当作文件处理。
但是我们看到的这些一切都是逻辑结构的文件。逻辑结构的文件有两种分类。记录型文件和流式文件。
无结构文件
文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows操作系统中的.txt文件。
顺序文件
记录一般是定长
可以用 记录长度*记录序列的方式来查询
只适合读写一大批记录
1、串结构
只能顺序查找,费时
2、顺序结构
文件中的所有记录按关键字顺序排列,可以用折半查找提高检索效率
顺序结构可以用于图像文件、音频文件、视频文件 (---by_chatgpt)
索引文件
用来解决可变长记录的文件
使用索引表处理可变长记录的文件,每个索引号对应一个可变记录项,并在索引表里存储其长度
每个索引项是定长的,故其相当于一个定长记录的顺序文件,这样就把对变长顺序文件的检索变成了定长记录索引文件的检索,可以使用公式:索引项长度*记录序列 加快检索速度
缺点是索引表增加了存储空间
索引顺序文件
索引文件与顺序文件的结合
索引表中只包含关键字和指针两个数据项,关键字递增排列,主文件中的记录分组排列,组内关键字可无序,组间必须有序
查找一条记录时,查找一条记录时,首先通过索引表找到其所在的组,然后在该组中使用顺序查找,就能很快地找到记录。
(优点类似于数据结构的分块查找)
关系型数据库文件,搜索引擎索引文件就是使用的索引顺序文件(by_chatgpt)
散列文件/直接文件
给定记录的键值或通过散列函数转换的键值直接决定记录的物理地址。
这种映射结构不同于顺序文件或索引文件,没有顺序的特性。
散列文件有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同。
五、文件的物理结构
连续分配
顺序存取速度快,当文件是定长时可以根据文件起始地址及记录长度进行随机访问
要求连续的存储空间,会产生外部碎片,不利于文件的动态扩充,因此只适合长度固定的文件
链接分配
1、隐式链接
目录项中含有文件第一块的指针和最后一块的指针。
每个文件对应一个磁盘块的链表;
磁盘块分布在磁盘的任何地方,除最后一个盘块外,每个盘块都含有指向文件下一个盘块的指针,这些指针对用户是透明的。
优点:
无外部碎片,可以动态分配盘块
缺点:
(1)、只适合顺序访问,若要访问文件的第i个盘块,则只能从第1个盘块开始通过盘块指针顺序查找到第i块,随机访问效率很低。
(2)、隐式链接的稳定性也是一个问题,系统在运行过程中由于软件或硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。
可以将几个盘块组成簇(cluster),按簇而不按块来分配,可以成倍地减少查找时间。指针所占的磁盘空间比例也要小得多。
这种方法的代价是增加了内部碎片。簇可以改善许多算法的磁盘访问时间,因此应用于大多数操作系统。
2、显示链接
显式链接是指把用于链接文件各物理块的指针,从每个物理块的末尾中提取出来,显式地存放在内存的一张链接表中。
该表在整个磁盘中仅设置一张,称为文件分配表(File Allocation Table,FAT)。
FAT表在系统启动时就会被读入内存,因此查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且明显减少了访问磁盘的次数。
索引分配
隐式链接不能支持直接访问,又FAT需要占用较大内存,由此,提出了索引分配
索引分配的思想是让每一个文件都具有索引表,这样就可以某些必要的索引表调入内存,而不是把整个FAT调入内存
可以设置多级索引结构 m级需访问磁盘m+1次
混合索引分配
为了能够较全面地照顾到小型、中型、大型和特大型文件,可采用混合索引分配方式。
文件的物理结构影响着逻辑结构
比如一个文件的逻辑结构是顺序结构,而物理结构是隐式链接结构的文件,即使理论上可以很快找出某条记录的地址,而实际找时仍然需要在磁盘上一块一块地找。
六、错题4.1
UNX操作系统中,所有设备都被视为特殊的文件,因为UNIX操作系统控制和访问外部设备的方式和访问一个文件的方式是相同的。
一个文件对应一个FCB,而一个文件目录项就是一个FCB
T16
16.有一个顺序文件含有10000条记录,平均查找的记录数为5000个,采用索引顺序文件
结构,则最好情况下平均只需查找(C)次记录。
A.500
B.10000
C.101
D.100
(1+50)/2 + (1+50)/2
T23
修改后写回还需要启动磁盘一次
七、文件目录结构
八、文件共享---硬链接与软链接
https://www.cnblogs.com/lordtianqiyi/p/17545838.html
用户A创建文件F,用户B硬链接F,在硬链接下,用户A不能删除文件F,只能将指针计数-1并删除自己目录的相应目录项。否则若A可以删除文件F,在B用户写文件时删除文件会造成指针悬空
硬链接下用户AB都拥有对F文件索引节点的指针
符号链接下只有用户A有对F文件索引节点的指针;软链接就是把到达共享文件的路径记录下来,当要访问文件时,根据路径寻找文件。
可见,硬链接的查找速度要比软链接的快。
九、错题4.2
06.下面的说法中,错误的是(D)。
I一个文件在同一系统中、不同的存储介质上的复制文件,应采用同一种物理结构
Ⅱ.对一个文件的访问,常由用户访问权限和用户优先级共同限制
III.文件系统采用树形目录结构后,对于不同用户的文件,其文件名应该不同
IV.为防止系统故障造成系统内文件受损,常采用存取控制矩阵方法保护文件
A.II
B.I、III
C.I、II、IV
D.全选
对于I:
文件在磁带上通常采用连续存放方法,在硬盘上通常不采用连续存放方法,在内存上采用随
机存放方法。
对于II:
对文件的访问控制,常由用户访问权限和文件属性共同限制
对于IV:
防止文件受损常采用备份的方法,而存取控制矩阵方法用于多用户之间的存取权限保护,IV错误。
访问控制矩阵
貌似和前面学的访问控制列表很像?
T8
T10
10.【2020统考真题】若多个进程共享同一个文件F,则下列叙述中,正确的是(B)。
A.各进程只能用“读”方式打开文件F
B.在系统打开文件表中仅有一个表项包含F的属性
C.各进程的用户打开文件表中关于℉的表项内容相同
D.进程关闭F时,系统删除F在系统打开文件表中的表项
C选项:
用户进程的打开文件表关于同一文件不一定相同,比如读写指针就不一定一致
补充:每个打开文件都具有的关联信息:
1、文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
2、文件打开计数。
3、文件磁盘位置。
4、访问权限
十、文件系统
文件系统结构
1、逻辑文件系统
⽤于管理元数据信息(包括⽂件系统的所有结构,不包括⽂件内容)
管理⽬录结构
通过FCB维护⽂件结构
负责⽂件保护
2、基本文件系统
组织⽂件及其逻辑块和物理块
可以将逻辑地址转换为物理地址
有空闲空间管理器,以跟踪未分配的块,根据需要提供给⽂件组织模块
3、文件组织模块
向对应的设备驱动程序发送通⽤命令,以读取和写⼊磁盘的物理块
管理内存缓冲区,保存各种⽂件系统,⽬录和数据块的缓冲
4、I/O控制
设备驱动程序: 将输⼊的命令翻译成底层硬件的特定指令
中断处理程序: 利⽤指令使IO设备与系统交互
文件系统在磁盘的布局
文件系统存放在磁盘上,多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统
1、超级块: 包含文件系统的所有关键信息,在计算机启动时,或者在该文件系统首次使用时,超级块会被载入内存。
超级块中的典型信息包括分区的块的数量、块的大小、空闲块的数量和指针、空闲的FCB数量和FCB指针等。
2、数据块: 包含⽂件的有⽤数据
3、inode 列表: 包含了块组中所有的 inode,inode ⽤于保存⽂件系统中与各个⽂件和⽬录相关的所有元数据
4、MBR
文件系统在内存中的结构
内存中的信息⽤于管理⽂件系统并通过缓存来提⾼信息
这些结构有以下类型:
1、内存中的安装表
2、内存中的⽬录结构的缓存包含最近访问⽬录的信息
3、整个系统的打开⽂件表
4、每个进程的打开⽂件表
十一、外存空闲空间管理
1、RAID(独立磁盘冗余队列)是指将多个独立的物理磁盘组成一个独立的逻辑盘,可以提高存储性能和安全性
2、卷
一个磁盘可以有多个分区,每个分区都有独立的文件系统,包含文件系统的分区称为卷
空闲表法
为所有空闲空间建⽴⼀张表
表内容包括空闲区的第⼀个块号和该空闲区的块个数,按盘块号递增排序
空闲盘区的分配类似于内存的分配算法,采用首次适应算法和最佳适应算法
空闲链表法
1、空闲盘块链
将磁盘上的所有空闲空间以盘块为单位拉成一条链。
2、空闲盘区链
将磁盘上的所有空闲空间以盘块为单位拉成一条链
每⼀个空闲块⾥有⼀个指针指向下⼀个空闲块
可以动态分配,采用首次适应算法
位视图法
位图是利⽤⼆进制的⼀位来表示磁盘中⼀个盘块的使⽤情况
磁盘上所有的盘块都有⼀个⼆进制位与之对应
成组链接法
用来存放一组空闲盘块号(空闲盘块的块号)的盘块称为成组链块。
成组链接法大抵是空闲盘块链的进化版
=>
=>
系统只需要保持第一个成组链块的指针即可
而第一个成组链块一般是超级块,超级块会被预先读入内存
分配:
当超级块的N减完后,会把其指向的下一个成组链块(图中的2)的信息复制到超级块中, 然后把2作为普通盘块分配给文件用
回收的话也是同理
十二、虚拟⽂件系统VFS
目的: 为用户程序提供了文件系统操作的统一接口,屏蔽了不同文件系统差异和操作细节
特性: 能提高系统性能,不是一种实际的文件系统,只存在于内存中,不存在与任何外存空间中,在系统启动时建立,在系统关闭时消亡
VFS的数据结构:
超级块对象(一个超级块对应一个文件系统),索引节点对象,目录项对象,文件对象
VFS向下屏蔽了各种文件系统的差异,向上提供了同一的文件调用函数(open、read、write)
十三、挂载
指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件。
文件系统在进程使用前必须先挂载
在windows上,磁盘挂载是这样的:先对磁盘分区、格式化系统、添加盘符(如D盘)
这之后,用户访问D盘实际上就是在访问磁盘
在linux上,磁盘挂载是这样的: 先对磁盘分区,格式化,挂载,比如挂载到mnt目录,那么接下来对mnt目录的访问就是对磁盘的访问
sudo fdisk -l // 查询 U盘的设备号
sudo mount /dev/sdb1 ./mnt_test // 把U盘挂载到 mnt_test的目录下
之后在mnt目录下创建文件,即相当于在U盘创建文件,即实现了 "访问此目录就等同于访问设备文件"
十四、错题4.3
FAT可以用于文件系统管理空闲磁盘块
FAT的表项与物理磁盘块一一对应,并且可以用一个特殊数字-1表示文件的最后一块,用-2表示这个磁盘块是空闲的