目录
3.1文件系统结构
从不同的角度出发有很多种文件层次结构图,但其基本功能基本一致。
3.2文件系统布局
3.2.1文件系统在外存中的结构
这部分内容与操作系统引导类似,文件系统也是操作系统的一部分。
- 主引导记录(MBR),位于磁盘的0号扇区,操作系统的引导步骤为:主存的ROM中的BIOS→MBR→扫描分区表→PBR。
- 引导块:每个分区都从一个引导块开始,负责启动该分区中的操作系统。
- 超级块:包含文件系统的所有关键信息,计算机启动时读入内存。典型信息有分区的块数量及大小、空闲块的数量和指针、空闲的FCB数量和FCB指针。
- 文件系统的空闲块信息可以使用位示图或空闲链表法等形式给出。可以使用索引结点进行优化。最后磁盘中还存放着所有目录和除目录之外的文件。
3.2.2文件系统在内存中的结构
内存中的信息用于管理文件系统并通过缓存(cache)来提高性能。这些数据在安装文件系统时被加载,在文件系统操作期间被更新,在卸载时被丢弃。这些结构可能包括:
- 内存中的安装表(mount table),包含每个已安装文件系统分区的有关信息。
- 内存中的目录结构的缓存包含最近访问目录的信息。对安装分区的目录,它可以包括一个指向分区表的指针。
- 整个系统的打开文件表,包含每个打开文件的FCB副本及其他信息。
- 每个进程的打开文件表,包括一个指向整个系统的打开文件表中的适当条目的指针,以及其他信息。
进程的打开文件表的索引号也称“文件描述符”,“文件句柄”(对应UNIX和Windows)
3.3外存空闲空间管理
一个磁盘划分成多个文件卷(C盘、D盘)或多个磁盘组成一个文件卷(逻辑卷、逻辑盘)。文件卷包括目录区和文件区。
3.3.1空闲表法
适用连续分配方式,其基本思想和动态分区分配一致,相似问题也有空闲盘区的分配算法(首次适应算法、最佳适应算法、最坏适应算法等)、回收盘区后空闲盘块表的更改等问题。
3.3.2空闲链表法
- 空闲盘块链:以盘块为单位,每一个空闲盘块记录下一个空闲盘块的指针。
- 空闲盘区链:以盘区(几个相邻的空闲盘块)为单位,每一个空闲盘区的首盘块记录下一个空闲盘区的指针和此盘区的长度。
操作系统保存着链头、链尾指针。
3.3.3位示图法
一个二进制位代表一个盘块(0为空闲)。
注意题中的字号与位号是不是从0开始编号。
3.3.4成组链接法
空闲表法和空闲链表法都不适用于大型文件系统,因为会使空闲表或空闲链表过大。UNIX中采用了成组链接法。
- 超级块存在于文件卷目录区,在开机时读入内存。
- 橙色部分表示下一组的空闲盘块数目。这一组的其中一个空闲盘块(如300)用来保存下下一组的空闲盘块信息。若没有下一组空闲盘块则盘块号设为-1。
- 分配时如果出现当前组空闲盘块数不够的问题需要把下一个超级块复制到当前超级块,以此类推。
- 回收时如果出现当前组空闲盘数量超出的问题需要把当前超级块复制到新回收的块,当前超级块更改内容。
3.4虚拟文件系统
操作系统中可能存在不同的文件系统,如Linux的ext3、ext2、vfat等。文件之间通过系统调用来实现跨文件系统操作。
虚拟文件系统(VFS,Virtual File System)为用户程序提供了文件系统操作的统一接口。严格说来,VFS并不是一种实际的文件系统。它只存在于内存中,不存在于任何外存空间。VFS在系统启动时建立,在系统关闭时消亡。
为了实现VFS,Linus主要抽象了四种对象类型。
- 在处理文件时,应用程序和内核空间使用的对象不同。
- 应用程序:打开文件时内核为其进程分配一个打开文件表的索引号(文件描述符),文件的读写等操作均通过该索引号进行。
- 内核空间:一个索引结点对应一个文件,该inode可能对应应用程序的多个进程的多个文件描述符。
3.5文件系统挂载(mounting)
文件系统在进程使用前必须先安装,也称挂载。
Window或MAC操作系统自动挂载创建的文件系统,Linux需要手动挂载,或者配置系统后自动挂载(编辑/etc/fstab文件)
mount:VFS的挂载描述符; umount:卸载文件系统操作,保存文件,退出挂载点/挂载目录后才可执行。