操作系统概论:文件管理

文件系统基础

数据项:分为基本数据项和组合数据项,基本数据项用于描述一个对象的某种属性的一个值,如姓名、日期等,组合数据项是基本数据项的组合。

记录:记录是一组相关数据项的集合,用于描述一个对象在多个方面的属性,如一名考生的记录有身份证号、姓名、准考证号等一系列域。记录分为定长记录和可变长记录。

文件:文件是指由创建者所定义的一组相关信息的集合,逻辑上可划分为有结构文件(记录式文件)和无结构文件(流式文件)。有结构文件由一组相似的记录组成,如excel表格;无结构文件被视为一个字符流,如一个二进制文件。

文件包含的属性:文件名、文件系统为其定义的唯一标识符、支持的文件系统类型、位置、大小、访问控制信息、时间等。

文件系统的层次结构

在这里插入图片描述
假如某用户请求删除“D:/工作目录/学生信息.xlsx”文件的最后100条记录。使用到的各层次如下。

  1. 调用用户接口,进行系统调用。
  2. 操作系统查找文件的存放路径,找到目录项。
  3. OS检查用户是否有对此文件的修改权限。
  4. 把用户提供的记录号转换为对应的逻辑地址。
  5. 逻辑地址转为物理地址。
  6. 对磁盘设备发出请求。
  7. 回收磁盘块。

用户接口

向上层提供简单易用的功能接口,并负责处理open、close等系统调用。

文件目录系统

根据用户提供的文件路径找到相应的FCB或索引结点,并负责管理目录和目录项相关操作。

存取控制模块

提供文件保护功能来保证文件数据的安全。

逻辑文件系统与文件信息缓冲区

假如采用的是索引文件的逻辑结构,会为文件中的各个记录建立一张索引表,在查询索引表之前需要把它调入到内存的文件信息缓冲区中。

物理文件系统

把上一层提供的逻辑地址转换为物理地址

辅助分配模块

负责文件存储空间分配和回收。

设备管理模块

直接与硬件交互,对其进行管理,如分配设备、分配设备缓冲区、启动设备等。

文件的逻辑结构

逻辑结构:在用户看来,文件内部的数据是如何组织起来的。

按逻辑结构划分,文件可分为无结构文件和有结构文件两种。

无结构文件又称流式文件,其内部数据由一系列二进制流或字符流组成。

有结构文件又称记录式文件,其由一组相似的记录组成,每条记录由若干个数据项组成,其逻辑结构又分为三种:顺序文件、索引文件和索引顺序文件。

名称记录格式逻辑上的特点物理上的特点划分
顺序文件定长或可变长一个接一个顺序排列顺序存储(默认)或链式存储串结构(顺序与关键字无关)、顺序结构(顺序按关键字排列)
索引文件定长或可变长索引表本身是定长记录的顺序文件,可随机查找,每个索引表项对应文件中的一条记录可离散存储-
索引顺序文件定长或可变长对顺序文件进行分组,组内关键字可无序,组间关键字有序,索引表中每一个索引项对应每组第一条记录,索引项排列也可无序--

顺序文件下对随机存取和根据关键字计算位置的支持性如下:
在这里插入图片描述
索引顺序文件中,对于含有N条记录的顺序文件,可将其分为 根号N组,根号N组分别对应索引表中的根号N项,查找时,平均查表 (根号N)/2次,平均在组中查找 (根号N)/2次,共 根号N次。还可建立多级索引结构进一步减少查找次数。
在这里插入图片描述

文件的物理结构

文件的逻辑地址 = 逻辑块号 + 块内地址

文件的分配方式(对磁盘非空闲块的管理)

  1. 连续分配:逻辑上相邻的文件块在物理上也相邻,且按相同顺序存放。地址转换时,只需将逻辑块号映射到物理块号即可,为此,在目录条目中为每个文件增加了起始块号和占用块数两个属性。
  2. 隐式链接分配(默认):目录条目中为每个文件增加了起始物理块号和结束物理块号两个属性,每个物理块中都保存着指向下一个物理块的指针。地址转换时,操作系统找到其FCB,从目录项中找到起始物理块号,读入起始物理块(逻辑0块)后得到下一个物理块(逻辑1块),然后依次访问下一个物理块,直到找到对应逻辑块。即:欲读X号逻辑块,需要依次读入0号到X号逻辑块,共X+1次磁盘操作。
  3. 显式链接分配:目录条目中为每个文件增加了一个起始物理块号属性,并在内存中设置了一张文件分配表FAT(供磁盘上的全部文件使用,表中的物理块号字段可省略),表项中存放了每一个物理块号及与其逻辑上相连的下一块的指针。地址转换时,首先从目录项中找到起始物理块号(逻辑0块),然后根据FAT的“下一块”字段可知其逻辑1块对应的物理块号,继续跳转,直到找到X号逻辑块对应的物理块,直接读入即可。
  4. 索引分配:目录条目中为每个文件增加了一个索引块的物理块号,索引块中存放了一张索引表,索引表内存储了此文件每一个逻辑块号(可省略)对应的物理块号(类似于页表机制)。地址转换时,从文件目录项找到索引块,读入索引块,在其中查找逻辑块号X对应的物理块号即可。当一个文件的大小太大以至于整张索引表无法只占用一个磁盘块就可储存时,需要进行处理,方式见下文。

