文件系统是操作系统中负责管理和存储文件信息的模块。它提供了在存储设备上组织文件的方法和数据结构。
如下图,逻辑文件系统、文件组织模块、基本文件系统构成了文件系统。
I/O控制
设备驱动程序
物理块读写
向设备驱动程序发送控制命令
例如:read drive 1,cylinder 72,track 2,sector 10,into memory location 1060
物理块(簇):一个或多个(2n)扇区组成,基本文件读写单位。
(物理)分区:磁盘分割成若干个独立的空间,每个空间称为分区
两大类分区:主分区和扩展分区;
主分区:能够安装操作系统的启动分区;
扩展分区:不能直接使用,必须分成若干逻辑分区。
卷(逻辑磁盘):磁盘上的逻辑分区,建立在物理分区上。
一般每个卷可以建立一个文件系统。
一个硬盘至少有一个主分区,最多4个,扩展分区可以没有,最多1个。
两种文件系统:
磁盘文件系统、内存文件系统。
引导控制块
包含了系统引导操作系统的各种信息,只有安装操作系统的分区才有。
在Unix文件系统,UFS:引导块;
在Windows文件系统,NTFS:分区引导扇区。
分区控制块
包含分区信息,例如总的块数、空闲块数、块大小等信息;
UFS:超级块;
NTFS:主控文件表。
目录和FCB
用户文件
MBR(主引导记录)存储在硬盘的0柱面、0磁头、1扇区,存储主引导程序等信息,在计算机启动时运行。
分区表存储了硬盘的分区信息,在这个例子中,有4个分区,在UFS中,主分区的结构如图所示,在Windows的文件系统FAT中,主分区的文件系统结构如图所示。
由于从磁盘检索和读取文件很耗时,需要在内存建立一个管理使用中的文件的文件系统,通过缓冲技术来提高文件访问的性能,这就是内存文件系统。
包括:
文件操作需要用到内存文件系统;
目的:通过缓冲技术提高文件系统性能。
目的:为了支持多个文件系统,引入虚拟文件系统(VFS),把多个文件系统整合成一个目录结构,为用户屏蔽了各个文件系统的差异。
文件系统接口(File system interface)
VFS接口(VFS interface)
网络文件系统 NFS
用于通过LAN(或WLAN)访问远程文件系统的软件系统的实现或规范
好处:节省存储空间,实现共享。
在下图的网络架构中,客户端可以利用网络文件系统访问在NFS服务器上的文件。
即:通用Internet文件系统
在Windows主机之间进行网络文件共享;
CIFS使用客户/服务器模式;
Windows
Linux
Mac OS
CD
在磁盘上如何为用户文件分配空间,以便有效地使用磁盘空间和快速访问文件,是文件系统性能的关键。
逻辑块:在文件空间中的块
大小和物理块一致;一个逻辑块存储在一个物理块中。
连续存储空间分配,和内存的连续分配相似,是指一个文件在磁盘上存储在连续的物理块中;而离散存储空间分配是指一个文件的物理块可以分布在磁盘的各处,类似于内存分配中的分页和分段。
物理块块号
每个文件在磁盘上占用一组连续的物理块;
FCB仅需给出:起始块号、长度;
每一种磁盘分配方式都需要考虑如何把文件内的逻辑地址转换为磁盘上的存储位置。
文件在存储时,首先吧文件划分为逻辑块,然后为每个逻辑块分配一个物理块并把逻辑块中的内容写到对应的物理块中。
逻辑地址LA:文件内相对地址(一维)
物理地址(B,D):存在在物理块中的地址(二维)
物理块大小:S
物理地址:
访问块号B = Q+起始块号
块内偏移D
连续分配主要用于早期操作系统中。其文件大小动态变化有困难,主要用于容量小、文件不需要频繁修改的文件系统中。
离散物理块分配方式:
链接分配
两种链接分配的方式
链表的指针隐藏在物理块中;
每个物理块中的指针指向下一个物理块;
FCB给出文件首块地址;
文件结束于空指针;
每个物理块用于存放文件信息的空间变小,因为每个物理块需要有一个空间来存放指向下一个物理块的指针,需要减去指针占的空间。
逻辑地址 LA表示文件内的逻辑地址,这是一个一维的文件内相对地址;
磁盘物理地址是二维地址,用(B,D)表示。
优点
可以离散存放,提高磁盘的利用率;
可以动态扩充文件大小;
便于文件的插入和删除操作;
缺点
文件信息隐藏在若干个不连续物理块中的链接分配模式是隐式链接。
磁盘上物理结构为隐式链接结构的文件只能顺序存取。
隐式链接性能低的原因,主要是指针分散存放,为了读到一个指针而读入整个物理块,读取效率低下。
显式链接中,指针集中存放,把所有指针存放在一张链接表中。
显式链接大大提高了检索速度。先访问链接表,再访问物理块。
显式链接的链接表一般在文件系统装载时就装入内存,不需要多次读入内存。
显式链接的性能接近于连续分配,大大优于隐式链接,只需要访问磁盘一次就可以读入需要访问的任意一块物理块。
显式链接由于链接表装入内存,所以不能太大。
表项16位:
最大216 * 2Bytes = 128KB
表项32位:
最大232* 4Bytes = 16GB
显式链接不适合大容量磁盘。
如4TB磁盘,物理块4KB
链接表大小=(4TB/4KB)*4Bytes=4GB
微软最早在MS-DOS中开始使用。
FAT根据指针大小分为早期的FAT12和FAT16,以及现在使用的FAT32和FAT64(exFAT)。
指向下一个块的指针分散在各个块中,访问性能低下。
改进1:文件分配表(FAT)
系统:存放指针的文件分配表
大文件系统会导致文件分配表过大,会浪费内存。
解决方法:分散的FAT
索引表:每个文件一张文件分配表。
索引块:存放指向文件每个物理块块号的物理块;
索引块中的第i个项:存放第i个逻辑块对应的物理块块号;
FCB指向索引块。
逻辑地址LA:文件内相对地址(一维)
物理地址(B,D):存在在物理块中的地址(二维)
物理块大小:S
大文件无法用单级索引实现
大于4MB的文件如何存放?
解决方法:多级索引
多级索引如何连接这些索引块呢?
把索引块通过链表组织(没有长度限制)
多级索引把索引块通过索引组织(有长度限制)
二级索引
假如
n级索引文件大小= (1K)n * 4KB
文件系统不仅要记录下磁盘上还没有被分配出去的空闲物理块,还需要为新文件分配物理块和回收被删除文件的物理块。
所以文件系统需要包含空闲空间管理模块。
利用二进制一位(bit)来表示一个块的使用情况。
所有块都有一个二进制位与之对应,所有块对应的位形成位示图。
如下图所示,这个位示图由32个位,4个字节组成。
位示图需要额外的空间。例如
block size=212 bytes
disk size=230 bytes(1 gigabytes)n=230/212=218 bits(or 32K bytes)
位示图存放在物理块中;
分配:1->0 回收:0->1比较容易得到连续物理块
Linux和Windows常用的方式
已知位示图中位置
已知块号k
该方法结合了空闲表和空闲链表;
例子:UNIX系统
先将释放的空闲块放到第一组;
满100块后,在第一组前再开辟一组;
原来的第一组变成第二组,新组为第一组
文件系统中的磁盘块经过多次分配和回收后,由于程序异常等原因会导致物理块空闲信息的不一致。
每个文件的目录或FCB中会记录这个文件分配到的物理块信息,位示图同样会记录每个物理块是否被使用。
也就是说文件系统中所有的物理块减去文件用掉的,剩余的都是空闲块。但是,有时不是这样的,存在不一致性。
所以,文件系统提供了一致性检查,将目录结构数据与磁盘空闲块结构相比较,纠正发现的不一致。