文件系统

一个进程在运行的时候,可以将一些数据保存在进程的地址空间中。但是保存到内存中的数据是临时的,当进程运行结束后,这些数据就丢失了。

因此有些数据必须保存在磁盘、光盘等外部存储设备上,长期地保存大量的数据。

三个基本要求:

  • 能够存储大量的数据(突破地址空间限制)
  • 长期保存:进程终止以后,数据依然存在
  • 可以共享数据:有些数据可能会被多个不同的进程所访问;

为解决这些问题,提出“文件”的概念,把数据组织成文件的形式,用文件作为数据的存储和访问单位。

文件

文件是一组带有标识(即文件名)的、在逻辑上有完整意义的信息项的序列

  • 信息项:构成文件内容的基本单位,各信息项之间具有顺序关系
  • 文件的意义由创建者和使用者进行解释

文件包含两个部分:

  • 文件体:文件本身的内容

  • 文件说明:文件存储和管理的相关信息

    如:文件名、文件内部标识、文件存储地址、访问权限、访问时间等

文件是一个抽象概念,是一组信息的集合。其本质是一组字节序列,源于用户程序对所要输入处理的原始数据和输出结果的持久化保存的需求,并按一定规范呈现。

所有“需要长期保存”的文件都按某种组织形式存放(映射)到磁盘中。

一切皆文件:所有的IO设备也可以看作是字节序列的集合,因此IO设备也可以抽象为文件进行管理。

目录是管理文件系统的系统文件,是一种特殊类型的文件。

文件名

用户通过文件名访问文件。操作系统通过文件名建立了从命名空间到磁盘空间的映射,从而实现对文件的管理。

==在引入文件目录后,文件可以重名。==

一个文件名是一个有限长度的字符串,一般由两部分组成:文件名+扩展名。

文件类别

  • 按性质和用途:系统文件、库文件、用户文件
  • 按数据形式:源文件、目标文件、可执行文件
  • 按对文件实施的保护级别分:只读文件、读写文件、执行文件、不保护文件
  • 按逻辑结构分:有结构文件、无结构文件
  • 按文件中物理结构分:顺序文件、链接文件、索引文件

UNIX将文件分为:

  • 普通文件
  • 目录文件
  • 特殊文件:一切皆文件
    • 字符设备文件,与输入输出相关
    • 块设备文件,如磁带磁盘

文件结构

流式文件:构成文件的基本单位是字符。文件是有逻辑意义、无结构的一串字符的集合;

记录式文件:文件由若干记录组成可以按记录进行读写、查找等操作。每条记录有其内部结构

文件的存取方式

顺序存取:访问

随机存取:提供读写位置(当前位置)

文件的存储介质

典型的存储介质:磁盘(包括SSD)、磁带、光盘等;

物理块(块block、簇cluster):数据存储、传输和分配的单位,存储设备通常划分为大小相等的物理块,统一编号。

目录

利用目录对文件进行更好的组织管理。能更好地根据文件名定位到一个文件。

基本概念

目录也是一种特殊的文件,是由文件说明索引组成的用于文件检索的特殊文件。

文件目录的内容包括文件访问和控制的信息,不包含文件本身的内容。

  • 文件名:目录自身的文件名

    如果有别名还需要记录别名的数量

  • 文件类型:

    • 属性attribute:如系统,隐含等
    • 文件组织:如顺序,索引等
  • 地址信息

    • 存放位置:位于的设备或文件卷、各存储块位置
    • 文件长度:以字节、字或存储块为单位
  • 访问控制信息

    • 文件所有者:通常是文件的创建者,可以改变
    • 访问权限:读、写、执行权限
  • 使用信息:创建时间、最后一次读/写访问的时间和用户

目录的分类

目录分为单级文件目录、二级文件目录和多级文件目录。现代OS使用多级文件目录。

单级文件目录

只有一级目录,所有文件位于同一个目录(根目录)下。

相当于没有目录系统,只是将记录文件信息的数据结构称之为文件目录,即根目录。

文件目录记录的表目包括的信息:

  1. 文件的符号名
  2. 文件所在物理地址
  3. 文件结构信息
  4. 存取控制信息
  5. 管理信息

优缺点:

  • 结构简单
  • 文件多时,目录检索时间长
  • 有命名冲突
  • 不便于实现文件共享
image-20240603205955041

二级文件目录

