0x17 文件系统实现

一、文件系统

文件系统

文件系统是操作系统中负责管理和存储文件信息的模块。它提供了在存储设备上组织文件的方法和数据结构。

  • 系统角度
    ①对存储设备的空间进行组织和分配
    ②负责文件检索、读写等操作
    ③目标:存取速度和存储空间效率
  • 用户角度
    ①提供按名存取的文件访问机制
    ②提供了文件的组织管理
    ③目标:方便的文件存取机制

文件系统的层次架构

如下图,逻辑文件系统、文件组织模块、基本文件系统构成了文件系统。
0x17 文件系统实现_第1张图片
I/O控制

  • 设备驱动程序(Device Drivers)
  • 中断

设备驱动程序

  • 控制I/O设备运行
  • 向硬件控制器发送专门控制命令
  • 操作系统通过设备驱动程序控制设备

基本文件系统

物理块读写
向设备驱动程序发送控制命令
例如:read drive 1,cylinder 72,track 2,sector 10,into memory location 1060

文件组织模块

  • 管理文件、逻辑块和物理块
  • 把文件的逻辑地址转换为物理地址
  • 管理空闲空间
  • 为文件分配物理块

逻辑文件系统

  • 管理文件系统中的元数据
    除了文件数据外的所有结构数据
  • 文件按名存取
  • 文件目录组织管理
  • 把文件名转换为文件ID,文件句柄
  • 管理FCB
  • 存储保护

文件系统实现

物理块(簇):一个或多个(2n)扇区组成,基本文件读写单位。

(物理)分区:磁盘分割成若干个独立的空间,每个空间称为分区
两大类分区:主分区和扩展分区;
主分区:能够安装操作系统的启动分区;
扩展分区:不能直接使用,必须分成若干逻辑分区。

卷(逻辑磁盘):磁盘上的逻辑分区,建立在物理分区上。
一般每个卷可以建立一个文件系统。

一个硬盘至少有一个主分区,最多4个,扩展分区可以没有,最多1个。

两种文件系统:
磁盘文件系统、内存文件系统。

磁盘文件系统

  1. 引导控制块
    包含了系统引导操作系统的各种信息,只有安装操作系统的分区才有。
    在Unix文件系统,UFS:引导块;
    在Windows文件系统,NTFS:分区引导扇区。

  2. 分区控制块
    包含分区信息,例如总的块数、空闲块数、块大小等信息;
    UFS:超级块;
    NTFS:主控文件表。

  3. 目录和FCB

  4. 用户文件
    0x17 文件系统实现_第2张图片
    MBR(主引导记录)存储在硬盘的0柱面、0磁头、1扇区,存储主引导程序等信息,在计算机启动时运行。
    分区表存储了硬盘的分区信息,在这个例子中,有4个分区,在UFS中,主分区的结构如图所示,在Windows的文件系统FAT中,主分区的文件系统结构如图所示。

内存文件系统

由于从磁盘检索和读取文件很耗时,需要在内存建立一个管理使用中的文件的文件系统,通过缓冲技术来提高文件访问的性能,这就是内存文件系统。

包括:

  • 分区表:所有安装分区信息
  • 目录缓冲结构:保存最近访问的目录信
  • 系统打开文件表
  • 进程打开文件表

文件操作需要用到内存文件系统;
目的:通过缓冲技术提高文件系统性能。

虚拟文件系统

目的:为了支持多个文件系统,引入虚拟文件系统(VFS),把多个文件系统整合成一个目录结构,为用户屏蔽了各个文件系统的差异。

  • 提供了一种面向对象的方法来实现文件系统;
  • 为不同类型的文件系统提供了接入VFS的接口;
  • 为用户提供了统一的系统调用接口(API)。

文件系统接口(File system interface)

  • 统一的应用程序访问文件的接口
  • 如:open,close,read,write等

VFS接口(VFS interface)

  • 为各类不同的文件系统定义VFS接口
  • 符合该接口的文件系统都可以接入VFS

网络文件系统NFS

