【14】文件系统

1、文件系统概述

操作系统中的文件系统为我们提供了数据的存储、读写、检索、共享与保护等功能

1.1 常见的文件系统

Windows操作系统:FAT32、NTFS
Linux:Ext系列
Mac:HFS系列

1.2 文件系统模型

三层文件系统模型:

三层文件系统模型
操作系统将具有表示名的一组关联信息的有序集合定义为文件,对数据的管理转化为对文件的管理,为了方便用户对文件的存取和检索,在文件系统中还需要定义目录,在目录项中存储文件的一些属性和控制信息,比如名称、权限、文件的物理地址等,文件的存储空间也需要文件系统管理,文件、目录、存储空间构成了文件系统模型最底层的对象

文件系统最终服务于用户,所以最上层是文件系统提供给用户的接口,文件系统模型的中间层是最核心部分,它实现了对对象的管理和操作

1.3 文件系统功能

  • 用户接口
  • 设备接口
  • 存储空间管理
  • 目录管理
  • 地址转换:用户习惯使用文件名这个逻辑地址来标识文件,文件实际上是以物理块(盘块)这种物理地址标识
  • 文件读写管理
  • 文件共享
  • 文件保护

1.4 文件系统在OS中所处的位置

文件系统处于设备驱动程序之上,不与具体硬件打交道,存储设备不同,数据地址的表示方式也不同(比如磁盘是以柱面、磁道、扇区描述数据地址),文件系统为了屏蔽具体存储设备数据地址差异,定义物理块(盘块)为文件的统一单位,文件系统负责文件到物理块的映射,而物理块号到存储设备的数据地址映射则由设备的驱动程序完成

 文件系统在OS中所处的位置

1.5 文件的分类

按组织形式和处理方式分类:

  • 普通文件:文件内容为普通用户数据
  • 目录文件:文件内容为关于目录的信息数据
  • 特殊文件:设备(块设备、字符设备、网络设备)

在Linux系统中,设备也看成文件来管理,设备(块设备、字符设备、网络设备),这样设计使操作系统可以使用统一的接口操作设备和一般的文件,简化了接口的设计,在Linux中通过ls - l命令可以查看文件及目录的详细属性信息,运行结果中的第一个字符代表文件的类型,-表示普通文件,d表示目录文件,b表示块设备文件,c表示字符设备文件

1.6 文件控制块(FCB)

文件系统通过FCB存储用于描述和控制文件的诸多信息,借助FCB的各种信息,操作系统可以对文件施与各种操作,一个文件或目录都有一个唯一的FCB
文件控制块(FCB)FCB包含三类信息:

  • 基本信息类:文件名、物理位置、逻辑结构和物理结构,主要保存了文件的了逻辑和物理的存储信息
  • 存取控制信息类:文件主存取权限、用户存取权限,这部分信息是保证文件的安全性
  • 使用信息类:文件创建和修改日期、当前使用信息(进程对文件的使用情况以及文件的同步情况)
1.6.1 MS-DOS系统的文件控制块

MS-DOS系统的文件控制块

1.6.2 类Unix系统的索引节点(Inode)

在类Unix系统中,将FCB除文件名外的信息重新定义在一个叫Inode的数据结构中,并定义一个编号标识该索引节点,FCB的内容简化为文件名和索引节点,加快了文件的检索速度
类Unix系统的索引节点(Inode)使用ls -il可以查看Linux文件或目录的Inode编号,文件和目录在Linux中当成一种对象来管理,都通过一个目录项来描述

1.7 文件系统的open和close操作

Linux系统,程序调用open操作,open操作会返回一个整数型的文件描述符fd,在内核中,所有打开的文件,其file结构指针存放在files_struct变量中该进程对应的fd_arrary[]数组中,数组的下标就是fd,open操作可以获得fd从而获得文件的file结构,包含了文件的权限、当前位置、标志以及指向dentry类型的指针f_dentry,dentry是该文件的FCB,含有该文件的Inode编号,根据Inode编号可以索引到Inode索引节点,文件系统可以通过file结构变量获取到文件的属性和控制信息

文件系统的open和close操作

task_struct结构体描述了进程的PCB,通过file指针关联该进程所打开的所有文件,文件操作完成之后不再使用时需要通过close函数关闭已打开的文件并释放相应的资源

用户能够打开的文件fd最小是从3开始的,当Linux系统在创建系统时,会为进程分配3个fd,分别是0标准出入、1标准输出、2标准出错,前3个fd被占用

1.8 文件系统如何创建的?

