操作系统 (五): 文件系统

本文为《现代操作系统》的读书笔记

目录

  • 引言
  • 文件和文件系统
    • 文件、记录和数据项
    • 文件系统模型 (File System)
  • 文件逻辑结构
    • 文件逻辑结构的类型
    • 顺序文件
    • 索引文件
    • 索引顺序文件
  • 外存分配方式
    • 连续分配 (顺序分配)
    • 链接分配
    • 索引分配
  • 目录管理
    • 文件控制块和索引结点
    • 目录结构
    • 目录查询技术
      • 顺序检索方法 (线性检索法)
      • Hash 方法
    • FAT32 文件系统实例
  • 文件存储空间的管理
    • 空闲表法 (连续分配)
    • 空闲链表法 (连续分配)
    • 位示图法
    • 成组链接法
  • 文件共享与文件保护
    • 基于索引节点的共享方式
    • 利用符号链实现文件共享
  • 数据一致性控制
    • 磁盘容错技术
      • 第一级容错技术 SFT - I
      • 第二级容错技术 SFT - Ⅱ
      • 第三级容错技术 (基于集群技术的容错功能)
    • 数据一致性控制
      • 事务
      • 重要数据结构的一致性检查

引言

  • 文件系统:把信息以文件的形式存储在磁盘或其他外部介质上
  • 需解决的问题:
    • (1) 用户角度:文件系统如何呈现在其面前:一个文件由什么组成,如何命名,如何保护文件,可以进行何种操作等等
    • (2) 操作系统角度:文件目录怎样实现,怎样管理存储空间,文件存储位置,磁盘实际运作方式 (与设备管理的接口) 等等
    • (3) 文件系统的作用: 提供高效、快速、方便的信息存储和访问功能; 为应用程序提供逻辑抽象 (虚拟机); 为磁盘空间提供管理机制 (资源管理器)
      • 在磁盘的情况下,典型的抽象是包含了一组已命名文件的一个磁盘。每个文件可以打开进行读写操作,然后进行读写,最后关闭文件。诸如具体磁道,扇区,磁头等细节,不应该出现在提供给应用程序员的抽象描述中

文件和文件系统

文件、记录和数据项

数据的组成

  • 数据项: (1) 基本数据项: 用于描述一个对象的某种属性的字符集,是数据组织中可以命名的最小逻辑单位; (2) 组合数据项 / 组项: 由若干个基本数据项组成
    • e.g. 基本数据项: 用于描述学生的基本数据项-学号、姓名、年龄等; 工资是个组项,由基本工资、工龄工资和奖励工资等基本项组成
  • 记录: 一组相关数据项的集合,用于描述一个对象在某方面的属性
  • 文件: 文件系统中的最大数据单位
    • 按文件的逻辑结构可分为有结构文件 (记录式文件,由若干个相关记录组成) 和无结构文件 (流式文件,即字符流,按二进制读写)
    • 按组织形式和处理方式可分为:(1) 普通文件: 由 ASCII 码或二进制码组成的字符文件; (2) 目录文件: 由文件目录组成,用来管理和实现文件系统功能的系统文件; (3) 特殊文件: 系统中的各类 I/O 设备
      在这里插入图片描述

文件系统模型 (File System)

在这里插入图片描述

  • 文件系统通常向用户提供两种类型的接口:
    • (1) 命令接口。这是指作为用户与文件系统交互的接口。 用户可通过键盘终端键入命令,取得文件系统的服务
    • (2) 程序接口(系统调用接口)。这是指作为用户程序与文件系统的接口。 用户程序可通过系统调用来取得文件系统的服务

文件逻辑结构

  • 文件系统设计的关键要素:记录构成文件的方法将文件存储到外存的方法
  • 对任一文件存在着两种形式的结构:
    • 文件的逻辑结构 (文件的组织): 从用户观点出发,所观察到的文件组织形式,是用户可以直接处理的数据及结构,它独立于物理特性
    • 文件的物理结构 (文件的存储结构): 文件在外存上的存储组织形式,与存储介质的存储性能有关,还和所采用的外存分配方式有关 (分为顺序链接索引结构)
    • 文件的逻辑结构和物理结构都将影响文件的检索速度

文件逻辑结构的类型

有结构的记录式文件

  • 文件构成:由一个以上的记录构成
  • 记录长度:分为定长和变长
  • 分类(按记录的组织方式):
    • 顺序文件: 定长 / 变长记录按某种顺序排列形成
    • 索引文件: 针对变长记录
    • 索引顺序文件: 为文件建立一张索引表,为每组记录的第一个记录设置一个表项

无结构的流式文件

  • 文件构成:由字符流构成。大量的源程序、 可执行文件、 库函数等, 所采用的就是无结构的文件形式,即流式文件
  • 长度:以字节为单位(通用计算机寻址的最小单位)
  • 访问:对流式文件的访问,则是采用读写指针来指出下一个要访问的字符
  • 注:在 UNIX 系统中,所有的文件都被看作是流式文件;即使是有结构文件,也被视为流式文件;系统不对文件进行格式处理。流式文件相比有结构的记录式文件好处:更加方便、OS 代码更加可靠、灵活,用户编程也更加方便,可以把流式文件看作是记录式文件的一个特例

