目录
- 一. 文件系统结构
- I/O 控制层
- 基本文件系统
- 文件组织模块
- 逻辑文件系统
- 二. 文件系统布局
- 文件系统在磁盘中的结构
- 主引导记录(MasterBoot Record,MBR)
- 引导块(boot block)
- 超级块(super block)
- 文件系统中空闲块的信息
- 文件系统在内存中的结构
- 三. 外存空间管理
- 空闲表法
- 空闲链表法
- 空闲盘块链
- 空闲盘区链
- 位示图法
- *成组链接法
- 四. 虚拟文件系统(VFS)
- 超级块对象
- 索引节点对象
- 目录项对象
- 文件对象
- 五. 文件系统挂载
一. 文件系统结构
文件系统(Filesystem)提供高效和便捷的磁盘访问,以便允许存储、定位、提取数据。
文件系统有两个不同的设计问题:第一个问题是,定义文件系统的用户接口,它涉及定义文件及其属性、所允许的文件操作、如何组织文件的目录结构。第二个问题是,创建算法和数据结构,以便映射逻辑文件系统到物理外存设备。
I/O 控制层
- 包括设备驱动程序和中断处理程序,在内存和磁盘系统之间传输信息。
设备驱动程序将输入的命令翻译成底层硬件的特定指令,硬件控制器利用这些指令使I/0 设备与系统交互。设备驱动程序告诉1/0控制器对设备的什么位置采取什么动作。
基本文件系统
- 向对应的设备驱动程序发送通用命令,以读取和写入磁盘的物理块。
每个物理块由磁盘地址标识。该层也管理内存缓冲区,并保存各种文件系统、目录和数据块的缓存。
在进行磁盘块传输前,分配合适的缓冲区,并对缓冲区进行管理。
文件组织模块
- 文件组织模块可以将文件的逻辑块地址转换为物理块地址,每个文件的逻辑块从0到N编号,它与数据的物理块不匹配,因此需要通过转换来定位。
文件组织模块还包括空闲空间管理器,以跟踪未分配的块,根据需求提供给文件组织模块。
逻辑文件系统
- 用于管理文件系统中的元数据信息。
- 元数据包括文件系统的所有结构,而不包括实际数据(或文件内容)。
逻辑文件系统管理目录结构,以便根据给定文件名为文件组织模块提供所需要的信息。它通过文件控制块来维护文件结构。逻辑文件系统还负责文件保护。
二. 文件系统布局
文件系统在磁盘中的结构
- 文件系统存放在磁盘上,多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统。
- 文件系统可能包括如下信息:启动存储在那里的操作系统的方式、总的块数、空闲块的数量 和位置、目录结构以及各个具体文件等。图4.20所示为一个可能的文件系统布局。 简单描述如下:
主引导记录(MasterBoot Record,MBR)
主引导记录,位于磁盘的0号扇区,用来引导计算机,MBR 的后面是分区表,该表给出每个分区的起始和结束地址。
表中的一个分区被标记为活动 分区。当计算机启动时,BIOS读入并执行MBR。MBR做的第一件事是确定活动分区, 读入它的第一块,即引导块。
引导块(boot block)
MBR执行引导块中的程序后,该程序负责启动该分区中的操作系统。每个分区都是统一从一个引导块开始,即使它不含有一个可启动的操作系统,也不 排除以后会在该分区安装一个操作系统。Windows系统称之为分区引导扇区。 除了从引导块开始,磁盘分区的布局是随着文件系统的不同而变化的。文件系统经常包 含有如图4.20所列的一些项目。
超级块(super block)
超级块(super block),包含文件系统的所有关键信息,在计算机启动时,或者在该文件 系统首次使用时,超级块会被读入内存。超级块中的典型信息包括分区的块的数量、块 的大小、空闲块的数量和指针、空闲的FCB数量和FCB指针等。
文件系统中空闲块的信息
文件系统中空闲块的信息,可以用位示图或指针链接的形式给出。后面也许跟的是一组 i节点,每个文件对应一个节点,i节点说明了文件的方方面面。接着可能是根目录,它 存放文件系统目录树的根部。最后,磁盘的其他部分存放了其他所有的目录和文件。
文件系统在内存中的结构
内存中的信息用于管理文件系统并通过缓存来提高性能。这些数据在安装文件系统时被加载,在文件系统操作期间被更新,在卸载时被丢弃。这些结构的类型可能包括:
- 内存中的安装表(mount table),包含每个已安装文件系统分区的有关信息。
- 内存中的目录结构的缓存,包含最近访问目录的信息。
- 整个系统的打开文件表,包含每个打开文件的FCB副本、打开计数及其他信息。
- 每个进程的打开文件表,包含进程打开文件的文件描述符(Windows称之为文件句柄) 和指向整个系统的打开文件表中对应表项的指针。
三. 外存空间管理
一个存储设备可以按整体用于文件系统,也可以细分。例如,一个磁盘可以划分为2个分区, 每个分区都可以有单独的文件系统。包含文件系统的分区通常称为卷(volume)。卷可以是磁盘的一 部分,也可以是整个磁盘,还可以是多个磁盘组成RAID集,如图4.21所示。
在一个卷中,存放文件数据的空间(文件区)和FCB的空间(目录区)是分离的。
由于存在很多种类的文件表示和存放格式,所以现代操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的卷中的文件。卷在提供文件服务前,必须由对应的文件程序进行初始 化,划分好目录区和文件区,建立空闲空间管理表格及存放卷信息的超级块。
文件存储设备分成许多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的 管理实质上是对空闲块的组织和管理,它包括空闲块的组织、分配与回收等问题。
空闲表法
空闲表法属于连续分配方式,它与内存的动态分区分配类似,为每个文件分配一块连续的 存储空间。系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中 包括表项序号、该空闲区的第一个空闲盘块号、该空闲区的空闲盘块数等信息。再将所有空闲 区按其起始盘块号递增的次序排列,如表4.2所示。
- 盘块的分配
空闲盘区的分配与内存的动态分配类似,也是采用首次适应算法、最佳适应算法等。
例如, 在系统为某新创建的文件分配空闲盘块时,先顺序地检索空闲盘块表的各表项,直至找到第一个 其大小能满足要求的空闲区,再将该盘区分配给用户,同时修改空闲盘块表。
- 盘块的回收
在对用户所释放的存储空间进行回收时,也采用类似于内存回收的方法,即要考虑回收区是 否与空闲盘块表中插入点的前区和后区相邻接,对相邻接者应予以合并。
空闲表法的优点是具有较高的分配速度,可减少访问磁盘的I/O频率。对于较小的文件(1~ 5个盘块),可以采用连续分配方式为文件分配几个相邻的盘块。
空闲链表法
空闲链表法是指将所有空闲盘区拉成一条空闲链,可分为以下两种。
空闲盘块链
- 空闲盘块链是指将磁盘上的所有空闲空间以盘块为单位拉成一条链。每个盘块都有指向 下一个空闲盘块的指针。
- 优点:分配和回收一个盘块的过程非常简单。
- 缺点:在为一个文件分配盘块时 可能要重复操作多次,效率较低;又因它是以盘块为单位的,空闲盘块链会很长。
空闲盘区链
- 空闲盘区链是指将磁盘上的所有空闲盘区拉成一条链,每个盘区包含若干相邻的盘块。每个 盘区含有下一个空闲盘区的指针和本盘区的盘块数。
- 优点:分配与回收的效率较高,且空闲盘区 链较短。
- 缺点:分配与回收的过程比较复杂。
位示图法
- 优点:很容易在位示图中找到一个或一组相邻接的空闲盘块。由于位示图很小, 占用空间少,因此可将它保存在内存中,从而节省许多磁盘启动的开销。
- 缺点:位示图大小会随着磁盘容量的增加而增大,因此常用于小型计算机。
*成组链接法
空闲表法和空闲链表法都不适用于大型文件系统,因为这会使空闲表或空闲链表太大。
UNIX系统中采用的是成组链接法,它结合了上述两种方法的思想而克服“表太长”的缺点。
- 成组链接法的思想:将空闲盘块分成若干组,如100个盘块作为一组,每组的第一个盘块记录下一组的空闲盘块总数和空闲盘块号。
这样,由各组的第一个盘块可以链接成一条链。第一组的空闲盘块总数和空闲盘块号保存在内存的专用栈中,称为空闲盘块号栈。假设系统空闲区为第201~7999号盘块,则第一组的盘块号为201~300……次末组的盘块号为7801~7900,最末一组的盘块号为7901~7999。最末一组只有99个盘块,它们的块号记录在前一组的7900号盘块中,该块中存放的第一个盘块号是“0”,以作为空闲盘块链的结束标志,如图4.23所示。
简而言之,每组(除了最后一组)的第一块作为索引块,然后将这些索引块链接起来。
- 盘块的分配
根据空闲盘块号栈的指针,将与之对应的盘块分配给用户,同时移动指针。若该指针指向的 是栈底的盘块号,则由于该盘块号对应的盘块中保存的是下一组空闲盘块号,因此要将该盘块的 内容读入栈中,作为新的空闲盘块号栈的内容,并将原栈底盘块号对应的盘块分配出去(其中有 用的数据已读入栈中)。最后,将栈中的空闲盘块数减1。
例如,在图4.23中,分配盘块时,先依次分配201~299号盘块,当需要分配300号盘块时, 首先将300号盘块的内容读入空闲盘块号栈,然后分配300号盘块。
- 盘块的回收
将回收的盘块号存入空闲盘块号栈的顶部,同时移动指针,并将栈中的空闲盘块数加1。当 栈中的空闲盘块数已达100时,表示栈已满,将现有栈中的100个空闲盘块号存入新回收的盘块, 并将新回收的盘块号作为新栈底,再将栈中的空闲盘块数置为1。
表示空闲空间的位向量表或空闲盘块号栈,以及卷中的目录区、文件区划分信息都要存放在 磁盘中,一般放在卷头位置,在UNIX系统中称为超级块。在对卷中的文件进行操作前,超级块 要预先读入内存,并且经常保持主存超级块与磁盘卷中超级块的一致性。
四. 虚拟文件系统(VFS)
虚拟文件系统(VFS)**屏蔽了不同文件系统的差异和操作细节,向上为用户提供了文件操作 的统一调用接口**
如图4.24所示。当用户程序访问文件时,通过VFS提供的统一调用函数(如 open()等)来操作不同文件系统的文件,而无须考虑具体的文件系统和实际的存储介质。
为了实现虚拟文 件系统,系统抽象了四种对象类型。每个对象都包含数据和函数指针,这些函数指针指向操作这 些数据的文件系统的实现函数。这四种对象类型如下。
超级块对象
表示一个已安装(或称挂载)的特定文件系统。超级块对象对应于磁盘上特定扇区的文件系 统超级块,用于存储已安装文件系统的元信息。其操作方法包含一系列可在超级块对象上调用的 操作函数,主要有分配inode、销毁inode、读inode、写inode等。
索引节点对象
表示一个特定的文件。索引节点和文件是一对一的关系。只有当文件被访问时,才在内存中 创建索引节点对象,每个索引节点对象都会复制磁盘索引节点包含的一些数据。索引节点对象还 提供许多操作函数,如创建新索引节点、创建硬链接、创建新目录等。
目录项对象
表示一个特定的目录项。目录项对象是一个路径的组成部分,它包含指向关联索引节点的指 针,还包含指向父目录和指向子目录的指针。不同于前面两个对象,目录项对象在磁盘上没有对 应的数据结构,而是VFS在遍历路径的过程中,将它们逐个解析成目录项对象的。
文件对象
表示一个与进程相关的已打开文件。可以通过调用open()打开一个文件,通过调用close() 关闭一个文件。文件对象和物理文件的关系类似于进程和程序的关系。文件对象仅是进程视 角上代表已打开的文件,它反过来指向其索引节点。文件对象包含与该文件相关联的目录项 对象,包含该文件的文件系统、文件指针等,还包含在该文件对象上的一系列操作函数。 当进程发起一个面向文件的系统调用时,内核调用VFS中的一个函数,该函数调用目标文件 系统中的相应函数,将文件系统请求转换到面向设备的指令。以在用户空间调用write()为例,它 在VFS中通过sys_write()函数处理,sys_write()找到具体文件系统提供的写方法,将控制权交给 该文件系统,最后由该文件系统与物理介质交互并写入数据,如图4.25所示。
严格来说,VFS并不是一种实际的文件系统,它只存在于内存中,不存在于任 何外存空间中。VFS在系统启动时建立,在系统关闭时消亡。
五. 文件系统挂载
如文件在使用前要打开那样,文件系统在进程使用之前必须先安装,也称挂载(Mounting)。 将设备中的文件系统挂载到某个目录后,就可通过这个目录来访问设备上的文件。
注意,这里的 设备指的是逻辑上的设备,如一个磁盘上的不同分区都可视为不同的设备。
Windows系统维护一个扩展的两级目录结构,用驱动器字母表示设备和卷。卷具有常规树结 构的目录,与驱动器号相关联,还含有指向已安装文件系统的指针。特定文件的路径形式为driver- letter:\path\tolfile,访问时,操作系统找到相应文件系统的指针,并遍历该设备的目录结构,以查 找指定的文件。
新版的Windows允许文件系统安装在目录树下的任意位置,就像UNIX一样。在 启动时,Windows操作系统自动发现所有设备,并且安装所有找到的文件系统。
UNIX使用系统的根文件系统,它是在系统启动时直接安装的,也是内核映像所在的文件系 统。除了根文件系统,所有其他文件系统都要先挂载到根文件系统中的某个目录后才能访问。其 他文件系统要么在系统初始化时自动安装,要么由用户挂载在已安装文件系统的目录下。安装文 件系统的这个目录称为安装点,同一个设备可以有多个安装点,同一个安装点同时只能挂载一个 设备。将设备挂载到安装点之后,通过该目录就可以读取该设备中的数据。 假定将存放在磁盘/dev/fd0上的ext2文件系统通过mount命令安装到/flp:
mount -t ext2 /dev/fd0 /flp
如需卸载该文件系统,可以使用umount命令。