在根目录下,每个用户对应一个用户目录,在用户目录下不再区分目录。

image-20240603210010761

多级目录

树型结构、可以嵌套的文件目录。

目录记录下一级目录名以及一个指向其目录的指针。在最后一级目录,记录指向文件的指针。

但本质上,目录就是一种文件,目录记录子文件的文件控制块,有指针指向。

优缺点:

  • 层次清楚

    • 不同性质、不同用户的文件可以构成不同子树,便于管理
    • 不同用户的文件可以被赋予不同的存取权限,有利于文件的保护
    • 数目较多时,便于系统和用户将文件分散管理,使得文件和目录的层次结构较为清晰。适用于较大的文件系统管理
  • 可解决文件重名问题

    只要在同一目录下的文件名不发生重复

  • 查找速度快

    对多级目录的查找每次只查找目录的一个子集

  • 目录级别太多时,会增加路径检索时间

文件系统

文件系统:负责文件管理的软件、被管理的软件、实施管理所需要的数据结构构成的总体

屏蔽了文件管理的复杂性,让用户可以不用关注文件存放的物理机制和查找方式,只需要了解文件名和路径即可。

文件系统的任务:

  • 方便的文件访问:以符号名称作为文件标识,便于用户使用;
  • 并发文件访问和控制:在多道程序系统中==支持对文件的并发访问和控制==;
  • 统一的用户接口:为不同设备提供统一接口,方便用户操作和编程;
  • 多种文件访问权限:在多用户系统中的==不同用户对同一文件会有不同的访问权限==;
  • 执行效率:存储效率、检索性能、读写性能;
  • 差错恢复:能够验证文件的正确性,并具有一定的差错恢复能力;

文件管理

文件系统是操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新。

文件管理的任务

用户视角:==使用逻辑文件==:

  • 用户关心文件中要使用的数据,不关心具体的存放形式和位置

  • 关心的是文件系统所提供的对外的用户接口

    包括文件如何命名、如何保护、如何访问(创建、打开、关闭、读、写等);

操作系统视角:==组织和管理物理文件==:

  • 文件的描述和分类,关心的是如何来实现与文件有关的各个功能模块

    包括如何来管理存储空间、文件系统的布局、文件的存储位置、磁盘实际运作方式(与设备管理的接口)等。

文件系统要完成的任务:

  1. 统一管理磁盘空间,实施磁盘空间的分配与回收;
  2. 实现文件的按名存取:名字空间–映射–>磁盘空间;
  3. 实现文件信息的共享,并提供文件的保护、保密手段;
  4. 向用户提供一个方便使用、易于维护的接口,并向用户提供有关统计信息;
  5. 提高文件系统的性能;
  6. 提供与IO系统的统一接口。

理想文件系统应该具备的特性:

  • 有效的分配文件存储器的存储空间;
  • 文件结构和存取的灵活性和多样性;
  • 具有对用户来说尽可能是透明的机制;
  • 尽可能达到对文件存储装置的独立性;
  • 存储在文件中的信息的安全性;
  • 能方便的共享公用的文件;
  • 有效的实现各种文件操作的命令。

文件系统的层次

  1. 文件系统向用户提供的接口:文件系统提供的接口

    提供两种类型的接口:

    • 命令行接口:用户通过键盘终端键入命令,取得文件系统的服务。
    • 程序接口:用户程序通过系统调用的形式来取得文件系统的服务。
  2. 对象操作管理的软件集合:文件系统的软件

    这是文件管理系统的核心部分,其中包括:

    • 对文件存储空间的管理
    • 对文件目录的管理
    • 用户将文件的逻辑地址转换为物理地址的机制
    • 对文件读和写的管理
    • 以及对文件的共享和保护的功能
  3. 对象及其属性:文件系统管理的文件

    文件系统管理的对象有:

    1. 文件:是文件管理的直接对象
    2. 目录:每个目录项中,必须包含文件名及文件所在的物理地址或指针
    3. 磁盘存储空间

文件系统的实现方法

如何描述文件,来记录各种信息

如何存放文件,实现对磁盘的高效利用

常用文件系统

文件控制块

使用文件控制块FCB来更好管理文件,是一个为管理文件而设置的数据结构,管理文件所需要的有关信息

  • 基本信息
    • 文件名
    • 物理位置
    • 文件逻辑结构:有/无结构,记录文件/流式文件
    • 文件物理结构:顺序、索引等
  • 访问控制信息
    • 文件所有者:通常是文件的创建者,可以改变
    • 访问权限:不同用户的权限可以不同
  • 使用信息
    • 创建时间
    • 上一次修改时间、修改者