顺序文件

逻辑记录的排序

  • 串结构记录顺序与关键字无关,按存入时间的先后排列
  • 顺序结构:所有记录按关键字排列

对顺序文件的读、写操作

在这里插入图片描述


顺序文件的优缺点

  • 优点: 顺序存取速度较快 (批量存取)。对定长记录,还可方便实现直接存取 (随机存取)
  • 缺点: 对变长记录,直接存取低效 (必须顺序查找);不利于文件的动态增长

索引文件

  • 索引文件为变长记录文件建立一张索引表以解决对变长记录文件难以进行直接存取的问题 (若索引表很大,可建立多级索引)
    在这里插入图片描述

  • 优点: 通过索引表可方便地实现直接存取,具有较快的检索速度; 易于进行文件的增删
  • 缺点: 索引表的使用增加了存储开销;索引表的查找策略对文件系统的效率影响很大

索引顺序文件

  • 为顺序文件建立一张索引表 (并不是为每一个记录都建立索引,像字典一样) 来解决变长记录文件的直接存取低效且存储费用增加的问题
    在这里插入图片描述

  • 优点: 通过索引表可方便地实现直接存取,具有较快的检索速度; 易于进行文件的增删
  • 缺点: 索引表的查找策略对文件系统的效率影响很大

外存分配方式

  • 文件的物理结构即文件的外存分配方式; 要考虑的主要问题:
    • 如何有效地利用外存空间、如何提高对文件的访问速度

连续分配 (顺序分配)

  • 每一个文件占用一个连续的磁盘块的集合, 从而成为一种物理上的顺序文件; 即, 把逻辑文件中的记录顺序地存储到邻接的各物理块,在目录项的“文件物理地址”字段中记录该文件的第一个记录所在盘块号和文件长度
    • 这样形成的文件结构称为顺序文件结构,此时的物理文件称为顺序文件
    • 邻接的物理块一般在同一条磁道上,所以不必移动磁头
      在这里插入图片描述

碎片问题

  • 随着文件建立时空间的分配和文件回收时空间的回收,将使磁盘空间分割成许多小块,形成外存碎片
  • 碎片压缩:
    在这里插入图片描述

连续/顺序分配优缺点

  • 优点:顺序访问容易、速度快;可以随机存取
  • 缺点:要求连续的存储空间。浪费空间:几次动态存储分配后就出现零头问题;紧凑又要花费大量机器时间; 必须事先知道文件长度,不能动态增长,不利于插入删除
  • 适用:简单应用环境,已知文件数量和大小; CD-ROM, DVD

链接分配

  • 将一个逻辑文件存储到外存时将文件装到多个离散的盘块中,通过每个盘块上的指针将同属于一个文件的盘块链成一个链表。这样形成的物理文件称为链接文件
    • 每个文件是一个磁盘块的链接列表:块可以分散在磁盘各处
    • 优点:采用离散分配消除了外部碎片,显著提高了外存利用率;当文件动态增长时,动态分配盘块,不需要预先知道文件的大小;对文件增删改方便

隐式链接

  • 在文件目录的每一个目录项中含有指向链接文件第一个盘块和最后盘块的指针,每个盘块内含有指向下一盘块的指针
  • 缺点:只适合顺序访问,对随机访问低效; 可靠性差,只要盘块指针故障,便使整个链断开; 每个盘块设一指针,占用较大的空间
    • 提高检索速度减少指针占用磁盘空间:将几个盘块组成一个,盘块分配以簇为单位,链接文件中每个元素以簇为单位,但增大了内部碎片
      在这里插入图片描述

显式链接

  • 文件分配表 FAT (File Allocation Table): 把用于链接文件各物理块的指针,显式地存放在内存的一张链接表 (FAT)中。该表在整个磁盘仅设置一张;表的序号是物理块号,从 0 0 0 开始直到 N − 1 N-1 N1 N N N 为盘块总数。在每个表项中存放链接指针,即下一个盘块号
  • 在链接表中,每条链的链首指针对应的块号(属于某一个文件的第一个盘块号)作为文件地址填入相应文件的 FCB (File Control Block,文件控制块)的 “物理地址” 字段中
    • 优点:除了前述链接分配的一般优点外,还由于 FAT 表在内存,大大提高了检索速率,减少访问磁盘次数
    • 缺点:FAT 表中每个盘块一项,占用大量内存
      在这里插入图片描述

文件 A, B 均占用 3 个盘块


链接分配的优缺点

  • 优点: 无外部碎片,没有磁盘空间浪费; 无需事先知道文件大小。文件动态增长时,可动态分配空闲盘块。对文件的增、删、改十分方便
  • 缺点: (1) 不能支持高效随机/直接访问,仅适合于顺序存取; (2) 需为指针分配空间。(隐式链接); (3) 可靠性较低(指针丢失/损坏); (4) 文件分配表 FAT(显式链接)需占用较大的内存空间