以磁盘为例,磁盘分区格式化时创建了分区的文件系统,在Linux中使用mkfs格式化命令,将hdc6分区格式化Ext2的文件系统,标准的Linux文件系统Ext2使用了以Inode为基础的文件系统,文件系统一开始就将Inode和Block规划好了,block即物理块(盘块)

EXT2文件系统

Ext2文件系统格式化时将分区划分为多个逻辑块组,每个块组都有独立的Inode Block Superblock,经过分区格式化后,分区产生了一个启动扇区Boot Block和多个Block Group区域,启动扇区可以安装引导OS的装载程序,避免覆盖整块硬盘唯一的MBR,实现多重引导的环境

每个block区域分为6个逻辑子区域:

  • 第一个是Superblock区,该区域记录了Ext2文件系统的整体信息,如文件系统所挂接的设备,Inode block的总量、使用量、剩余量以及文件系统的格式等信息;
  • 第二个区是Group Description,描述了每个block group的开始与结束的block号码,以及说明每个区段分别介于哪一个号码间;
  • Block Bitmap是一个表描述分区哪些block可用,即外存空间使用情况的描述表;
  • Inode Bitmap与Block Bitmap类似,记录的是使用和未使用的Inode号
  • Inode table存放Inode的区域
  • Data block存放文件内容的区域

可以使用dumpe2fs命令查看磁盘分区文件系统的详细内容,也可以通过dumpe2f和grep命令的联合操作获得一个Block和Inode的大小


2、文件的逻辑结构

文件在不同层面

文件的逻辑结构是用户所观察到的文件组织形式,用户可以直接处理的数据及其结构,逻辑层的结构是具有逻辑结构的一组对象组成,不同的应用可以使用不同的逻辑结构,以提高文件的检索速度

2.1 文件逻辑结构分类

按文件的组织形式分类:

2.1.1 顺序文件:按照线性顺序组织记录的关系

串结构:各记录逻辑顺序按存入时间排序
顺序结构:各记录逻辑顺序按关键字排序

优点:批量存取效率高;缺点:增修删低效不方便

顺序文件只能顺序读或者顺序写,读/写指针Rptr和Wptr总是指向下一个记录首地址
顺序文件只能通过遍历方式查找与关键字匹配的记录(变长记录文件)

2.1.2 索引文件-建立索引表

为变长记录文件建立一张索引表,表中填入每条记录的关键字、长度以及该记录在逻辑文件中的地址,关键字排序(将变长记录的文件的顺序检索变为对定长记录索引表的随机检索)

优点:支持记录的随机检索、增修删操作效率高
缺点:索引表增加了存储开销

2.1.3 索引顺序文件-建立短的索引表

将记录分为若干组,索引表为每组的第一个记录建立一个索引项,检索时根据索引表键值确定该记录在主文件中的哪一组,再按索引项中的记录指针找到该组,在主文件的组内顺序查找目标记录

优点:支持记录的随机检索,索引表的存储开销适中
缺点:文件检索效率适中

2.1.4 直接文件

根据给定的记录键值,直接获得指定记录的物理地址(键值转换)

哈希文件:使用最广泛的一种直接文件


3、外存分配方式

文件系统的底层设计:文件在外存的分配方式,形成了文件的物理结构,直接影响着文件系统对外存的访问效率

3.1 物理块

将外存的空间抽象起来,并逻辑划分为等大的物理块(盘块),文件也被划分为多个逻辑块,物理块和逻辑块大小相等,大小一般为512B或1024B,以块作为分配和传送信息的基本单位,而物理块(盘块)到具体外设如磁盘地址的映射由磁盘驱动程序完成

3.2 外存分配方式

外存分配方式:文件在外存物理块间的组织关系:

  • 连续组织
  • 链接组织:隐式链接、显示链接
  • 索引组织:单级索引、多级索引、增量式索引
3.2.1 连续组织的外存分配方式

文件的逻辑块存放在外存连续的物理块中,因此在文件分配表(FCB)中,只需要记录文件的第一个逻辑块在外存的物理块号和文件的长度

优点:文件的顺序访问容易,支持文件的随机访问、磁盘存取速度快,寻道次数和寻道时间最少
缺点:易产生外部碎片,降低外存空间的利用率,不利于文件的插入和删除

应用例子:Linux用于扩充内存需要内外存数据交换的磁盘swap区

3.2.2 链接外存分配方式-隐式链接

为每个文件分配不相邻物理块,通过链指针建立物理块关联关系,在文件分配表(FCB)中,也只需记录文件的第一个逻辑块在外存的物理块号和文件的长度

