操作系统——第6章 文件管理

第6章 文件管理

基本概念

  1. 文件系统必须完成的工作

    • 文件存储空间管理:在辅存上分配、回收、调整存储区

    • 逻辑文件管理:用户可见的文件逻辑结构,可实现按名存取

    • 物理文件管理:实现逻辑文件到物理文件的转换,文件在辅存上的物理结构

    • 文件目录管理:对存储设备上的文件信息可以进行查找

    • 文件共享和安全管理

  2. 文件具有两种解释

    • 文件是具有标识符的相关联字符流的集合(无结构的),常用操作系统都将文件视为这种形式

    • 文件是具有标识符的相关联记录的集合(记录是有意义的信息单位),数据库系统常使用这种形式

  3. 文件系统是操作系统中管理文件的部分,负责为用户建立、撤销、读写、修改与复制文件,完成文件的按名存取与访问控制

  4. 文件的分类(按性质和用途)

    • 系统文件:用户不能读写与修改,只能通过系统调用使用之

    • 库文件:用户可以读取和执行,但不能修改,是一些标准子程序库

    • 用户文件:用户委托系统保存的文件,所有者和被授权者才能使用

  5. 文件的分类(按组织形式)

    • 普通文件:一般格式的文件

    • 目录文件:记录着文件的目录信息,其中没有程序和数据,用于检索普通文件

    • 特殊文件:例如UNIX系统中将设备都视为特殊文件

记录式文件的结构

记录式文件中保存着一条条记录,记录是具有特定意义的信息单位。记录位于文件中的某一逻辑地址处,由与记录名对应的一组关键字、属性、属性值组成

一个记录式结构的文件中包含很多记录,这些记录一般有以下几种组织方式

  1. 连续结构

    即将记录按生成的先后顺序,连续排列,这种结构也可以用于无结构文件的组织(将每个字节视为一个记录)

    便于追加与变更,但不利于搜索

  2. 多重结构

    将“每个关键字存在于各记录中的情况”存储下来,可以使用队列来存储,下图是有m个关键字的存储例子, K 1 , K 2 , … , K m K_1,K_2,\dots,K_m K1,K2,,Km为各记录中关键字的集合, R i , R x R_i,R_x Ri,Rx等是各记录

多重结构

  1. 转置结构

    将指向关键字相同的记录的指针连续排放,如此便于查找关键字相同的某一特定记录

转置结构

  1. 顺序结构

    按某种优先级或排序规则存放各记录,例如按字典序、按时间序等构成顺序结构文件

文件存取方法

文件存取的目的是找到文件内容所在的逻辑地址,一般有三种存取方法

  1. 顺序存取

    即按文件的逻辑地址顺序存取

    在记录型文件中,按记录排列顺序存取,下一次访问的记录为当前访问记录的下一条

    在无结构字符流文件中,读写指针在存取完一段后,会自动后移/前移该段的长度

  2. 随机存取

    也称为直接存取,可以根据记录编号直接存取某记录,或是直接将读写指针移到目标位置进行存取

  3. 按关键字存取

    多用在数据库管理系统中,在存取时需要先根据关键字或记录名搜索到目标的逻辑位置,再进行存取

    此处的搜索一般分为两步进行:关键字搜索和记录搜索。关键字搜索确认该关键字在文件中的位置(找到记录队列),在搜索到目标关键字后再通过记录搜索找到特定的某条记录

    显然,上述的搜索可以使用线性搜索、散列法、二分搜索等搜索算法完成

文件存储的物理结构

总的来说,不管使用哪种存取方法,最终影响到物理存储的信息上,都遵循如下步骤

  1. 搜索到要操作对象的逻辑地址

  2. 将此逻辑地址映射到对应的物理地址

  3. 对物理地址处的有关信息进行操作

文件物理结构

文件物理结构,就是文件在存储设备上存放的物理组织方式,逻辑地址到物理地址的变换也是由文件的物理结构决定的

文件系统会将存储设备划分为若干大小相等的物理块,以便于管理

