14、文件系统2(操作系统笔记)

一、文件系统实例(FAT)

1.1 Windows的FAT16文件系统

  • 簇(块)大小:1、2、4、8、16、3264扇区
  • 文件系统的数据记录在“引导扇区”中
  • 文件分配表FAT的作用
    描述簇的分配状态、标注下一簇的簇号等
  • FAT表项:2字节(16位)
  • 目录项:32字节
  • 根目录大小固定


    1

1.2 FAT文件系统:主引导记录(Main Boot Record,MBR)

  • 主引导记录
    一般放在零号扇区中


    14、文件系统2(操作系统笔记)_第1张图片
    2

1.3 FAT文件系统:分区引导扇区(Dos Boot Record,DBR)

14、文件系统2(操作系统笔记)_第2张图片
3

说明:这里是以 FAT32为例。

1.4 引导扇区(BIOS参数块)

14、文件系统2(操作系统笔记)_第3张图片
4

说明:这里我们看 BIOS参数块,也是以 FAT32为例。

1.5 引导扇区(扩展BIOS参数块EBPB)

14、文件系统2(操作系统笔记)_第4张图片
5

1.6 文件分配表FAT

  • 可以把文件分配表看成是一个整数数组,每个整数代表磁盘分区的一个簇号
  • 状态
    未使用、坏簇、系统保留、被文件占用(下一簇簇号)、最后一簇(0xFFFF
  • 簇号从0开始编号,簇0和簇1是保留的。
    14、文件系统2(操作系统笔记)_第5张图片
    6

1.7 FAT16目录项

14、文件系统2(操作系统笔记)_第6张图片
7

说明:在前面讲过, UNIX系统中 i节点加上目录项就是 FCB,而在 FAT文件系统中 FCB就等于目录项。 32个字节没有用完,没用完的保留。

1.8 FAT32文件系统

  • FAT32中,根目录区(BOOT区)不是固定区域、固定大小,而是数据区的一部分,采用与子目录文件相同的管理方式
  • 目录项仍占32字节,但分为各种类型(包括:“.”目录项、“..”目录项、短文件名目录项、长文件名目录项、卷标项(根目录)、已删除目录项(第一字节为0xE5)等)
  • 支持长文件名格式
  • 支持Unicode
  • 不支持高级容错特性,不具有内部安全特性


    8

1.9 FAT32目录项

14、文件系统2(操作系统笔记)_第7张图片
9

说明:这是一个基本的目录项。

1.10 一般长文件名的实现方式

14、文件系统2(操作系统笔记)_第8张图片
10

说明:左边的实现是目录项的长度不固定。第一个字段给出目录项的长度,然后把固定长度的属性记录在其后,再才是文件名,因为文件名的长度是不一样的,留出足够的空间给文件名。缺点就是一个文件删除时,就留出了一块空间,而这个空间可能不能放下其他文件,这样就会产生碎片。右边的实现是由于文件名的长度不固定,所以我们希望每个目录项的大小是固定的,其中包含了一个指向文件名起始地址的指针,然后是文件的相关属性,所有的文件名都存放在另一个区域(堆)。

1.11 FAT32中长文件名目录项格式

14、文件系统2(操作系统笔记)_第9张图片
11

说明:其中有三处地方分别记录了文件名。前 5个字符(采用的是 Unicode编码,则两个字节代表一个字符)保存文件名的前 5个字符,于是一共可以保存 13个字符。如果一个长文件名目录项不够,则需要用第二个。在第一个字段中第 6位来记录是否是最后一个目录项。下面看一个例子,文件名为 The quick brown.fox,采用 Unicode编码。
14、文件系统2(操作系统笔记)_第10张图片
12

说明:其实这样一个文件占用了三个目录项。第一个目录项就是短文件名目录项,后面的两个目录项主要保存文件名。再看一个更长的文件名文件例子:
14、文件系统2(操作系统笔记)_第11张图片
13

说明:这里的文件名更长,需要占用五个目录项。

二、文件操作的实现

这里主要是以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 文件操作:指针定位

seekfd, 新指针位置):系统为每个进程打开的每个文件维护一个读写指针,即相对于文件开头的偏移地址(读写指针指向每次文件读写的开始位置 ,在每次读写完成后,读写指针按照读写的数据量自动后移相应的数值)

  • 1、由fd查用户打开文件表,找到对应的表项
  • 2、将用户打开文件表中文件读写指针位置设为新指针的位置,供后继读写命令存取该指针处文件内容。

2.5 文件操作:读文件

read(文件描述符,读指针,要读的长度,内存目的地址)

  • 1、根据打开文件时得到的文件描述符,找到相应的文件控制块(目录项),确定读操作的合法性,读操作合法则进行下一步,否则出错处理。
  • 2、将文件的逻辑块号转换为物理块号。根据参数中的读指针、长度与文件控制块中的信息,确定块号、块数、块内位移
  • 3、申请缓冲区
  • 4、启动磁盘I/O操作,把磁盘块中的信息读入缓冲区,再送到指定的内存区(多次读盘)
  • 5、反复执行3、4直至读出所需数量的数据或读至文件尾

三、文件系统的管理

3.1 文件系统的可靠性

可靠性:抵御和预防各种物理性破坏和人为性破坏的能力

  • 块坏问题
  • 备份
    通过转储操作,形成文件或文件系统的多个副本。

3.2 文件系统备份

  • 全量转储
    定期将所有文件拷贝到后援存储器
  • 增量转储
    只转储修改过的文件,即两次备份之间的修改。减少系统开销。
  • 物理转储
    从磁盘第零块开始,将所有磁盘块按序输出到磁带
  • 逻辑转储
    从一个或几个指定目录开始,递归地转储子给定日期后所有更改的文件和目录

3.3 文件系统一致性

  • 问题的产生:
    磁盘块-->内存-->写回磁盘块
    若在写回之前,系统崩溃,则文件系统出现不一致

  • 解决方案
    设计一个使用程序,当系统再次启动时,运行该程序,检查磁盘块和目录系统

3.4 磁盘块的一致性检查

14、文件系统2(操作系统笔记)_第12张图片
14

说明::一致性检查时,检查所有的文件和空闲块,检查完之后可能会出现四种结果。第一种是一个一致性的结果,即某个磁盘块要么分配给了某个文件,要么在空闲块中。第二种结果是在空闲块中找不到,但是也没有分配给某个文件,于是我们通过在空闲块表中将磁块标记为一来解决。第三种结果是某个磁盘块在空闲块表中出现了两次,同样是不合理的,对这一位进行修改。最后一种结果是在两个文件中出现,这种情况较为复杂,我们应该在空闲块中找一个,然后将其中一个磁盘块内容拷贝到这个空闲块中,然后将使用块表中的这一位减一。

3.5 文件系统的写入策略

对某些文件做出了修改,那么什么时候将修改后的内容写入到文件中。这里需要考虑文件系统一致性和速度。下面有几种写入策略

  • 通写(write-through
    内存中的修改立即写到磁盘。缺点是速度性能差,如FAT文件系统。
  • 延迟写(lazy-write
    利用回写(write back)缓存的方法得到高速。其缺点就是可恢复性较差,可能会导致信息丢失
  • 可恢复写(tansaction log
    采用事务日志来实现文件系统的写入,既考虑安全性,又考虑速度性能,如NTFS

你可能感兴趣的:(14、文件系统2(操作系统笔记))