优点:实现了外存有空即用的分配方式,消除了外存空间的外部碎片,空间利用率高,但寻道次数和时间更多,通过链表构建物理块关系有利于文件的插入、删除和文件动态扩充
缺点:只适合文件的顺序访问,盘块的联系通过链表指针构建,可靠性弱

3.2.3 链接外存分配方式-显示链接

微软公司在FAT16(16表示表项占16bit)中采用了显示链接外存分配方式,该方式将物理块链接信息显示的存放在内存中的一张FAT表中,表项序号是物理盘块号,每个表项中存放文件的下一个物理块号(盘块号)的编号,即链接指针

优点:具有隐式链接的优点外,因物理块(盘块)的链接指针集中存放在内存的FAT表中,因此该方式还具有支持文件随机访问的特点,链接关系可以通过备份FAT表保证可靠性
缺点:磁盘容量大时,FAT占用较大的内存空间

应用例子:Windows的FAT文件格式

3.2.3 单级索引的外存分配方式

为每个文件分配一个索引表块,把分配给该文件的所有物理块都记录在索引表块中,文件物理地址指向索引表块

优点:支持随机检索,文件的增删容易
缺点:增加了存储开销

3.2.4 多级索引的外存分配方式

为每个文件分配2级以上索引信息,文件所有物理块记录在最低级索引表块中

优点:提高大文件数据的查找速度
缺点:启动磁盘次数随着索引级数的增加而增多,对中小文件不合适

3.2.5 Unix增量式索引的外存分配方式

在文件磁盘索引节点中,使用0 ~ 12共13个地址项,记录文件的外存地址,i.addr(0) ~ i.addr(9)为直接地址,直接记录文件数据的物理块号,当文件大于10个物理块时,在i.addr(10)中填入该文件的一级索引表块号,一级索引不够用时,在i.addr(11)中填入二级索引的主索引表块号,二级索引不够用时,启用i.addr(12)填入三级索引的主索引表块号
Unix增量式索引


4、文件的目录管理

文件和FCB一一对应,FCB的有序集称为文件目录,一个FCB就是一个目录项,文件目录以文件的形式保存在外存上,称为目录文件,OS将目录当成文件看待,可以说OS通过目录组织诸多的文件
文件目录FCB

4.1 文件检索的基本过程

文件检索的目的是查找到该文件的FCB(文件的属性和控制信息),目录文件存放在外存,可由多个物理块组成,要实现按名存取,需要将目录文件对应的物理块逐步调入内存,遍历目录项中的文件名找到FCB

在Unix系统中FCB仅由两个字段组成,文件名和Inode(唯一编号),Inode存放了除文件名外的FCB内容,这样设计使目录文件大大减小,按名检索速度得到提升,当系统需要Inode信息时,才将该文件的Inode载入内存

4.1.1 磁盘索引节点(磁盘Inode)

存放在磁盘上的索引节点,每个文件有唯一的一个

Unix磁盘索引节点

4.1.2 内存索引节点(内存Inode)

存放在内存上的索引节点,文件打开时将磁盘索引节点拷贝到内存索引结点中,并增加进程当前使用的内容:

增加进程当前使用的内容

4.2 目录管理的基本要求

  • 实现“按名存取”
  • 提高对目录的检索速度
  • 允许文件共享
  • 允许文件重名

4.3 目录结构

4.3.1 单级结构

为所有文件建立一个文件,用线性表的方式组织目录项

优点:简单,易实现
缺点:(1)目录项太多时查找速度慢,平均检索时间长
(2)文件不允许重名,限制用户对文件的命名
(3)不便于实现文件共享

4.3.2 二级目录结构

主文件目录MFD:给出了用户名以及用户子目录所在的物理位置
用户文件目录UFD:给出了该用户所有文件的FCB

优点:提高了检索目录的速度,解决了文件的重名问题和共享问题
缺点:增加了系统空间开销,一个用户下只允许构建单层目录

4.3.3 树形目录结构

主目录称为根目录,其他目录均作为树的分支节点,文件称为树叶

优点:目录层次丰富、结构清晰,便于管理和保护,解决了文件的重名和共享问题,加快了文件查找速度
缺点:增加了系统空间开销

4.4 目录的按名存取

int fd = open("usr/ast/mbox");
read(fd,buffer,count);
  1. 内核根据mbox路径找到mbox的目录项FCB和Inode,同时构建内存FCB和Inode,通过建立file类型变量设置文件的访问模式、文件位置偏移量、打开模式等信息,并提供文件描述符fd作为open的返回值;
  2. 根据fd和file变量执行read读文件操作;