连续文件

将逻辑上连续的文件依次存放在物理块中,标记文件需要文件名、首地址、文件长度。要取得文件的中间部分时,可以直接通过起始地址与偏移量访问

在文件存放、删除的过程中,会出现一些存储碎片,即下图中文件之间的空白块,这说明连续文件结构不适合存储需要经常修改的文件

连续文件物理结构

对这些碎片,可以进行整理,即把文件都往前移动,调整为按序存放

连续文件碎片整理

串联文件

使用非连续的物理块来存储信息,文件的每个物理块都通过指针指示下一个物理块。要取得文件的中间部分时,只能顺着指针一个个物理块往下找,搜索效率低,不适合随机存取

事实上,以串联形式组织的文件无需指出文件长度,顺着指针就可以知道文件有多长。但有时为了效率,还是会记录一下文件的长度。串联文件物理结构不会产生碎片

串联文件物理结构

索引文件

要求系统为每个文件建立一张索引表,表中记录了文件所在的逻辑块号和与之对应的物理块号。采用此种方式存储的文件,可以动态增长,而且也可以较为方便地实现随机存取

索引文件物理结构
索引文件物理结构

文件说明信息表中,每个文件都有个索引表指针,指出该文件的索引表的存储位置。显然,当文件很大时,索引表的大小很可能会超出一个物理块,那么又需要对索引表进行组织,非常不方便。当然,可以使用二级索引解决索引文件超过一个物理块大小的问题

显然,索引文件的物理结构需要额外的存储空间存放索引表,并且至少需要访问存储器两次才能取得需要的文件信息,降低了速度

可以对这种物理结构稍作改进,每个索引项指出的不是一个物理块,而是一段物理块,指出起始地址和长度即可,也就是进行了变长分区

索引文件物理结构变长分区

文件存储设备
顺序存取存储设备

磁带就是典型的顺序存取存储设备

顺序存取存储设备只有在前面的物理块被存取过后,才能存取后续物理块。一般会在相邻的两个物理块之间设计一个间隙将物理块隔开

直接存取存储设备

磁盘就是典型的直接存取存储设备

通过磁头的移动,文件系统可以直接存取磁盘上任意位置的物理块。磁盘的结构如下图所示

磁盘结构

盘片的两面都可以存储信息,一个盘片对应一个磁头臂,每个磁头臂上都有两个磁头,可以读写盘片的上下面。一圈圈的称为“磁道”每个面会分为若干个扇区,各盘片的相同磁道构成了柱面

文件存储空间管理

即空闲块的组织和管理,包括空闲块的组织、分配与回收。下面是三种空闲块的管理方法

空闲文件目录

将空闲块视为特殊的文件,称为空闲文件,然后将这些空闲文件集中在一个目录中。事实上,这个目录中的每个表项都可以理解为一个“空闲文件”,每个空闲文件记录着一段空闲物理块的信息(包括起始块号、块数量、文件名等)

分配空闲区时,可以使用最先适应法、最优适应法、最坏适应法,从前往后扫描空闲文件目录,直到找到一个满足需求的,将信息放入对应物理块,然后修改空闲文件目录

释放空闲区时,将这段即将空出来的空闲区的首块号和块数作为空闲文件放在空闲文件目录中,之后可能会进行表项的合并

这种方法适合连续文件结构

空闲块链

将存储设备上的空闲块以链表形式组织起来。分配空闲区时,从链头开始摘取所需空闲块,再调整链首指针;释放空闲区时,将释放的空闲块插在链尾

成组链法

成组链法将每50个空闲块视为一组,在初始构建成组链时从后往前进行分组,每组的第一块用来存放前一组中(由于是从后往前进行分组的,此处的“前一组”指的当前位置后面的一组)

成组链法的具体详解请见专题

位示图

和存储管理中提到过的位示图原理思路相同。系统会从内存中划出一片区域,位示图反映每个文件存储设备的使用情况,每个文件存储设备的物理块对应位示图中的一个比特,0表示该块为空闲块,1表示该块已被分配