文件的结构

文件的逻辑结构:文件的组织方式。好的逻辑结构可以提高检索效率、便于文件修改

文件的物理结构:文件在存储介质上的存放方式,包括位置、链接和编目方式

  • 物理结构有连续结构、索引结构、串联结构,表明了文件被划分成N块时在磁盘上的存放方式
  • 地址:块号或簇号

连续结构

文件的各部分在磁盘上顺序存储。适用于变化不大的顺序访问的文件

优点:

  • 不需要额外的空间开销,只要在文件目录中指出文件的大小和首块的块号即可
  • 支持顺序存取和随机存取,顺序连续存取速度快

缺点:

  • 动态地增长和缩小系统开销很大
  • 文件创建时要求用户提供文件的大小,不利于文件的动态增加和修改,存储空间浪费较大

串联/链接结构

串联文件结构是按顺序由串联的块组成的,即文件的信息按存储介质的物理特性存于若干块中。

链首指针存放在该文件目录中

每个物理块的最末一个字(或第一个字)作为链接字,它指出后继块的物理地址

文件的结尾块的指针为“∧”,表示文件至本块结束。

对于记录式文件,一块中可包含一个逻辑记录或多个逻辑记录,也可以若干物理块包含一个逻辑记录。

优点:

  • 空间利用率高;能较好的利用辅存空间。
  • 文件动态扩充和修改容易。
  • 顺序存取效率高

缺点:

  • 随机存取效率太低,如果访问文件的最后的内容,要访问整个文件。
  • 可靠性问题,如指针出错;
  • 链接指针占用一定的空间。

索引结构

一个文件的信息存放在若干个不连续物理块中。系统为每个文件建立一个专用索引表,FCB记录索引表的地址。

将这些文件对应的物理块的块号存放在该索引中,是磁盘块地址数组,其中第i个目录对应文件的第i块。

索引文件:由数据文件和索引表构成。在存储区中占两个区:索引区和数据区。

索引区存放索引表,数据区存放数据文件本身。

访问索引文件需要两步操作:

  1. 查文件索引号,由逻辑块号查得物理块号
  2. 由此磁盘物理块号而获得所要求的信息

索引表

优点:保持了链接结构的优点,又回避了其缺点:

  • 即能顺序存取,又能随机存取
  • 满足了文件动态增长、插入删除的要求
  • 能充分利用外存空间

缺点:

  • 索引表本身带来了系统开销:用于索引表的空间开销和文件索引的时间开销

索引表的组织方式

  • 链接模式:一个盘块一个索引表,多个索引表链接起来
  • 多级索引:将一个大文件的所有索引表(二级索引)的地址放在另一个索引表(一级索引)中
  • 综合模式:直接索引方式与间接索引方式结合

UNIX多级索引示意

目录的实现

给定一个文件名,即可返回相应的FCB。

具体实现分为直接法和间接法:

  • ==直接法:目录项=文件名+FCB==(属性信息、在外存上的存放位置)。如MS-DOS/Windows;

  • ==间接法:目录项=文件名+FCB的地址==(索引号)。如Unix(inode)

    存储的是FCB的地址,需要再次访问内存获得真正的FCB

两种实现方式

查找文件名

在现代OS中,一般都支持更长的、可变长度的文件名。实现方法有:

  1. 在目录项中,将文件名的长度固定为255个字符。

    缺点:浪费空间,很少文件用很长的名字;

  2. 每个目录项的长度可变,分为三部分:目录项长度、文件的属性信息(此两项长度固定)、文件名(长度可变)。

    缺点:文件被删除后,该目录项所占用的空间不太好回收利用;

  3. 目录项本身的长度固定,把长度可变的文件名统一放在目录文件的末尾

image-20240517150704371

顺序查寻法:遍历文件目录中的表目,将表目中的名字字段与查找到 文件名进行比较

Hash方法:利用Hash函数,把每个符号名唯一地变换成符号表中的表目索引