在这里插入图片描述

4.5 目录检索

以Unix文件系统为例,使用线性检索目录的方式

在Unix查找/usr/ast/mbox

  • 线性检索法/顺序检索法:根据路径名顺序查找各级目录;目录检索速度较慢,软件缓存最近访问的目录信息提高检索速度;二分查找、平衡树
  • Hash方法:利用Hash函数直接将文件名转换为索引值直接查找目录表;目录表检索速度快

5、文件存储空间的管理

对磁盘块的管理分为已分配盘块的管理(外存分配方式)、空闲盘块的管理(文件存储空间的管理)

5.1 空闲表法

适用于连续分配方式,与内存动态分区方式相似,为每个文件分配一块连续的存储空间,称为空闲区,为外存上所有的空闲区建立一张空闲表,每个空闲区对应一个表项,存储该空闲区的第一个盘块号和空闲盘块的块数

存储空间的分配:采用首次适应算法,循环首次适应算法等
存储空间的回收:根据回收区前后是否有相邻空闲区要考虑空闲区合并问题

5.2 空闲链表法

由操作系统保管链头、链尾指针

空闲盘块链:以空闲盘块为单位进行链接
分配:适用于离散分配方式,空闲盘块中存放指向下一个空闲盘块的指针,为一个文件分配多个盘块需要多次重复操作
回收:将回收的盘块的依次挂到链尾,并修改链尾

空闲盘区链:连续的空闲块形成一个空闲区,以空闲区为单位进行链接
分配和回收与空闲表法类似,只是以链表的形式管理空闲区,既适用于离散,也适用于连续分配方式

5.3 位示图法

利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有盘块都有一个二进制位与之对应,值为“0”表示盘块空闲,值为“1”表示盘块已分配

盘块号(位示图第i行,第j列)计算:b = n * (i - 1) + j,n表示每行的行数

优点:从位示图中很容易找到一个或一组相邻接的空闲盘块;占用空间少,节省许多磁盘的启动操作;

5.4 成组链接法

Unix系统将空闲表和空闲链表法相结合,形成的一种空闲盘块管理法,适合大型文件系统,将空闲盘块分成组,在每组第一块存放下一组空闲块的情况,将每组第一块链接起来,链表本身短,占空间小,分配、释放快

空闲盘块号栈:

  • 用来存放当前可用的一组空闲盘块的盘块号,以及栈种尚有的空闲盘块数N
  • S.free(0)是栈底,栈满时是栈顶是S.free(99)

空闲盘块的分配

  • 检查栈是否有锁,如无从栈顶分一盘快给用户
  • 栈指针下移,空盘数减一

如果分配的盘块是栈底S.free(0),需要调用磁盘读过程,把盘块中的内容读入栈中,再行分配

空闲盘块的回收:将回收盘块的盘块号记入空闲盘块记入栈顶,空闲盘块数加1
如果此时空闲盘块数已经达到100了,就将现在空闲盘块栈中信息记入新回收的块(作为第一组第一个)


6、文件的共享和保护

文件共享是指系统允许多个用户(进程)访问同一文件,系统中只需要保留该共享文件的一个副本

6.1 基于索引节点的共享

索引节点专门保存除文件名之外的文件物理地址及其他文件属性,在用户的文件目录中保存的是文件名和指向索引节点的指针,因此不同的文件通过指向相同的文件的索引节点就可以实现共享

缺陷 :当一个用户想要删除该文件时,不能直接将它删除,只有链接计数器为0时,才能真正删除

6.2 基于符号链的共享

只有文件主才拥有指向文件索引结点的指针,而共享该文件的其他用户只有该文件的路径名,通过符号链共享也不会增加链接计数器count的值

  • 符号链接要建立新的符号链接文件,共享开销大
  • 符号链接的链接计数不会增加
  • 符号链接与原文件拥有不同的索引结点号,表明它们是不同的文件

在Linux系统中,通过ln命令可以建立基于索引结点的共享文件,用到的是同一个文件,称为硬链接,ln -s命令建立的是一个基于符号链的共享文件,另外建立了一个文件,只不过文件内容保存指向共享文件的符号链,称为软链接

Windows快捷方式也是符号链接,通过快捷方式找到共享文件,如果共享文件被删除了,链接失效了,符号链接也就失去意义,可以自行删除

6.3 文件保护

6.3.1 硬件系统可靠性

