回顾:
1. 文件系统的用户视角
- 系统调用
- 结构、组织方式、文件类型
2. 文件系统的实现视角
- 磁盘和分区布局
- 文件表
- 可用空间管理
- ......
磁盘调度:
- 文件系统的布局和文件分配方式对寻道动作有着重大影响:连续文件会减少寻道动作。
- 操作系统在实施磁盘调度时(相对于控制器而言)能够优先处理/排序请求。
本章小结:
1. 文件系统实现方式
- 连续式
- 链表
- 文件分配表(File Allocation Table,FAT)
2. 使用索引节点进行查找 i-nodes (lookups)
3. 硬链接和软链接
文件系统实现方式
文件访问:顺序访问与随机访问
- 文件将由多个块组成
- 文件可以是顺序访问的,也可以是随机访问的(这对于数据库系统来说是必不可少的)
连续分配
概念
连续文件系统与内存分配中的动态分区类似:
- 每个文件都存储在硬盘上一组连续的块中
- 例如,1KB 的块、100KB 的文件,我们需要 100 个连续的块
可用空间的分配可以使用首次适应、最佳适应、下次适应等方法进行。
优势
易于实现:仅需存储第一个块的位置以及文件的长度(在文件控制块中)
最佳的读写性能:块会集中存储在相邻的扇区中(从而最大限度地减少寻道时间)
缺点
连续文件系统的缺点包括:
- 文件(进程)的确切大小往往无法事先确定
- 需要分配算法来决定分配哪些空闲块(例如,首次适应、最佳适应)
- 删除文件会导致外部碎片化,这需要进行碎片整理(这个过程很慢)
用于 CD-ROM/DVD 的连续分配:由于它们是“一次写入”模式,外部碎片化问题相对较小
链表
概念
为避免外部数据的分散(碎片化),文件被存储在独立的块中(类似于分页方式),这些块相互链接。
只有第一个块的地址被存储在文件控制块(FCB)中。
每个块都包含一个指向下一个块的数据指针(该指针会占用空间)
优势
易于维护:在目录项中只需维护第一个块(地址)即可
文件可以动态扩展:新的块/扇区会添加到末尾
与分页类似,不存在外部碎片化现象
顺序访问非常简单,不过可能需要更多的寻道操作(非连续访问)
缺点
随机访问速度非常慢
内部碎片:该块的后半部分未被使用(平均而言)
- 较小的块大小会减少内部碎片
可能导致随机(缓慢)的磁盘访问
- 较大的块(包含多个扇区)会提高速度(但会增加内部碎片)
一个数据块内的数据已不再为 2 的幂次
可靠性降低:如果一个数据块损坏/丢失,那么对该文件其余部分的访问也将失效
文件分配表(File Allocation Table,FAT)
关键概念
将链表指针存储在一个单独的索引表中,该索引表称为文件分配表(FAT)(加载到内存中)
优缺点
优点:
- 块大小仍为 2 的幂次(由于指针的存在,块内不会出现空间浪费)
- 索引表可保留在内存中,从而实现快速的非顺序/随机访问(但表的访问本身仍为顺序访问)
缺点:
- 文件分配表的大小会随着块的数量或磁盘大小而增加。
- 对于一个 200GB 的磁盘(块大小为 1KB)来说,需要 2 亿个条目(每个条目占用 800MB 的空间,每条目占用 4 字节)才能完成存储。
索引节点(i-nodes)
概念
每个文件都有一个小型的数据结构(存储在磁盘上),称为 i-节点(索引节点),其中包含了其属性和块指针。
- 与 FAT 不同,i-节点只有在文件被打开时才会被加载(存储在系统范围的打开文件表中)
- 如果每个 i -节点由 n 字节组成,并且在任何时刻最多可以打开 k 个文件,那么最多需要 n×k 字节的主内存
i -节点由直接块指针(通常为 10 个)、间接块指针或两者组合而成(例如,类似于多级页表)
假设块大小为 1KB,磁盘地址空间为 32 位
仅使用直接块指针时,最大文件大小为 10KB(1KB × NUMBER_OF_DIRECT_BLOCK_POINTERS[直接块指针数量])
使用单个间接块时,最大文件大小为(10 + 256)× 1KB = 266KB
使用双间接块时,包含 256 个指针的 256 个块:最大文件大小为(10 + 256 + 256²)× 1KB = 65802KB
如果需要更大的文件,我们将需要三重间接块,以实现最大文件大小为(10 + 256 + 256² + 256³)× 1KB
使用 i - 节点的实现方式
在 UNIX、Linux 和 MacOS 系统中:
- 文件的所有元数据(类型、大小、日期、所有者以及块指针)都存储在一个 i 节点中。
- 目录是一种非常简单的数据结构,由文件名和指向 i 节点的指针组成。
目录只不过是一种特殊的文件类型,因此它们也有自己的 i 节点。
文件系统比较:连续式、链接式与索引式(Contiguous vs. Linked vs. Indexed)
查找(Lookups)
打开一个文件需要先确定磁盘块的位置
- 绝对文件名是相对于根目录来定位的
- 相对文件名则是基于当前工作目录来定位的
例如:尝试定位 /usr/gdm/mbox
1. 找到文件系统的根目录
- 其 i 索引节点位于磁盘上的固定位置(目录本身可以位于任何位置)
2. 找到路径中指定的目录条目:
- 找到路径中第一个组成部分(目录)的 i 索引节点编号(提供的路径中的目录部分)
- 使用该 i 索引节点编号在 i 索引表中进行索引并检索目录文件
- 通过重复上述两个步骤查找剩余的路径目录
3. 一旦找到了文件的目录,就找到该文件的 i 索引节点并将其缓存到内存中
在目录之间共享文件
硬链接和软链接:
有两种方法可以实现文件的共享,例如在目录 B 和 C 之间共享(其中 C 是“真实”的所有者):
- 硬链接:在 B 和 C 中分别保留对同一 i-node 的两个(或多个)引用
i-node 引用计数器将被设置为 2 - 符号链接:
① 所有者在例如目录 C 中维护对 i-node 的引用
② “引用者”维护一个小型文件(具有自己的 i-node),其中包含目录 C 中共享文件的位置和名称
哪种方法最好? ⇒ 两者都有优点和缺点
硬链接(Hard Links)
硬链接是链接文件的最快方式!
硬链接的缺点:
- 假设文件的所有者删除了该文件:
①如果索引节点也被删除,那么在最理想的情况下,任何硬链接都将指向一个无效的索引节点②如果索引节点被删除并“回收”以指向另一个文件,硬链接将指向错误的文件! - 唯一的解决办法是删除该文件,并且如果“引用计数”大于 0(文件的原始所有者仍需为所占用的空间消费),则保留索引节点不变。
软链接(Soft Links)
软链接的缺点:
- 会导致额外的文件查找操作(一旦找到了链接文件,还需要找到原始文件)
- 需要为链接文件额外分配一个 i 索引节点
符号链接的优点:
- 删除原始文件时不会出现问题 ⇒ 这个文件就不再存在了
- 它们可以跨越不同机器的界限,即链接的文件可以位于不同的机器上
Unix中的硬链接和软链接:
[pszgd@severn ~]$ pwd
/home/pszgd
[pszgd@severn ~]$ ls -i labs/
3250013 req1b.c
[pszgd@severn ~]$ ln labs/req1b.c hardLink
[pszgd@severn ~]$ ln -s labs/req1b.c softLink
[pszgd@severn ~]$ ls -ali hardLink softLink
3250013 hardLink
3250021 softLink -> labs/req1b.c
[pszgd@severn ~]$ rm labs/req1b.c
1. 初始状态:
[pszgd@severn ~]$ pwd
/home/pszgd
[pszgd@severn ~]$ ls -i labs/
3250013 req1b.c
-
当前目录:
/home/pszgd -
labs/目录中有一个文件req1b.c,inode 编号为3250013
2. 创建硬链接和软链接
[pszgd@severn ~]$ ln labs/req1b.c hardLink
[pszgd@severn ~]$ ln -s labs/req1b.c softLink
-
硬链接
hardLink:创建指向同一 inode (3250013) 的另一个目录项 -
软链接
softLink:创建符号链接,包含指向labs/req1b.c的路径信息
3. 查看链接信息
[pszgd@severn ~]$ ls -ali hardLink softLink
3250013 hardLink
3250021 softLink -> labs/req1b.c
-
hardLink:inode 3250013(与原文件相同) -
softLink:inode 3250021(新的 inode),指向labs/req1b.c
4. 删除原文件
[pszgd@severn ~]$ rm labs/req1b.c
| 特性 | 硬链接 (hardLink) | 软链接 (softLink) |
|---|---|---|
| inode | 与原文件相同 (3250013) | 新的 inode (3250021) |
| 存储内容 | 直接指向数据块 | 存储目标文件路径 |
| 删除原文件后 | 仍然有效 | 变成坏链接 |
| 跨文件系统 | 不支持 | 支持 |
| 链接目录 | 通常不允许 | 允许 |
在Unix/Linux系统中,硬链接更健壮(只要还有一个硬链接存在,文件数据就不会丢失),而软链接更灵活但依赖于目标文件的存在。
文件系统示例:Unix 与 Windows 的比较
Unix V7 文件系统:
- 树形结构的文件系统,包含链接
- 目录包含文件名和 i-节点编号
- i-节点包含用户和系统属性(例如计数变量)
- 可以使用单个、双层和三层间接块
后来开发了更复杂的文件系统(例如 ext3/4)
Windows:
- 在 XP 系统中,使用的是 FAT-16 和 FAT-32 文件系统
- 从 XP 系统升级到 NTFS(64 位)是因为文件大小受限:NTFS 采用文件表,其 i-节点更大,还能包含小文件和目录
- 最近则使用了 ReFS 系统
理解
使用 i-节点时,我们所能拥有的最大文件大小取决于块大小以及间接指针的数量。
1. 假设一个32位的磁盘地址空间,对于一个500GB驱动器和1KB块大小的FAT文件系统,最大(理论上)文件大小是多少?(不考虑目录元数据)
给定条件:
-
32位磁盘地址空间(即每个FAT表项为32位/4字节)
-
磁盘大小:500GB
-
块大小(簇大小):1KB = 1024字节
-
不考虑目录元数据
计算过程:
FAT文件系统中,文件大小受限于FAT表能寻址的簇数量。
-
每个FAT表项为32位,可寻址的簇总数为:2³² = 4,294,967,296个簇
-
每个簇大小为1KB,因此最大文件大小为:
232×1KB=4,294,967,296×1024字节232×1KB=4,294,967,296×1024字节
计算具体数值:
-
4,294,967,296×1024=4,398,046,511,1044,294,967,296×1024=4,398,046,511,104 字节
-
转换为GB:4,398,046,511,104/10243=40964,398,046,511,104/10243=4096 GB
但磁盘只有500GB,所以实际最大文件大小受磁盘容量限制:
-
500GB磁盘的总簇数:500×10243/1024=500×10242=524,288,000500×10243/1024=500×10242=524,288,000个簇
-
每个文件最多可占用所有簇,因此最大文件大小为500GB
然而,FAT表本身有限制:
-
32位FAT表最多支持4,294,967,296个簇
-
但实际FAT-32实现中,只有28位用于簇寻址(高位4位保留)
理论最大文件大小:
-
如果磁盘足够大:232×1KB=4TB232×1KB=4TB(但32位FAT实际用28位,见下文)
-
对于500GB磁盘:500GB(受磁盘容量限制)
2. FAT最常用的实现被称为FAT-32。调查为什么每个文件有4GB的理论限制(有时甚至小于2GB)。
原因分析:
a) FAT-32实际使用28位寻址
-
虽然称为"FAT-32",但实际只使用28位存储簇号(高4位保留)
-
最大簇数:228=268,435,456228=268,435,456个簇
-
如果簇大小为32KB(最大允许),最大文件大小:
228×32KB=268,435,456×32,768字节=8,796,093,022,208字节≈8TB228×32KB=268,435,456×32,768字节=8,796,093,022,208字节≈8TB -
但实际限制来自文件大小字段
b) 文件大小字段限制
-
FAT-32目录项中,文件大小使用32位无符号整数存储
-
最大值为:232−1=4,294,967,295232−1=4,294,967,295字节 ≈ 4GB - 1字节
-
因此任何文件不能超过4GB
c) 有时小于2GB的原因
-
工具和操作系统限制:
-
早期工具(如Windows 9x)可能实现更保守的限制
-
某些应用程序使用有符号32位整数,限制为2GB
-
-
簇大小影响:
-
小簇大小导致大文件需要更多簇,但FAT表大小有限
-
例如:1KB簇时,4GB文件需要4百万个簇,但FAT表可能无法处理
-
-
文件系统开销:FAT表本身需要内存和磁盘空间,大文件可能使FAT表过大
-
兼容性问题:一些旧系统或工具可能不支持接近4GB的文件
总结答案
1. FAT理论最大文件大小:
-
对于500GB磁盘和1KB簇:500GB(受磁盘容量限制)
-
无磁盘容量限制时:4TB(但实际FAT-32用28位寻址)
2. FAT-32文件大小限制原因:
-
主要限制:目录项中文件大小字段为32位(最大4GB-1)
-
次要限制:实际簇寻址只有28位,但簇大小可达32KB(理论8TB)
-
有时小于2GB:由于工具使用有符号整数或实现限制
604

被折叠的 条评论
为什么被折叠?



