一、文件系统实例(FAT)
1.1 Windows的FAT16文件系统
- 簇(块)大小:
1、2、4、8、16、32
或64
扇区 - 文件系统的数据记录在“引导扇区”中
- 文件分配表
FAT
的作用
描述簇的分配状态、标注下一簇的簇号等 -
FAT
表项:2
字节(16
位) - 目录项:
32
字节 -
根目录大小固定
1.2 FAT文件系统:主引导记录(Main Boot Record,MBR)
-
主引导记录
一般放在零号扇区中
1.3 FAT文件系统:分区引导扇区(Dos Boot Record,DBR)
说明:这里是以
FAT32
为例。
1.4 引导扇区(BIOS参数块)
说明:这里我们看
BIOS
参数块,也是以FAT32
为例。
1.5 引导扇区(扩展BIOS参数块EBPB)
1.6 文件分配表FAT
- 可以把文件分配表看成是一个整数数组,每个整数代表磁盘分区的一个簇号
- 状态
未使用、坏簇、系统保留、被文件占用(下一簇簇号)、最后一簇(0xFFFF
) - 簇号从
0
开始编号,簇0
和簇1
是保留的。
1.7 FAT16目录项
说明:在前面讲过,
UNIX
系统中i
节点加上目录项就是FCB
,而在FAT
文件系统中FCB
就等于目录项。32
个字节没有用完,没用完的保留。
1.8 FAT32文件系统
- 在
FAT32
中,根目录区(BOOT
区)不是固定区域、固定大小,而是数据区的一部分,采用与子目录文件相同的管理方式 - 目录项仍占
32
字节,但分为各种类型(包括:“.”
目录项、“..”
目录项、短文件名目录项、长文件名目录项、卷标项(根目录)、已删除目录项(第一字节为0xE5
)等) - 支持长文件名格式
- 支持
Unicode
-
不支持高级容错特性,不具有内部安全特性
1.9 FAT32目录项
说明:这是一个基本的目录项。
1.10 一般长文件名的实现方式
说明:左边的实现是目录项的长度不固定。第一个字段给出目录项的长度,然后把固定长度的属性记录在其后,再才是文件名,因为文件名的长度是不一样的,留出足够的空间给文件名。缺点就是一个文件删除时,就留出了一块空间,而这个空间可能不能放下其他文件,这样就会产生碎片。右边的实现是由于文件名的长度不固定,所以我们希望每个目录项的大小是固定的,其中包含了一个指向文件名起始地址的指针,然后是文件的相关属性,所有的文件名都存放在另一个区域(堆)。
1.11 FAT32中长文件名目录项格式
说明:其中有三处地方分别记录了文件名。前
5
个字符(采用的是Unicode
编码,则两个字节代表一个字符)保存文件名的前5
个字符,于是一共可以保存13
个字符。如果一个长文件名目录项不够,则需要用第二个。在第一个字段中第6
位来记录是否是最后一个目录项。下面看一个例子,文件名为The quick brown.fox
,采用Unicode
编码。说明:其实这样一个文件占用了三个目录项。第一个目录项就是短文件名目录项,后面的两个目录项主要保存文件名。再看一个更长的文件名文件例子:
说明:这里的文件名更长,需要占用五个目录项。
二、文件操作的实现
这里主要是以UNIX
操作系统为例。
2.1 文件操作的实现
-
创建文件
建立系统与文件的联系,实质是建立文件的FCB
- 在目录中为新文件建立一个目录项(在
UNIX
中还需要i
节点),根据提供的参数及需要填写相关内容 - 分配必要的存储空间
- 在目录中为新文件建立一个目录项(在
打开文件
根据文件名目录中检索,并将该文件的目录项读入内存,建立相应的数据结构,为后续的文件操作做好准备。打开文件后一般会返回一个值,这个值一般叫文件描述符或文件句柄,之后的操作是通过文件描述符来进行的。
2.2 文件操作:建立文件
create
(文件名,访问权限)
- 1、检查参数的合法性
例如:文件名是否符合命名规则;有无重名文件,合法则进行下一步,否则报错返回。 - 2、申请空闲目录项,并填写相关内容
- 3、为文件申请磁盘块
- 4、返回
2.3 文件操作:打开文件
为文件读写做准备:给出文件路径名,获得文件句柄(file handler
)或文件描述符(file descripter
),需将该文件的目录项读到内存fd = open
(文件路径名,打开方式)
- 1、根据文件路径名查目录,找到目录项(或
i
节点号) - 2、根据文件号查系统打开文件表,看文件是否已被打开,如果是,则共享计数加一,否则,将目录项(或i节点)等信息填入系统打开文件表空表项,共享计数置为一。
- 3、根据打开方式、共享说明和用户身份检查访问合法性
- 4、在用户打开文件表中获取一空表项,填写打开方式等,并指向系统打开文件表对应表项,返回信息:
fd
(文件描述符,是一个非负整数,用于以后读写文件)
2.4 文件操作:指针定位
seek
(fd
, 新指针位置):系统为每个进程打开的每个文件维护一个读写指针,即相对于文件开头的偏移地址(读写指针指向每次文件读写的开始位置 ,在每次读写完成后,读写指针按照读写的数据量自动后移相应的数值)
- 1、由
fd
查用户打开文件表,找到对应的表项 - 2、将用户打开文件表中文件读写指针位置设为新指针的位置,供后继读写命令存取该指针处文件内容。
2.5 文件操作:读文件
read
(文件描述符,读指针,要读的长度,内存目的地址)
- 1、根据打开文件时得到的文件描述符,找到相应的文件控制块(目录项),确定读操作的合法性,读操作合法则进行下一步,否则出错处理。
- 2、将文件的逻辑块号转换为物理块号。根据参数中的读指针、长度与文件控制块中的信息,确定块号、块数、块内位移
- 3、申请缓冲区
- 4、启动磁盘
I/O
操作,把磁盘块中的信息读入缓冲区,再送到指定的内存区(多次读盘) - 5、反复执行
3、4
直至读出所需数量的数据或读至文件尾
三、文件系统的管理
3.1 文件系统的可靠性
可靠性:抵御和预防各种物理性破坏和人为性破坏的能力
- 块坏问题
- 备份
通过转储操作,形成文件或文件系统的多个副本。
3.2 文件系统备份
- 全量转储
定期将所有文件拷贝到后援存储器 - 增量转储
只转储修改过的文件,即两次备份之间的修改。减少系统开销。 - 物理转储
从磁盘第零块开始,将所有磁盘块按序输出到磁带 - 逻辑转储
从一个或几个指定目录开始,递归地转储子给定日期后所有更改的文件和目录
3.3 文件系统一致性
问题的产生:
磁盘块-->内存-->写回磁盘块
若在写回之前,系统崩溃,则文件系统出现不一致解决方案
设计一个使用程序,当系统再次启动时,运行该程序,检查磁盘块和目录系统
3.4 磁盘块的一致性检查
说明::一致性检查时,检查所有的文件和空闲块,检查完之后可能会出现四种结果。第一种是一个一致性的结果,即某个磁盘块要么分配给了某个文件,要么在空闲块中。第二种结果是在空闲块中找不到,但是也没有分配给某个文件,于是我们通过在空闲块表中将磁块标记为一来解决。第三种结果是某个磁盘块在空闲块表中出现了两次,同样是不合理的,对这一位进行修改。最后一种结果是在两个文件中出现,这种情况较为复杂,我们应该在空闲块中找一个,然后将其中一个磁盘块内容拷贝到这个空闲块中,然后将使用块表中的这一位减一。
3.5 文件系统的写入策略
对某些文件做出了修改,那么什么时候将修改后的内容写入到文件中。这里需要考虑文件系统一致性和速度。下面有几种写入策略
- 通写(
write-through
)
内存中的修改立即写到磁盘。缺点是速度性能差,如FAT
文件系统。 - 延迟写(
lazy-write
)
利用回写(write back
)缓存的方法得到高速。其缺点就是可恢复性较差,可能会导致信息丢失 - 可恢复写(
tansaction log
)
采用事务日志来实现文件系统的写入,既考虑安全性,又考虑速度性能,如NTFS