索引分配

  • 为每一个文件分配一个索引块 (表),再把分配给该文件的所有块号,都记录在该索引块中。该索引块的地址由该文件的目录项指出

单级索引分配

  • 通常用一专门的盘块作为索引表,存放分配给该文件的所有盘块号。当打开一文件时不需要把整个 FAT 表调入内存,只要把该文件对应的索引表调入内存即可。建立文件时,在文件目录的表项中填上指向该索引块的指针
    • 特点: 需要索引块,可能要花费较多的外存(一个盘块可放成百甚至上千个盘块号); 可随机存取(直接访问); 可以动态分配而无外部碎片; 对于小文件采用索引分配方式,其索引块的利用率极低
      在这里插入图片描述

多级索引分配

  • 对于大型文件,一个索引块可能容纳不下所有的盘块号,则可再分配一个索引块继续装入盘块号, …., 直到装完所有的盘块号; 最后通过链指针将各索引块链接起来;但若文件太大,索引块很多,效率很低,此时可为索引块再分配一个索引块,装填索引块的盘块号。于是形成二级索引分配方式
    • 假设每个盘块大小为 1KB,每个盘块号占 4 个字节,则在一个索引块中可放 256 个文件物理块的盘块号。在两级索引时,最多可包含的存放文件的盘块的盘块号总数为 256 × 256 = 64 K 256\times256=64K 256×256=64K 个盘块号。可以得出:采用两级索引时,所允许的文件最大长度为 64MB
      在这里插入图片描述

混合索引 (UNIX 文件系统采用)

  • 每个文件的索引表为 13 个索引项。最前面 10 项直接登记存放文件信息的物理块号 (直接寻址),如果文件大于 10 块,则利用第 11 项指向一个存放其他盘块号的物理块 (一次间接寻址),对于更大的文件还可利用第 12 和第 13 项作为二次和三次间接寻址
    在这里插入图片描述在这里插入图片描述

目录管理

  • 目录是一种数据结构,它给出系统中每个文件与其物理位置之间的映射关系

文件控制块和索引结点

文件控制块目录文件

  • 文件控制块 (FCB) 是用于描述和控制文件的数据结构,它存放了为管理文件所需的所有有关信息 (文件属性),是文件存在的标志。文件管理程序借助于文件控制块中的信息,实现对文件的各种操作
  • 文件与文件控制块一一对应,把文件控制块的有序集合称为文件目录 (目录文件)。 一个文件控制块就是一个文件目录项

FCB 内容

  • 基本信息类:文件名,文件号,用户名,文件物理地址文件长度,文件逻辑结构,文件物理结构
  • 存取控制信息
  • 使用信息类:文件的建立日期,保存期限,最后修改日期,最后访问日期,文件类型,文件属性,共享计数
    在这里插入图片描述

索引结点

  • 文件目录通常存放在磁盘上,当文件多时,目录项可能占用多个盘块,查找速度慢,查找需访问的盘块多,效率低
    • 解决:查找是按文件名,因此将文件名和文件描述信息分开,分别放在目录项和索引结点中,检索时,只将目录项调入内存,找到后,将该项中的索引结点调入即可
  • 磁盘索引结点 (磁盘上,每个文件一个):主要包括:文件主标识,文件类型,文件存取权限,文件物理地址,文件长度,文件连接计数,文件存取时间
  • 内存索引结点 (内存,从磁盘索引结点拷入信息):主要包括:索引结点编号,状态,访问计数,文件所在设备的逻辑设备号,链接指针
    在这里插入图片描述

目录结构

  • 目录结构的组织,关系到文件系统的存取速度,也关系到文件的共享性和安全性

  • (1) 单级目录结构: 在整个系统中,为所有文件建立一个目录文件 (组成一线性表),每个文件占一个目录项; 为表明每个目录项是否空闲,设置一个状态位
    • 创建新文件: 查所有目录项,看新文件名是否唯一;在目录中去找出一空目录项;把新文件名、物理地址和其他属性填入目录项中,并置状态位为 1
    • 删除文件: 在目录中找到该文件的目录项,从中找到该文件的物理地址,对它们进行回收;再清除其所占用的目录项 (置状态位为 0)
    • 优点: 简单,实现了按名存取; 缺点: 限制了用户对文件的命名 (不允许重名); 文件平均检索时间长 (查找速度慢); 限制了对文件的共享
    • 适用于单用户环境
      在这里插入图片描述
  • (2) 两级目录: 为每一个用户建立一个单独的用户文件目录 UFD (User File Directory)。它由用户所有文件的文件控制块 (FCB) 组成; 在系统中再建立一个主文件目录 MFD (Master File Directory);在主文件目录中,每个用户文件目录都占有一个目录项;目录项中包括用户名和指向该用户目录文件的指针
    • 创建新文件: 用户要创建新文件,OS 检查该用户的 UFD,判定在该 UFD 中是否已有同名的另一个文件。若有,用户必须为新文件重新命名;若无,便在 UFD 中建立一新目录项,将新文件名及其有关属性填入目录项中,并置其状态位为 1
    • 删除文件:OS 查找该用户的 UFD,从中找出指定文件的目录项,在回收该文件所占用的存储空间后,将该目录项删除
    • 优点: 提高了检索目录的速度; 在不同的用户目录中, 可以使用相同的文件名; 不同用户还可使用不同的文件名来访问系统中的同一个共享文件; 缺点:增加了系统开销
      在这里插入图片描述
  • (3) 多级目录结构: 在两级目录结构的基础上,允许用户再创建自己的子目录及子目录的子目录… (查找文件时,可以按绝对路径相对路径查找)
    • 优点:层次结构清晰,便于管理和保护;有利于文件分类;解决重名问题;提高文件检索速度;能进行存取权限的控制;便于实现文件共享
      在这里插入图片描述