文件目录管理与存取控制

基本概念
  1. 文件说明/文件控制块FCB:文件名和对该文件实施控制管理的控制管理信息(包括文件类型、文件结构等)

  2. 文件体:即文件本身,可以使记录式文件或字符流式文件

  3. 目录文件:存放文件目录信息的数据结构,其中每条记录都是一个文件的说明信息。注意与文件目录的区分

文件目录
单级目录

文件系统为存储设备的所有文件建立一张目录表,每个文件的文件说明信息占一项。此目录表存在存储设备的某固定区域,需要时全部或部分调入内存

在单级目录结构中,各文件说明项处于相同的地位,搜索文件时需要搜索文件系统中全部的文件,且系统中不允许有两个名称相同的文件

单级目录

二级目录

文件说明信息被组织成目录文件,并以用户为单位把各自的文件说明分为不同的组

各组的存取控制信息应放在主目录MFD的目录项中,MFD的每个表项指向一个用户文件目录UFD,每个UFD中记录着一个用户的所有文件

通过二级目录,可以解决文件重名和文件共享的问题,提高了搜索速度

二级目录

从上图可见,若有多个用户需要共享某文件,只要两个用户的UFD中对应表项指示同一个物理块起始地址即可。事实上,被多个用户共享的单个文件可以以不同文件名存在于各用户的UFD中。例如上图中,Zhang的UFD中的Editor表项的文件名不一定和Wang的一样为Editor

多级目录

在多级目录中,除了最低一级(即叶子结点)中真正存了文件内容外,其他级的目录中存放的都是下一级目录或文件的说明信息,最高层则作为根目录

多级目录构成的是一个树状的结构

多级目录

从上图中,我们可以发现多级目录的一些特点

  1. 层次清晰,可以根据不同用户、不同类型、不同性质将文件构成不同的子树,利于文件的管理与保护

  2. 较好解决重名问题,同一子目录下的文件名不重复就可以

  3. 查找速度更快,在确定了要查找的目标后,只需要在某个较小的子树中进行搜索,要搜索的文件数目大大减少

文件共享
绕道法

从当前目录出发,往上级目录走,直到到达与所要共享文件所在路径的交叉点,然后再向共享文件方向往下走,从而访问共享文件。绕道法需要用户指定被共享的文件和被链接的目录

链接法

直接在相应目录表之间进行链接,将一个目录中的链指针直接指向被共享文件所在的目录,显然链接法中仍然需要用户指定被共享的文件和被链接的目录

链接法往往分为硬链接软链接两种

硬链接

使得要共享同一文件的目录指向该文件的索引节点,而不是直接指向物理块。如此,对该文件的修改就可以通过索引节点被所有目录共享

硬链接示意图

上图中,目录a和目录b中关于文件Test的记录存放着指向Test索引节点的指针。在目录a或目录b中修改Test文件时,此变更都会通过索引节点真实地反映到Test所在的物理块上

软链接

使用软链接时,要共享同一文件的目录中保存的Link文件事实上存放着对应文件的路径名,通过这个路径找到这个文件真实存在的目录,直接对其进行存取

软链接示意图

上图中,文件F8为目录D5、D6、D3所共享,虚线箭头就是软链接(即路径),当在D3或D5中要对文件F8进行存取时,就会通过此路径找到实际上处在D6下的F8

基本文件目录表BFD

这是一种目录管理的方法,通过这种方法,可以大幅提高文件搜索的速度,具体见下面目录管理中的内容

目录管理

需要指出的是,由文件说明信息或目录管理说明信息构成的目录文件也是存放在存储设备(外存)中的。根据上面存取文件时需要进行的物理块定位操作,可以发现需要多次访问外存,这会非常慢

基本文件目录表BFD

在这种方法下,将文件的FCB分为两部分,在按文件名查找文件时,只需要使用SFD,既节省内存空间又便于进行快速检索