网络文件系统 NFS
用于通过LAN(或WLAN)访问远程文件系统的软件系统的实现或规范
好处:节省存储空间,实现共享。

在下图的网络架构中,客户端可以利用网络文件系统访问在NFS服务器上的文件。
0x17 文件系统实现_第3张图片

网络文件系统 CIFS

即:通用Internet文件系统
在Windows主机之间进行网络文件共享;
CIFS使用客户/服务器模式;

常用文件系统

Windows

  • FAT(File Allocation Table)
  • NTFS(New Technology File System)
  • ReFS(Resilient File System)

Linux

  • Ext(Ext2、Ext3、Ext4)

Mac OS

  • HFS(Hierarchical File System)

CD

  • CDFS

在磁盘上如何为用户文件分配空间,以便有效地使用磁盘空间和快速访问文件,是文件系统性能的关键。

二、连续分配

物理块

  1. 读写存储设备的基本单位
    文件读写操作时,以块为单位进行读写。例如程序需要读1个字节,则OS把包含该字节的一块读入。
    好处:减少读写次数,提高效率。
  2. 存储设备的基本分配单位
    以物理块为单位为文件分配存储空间。
  3. 和内存的页面大小相对应
    页面大小:4KB;
    物理块大小:4KB的倍数(4K/8K/16K/32K/64K)

逻辑块

逻辑块:在文件空间中的块
大小和物理块一致;一个逻辑块存储在一个物理块中。
0x17 文件系统实现_第4张图片

存储空间分配方式

0x17 文件系统实现_第5张图片
连续存储空间分配,和内存的连续分配相似,是指一个文件在磁盘上存储在连续的物理块中;而离散存储空间分配是指一个文件的物理块可以分布在磁盘的各处,类似于内存分配中的分页和分段。

物理块块号

  • 一维空间
  • 从0开始编号
  • 可以根据物理设备的特性进行转换。

连续分配

每个文件在磁盘上占用一组连续的物理块;
FCB仅需给出:起始块号、长度;
0x17 文件系统实现_第6张图片
每一种磁盘分配方式都需要考虑如何把文件内的逻辑地址转换为磁盘上的存储位置。

地址映射

文件在存储时,首先吧文件划分为逻辑块,然后为每个逻辑块分配一个物理块并把逻辑块中的内容写到对应的物理块中。

逻辑地址LA:文件内相对地址(一维)
物理地址(B,D):存在在物理块中的地址(二维)
在这里插入图片描述
物理块大小:S
物理地址:
访问块号B = Q+起始块号
块内偏移D
0x17 文件系统实现_第7张图片

性能分析

优点

  1. 支持随机访问(可直接访问指定块号的物理块)
  2. 存取速度快(上一个块到下一个块移动距离短)
  3. 适用一次性写入操作

0x17 文件系统实现_第8张图片

缺点

  1. 浪费空间(小空间无法分配)
  2. 文件不能动态增长(文件A)
  3. 不利于文件的插入和删除(需要移动数据)

0x17 文件系统实现_第9张图片

连续分配的改进

  1. 改进的连续分配方案(Veritas File System)
  2. 基于扩展的文件系统(局部连续)
  • 扩展是一组连续的磁盘块集合
  • 扩展在文件分配时被分配
  • 一个文件可能包含一个或多个扩展
  • 需要一个指向下一个扩展的指针

三、链接分配

连续分配的问题

连续分配主要用于早期操作系统中。其文件大小动态变化有困难,主要用于容量小、文件不需要频繁修改的文件系统中。

链接分配

离散物理块分配方式

  • 链接分配
  • 索引分配

链接分配

  • 文件信息存放在若干个不连续的物理块中
  • 文件的所有物理块通过指针链接成链表结构

两种链接分配的方式

  • 显式链接
  • 隐式链接

隐式链接

链表的指针隐藏在物理块中;
每个物理块中的指针指向下一个物理块
FCB给出文件首块地址;
文件结束于空指针;
每个物理块用于存放文件信息的空间变小,因为每个物理块需要有一个空间来存放指向下一个物理块的指针,需要减去指针占的空间

  • 减去指针占据的空间
  • 4KB物理块,指针4B:最后存储空间4092B