目录的其他实现方法

  • 哈希表算法: 目录项信息存在一哈希表中,搜索时根据文件名计算哈希值,得到一个指向表中文件的指针
  • B+ 树 (NTFS 文件系统就采用了 B+ 树)

目录查询技术

  • 当用户要访问一个已存文件:
    • (1) 利用文件名查找文件目录,找出 FCB 或者 i i i 节点
    • (2) 找到 FCB 或者 i i i 节点记录的文件物理地址,换算出物理位置,然后启动磁盘操作,将所需文件读入
  • 目录检索方式: 线性检索法HASH 方法

顺序检索方法 (线性检索法)

  • 单级目录中,利用用户提供的文件名,用顺序查找法直接从文件目录表中找到指名文件的目录项
  • 树型目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时须对多级目录进行查找
    • e.g. 查找 /usr/ast/mbox 的步骤
      在这里插入图片描述

Hash 方法

  • 在建立 Hash 索引文件目录后,系统利用用户提供的文件名并将它转换为文件目录的索引值,再利用该索引值到目录中查询

FAT32 文件系统实例

基本概念

  • 扇区 (Sector): 磁盘空间被分为扇区,扇区是指可寻址的大小固定的块
  • (Cluster): 用于磁盘空间管理的基本单元,簇的大小是不固定的,但都是物理扇区大小的整数倍
  • 分区 (Partition): 磁盘上连续扇区的集合,分区表或者其他的磁盘管理数据库保存了分区的起始扇区和其他属性

FAT 分区的组织结构图

  • 引导扇区包括引导代码BPB 参数 (BIOS Paramter Block)
  • FAT 区: 每个 FAT 卷都有至少一个 FAT 表 (一般有两个相同的 FAT 表) 构成 FAT 区,每个 FAT 表由若干个 FAT 项构成,每个 FAT 项对应着卷中每个簇的使用情况(FAT 文件系统首簇号为 2)(可以把文件分配表看成一个整型数组,索引代表磁盘分区的一个簇号,值表示该簇的使用情况)
    在这里插入图片描述

目录项 (FCB) 的结构

  • FAT 卷中每个文件都有一个目录项。要注意的是目录在 FAT 卷中也被认为是一种文件,其文件属性会被定义为目录,其起始簇号所指向的簇是一个包含若干个目录项目的目录
    在这里插入图片描述

文件存储空间的管理

  • 文件存储空间的管理: 为新创建的文件分配外存空间 (连续分配 / 离散分配); 外存分配的基本单位磁盘块而非字节
    • 对于文件系统,当文件较小时 (1~4个盘块) 多采用连续分配,当文件较大时采用离散分配方式

空闲表法 (连续分配)

  • 空闲表法为每个文件分配一块连续的存储空间 (类似于内存的动态分区分配)。系统为所有的外存空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中包括表项序号,该空闲区的第一个盘块号,该区的空闲盘块数等信息。将所有空闲区按其起始盘块号递增的次序排列 (可采用首次适应算法循环首次适应算法等)
    在这里插入图片描述

空闲链表法 (连续分配)

  • 空闲盘块链:将磁盘上所有的空闲空间以盘块为单位建立链表。分配和回收非常简单,但为文件分配空间时可能要重复操作多次
  • 空闲盘区链:将磁盘上所有的空闲盘区 (每个盘区包含若干盘块) 建立链表。分配时多采用首次适应算法。为了提高速度可采用显式链接方法,即在内存中为空闲盘区建立一张链接表。回收时也要考虑与相邻盘区合并的问题

位示图法

  • 用二进制表示磁盘中某一的使用情况。“0” 表示空闲,“1” 表示已分配,或者相反。磁盘上所有盘块都有一个二进制位与之对应。所有盘块对应的位构成一集合,称为位示图
    • 通常用 m × n m×n m×n 个位构成位示图。 m × n m×n m×n 等于盘块总数
    • 优点: 容易找空闲相邻的空闲盘块 (位示图的相邻位均为 0);位示图占用空间少,可保存在内存
  • 盘块的分配: 顺序扫描位示图,从中找出一个或一组其值为 “0” 的二进制位,并将其转换成与之相应的盘块号 (将二进制位的行列数转换为盘块号);修改位示图,令 m a p [ i , j ] = 1 map[i,j]=1 map[i,j]=1
  • 盘块的回收: 将回收盘块的盘块号转换成位示图中的行号和列号,修改位示图,令 m a p [ i , j ] = 0 map[i,j]=0 map[i,j]=0