事实上,下面所说的各个表是存在于文件系统中的,也就是需要存储在外存中的

  • 基本文件目录表BFD

    包括文件的结构信息、物理块号、存取控制、管理信息等,每一个表项都通过由系统赋予的内部标识符来唯一标识

  • 符号文件目录SFD

    每个表项只有两部分——文件名、内部标识符

事实上,常把BFD中的表项称为索引节点,即I节点

BFD结构的目录管理

为了便于表示,上图中的BFD的表项中缺省了很多内容。可以发现,无论是MFD、SFD,还是文件本身的物理块位置,都在BFD中被指出。如此,就可以只通过一次索引,就可以找到

根据上图举个🌰

例如要取得用户Zhang的文件w.c(/Zhang/Sub_d/w.c),过程如下

  1. 将MFD中用户Zhang的表项放入内存

  2. 根据上一步得到的ID在BFD中得到Zhang的SFD的物理块位置,将Zhang的SFD读入内存(可以一部分一部分反复读入,也可一次性全部读入)并进行搜索

  3. 根据上一步搜索到的Sub_d的ID=8,在BFD中找到Sub_d的SFD,再次在其中搜索文件w.c

  4. 根据上一步搜索到的w.c的ID=9,在BFD中找到w.c文件的相关信息(包括上图中未标出的文件结构信息、管理信息等),至此,文件成功打开,实现了文件的访问

在上面这个例子中,不断地从外存将不同表项调入内存时,一般来说需要添加些内容,包括索引节点编号、索引节点状态、访问计数等

另外,经过上面的过程打开文件后,将这样打开的文件称为活动文件内存中存放SFD表称为活动名字表(一个用户一张),内存中存放活动文件的BFD表称为活动文件表(整个系统只有一张)

当然,由于文件本身也可由BFD索引,当文件非常多的时候,BFD可能会非常大,因此,在这个目录管理方法中,对于文件本身,同样可以采用多级间接索引的方法,甚至混用不同次数的间接索引

I节点表使用间接索引

存取控制

文件存取控制包括三方面的内容

  • 文件共享

  • 文件保护

  • 文件保密

只要限制用户对各文件的读、写、执行的权限就可以完成上述工作。存取控制验证模块的工作就是要完成上述三种用户权限的控制,一般通过如下步骤完成

  • 得到用户的存取权限

  • 比较用户的权限和用户本次存取要求的是否一致

  • 比较存取要求和被访问文件的保密性,查看是否有冲突

下面是几种用于验证用户存取操作的方法

存取控制矩阵

最易于理解的结构,使用一个二维矩阵来记录用户对于各文件的存取权限

存取控制矩阵

显然,当文件、用户数量较多时,存取控制矩阵会非常浪费空间,且查找时效率也很低

存取控制表

以文件为单位,给每个文件都带上一个存取控制表,放在文件说明中,同时将用户分组,存取控制表中记录的是本文件对于各用户组的权限如何

存取控制表

由于文件在打开时会将文件说明信息同时放入内存,因此存取控制验证能更快地运行

口令方式

此处可以有两种设计

  • 用户要进入系统使用前,要求其输入口令

  • 创建文件时,给文件设置口令,放在文件的文件说明中,使用该文件前要求输入口令

这种方式实现简单,占用内存空间小,但保密性较差

密码方式

对文件本身进行加密,在文件放入存储设备时,对文件编码加密,在读出时又需要输入密码进行译码解密

这种方式保密性强,但是编解码(加密解密)需要花费较多时间进行计算

文件的层次结构及使用

用户要使用文件,文件系统需要以系统调用或命令方式为用户提供下列服务

  • 设置和修改用户对文件的存取权限

  • 创建、修改、删除目录

  • 文件共享,访问路径设置

  • 创建、打开、读写、关闭、撤销文件

将文件系统进行分层,便于实现和调整,相邻的层次通过接口进行交互

文件系统层次结构

上图中右侧已经标出各层次的功能,例如符号文件系统SFD完成了文件名到文件标识符fd的转换,也就是说上一层用户接口给SFD提供了文件名

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值