FAT表的结构如图,其中物理块号不需存储。
在这里插入图片描述

索引分配时解决索引表长度太大的方式:

  • 链接方案:将多个索引块链接起来,共同存放一张索引表,类似于隐式链接,每个索引块后都有指向下一个索引块的指针。这种方式仍存在地址转换时磁盘操作过多的可能。
  • 多层索引:类似于多级页表,各层索引表的大小也不能超过一个磁盘块。若采用k层索引结构,访问各级索引表需要读磁盘k次,最后访问数据块还需读磁盘一次,共k+1次。这种方式不利于小文件的存储。
  • 混合索引:在多层索引的基础上做了改进,一个文件的顶级索引表中,可包含直接地址索引(指向物理块)、一级间接索引(指向单层索引表)、二级间接索引(指向二层索引表)。这种方式兼顾了大文件和小文件的存储。

优缺点比较

分配方式优点缺点
连续分配支持顺序访问和随机访问、在顺序访问时,由于各物理块相邻,所以速度最快不方便拓展、会产生外部碎片(比如4号块已被占用时,某文件占用1、2号块,则3号块很难被利用)
隐式链接方便拓展、无碎片、外存利用率高只支持顺序访问、查找效率低
显式链接方便拓展、无碎片、外存利用率高、支持顺序访问和随机访问FAT表需要占用一定空间
索引分配支持顺序访问和随机访问、易于拓展索引表需要占用一定空间,不同的索引查找策略效率不同

文件存储空间管理(对磁盘空闲块的管理)

文件存储器空间的划分与初始化

文件卷:将物理盘划分为一个个的文件卷,也称为逻辑卷、逻辑盘,即我们平时说的C盘、D盘等。

一个文件存储在一个文件卷中,文件卷可以是物理盘的一部分,也可以是整个物理盘,甚至可以是多个物理盘。

在进行存储空间初始化时,对每个文件卷进行划分,分为目录区和文件区两部分,目录区主要用于存放文件目录信息FCB以及磁盘存储空间管理的信息如空闲表、位示图。

文件存储器空间管理

实质:对空闲磁盘块的组织、分配和回收。

主要有:空闲表法、空闲链表法、位示图法、成组链接法。

  1. 空闲表法:连续分配方式,与内存分配的动态分区分配类似,分配时根据某种策略(如首次适应、最佳适应等)从多个满足条件的空闲区中选出一个分配。系统为整个磁盘维护一张空闲表,每个空闲区对应一个表项,表项有两个属性:空闲区的起始盘块号、空闲盘块数。所有空闲区按起始盘块号递增的顺序排列。此种方式在回收时应注意表项合并的问题。
  2. 空闲链表法:根据划分单位的不同,分为离散分配的空闲盘块链和既可离散又可连续分配的空闲盘区链。空闲盘块链是以盘块为单位组成的一条空闲链,每个空闲盘块中都存放着指向下一个空闲盘块的指针。操作系统维护着链头指针和链尾指针,分配时从链头开始依次摘下K个盘块进行分配,回收时将盘块挂到链尾,然后修改链尾指针即可,不涉及合并的问题。 空闲盘区链中,每个空闲盘区的起始块 (!) 中记录了空闲盘区的长度和下一个空闲区指针。操作系统维护着链头指针和链尾指针,分配时根据某种策略从链头开始检索,直到找到一个符合要求的空闲区,若找不到,则可将不同空闲区的盘块分配给同一个文件。回收时若回收区与某空闲区相邻,要进行合并。
  3. 位示图法:既可离散分配又可连续分配。为整个磁盘维护一张位示图,位示图有字号和位号两个维度中,由字号、位号可唯一确定一个二进制位,每个二进制位对应着一个盘块,0表示盘块空闲。分配时顺序扫描位示图,找到K个为0的二进制位,由其字号和位号计算对应盘块号,分配,然后将二进制位置1即可,回收时同理。
  4. 成组链接法:在文件卷的目录区中取一个磁盘块作为“超级块”,当系统启动时将超级块读入内存。超级块中记录着:下一组空闲盘块的数量和这些空闲块的块号。参考:实例讲解成组链接法