成组链接法

参考:成组链接法

  • 空闲表法和空闲链表法不适用于大型文件系统,因为空闲表和空闲链表太长。UNIX 将上述两种方法结合而成的成组链接法

  • (1) 先将文件区中的所有空闲盘块,分成若干个组
    • 比如将每 100 个盘块作为一组。假定盘上共有 10000 个盘块,每块大小为 1KB,其中 201 201 201 ~ 7999 7999 7999 号盘块用于存放文件,即作为文件区,这样最末一组盘块号应为 7901 7901 7901 ~ 7999 7999 7999 号 (保证之前的组都是 100 个盘块);次末组为 7801 7801 7801 ~ 7900 7900 7900,…,第二组的盘块号为 301 301 301 ~ 400 400 400;第一组为 201 201 201 ~ 300 300 300
  • (2)每一组的盘块总数 N N N 和该组所有盘块号记入其前一组的第一个盘块的 S . f r e e ( 0 ) S.free(0) S.free(0) ~ S . f r e e ( 99 ) S.free(99) S.free(99) (如下图所示,每一列都是一组,最右边为最后一组。第一组的信息由空闲盘块号栈 / 超级块记录),这样,由各组的第一个盘块可链成一条链。将第一组的盘块总数和所有的盘块号,记入空闲盘块号栈中,作为当前可供分配的空闲盘块号。最末一组只有 99 个盘块,其盘块号分别记入其前一组的 S . f r e e ( 1 ) S.free(1) S.free(1) ~ S . f r e e ( 99 ) S.free(99) S.free(99) 中,而在 S . f r e e ( 0 ) S.free(0) S.free(0) 中则存放 0,作为空闲盘块链的结束标志
    • 解释:如下图所示,首先来看左边绿色的空闲盘块号栈,这是唯一进入内存的一组,只有它会占据存储空间,其中 S . f r e e = 100 S.free = 100 S.free=100 表示该组有 100 个空闲块,再往下看,第 0 号对应的是 300,它指向 300 号对应的磁盘块,这里的 300 号盘块其实是一个类似 ”空闲盘块号栈“ 的结构。再看第 1 ~ 99 对应的号,它们指向黄色的盘块,这些块里保存的才是真正的可用的空闲块,也就是说每组中只有 99 个块可用。尽管如此,每组还是有 100 个块的 (因为用去一个块记录其他 99 个块并且保存指向下一组的链接)。特别要注意的是,最后一组的下一组盘块号不是没有么,我们这里采用的是结束标记 “0”,作为空闲盘块链的结束标志,也就是最右边一个蓝色块的第二项为 0
      在这里插入图片描述

空闲盘块的分配与回收

  • 盘块分配:首先检查空闲盘块号栈是否上锁,如未上锁,便从栈顶取出一空闲块号将与它对应的盘块分配给用户,然后栈顶指针下移一格 ( N N N 减一,因此这里 N N N 兼作栈顶指针)。若该盘块号已是栈底,即 S . f r e e ( 0 ) S.free(0) S.free(0), 这是当前栈中最后一个可供分配的盘块号。由于在该盘块号所对应的盘块中记有下一组可用的盘块号,因此,需调用磁盘读过程,将栈底盘块号所对应盘块的内容读入栈中,作为新的盘块号栈的内容,并把原栈底对应的盘块分配出去
  • 盘块回收:将回收盘块的盘块号记入空闲盘块号栈的顶部,并执行空闲盘块数加 1 操作 ( N + 1 N+1 N+1)。当栈已满时 ( N = 100 N=100 N=100),便将现有栈中的 100 个盘块号记入新回收的盘块中,再将其盘块号作为新栈底
  • 特点:空白块号的登记不占用额外空间、绝大部分分配和释放工作都在主存进行、把总块数作为空白块栈的指针使用,是理想的存储结构,效率高

文件共享与文件保护

  • 文件共享:一个文件被多个用户或程序使用
    • 目的:节省时间和存储空间,减少了用户工作量; 进程间通过文件交换信息
  • 共享形式
    • 被多个用户使用,由存取权限控制
    • 被多个程序使用,但各用自己的读写指针
    • 被多个程序使用,但共享读写指针

