文件系统结构(File System Structure)
磁盘提供大量的外存空间来维持文件系统。磁盘的下述两个特点使得其成为存储多个文件的方便介质。
- ①可以原地重写;
- ②可以直接访问磁盘上的任意一块信息。
为了提供对磁盘的高效且便捷的访问,操作系统通过文件系统来轻松地存储、定位、提取数据。文件系统有两个设计问题。
- ①定义文件系统对用户的接口
- ②创建数据结构和算法来将逻辑文件系统映射到物理外存设备上。
文件系统本身通常由不同的层组成。如下图所示的是一个分层设计的简单例子。
- I/O控制
- 由设备驱动程序和中断处理程序组成,实现内存与磁盘之间的信息传递
- 基本文件系统
- 向合适的设备驱动程序发送一般命令就可对磁盘上的物理块进行读写
- 文件组织模块
- 知道文件及其逻辑块和物理块。
- 空闲空间管理器
- 逻辑文件系统
- 管理元数据:文件系统的所有结构数据,而不包括实际数据(或文件内容)
- 根据给定符号文件名来管理目录结构
- 逻辑文件系统通过文件控制块(FCB)来维护文件结构
FCB的典型结构如下图所示
文件系统实现(File System Implementation )
实现文件系统要使用多个磁盘和内存结构。虽然这些结构赢操作系统和文件系统而异,但是还是有其规律性的。
实现文件系统的结构和操作如下:
- 磁盘结构;
- 内存中的文件系统结构;
- 分区与安装
- 虚拟文件系统
磁盘结构
- 引导控制块(卷)(boot control block\Volume)
- 包含启动OS的控制信息
- UFS 中称为引导块(boot block )
- 通常为分区的第一块。如果该分区没有OS,则为空
- NTFS中称为分区引导扇区(partition boot sector)
卷控制块(卷)( Volume control block (/volume))
- 包含卷的详细信息,包括
- 块数和块的大小;
- 空闲块的数量和指针;
- 空闲FCB的数量和指针。
- UFS称为超级块 Superblock , NTFS 称为 主控文件表master file table 。
- 包含卷的详细信息,包括
目录结构
- 用来组织文件
- UFS ,包括文件名和关联的inode 号
- NTFS,主控文件表(master file table );
- 文件控制块(FCB):包括很多文件信息,如文件许可、拥有者、大小和数据块的位置等,详情见上文示例。
- UFS中, 索引节点( inode) ;
- NTFS中,主控文件表;
- 采用关系数据库结构, 记录/文件
内存中的文件系统结构
- 安装表
- 包含所有安装分区的信息
- 目录结构快表
- 保存近来访问过的目录信息(对安装分区的目录,可以包括一个指向分区表的指针)
- 系统范围的打开文件表
- 包括每个打开文件的FCB拷贝和其他信息
- 单个进程的打开文件表
- 包括一个指向系统范围内已打开文件表中合适条目和其他信息的指针
- 文件描述符(file descriptor, Linux/UNIX)
- 文件句柄(file handle, Windows)
- 包括一个指向系统范围内已打开文件表中合适条目和其他信息的指针
下图总结了文件系统实现的 操作结构。
分区与安装
磁盘布局赢操作系统而异。一个磁盘可分成多个分区,或者一个卷可以跨越多个磁盘上的数个分区。
分区可以是“生的”(raw),即没有文件系统,或是“熟的”(cooked)即含有文件系统。生的分区用于没有合适文件系统的地方。如:Unix中的交换区,因为它不使用文件系统而是使用自己的磁盘格式。
引导信息能存在各个分区中,并且有自己的格式。因为在引导时,系统并没有文件系统设配驱动程序,所以不能解释文件系统格式。它通常为一组有序块并且作为二进制镜像文件读入内存。引导信息除了包括如何启动一个特定操作系统外,还可以有其他指令。(如BootManager bootstar 8.3,Linux GRUB, GRUB - GRand Unified Bootloader)
根分区(root partition)包括操作系统内核或其他系统文件,在引导时装入内存。其他分区根据不同操作系统可以在引导时自动装入或在此之后手动装入。
- /root, /boot
- 文件系统安装表(file system mount table)
虚拟文件系统
- 虚拟文件系统(VFS)提供了一种面向对象的方法来实现文件系统
- VFS功能
- 通过定义VFS 接口将一般文件系统操作与实现分离;
- 为网络中唯一表示一个文件提供一种机制(by vnode)
- VFS允许在不同类型的文件系统上采用同样的系统调用接口(API)
- API是针对VFS的接口,而非对任何特定类型的文件系统
第一层为文件系统接口,包括,open()、read()、write()和close()调用以及文件描述符。
第二层称为虚拟文件系统(VFS)层,它有两个目的:
- VFS层通过定义一个清晰的VFS接口,以将文件系统的通用操作和具体实现分开。多个VFS接口的实现可以共存在同一台机器上,它允许访问已经装再本地的多个类型的文件系统
- VFS提供了在网络上唯一标示一个文件的机制。
目录实现(Directory Implementation)
目录分配和目录管理算法的选择对文件系统的效率、性能和可靠性有很大的影响。
线性列表
最为简单的目录实现方法是使用存储文件名和数据块指针(数组、链表等)的线性列表,这种方法编程简单但是运行时较为费时。
目录条目的线性列表的真正缺点是采用线性搜索来查找特定条目。
事实上,许多操作系统采用软件缓存来存储最近访问过的目录信息。缓存命中避免了不断地从磁盘读取信息,排序列表可以使用二分搜索,并减少平均搜索时间。
Hash表
采用Hash数据结构的线性表
- 减少了目录搜索时间,插入和删除也较为简单。
- 不过需要一些机制来避免碰撞(两个文件名哈希到相同的位置)
哈希表的最大困难是:其固定的大小和哈希函数对大小的依赖性
分配方法(Allocation Methods)
- 目标
- 有效使用磁盘空间;
- 快速访问文件。
- 常用的分配方法有以下三类
- 连续分配
- 链接分配
- 索引分配
连续分配 (contiguous allocation)
连续分配方法要求每个文件占据磁盘上的一组连续的块。
特点:
- 简单 - 只需要记录文件的起始位置(块号)及长度。
- 访问文件很容易,所需的寻道时间也最少
- 顺序访问;
- 直接访问。
- 存在的问题
- 为新文件找空间比较困难
- 首次,最佳,最差
- 文件很难增长
- 为新文件找空间比较困难
逻辑地址到物理地址的映射方法如下:
- 逻辑地址 / 块大小 = 商, 余数