文件目录

所有文件的信息都保存在目录结构中,而目录结构保存在外存中,在需要时才会被调入内存。

对目录的可能操作有
在这里插入图片描述

文件控制块

目录本身就是一种有结构文件,每条记录对应一个在该目录下存放的文件。一条记录中包括文件名、类型、存取权限、物理地址等多种信息。一条记录就是一个文件控制块FCB。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。FCB实现了“按名存取”。

目录结构

  1. 单级目录结构:整个系统中只建立一张目录表,每个文件占一个目录项,不允许文件重名。
  2. 两级目录结构:分为主文件目录和用户文件目录。不同用户的文件可以重名。可以通过检查用户名实现访问控制。
  3. 树形(多级)目录结构:不同目录下的文件可以重名,路径分为绝对路径和相对路径。引入了“当前目录”减少了磁盘IO次数。
  4. 无环图目录结构:为了实现文件的共享,在树形结构的基础上增加了指向同一个文件或目录的有向边,使整个目录结构成为有向无环图。被共享的文件或目录称为共享结点,每个共享结点都有一个共享计数器。用户提出删除结点时,先删除用户目录下的对应FCB,然后使共享计数器减1,当其减为0时才进行删除操作。

索引结点

索引结点实质是对FCB的改进,操作系统在查找各级目录的过程中只需用到“文件名”这一信息,使用全部的目录表就显得冗余,因此把目录表的目录项分为两部分,即文件名和索引结点指针。除了文件名之外,所有的描述信息都被放在索引结点中。

主要的性能提升表现在查找目录的磁盘I/O上,引入索引结点后,需要读取的磁盘块数大大减少,从而加快了文件检索的速度。当找到文件名对应的目录项后,再根据索引结点指针把索引结点调入内存,然后从中读取文件的物理地址,调入文件。

文件操作

  1. 打开文件(open):使用系统调用open(路径, 文件名, 操作类型)先在外存找到此文件的属性(即其对应的目录条目,包括文件在外存上的物理地址),然后检查当前用户是否有操作权限,若有,则将目录项从外存拷贝到内存中的进程“打开文件表”,为其建立一个表目,并将其在系统“打开文件表”中的编号(又称文件描述符,实质是指针)返回给用户。在open调用完成后,操作系统对该文件的操作就不再需要文件名, 只需要open返回的指针即可。打开文件表分为系统级(打开计数器)和进程级(读写指针、访问权限)两种,当一个文件第一次被某进程打开时,系统的打开文件表为其增加一个表项,若非第一次被打开,则将对应表项的打开计数器+1。

  2. 关闭文件(close):先删除本进程的打开文件表对应表项,并回收其占用的内存等资源,然后将系统打开文件表中对应表项的打开计数器-1,若变为0,则删除对应表项。

  3. 读文件(read):提供文件在系统打开文件表中的索引、要读入的数据大小、内存缓冲区指针作为参数。由read系统调用进行读文件。

  4. 写文件(write):提供文件在系统打开文件表中的索引、待写入的数据大小、待写入数据的内存缓冲区指针作为参数。由wirte系统调用进行写文件。

  5. 创建文件(create):需要提供所需外存大小、文件存放路径、文件名作为参数。操作系统先在外存中为文件找到存储空间,然后根据文件存放路径找到目标目录项,在其中添加一个条目。

  6. 删除文件(delete):提供文件存放路径和文件名作为参数,找到其目录项后,根据目录项回收其占用的磁盘块,最后删除此目录项。

文件共享

文件共享的意义:使多个用户或进程共享同一个文件,而系统中只需要保留文件的一个副本。

两种实现方式:基于索引结点的硬链接共享方式和基于符号链的软链接共享方式。

硬链接方式:此种方式的目录项由文件名和索引结点指针组成,文件的信息除文件名外全部存放于索引结点中,此外,还在索引结点中设置了一个链接计数器count用于表示链接到本索引结点上的用户目录项的数目。此种方式下,用户A创建一个新文件时,此文件的链接计数器被置为1,若用户B欲共享此文件,则在用户B的目录中增加一个目录项,将B的目录项的索引结点指针指向此文件的索引结点,然后count += 1。A欲删除文件时,只能删除自己的目录项,并将count值减一,此时用户B仍可访问此文件,直至count值减为0时,由系统负责删除此文件。