基于索引节点的共享方式

  • 树型结构的目录中,当有两个 (或多个) 用户要共享一个子目录或文件时,必须将共享文件或子目录链接到两个 (或多个) 用户的目录中,以便能方便地找到该文件 (此时该文件系统的目录结构,已不再是树型结构,而是个有向非循环图)
    • 如下图所示,如何建立 B B B 目录与 C C C 目录到 共享文件 (带 ? ? ? 者) 之间的链接呢?
      • 如果在文件目录中包含了文件的物理地址,即文件所在盘块的盘块号,则在链接时,必须将文件的物理地址拷贝到 B B B 目录中去,但如果以后 B B B C C C 还要继续向该文件中添加新内容,也必然要相应地再增加新的盘块,这须由附加操作 A p p e n d Append Append 来完成。而这些新增加的盘块,也只会出现在执行了该操作的目录中。这种变化对其他用户而言是不可见的,因而新增加的这部分内容已不能被共享
        在这里插入图片描述
      • 解决:引入索引结点,将文件的物理地址和其他的属性放在索引结点中,只在目录项中存放文件名和指向索引结点的指针。由任何用户对文件进行 A p p e n d Append Append 操作或修改,引起相应索引结点内容的改变
        • 索引结点中有链接计数器。只有计数器值为 0,才能删除文件,同时也将删除索引结点 (悬空指针问题: 文件拥有者不能删除自己的文件,否则将留下指向该结点的悬空指针,造成该结点再分配时,系统出错;为此,拥有者只能清除自己的目录项,且要为其它共享者无端付费,直至其它共有者清除该文件)
          在这里插入图片描述
richard@richard-ubuntu:~/tmp/link_test$ ls -l
-rw-rw-r-- 1 richard richard 0  6月 19 21:22 a
richard@richard-ubuntu:~/tmp/link_test$ ln a b	# 创建硬链接
richard@richard-ubuntu:~/tmp/link_test$ ls -l
-rw-rw-r-- 2 richard richard 0  6月 19 21:22 a	# 可以看到,链接数由 1 变成了 2
-rw-rw-r-- 2 richard richard 0  6月 19 21:22 b
richard@richard-ubuntu:~/tmp/link_test$ rm a	
richard@richard-ubuntu:~/tmp/link_test$ ls -l	# 删除 a 后,b 依然存在
-rw-rw-r-- 1 richard richard 0  6月 19 21:22 b

利用符号链实现文件共享

  • 建立符号链接文件, 它是一种特殊类型的文件,其内容是被链接文件的路径名。建立符号链接文件,并不影响原文件,实际上它们各是一个文件;只有文件主才有指向索引结点的指针,而其他共享用户只有该文件的路径名,文件主删除文件,不会有悬空指针
    • 缺点:空间和时间开销更大 (读共享文件,可能多次读盘;符号链文件本身需配置索引结点)
    • 优点能链接世界上任何机器中的文件 (甚至原文件是在其他计算机上)

  • 说明:两种链接方式,都允许文件名不同,即每个用户都可以使用自己的路径名去访问共享文件。当我们去遍历整个文件系统时,将会多次遍历到该共享文件

数据一致性控制

磁盘容错技术

  • 通过增加冗余的磁盘驱动器、磁盘控制器,来提高系统可靠性

第一级容错技术 SFT - I

  • 用于磁盘表面损坏引起的数据丢失的恢复

  • 双份文件目录双份文件分配表 (FAT): 在不同的磁盘或磁盘的不同区域,分别建立双份目录表和 FAT,一旦由于磁盘表面缺陷而造成文件目录或 FAT 的损坏时,系统便自动启用备份文件目录和备份 FAT。系统每次加电启动时,都要对两份目录和两份 FAT 进行检查,以验证他们的一致性
  • 热修复重定向和写后读校验:磁盘表面有缺陷时,一般主要采取以下两个补救措施:
    • 将磁盘的一小部分 (2%~3%) 作为热修复重定向区。写数据时若发现磁盘 x x x y y y 扇区损坏则将数据写入热修复重定向区的 p p p q q q 扇区。当 OS 要访问 x x x y y y 扇区的数据时改为访问热修复重定向区的 p p p q q q 扇区
    • 每次从内存缓冲区向磁盘写入数据块后,立即从磁盘读出该数据块并送至另一缓冲区,将两个缓冲区的数据进行比较,若两者一致便确认写入成功。否则重写,若重写仍失败则认定该盘块有缺陷,应将数据写入热修复重定向区中,并将坏盘块的地址记录在坏盘块表中

第二级容错技术 SFT - Ⅱ

  • 主要用于防止有磁盘驱动器和磁盘控制器的故障所导致的系统不能正常工作

  • 磁盘镜像 (Disk Mirroring): 在同一磁盘控制器之下再增设一个完全相同的磁盘驱动器; 每次向主磁盘写入数据后,把数据再写到备份磁盘上,是两个磁盘具有完全相同的位像图 (I/O 速度未能得到提高;磁盘利用率降至 50%)
    在这里插入图片描述
  • 磁盘双工 (Disk Duplexing): 将两台磁盘驱动器分别接到两个磁盘控制器上,同样使两台磁盘镜像成对;文件服务器同时将数据写到两个处于不同控制器下的磁盘上,磁盘双工,可实现数据并行写入或读出
    在这里插入图片描述

