Lecture 22: File Systems 3

回顾:

1. 文件系统的用户视角

  • 系统调用
  • 结构、组织方式、文件类型

2. 文件系统的实现视角

  • 磁盘和分区布局
  • 文件表
  • 可用空间管理
  • ......

磁盘调度:

  • 文件系统的布局文件分配方式寻道动作有着重大影响:连续文件会减少寻道动作。
  • 操作系统在实施磁盘调度时(相对于控制器而言)能够优先处理/排序请求

本章小结:

1. 文件系统实现方式

  1. 连续式
  2. 链表
  3. 文件分配表(File Allocation Table,FAT)

2. 使用索引节点进行查找 i-nodes (lookups)

3. 硬链接和软链接

文件系统实现方式

文件访问:顺序访问与随机访问

  • 文件将由多个组成
  • 文件可以是顺序访问的,也可以是随机访问的(这对于数据库系统来说是必不可少的)
文件的访问类型

连续分配

概念

连续文件系统与内存分配中的动态分区类似:

  • 每个文件都存储在硬盘上一组连续的块
  • 例如,1KB 的块、100KB 的文件,我们需要 100 个连续的块

可用空间的分配可以使用首次适应、最佳适应、下次适应等方法进行。

删除文件时的外部碎片化现象

优势

易于实现:仅需存储第一个块的位置以及文件的长度(在文件控制块中)
最佳的读写性能:块会集中存储在相邻的扇区中(从而最大限度地减少寻道时间)

目录表

缺点

连续文件系统的缺点包括:

  • 文件(进程)的确切大小往往无法事先确定
  • 需要分配算法来决定分配哪些空闲块(例如,首次适应、最佳适应)
  • 删除文件会导致外部碎片化,这需要进行碎片整理(这个过程很

用于 CD-ROM/DVD 的连续分配:由于它们是“一次写入”模式,外部碎片化问题相对较小

链表

概念

为避免外部数据的分散(碎片化),文件被存储在独立的块中(类似于分页方式),这些块相互链接
只有第一个块的地址被存储在文件控制块(FCB)中。
每个块都包含一个指向下一个块的数据指针(该指针会占用空间)

链表文件存储

优势

易于维护:在目录项中只需维护第一个块(地址)即可
文件可以动态扩展:新的块/扇区会添加到末尾
与分页类似,不存在外部碎片化现象
顺序访问非常简单,不过可能需要更多的寻道操作(非连续访问)

缺点

随机访问速度非常
内部碎片:该块的后半部分未被使用(平均而言)

  • 较小的块大小会减少内部碎片

可能导致随机(缓慢)的磁盘访问

  • 较大的块(包含多个扇区)会提高速度(但会增加内部碎片)

一个数据块内的数据已不再为 2 的幂次
可靠性降低:如果一个数据块损坏/丢失,那么对该文件其余部分的访问也将失效

文件分配表(File Allocation Table,FAT)

关键概念

将链表指针存储在一个单独的索引表中,该索引表称为文件分配表(FAT)(加载到内存中)

File Allocation Tables

优缺点

优点:

  • 块大小仍为 2 的幂次(由于指针的存在,块内不会出现空间浪费)
  • 索引表保留在内存中,从而实现快速的非顺序/随机访问(但表的访问本身仍为顺序访问)

缺点:

  • 文件分配表大小会随着块的数量或磁盘大小而增加。
  • 对于一个 200GB 的磁盘块大小为 1KB)来说,需要 2 亿个条目(每个条目占用 800MB 的空间,每条目占用 4 字节)才能完成存储。

索引节点(i-nodes)

概念

每个文件都有一个小型的数据结构(存储在磁盘上),称为 i-节点(索引节点),其中包含了其属性和块指针。

  • 与 FAT 不同,i-节点只有在文件被打开时才会被加载(存储在系统范围的打开文件表中)
  • 如果每个 i -节点由 n 字节组成,并且在任何时刻最多可以打开 k 个文件,那么最多需要 n×k 字节的主内存

i -节点由直接块指针(通常为 10 个)、间接块指针或两者组合而成(例如,类似于多级页表

使用 I-节点进行文件存储

假设块大小为 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 节点。

i-node 目录结构

文件系统比较:连续式、链接式与索引式(Contiguous vs. Linked vs. Indexed)

Contiguous vs. Linked List (or FAT) vs. i-nodes (or indexed)

查找(Lookups)

打开一个文件需要先确定磁盘块的位置

  • 绝对文件名是相对于根目录来定位的
  • 相对文件名则是基于当前工作目录来定位的

例如:尝试定位 /usr/gdm/mbox

Locating a File

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(文件的原始所有者仍需为所占用的空间消费),则保留索引节点不变
(a)在创建链接之前。 (b)在创建链接之后。 (c)在原始所有者删除该文件之后。
软链接(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的原因

  1. 工具和操作系统限制

    • 早期工具(如Windows 9x)可能实现更保守的限制

    • 某些应用程序使用有符号32位整数,限制为2GB

  2. 簇大小影响

    • 小簇大小导致大文件需要更多簇,但FAT表大小有限

    • 例如:1KB簇时,4GB文件需要4百万个簇,但FAT表可能无法处理

  3. 文件系统开销:FAT表本身需要内存和磁盘空间,大文件可能使FAT表过大

  4. 兼容性问题:一些旧系统或工具可能不支持接近4GB的文件

总结答案

1. FAT理论最大文件大小:

  • 对于500GB磁盘和1KB簇:500GB(受磁盘容量限制)

  • 无磁盘容量限制时:4TB(但实际FAT-32用28位寻址)

2. FAT-32文件大小限制原因:

  • 主要限制:目录项中文件大小字段为32位(最大4GB-1)

  • 次要限制:实际簇寻址只有28位,但簇大小可达32KB(理论8TB)

  • 有时小于2GB:由于工具使用有符号整数或实现限制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值