逻辑地址 LA表示文件内的逻辑地址,这是一个一维的文件内相对地址;
磁盘物理地址是二维地址,用(B,D)表示。
0x17 文件系统实现_第10张图片

性能分析

  1. 优点
    可以离散存放,提高磁盘的利用率;
    可以动态扩充文件大小;
    便于文件的插入和删除操作;

  2. 缺点

  • 无法实现随机访问,访问文件慢;
    访问第i块,需要把0-(i-1)块都读入;
  • 可靠性差:只要有一个指针有问题,后面的物理块都无法访问。
  1. 优化方法:多块集合成组

文件信息隐藏在若干个不连续物理块中的链接分配模式是隐式链接。
磁盘上物理结构为隐式链接结构的文件只能顺序存取

显式链接

隐式链接性能低的原因,主要是指针分散存放,为了读到一个指针而读入整个物理块,读取效率低下。
显式链接中,指针集中存放,把所有指针存放在一张链接表中。
0x17 文件系统实现_第11张图片
显式链接大大提高了检索速度先访问链接表,再访问物理块。

显式链接的链接表一般在文件系统装载时就装入内存,不需要多次读入内存。
显式链接的性能接近于连续分配,大大优于隐式链接,只需要访问磁盘一次就可以读入需要访问的任意一块物理块。

显式链接由于链接表装入内存,所以不能太大
表项16位:
最大216 * 2Bytes = 128KB

表项32位:
最大232* 4Bytes = 16GB

显式链接不适合大容量磁盘。
如4TB磁盘,物理块4KB
链接表大小=(4TB/4KB)*4Bytes=4GB

显式链接例子:FAT

微软最早在MS-DOS中开始使用。
FAT根据指针大小分为早期的FAT12和FAT16,以及现在使用的FAT32和FAT64(exFAT)。

0x17 文件系统实现_第12张图片
FAT32

  • 两份FAT表
  • 每个簇(物理块)固定为4KB~32KB
  • FAT表的表项占据32位
  • FAT表最大表项数232
  • 单个文件不能大于4G
  • FAT32管理的单个最大磁盘空间:512B*232 = 2TB
    0x17 文件系统实现_第13张图片

四、索引分配

隐式链接分配问题

指向下一个块的指针分散在各个块中,访问性能低下。

改进1:文件分配表(FAT)
系统:存放指针的文件分配表
大文件系统会导致文件分配表过大,会浪费内存。

解决方法:分散的FAT
索引表:每个文件一张文件分配表。

索引分配

索引块:存放指向文件每个物理块块号的物理块;
索引块中的第i个项:存放第i个逻辑块对应的物理块块号;
FCB指向索引块。

性能分析

  1. 优点:
  • 支持随机访问(先访问索引块,然后访问具体块)
  • 离散存放,没有碎片
  1. 缺点
  • 需要额外空间存放索引表
  • 磁盘访问时间增加(物理块分布在磁盘各地)

地址映射

逻辑地址LA:文件内相对地址(一维)
物理地址(B,D):存在在物理块中的地址(二维)
物理块大小:S
在这里插入图片描述
0x17 文件系统实现_第14张图片

多级索引

大文件无法用单级索引实现

  • 物理块大小S=4KB
  • 表项大小:4个字节(最多232块)
  • 每个物理块存放的块号数目:4K/4=1K个
  • 单级目录最大文件:1K*4KB=4MB

大于4MB的文件如何存放?
解决方法:多级索引
0x17 文件系统实现_第15张图片
多级索引如何连接这些索引块呢?

链接策略

把索引块通过链表组织(没有长度限制)

  • 访问块号B=索引表中第Q1块索引块中第Q2项存放的块号
  • 块内偏移D=R2
    0x17 文件系统实现_第16张图片

二级索引

多级索引把索引块通过索引组织(有长度限制)

二级索引

  • 外层索引表(一个物理块)
  • 内层索引表(物理块数目=外层索引表的项数)