第三级容错技术 (基于集群技术的容错功能)

  • 集群: 由一组互联的自主计算机组成统一的计算机系统,给人感觉,它们是一台机器

  • 双机热备份模式: 备有两台处理能力完全相同的服务器,一台作为主服务器,另一台作为备份服务器; 平时主服务器运行,备份服务器则时刻监视主服务器的运行,一旦主服务器出现故障,备份服务器立刻接替主服务器的工作成为系统中主服务器,而修复后的服务器再作为备份服务器 (在两台服务器上各装入一块网卡,并通过一条镜像服务器链路 MSL 将两台服务器连接起来,使两台服务器保持镜像关系)
    • 备份服务器处于被动等待状态,整个系统使用效率 50%
  • 互为备用模式:平时,两台服务器均为在线服务器,各自完成自己任务;为了实现互为备份,最好每台服务器内都配两个硬盘,一个用于装载系统程序和应用程序,另一个用作镜像盘,接收另一台服务器发来的备份数据,同时通过某种专线连接两台服务器,如果通过专线链接检查到某台服务器发生故障,正常服务器向故障服务器的客户机发出广播信息,表明要进行切换。切换成功后。客户机无需重新登录便可继续使用网络提供的服务和访问网络服务器上的数据
  • 公用磁盘模式:将多台计算机连接到一台公共磁盘系统,公共磁盘被划分为若干卷,每台计算机使用一个卷;如果某台计算机发生故障,系统重新配置,按某种调度策略选另一台替代机器,后者对发生故障的机器的卷拥有所有权,并接替故障计算机承担的任务
    • 消除了信息复制时间,减少了网络和服务器开销

数据一致性控制

  • 问题:在数据应用中,当把一个数据分别存储到多个文件中时,可能将会出现同一数据不一致性
  • 问题解决:配置能保证数据一致性的软件及高度可靠的硬盘 (稳定存储器),采用冗余技术 (磁盘双工方式) 可实现
    • 保证数据一致性的软件手段:事务、重要数据结构的一致性检查

事务

  • 事务: 用于访问和修改各种数据项的程序单位,可被看成是一系列的读和写操作
    • 事务操作具有原子操作,即对分布在不同位置的同一数据进行读和写操作全部完成后,才能终止事务。若一个失败,则夭折事务,已修改的部分也全部恢复原来的情况
    • 事务操作的原子性借助于存放在稳定存储器中的事务记录来实现(每条记录描述了事务运行中的重要操作 ,如修改操作、开始操作、托付事务和夭折事务等)

重要数据结构的一致性检查

  • 文件系统工作过程中,经常要读取磁盘块,进行修改后再写磁盘。如果在修改过的磁盘块全部写回之前系统发生故障,则文件系统有可能处于不一致状态。因此,往往在崩溃后重新启动时,运行一实用程序进行一致性的检查
    • 盘块号的一致性检查
      • 空闲盘块表(链) 记录尚未使用的空闲盘块的编号;用 文件分配表 FAT 记录已分配盘块的使用情况;应维护这两个数据结构的一致性:
        空 闲 盘 块 数 + 已 分 配 盘 块 = 总 盘 块 数 N 空闲盘块数+已分配盘块=总盘块数N +=N
      • 为此构造一个计数器表每个表项中包含两个计数器,分别用作空闲盘块号计数器数据盘块号计数器。初始时,计数器表所有表项均置 0;然后用 N N N 个空闲盘块号计数器所组成的第一组计数器来对从空闲盘块表(链)中读出的盘块号进行计数;再用 N N N 个数据盘块号计数器所组成的第二组计数器,对从文件分配表读出的已分配给文件使用的盘块号进行计数;若情况正常,则上述两组计数器中对应的一对(计数器中的)数据应该互补。否则有错
        在这里插入图片描述
    • 链接计数的一致性检查: 在 UNIX 的文件目录,共享文件的索引结点号会在目录中出现多次 (在每个用户目录中出现 1 次);在该共享文件的索引结点中有一个链接计数 count,用来指出共享文件的用户 (进程) 数;在正常情况下这两个数据应该一致
      • 索引结点中的链接计数 count 值大于计数器表中相应索引结点号的计数值:浪费了存储空间。解决方法:是用计数器表中的正确的计数值去为 count 重新赋值
      • count 值小于计数器表中索引结点号计数值:有潜在的危险。解决方法:将 count 值置为正确值

热门文章

暂无图片
编程学习 ·

exe4j详细使用教程(附下载安装链接)

一、exe4j介绍 ​ exe4j是一个帮助你集成Java应用程序到Windows操作环境的java可执行文件生成工具,无论这些应用是用于服务器,还是图形用户界面(GUI)或命令行的应用程序。如果你想在任务管理器中及Windows XP分组的用户友好任务栏…
暂无图片
编程学习 ·

AUTOSAR从入门到精通100讲(126)-浅谈车载充电系统通信方案

01 引言 本文深入研究车载充电系统策略,设计出一套基于电动汽车电池管理系统与车载充电机的CAN通信协议,可供电动汽车设计人员参考借鉴。 02 电动汽车充电系统通讯网络 电动汽车整车控制系统中采用的是CAN总线通信方式,由一个整车内部高速CAN网络、内部低速CAN网络和一个充电…
暂无图片
编程学习 ·