软链接方式:引入了一种新文件类型LINK,这种文件记录了被共享的文件的存放路径。B欲共享A的文件时,在B的目录下创建一个LINK型文件指向A的文件,当操作系统判断某文件为LINK型文件时,会根据其中记录的路径来查找目录,进而找到A的文件,注意,如果把A的源文件删除后,在同目录下放入一个同名文件,B再打开时会打开新的文件。使用此种方式实现共享时,只有文件的拥有才有指向源文件索引结点的指针,其他用户实质上只有一个源文件的路径。

文件保护

口令保护:在文件FCB或索引结点中设置一个口令字段,用户访问文件前需输入口令并由OS进行验证。这种方式的口令存储在系统中,安全性不够高。

加密保护:对文件进行加密,访问文件时需要提供密码对文件进行解密。这种方式加解密需要一定开销。

访问控制:在FCB或索引结点中增加一个访问控制表,记录了各个用户可以对文件执行的操作,如读、写、执行等。

磁盘

磁盘结构

见:鸟哥的Linux私房菜(3):主机规划与磁盘分区

磁盘分类

固定头磁盘:每个磁道都有一个磁头,使用时只需激活对应磁道即可,不需移动。

活动头磁盘:通过磁头臂的来回伸缩来定位磁道。

磁盘调度算法

一次磁盘读写操作的时间由寻找时间、延迟时间和传输时间决定。

寻找时间:启动磁头臂的时间 + 寻道时间

延迟时间:平均需要转的圈数1/2 * 转一圈所需的时间

传输时间:需要读写的磁道数(即b字节/每个磁道上的字节数N)* 转一圈所需的时间

在这些时间中,操作系统唯一可以优化的就是寻道时间,其余都由磁盘决定,因此有了不同的磁盘调度算法,如先来先服务、最短寻找时间优先、SCAN、C-SCAN、LOOK、C-LOOK等。

比较如下:

算法描述优点缺点
FCFS先来先服务公平、简单、不会饥饿平均寻道距离久
SSTF最短寻道时间优先性能比FCFS好不能保证平均寻道距离短、会饥饿
SCAN初始时向某方向移动,依次访问各磁道,直到到头后,反向移动,依次访问各磁道不会饥饿、寻道性能好不利于远离磁头一端的访问请求
C-SCAN初始时向某方向移动,依次访问各磁道,直到到头后,快速移动至另一端,移动过程中不访问磁道,到达另一端后开始依次访问各磁道消除了SCAN中的不公平-
LOOK基本同SCAN,唯一改进的是不需要到头才返回,访问到单向最后一个磁道后即返回减少了不必要的移动-
C-LOOK同上

交替编号

假设要读取物理上相邻的2、3、4号扇区,磁头读取完2号扇区后,需要一小段时间进行处理,但是在处理时,盘片仍在不停地旋转,于是可能就会错过3、4号扇区,需要再次旋转一圈才能读取。考虑程序的空间局部性,如果逻辑上相邻的扇区物理上也相邻的话,其读写效率就会大大减少。

采用交替编号的策略,使逻辑上相邻的扇区在物理上有一定间隔,如图。
在这里插入图片描述

错位命名

如果同一柱面上从上至下扇区号都相同的话,按(柱面号, 盘面号, 扇区号)的格式,若要读取(000, 00, 111)后读取(000, 01, 000),当读完第一个磁盘块后,需要短暂的时间作处理,处理时就错过了1号盘面的0号扇区。
因此可以将位于同一柱面上不同盘面的扇区错位命名,使其能连续读取,而不用转过一圈后再读。

磁盘初始化

磁盘出厂时还未划分扇区。

  1. 低级(物理)格式化:划分各扇区,扇区包括头、数据区、尾三部分,头尾部分用于存储管理扇区的信息(如CRC码)。
  2. 逻辑分区:每个分区由若干柱面组成。
  3. 逻辑格式化:创建文件系统根目录、初始化存储空间管理时要用到的数据结构,如位示图、空闲分区表等。

引导块

计算机开机时需要进行一系列初始化工作,在ROM中只存放一个很小的“自举程序装入程序”,上电时启动,它负责将自举程序从磁盘的引导块(启动分区)上读入内存,完成初始化。拥有启动分区的磁盘称为启动盘(系统盘)。

坏块

发生硬件故障后无法正常使用的磁盘块被称为坏块。

对于简单的磁盘,可以在逻辑格式化时进行坏块检查,并在某些数据结构(如FAT表)中进行标明。这种方式的坏块对操作系统不透明。

对于复杂的磁盘,由一个磁盘内的硬件(磁盘控制器)维护一个坏块链表,并保留一些备用扇区用于替换。这种方式的坏块对操作系统透明。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值