0x17 文件系统实现_第17张图片
二级索引地址映射:
0x17 文件系统实现_第18张图片

索引和文件大小

假如

  • 物理块大小S=4KB
  • 索引项(块号)大小:4Bytes

n级索引文件大小= (1K)n * 4KB

  • 单级索引:= (1K)1 * 4KB=4MB
  • 二级索引:= (1K)2 * 4KB=4GB
  • 三级索引:= (1K)3 * 4KB=4TB
  • 四级索引:= (1K)4 * 4KB=4PB

联合策略:UNIX(每块4KB)

  • 多种索引混合
  • 0级索引
    FCB中12个指针指向12个块
  • 一级索引
    1K块
  • 二级索引
    1M块
  • 三级索引
    1G块

五、空闲空间管理

文件系统不仅要记录下磁盘上还没有被分配出去的空闲物理块,还需要为新文件分配物理块和回收被删除文件的物理块。
所以文件系统需要包含空闲空间管理模块。

空闲表

  1. 空闲区:连续的未分配物理块集合;
  2. 空闲表
    每个表项对应一个空闲区
    内容包括空闲区的第一块号、空闲块的块数
  3. 空闲表适用连续分配
  4. 分配和回收方式:和内存的连续分配类似
  5. 需要额外空间
    0x17 文件系统实现_第19张图片

空闲链表

  1. 将磁盘上所有空闲块链接在一个链表中
  2. 分配:从链表头依次摘下适当数目的空闲块
  3. 回收:空闲块加入链表尾部
  4. 优点:不需专用块存放管理信息
  5. 缺点:增加/O操作,得到连续空间难

位示图

利用二进制一位(bit)来表示一个块的使用情况。

  • 1:盘块空闲
  • 0:盘块已分配

所有块都有一个二进制位与之对应,所有块对应的位形成位示图。

如下图所示,这个位示图由32个位,4个字节组成。
0x17 文件系统实现_第20张图片
位示图需要额外的空间。例如
block size=212 bytes
disk size=230 bytes(1 gigabytes)n=230/212=218 bits(or 32K bytes)

位示图存放在物理块中;
分配:1->0           回收:0->1比较容易得到连续物理块
Linux和Windows常用的方式

块号计算

已知位示图中位置

  • 第i个字节
  • 第j位
    块号k=i*8+(7-j)

已知块号k

  • 位示图中字节i
    i=[k/8]
  • 该字节中的位j
    j=7-k%8
    0x17 文件系统实现_第21张图片

成组链接法

该方法结合了空闲表和空闲链表;

例子:UNIX系统

  • 将空闲块分成若干组,每100个块为一组;
  • 每组第一空闲块存放空闲块总数、下一组空闲块首块的块号、本组其它空闲块的块号列表;
  • 如果下一组空闲块首块的块号等于0,则该组是最后一组。

0x17 文件系统实现_第22张图片
0x17 文件系统实现_第23张图片
0x17 文件系统实现_第24张图片

空闲块回收

先将释放的空闲块放到第一组;
满100块后,在第一组前再开辟一组;
原来的第一组变成第二组,新组为第一组

一致性检查

文件系统中的磁盘块经过多次分配和回收后,由于程序异常等原因会导致物理块空闲信息的不一致。

每个文件的目录或FCB中会记录这个文件分配到的物理块信息,位示图同样会记录每个物理块是否被使用。
也就是说文件系统中所有的物理块减去文件用掉的,剩余的都是空闲块。但是,有时不是这样的,存在不一致性。

所以,文件系统提供了一致性检查,将目录结构数据与磁盘空闲块结构相比较,纠正发现的不一致。

  • 空闲块在某个文件的物理块中(A)
  • 非空闲块不属于任意一个文件(B)
  • 一个物理块属于多个文件(C)

0x17 文件系统实现_第25张图片

空闲空间整理

  • 把不连续的空闲块集合在一起;
  • 有利于给文件分配连续的物理块;

你可能感兴趣的:(操作系统笔记)