CMake(九):生成器表达式

当运行CMake时,开发人员倾向于认为它是一个简单的步骤,需要读取项目的CMakeLists.txt文件,并生成相关的特定于生成器的项目文件集(例如Visual Studio解决方案和项目文件,Xcode项目,Unix Makefiles或Ninja输入文件)。然…
暂无图片
编程学习 ·

47.第十章 网络协议和管理配置 -- 网络配置(八)

4.3.3 route 命令 路由表管理命令 路由表主要构成: Destination: 目标网络ID,表示可以到达的目标网络ID,0.0.0.0/0 表示所有未知网络,又称为默认路由,优先级最低Genmask:目标网络对应的netmaskIface: 到达对应网络,应该从当前主机哪个网卡发送出来Gateway: 到达非直连的网络,…
暂无图片
编程学习 ·

元宇宙技术基础

请看图: 1、通过AR、VR等交互技术提升游戏的沉浸感 回顾游戏的发展历程,沉浸感的提升一直是技术突破的主要方向。从《愤怒的小鸟》到CSGO,游戏建模方式从2D到3D的提升使游戏中的物体呈现立体感。玩家在游戏中可以只有切换视角,进而提升沉浸…
暂无图片
编程学习 ·

flink的伪分布式搭建

一 flink的伪分布式搭建 1.1 执行架构图 1.Flink程序需要提交给 Job Client2.Job Client将作业提交给 Job Manager3.Job Manager负责协调资源分配和作业执行。 资源分配完成后,任务将提交给相应的 Task Manage。4.Task Manager启动一个线程以开始执行。Task Manage…
暂无图片
编程学习 ·

十进制正整数与二进制字符串的转换(C++)

Function one: //十进制数字转成二进制字符串 string Binary(int x) {string s "";while(x){if(x % 2 0) s 0 s;else s 1 s;x / 2;}return s; } Function two: //二进制字符串变为十进制数字 int Decimal(string s) {int num 0, …
暂无图片
编程学习 ·

[含lw+源码等]微信小程序校园辩论管理平台+后台管理系统[包运行成功]Java毕业设计计算机毕设

项目功能简介: 《微信小程序校园辩论管理平台后台管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 本系统包含微信小程序做的辩论管理前台和Java做的后台管理系统: 微信小程序——辩论管理前台涉及技术:WXML 和 WXS…
暂无图片
编程学习 ·

树莓派驱动DHT11温湿度传感器

1,直接使用python库 代码如下 import RPi.GPIO as GPIO import dht11 import time import datetimeGPIO.setwarnings(True) GPIO.setmode(GPIO.BCM)instance dht11.DHT11(pin14)try:while True:result instance.read()if result.is_valid():print(ok)print(&quo…
暂无图片
编程学习 ·

ELK简介

ELK简介 ELK是三个开源软件的缩写,Elasticsearch、Logstash、Kibana。它们都是开源软件。不过现在还新增了一个 Beats,它是一个轻量级的日志收集处理工具(Agent),Beats 占用资源少,适合于在各个服务器上搜集日志后传输给 Logstas…
暂无图片
编程学习 ·

Linux 基础

通常大数据框架都部署在 Linux 服务器上,所以需要具备一定的 Linux 知识。Linux 书籍当中比较著名的是 《鸟哥私房菜》系列,这个系列很全面也很经典。但如果你希望能够快速地入门,这里推荐《Linux 就该这么学》,其网站上有免费的电…
暂无图片
编程学习 ·

Windows2022 无线网卡装不上驱动

想来 Windows2022 和 windows10/11 的驱动应该差不多通用的,但是死活装不上呢? 搜一下,有人提到 “默认安装时‘无线LAN服务’是关闭的,如果需要开启,只需要在“添加角色和功能”中,选择开启“无线LAN服务…
暂无图片
编程学习 ·

【嵌入式面试宝典】版本控制工具Git常用命令总结

目录 创建仓库 查看信息 版本回退 版本检出 远程库 Git 创建仓库 git initgit add <file> 可反复多次使用&#xff0c;添加多个文件git commit -m <message> 查看信息 git status 仓库当前的状态git diff 差异对比git log 历史记录&#xff0c;提交日志--pret…
暂无图片
编程学习 ·

用Postman生成测试报告

newman newman是一款基于nodejs开发的可以运行postman脚本的工具&#xff0c;使用Newman&#xff0c;可以直接从命令运行和测试postman集合。 安装nodejs 下载地址&#xff1a;https://nodejs.org/en/download/ 选择自己系统相对应的版本内容进行下载&#xff0c;然后傻瓜式安…
暂无图片
编程学习 ·

Java面向对象之多态、向上转型和向下转型

文章目录前言一、多态二、引用类型之间的转换Ⅰ.向上转型Ⅱ.向下转型总结前言 今天继续Java面向对象的学习&#xff0c;学习面向对象的第三大特征&#xff1a;多态&#xff0c;了解多态的意义&#xff0c;以及两种引用类型之间的转换&#xff1a;向上转型、向下转型。  希望能…