备份技术:通过周期性转储或者增量性转储技术把所有文件的内容转存到某种介质上,通常是磁带或磁盘

磁盘容错技术:通过不同级别的容错技术,防止因硬件故障而造成的文件数据破坏,如磁盘镜像或磁盘双工用于防止磁盘驱动器或磁盘控制器故障而造成的文件破坏

6.3.2 软件系统安全性

文件本身不得被未经文件主授权的任何用户存取,而授权的用户也只能在存取权限内使用

口令保护:安全级别低,为文件设置一个口令,口令一般存放在文件的FCB中,用户访问文件前先输入口令,对比后如果正确则允许访问

加密保护:使用某个“密码”对文件进行加密,用户访问文件时需要提供正确的密码

访问控制:在每个文件的FCB中增加一个访问控制表,记录各个用户可以对文件执行哪些操作

6.3.3 数据一致性

同一数据存放在不同的文件中,在任何情况下都应该保证数据是相同的,对一个文件修改时应对不同的文件都统一修改,才能保证数据的一致性。修改数据的流向是:磁盘块->内存->写回磁盘块,若在写回之前,系统崩溃,则文件系统数据出现不一致

系统应配置保证数据一致性的软件和硬件
硬件:稳定存储器
软件:事务、重复数据一致性检查


7、Linux文件系统

文件系统是OS对文件进行组织的方法和数据结构,也就是在存储设备上对文件进行组织的方法,常见的文件系统有ext、NTFS、JFS等,Linux支持不同的文件系统,所有的文件系统按树型结构进行组织,将一个文件系统的顶层目录挂到另一个文件系统的子目录上,称为安装,该子目录称为安装点,EXT是Linux的标准文件系统,系统将它的磁盘分区作为系统的根文件系统,EXT以外的系统则安装在根文件系统下的某个目录,成为系统树形结构中的一个分支,可以用mount命令安装一个文件系统

文件结构是文件存放在磁盘存储设备上的组织方式,主要体现在对文件和目录的组织上,Linux采用标准的目录结构,有助于对文件系统和不同用户进行统一管理

Linux树形文件结构

一切皆是文件,这是Unix/Linux设计的基本设计哲学之一,不仅存放在磁盘上的普通的文件是文件,设备也被看做文件,目录是文件,套接字也是文件,虽然类型不同,但文件系统对其提供了统一的操作界面,如open(), read(), write()等

可以通过ls命令查看/dev目录下文件的详细信息ls -l /dev

/dev目录下文件的详细信息

7.1 虚拟文件系统(VFS)框架

Linux文件系统的同一框架VFS,虚拟文件系统所提供的抽象界面主要由一组标准的抽象的操作构成的,如read(), write(), open等,这些函数以系统调用的形式供用户程序调用,VFS根据具体的请求链接到具体的文件系统

7.2 索引节点(inode)和数据块(block)

文件存储在磁盘上,磁盘的最小存储单位称为扇区,每个扇区存放512个字节,OS读取硬盘时一次性连续读取多个扇区(一个块),由多个扇区组成的块是文件读取的最小单位(常见为4kB,也就是连续8个扇区)

描述文件属性的索引节点(inode),可以用stat命令,查看某个文件的inode信息,查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令,

Unix/Linux系统内部不使用文件名,而使用inode号来识别文件,表面上用户通过文件名来打开文件,实际上内核分三步:①内核中通过文件名找到对应的inode号 ②通过inode号获取inode信息 ③根据inode信息找到文件数据所在的block,从块中把这个数据读出来

7.3 目录文件

在Linux系统中,目录也是一种文件,目录结构就是一系列目录项(dirent)的列表,每个目录项由两方面组成,所包含文件的文件名以及该文件名对应的inode号码

ls命令只列出目录文件中的所有文件名,ls -i列出整个目录文件,即文件名和inode号,如果要查看文件的详细信息,就必须根据inode号,访问inode节点,读取信息,ls -l命令列出文件的详细信息,目录文件的r/w权限都是针对目录文件本身,如果只有读权限只能获取文件名,无法获取其他信息;读取inode信息需要目录文件的执行权限(x)

7.4 进程与打开的文件

内核有两个数据结构描述文件:一个是文件描述符用files_struct结构来记录文件描述符的使用情况,称为用户打开文件表,表的索引就是文件描述符,是进程的私有数据,数组的第0,1,2三个下标分别表示三个标准的输入、输出和错误文件,3分配给新打开的文件;进程打开的文件用file来描述,每一个文件描述符指向file结构,真正描述打开的文件的是file结构,保存相关文件的inode元信息

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值