保护文件

  • 建立副本:把同一个文件保存到多个存储介质上,出故障时,可备用副本替换

    • 优点:方法简单
    • 缺点:设备费用和系统开销增大
    • 适用于短小且极为重要的文件
  • 定时转储

    每隔一定时间把文件转储到其他存储介质上,当文件发生故障,就用转储的文件来复原,把有故障的文件恢复到转储时刻文件的状态

    Unix就采用定时转储办法保护文件,可以提高文件的可靠性

  • ==文件的一致性检查==

    • 磁盘块的一致性:每个磁盘块设置两个计数器,一个记录在文件中出现的次数,另一个记录在空闲块中出现的次数,最终检查两个计数器是否存在不一致问题。

    • 文件的一致性:每个文件设置两个计数器,一个记录其i节点被引用的次数,另一个记录文件目录中引用的次数,最终检查两个计数器是否存在不一致问题。

  • 文件的存取保护

    • 文件保护机制
      • 防止未被核准的用户存取文件;
      • 防止一个用户冒充另一个用户来存取;
      • 防止核准用户(包括文件主)误用文件;
    • 存取权限验证步骤
      • 审定用户的权限;
      • 比较用户的权限与本次存取要求是否一致;
      • 将存取要求和被访问文件的保密性比较,看是否有冲突。

文件的并发访问

提供多个进程并发访问同一文件的机制。

访问文件之前,必须先打开文件:如果文件的目录内容不在内存,则将其从外存读入,否则,仍使用已在内存的目录内容。这样多个进程访问同一个文件都使用内存中同一个目录内容,保证了文件系统的一致性。

利用进程间通信,协调对文件的访问。

文件系统的优化

提高文件系统的性能:块高速缓存

块高速缓存(BLOCK CACHE):是指==在内存中为磁盘块设置的一个缓冲区,保存了磁盘中某些块的副本。==

利用访问的局部性原理,当下次可能访问时,直接从高速缓存中取出。

当对文件系统进行操作的时候,检查所有的读请求,看所需块是否在块高速缓冲中:

  • 如果在,则可直接进行读操作。从此链中拿出来,然后挂接到链尾。
    • 对于以后可能会再次使用的块将其放在链尾
    • 而对于使用概率很小的块可能就需要将其剔除。
  • 否则,先将数据块读入块高速缓存,再拷贝到所需的地方
  • 使用块号进行散列以提高检查速度

在块高速缓存中有若干个数据块,使用双向链表进行组织。当要访问这个链的时候就将其从此链中拿出来,然后挂接到链尾。

块高速缓存

基于日志结构的文件系统LFS

大多读操作都可以基于缓存数据来处理,因而无需读取硬盘。从磁盘的角度来看,主要以写操作为主,需要提高写数据的速度。减少因磁头的移动所带来的开销:一次合并多次的写操作。

当前文件系统中,写一个数据块需要几次写操作(写数据、修改元数据), 因而需要多次移动磁头来进行寻道。

将磁盘看作一个日志系统log,是一个数据结构,所有的写操作仅在日志头来完成。避免为寻道而进行的磁头移动。

“文件”总是顺序地添加到磁盘上。==新的数据块和元数据 (inode、目录)先放在缓存中,然后 一次性写入到硬盘==。

两种文件系统的区别

LFS的数据结构

  • 段Segment: 包含数据块和元数据的日志
  • inode:与Unix的inode一样,包含文件的物理块指针
  • inode map:一个存放inode节点在磁盘上的位置的表。写入时被视为段的一部分
  • 段摘要: 段中每一个数据块的信息
  • 段使用情况表: 段数据块中的有效数据的量

LFS的读写操作

每个写操作的执行都会在内存的segment缓冲区加入新的数据块;当segment写满了之后,其中的数据会写到磁盘。

读操作与Unix文件系统基本相同,只是在寻找inode时需要用到缓存在内存中的inode map

随着不断的读写操作,由于新的数据块会不断替换文件中原来的数据块,结果segment会逐渐碎片化

LFS的清理操作

LFS的主要问题就是清理,其目的是为了提供连续的空闲磁盘空间

清理进程对段进行清理,也就是把没有填充满的段进行紧缩,从而腾出更多的空闲空间

清理进程对磁盘中的段进行选择的依据是:

  • 利用率: 清理一个段是否能够有效提高磁盘的利用率
  • 生命周期: 一个段是否很快就会被改变

清理进程会区分segment的冷热程度(被访问的频度):

  • 对于冷的段,其利用率达到75%时会被清理;
  • 对于热的段,其利用率达到15%时即被清理:认为热的会很快就被覆写