【操作系统基础】文件管理系统(一)

一、初始文件管理

由于系统的内存有限并且不能长期将文件保存在内存中,因此平时总是将它们以文件的形式存放在外存中,需要时再将它们调入内存。如何合理并高效地进行文件管理是操作系统实现的目标。

1. 文件的属性

计算机中存放了各种各样的文件,一个文件拥有哪些属性?这里简单介绍下:

  • 文件名:由创建文件的用户决定文件名,主要是为了方便用户找到文件,同一目录下不允许有重名文件;
  • 标识符:一个系统内的各文件标识符唯一,对用户来说毫无可读性,因此标识符只是操作系统用于区分各个文件的一种内部名称;
  • 类型:指明文件类型;
  • 位置:文件存放的路径(让用户使用)、在外存中的地址(操作系统使用,对用户不可见);
  • 大小:指明文件的大小;
  • 保护信息:对文件进行保护的访问控制信息;
  • 创建时间、上次修改时间以及文件所有者信息。

2. 文件的组织形式

文件的逻辑结构可分为两大类,一类是有结构文件,这是指由一个以上的记录构成的文件,故称为记录式文件。另一类是无结构文件,这是由字符流或者二进制数据构成的文件,又称为流式文件。

  • 无结构文件:如文本文件,对于源程序、可执行文件、库函数等通常采用的是无结构文件形式;
  • 有结构文件:每个记录都用于描述实体集中的一个实体,各记录有着相同或不同数目的数据项,记录分为定长记录(文件中所有记录的长度都是相同的,所有记录中的各数据项都处在记录中相同的位置,具有相同的顺序和长度)和变长记录(文件中各记录的长度并不一定相同,可能由于一个记录中所包含的数据项长度不同)。根据用户和系统的需要,可采用多种方式来组织这些记录,如顺序文件(记录按照某种顺序排列所形成的文件,记录通常是定长的,能较快查找到文件中的记录),索引文件(记录为可变长度时,通常建立一张索引表,并为每个记录设置一个表项,加快对记录检索的速度),索引顺序文件(为文件建立一张索引表,为每一组记录中的第一个记录设置一个表项)。

3. 操作系统相关功能

  • 创建文件:即 create 系统调用,在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项,目录项中应该记录新文件的文件名及其在外存的地址等属性;
  • 删除文件:即 delete 系统调用,当已不再需要某文件时,可将其从文件系统中删除,在删除时,系统应先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间;
  • 读文件:即 read 系统调用,须在相应系统调用中给出文件名和应读入的内存目标地址。此时,系统要查找目录,找到指定目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件进行读/写;
  • 写文件:即 write 系统调用,写文件时,须在相应系统调用中给出文件名和其在内存源地址。此时,系统要查找目录,找到指定目录项,从再利用目录中的写指针进行写操作;
  • 打开文件:即 open 系统调用;
  • 关闭文件:即 close 系统调用。

基于上面操作系统提供的几个基本操作从而可以完成更加复杂的操作,比如“复制文件”:先创建一个新的空文件,再把源文件读入内存,再将内存中源文件读入内存,再将内存中的数据写到新文件中。

4. 文件在外存如何存放

类似于将内存分为一个一个“内存块”,外存分为一个一个“块/磁盘块/物理块”。每个磁盘块的大小是相等的,每块一般包含2的整数幂各地址(如下图中,一块包含 2^10 个地址,即 1 KB)。同样类似的是,文件的逻辑地址也分为(逻辑块号,块内地址),操作系统同样需要将逻辑地址转化为外存的物理地址(物理块号,块内地址)的形式。块内地址的位数取决于磁盘块的大小。

在这里插入图片描述

操作系统以“块”为单位为文件分配存储空间,因此即使一个文件大小只有10 B,但它依然需要占用 1 KB(假设一块为1 KB)的磁盘块。外存中的数据读入内存同样以块为单位。

二、文件的逻辑结构

所谓的“逻辑结构”,就是指在用户看来,文件内部的数据应该是如何组织起来的。而“物理结构”指的是在操作系统看来,文件的数据是如何存放在外存中的。类似于数据结构的“逻辑结构”和“物理结构”。

在这里插入图片描述

1. 有结构文件

上文提到,按文件是否有结构分类,可以分为无结构文件、有结构文件两种。

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”。如:Windows 操作系统中的 .txt 文件;

有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又由若干个数据项组成。如:数据库文件。一般来说,每条记录有一个数据项可作为关键字(作为识别不同记录的 ID)。

同时,根据各条记录的长度(占用的存储空间)是否相等,又可分为定长记录可变长记录两种。

比如说我们现在的一条记录,记录中的各项的长度基本不会相差太多,那么我们可能就将其设定为定长记录。如果这条记录中有某项长度在各条记录中可能的长度都相差较大,那么我们或许会将其设置为可变长记录。如同我们 MySQL 数据库中的 char 和 varchar。

2. 有结构文件的逻辑结构

无结构文件的内部数据其实就是一系列字符流,没有明显的结构特性。因此也不用探讨无结构文件的“逻辑结构”问题。

而有结构文件根据各条记录在逻辑上的组织,可以分为三类:顺序文件、索引文件以及顺序索引文件。

2.1 顺序文件

顺序文件就是指文件中记录一个接一个地顺序排序(逻辑上),记录可以是定长的或可变长的。各个记录在物理上可以顺序存储链式存储

在这里插入图片描述

基于上述两种存储结构,它们也各有其优缺点:

  • 链式存储:无论是定长/可变长记录,都无法实现随机存取,每次只能从第一个记录开始依次往后查找;
  • 顺序存储:
    • 可变长记录:无法实现随机存取,每次只能从第一个记录开始依次往后查找;
    • 定长记录:可实现随机存取,记录长度为L,则第 i 个记录存放的相对位置是 i * L;若采用串结构,无法快速找到某关键字对应的记录;若采用顺序结构,可以快速找到某关键字对应的记录(如折半查找)。

在这里插入图片描述

2.2 索引文件

对于可变长记录文件,要找到第 i 个记录,必须先顺序查找前 i-1 个记录,但是很多应用场景中又必须使用可变长记录。对于此问题,可以使用索引文件解决。
在这里插入图片描述

索引表本身是定长记录的顺序文件。因此可以快速找到第 i 个记录对应的索引项。可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。每当要增加/删除一条记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于信息处理的及时性要求比较高的场合

另外,可以用不同的数据项建立多个索引表。如:学生信息表,可用关键字“学号”建立一张索引表。也可用“姓名”建立一张索引表。这样就可以根据“姓名”快速地检索文件了。(Eg: SQL 就支持根据某个数据项建立索引的功能)。

2.3 索引顺序文件

上面介绍了索引文件,但是索引文件有个缺点:每个记录对应一个索引表项,因此索引表可能会很大。比如:文件的每个记录平均只占 8 B,而每个索引表项占 32 个字节,那么索引表都要比文件内容本身大4倍,这样对存储空间的利用率就太低了。

在这里插入图片描述

索引顺序文件是索引文件和顺序文件思想的结合。索引顺序文件中,同样会为文件建立一张索引表,但不同的是:并不是每个记录对应一个索引表项,而是一组记录对应一个索引项

除此之外,为了进一步提高索引效率,可以为顺序文件建立多级索引表。

三、目录管理

为了能够对文件实施有效的管理,必须对它们加以妥善组织,这主要是通过文件目录实现的,文件目录也是一种数据结构,用于标识系统中的文件及其物理地址,供检索时使用,对目录的管理要求如下:

  1. 实现按名存取:即用户只需向系统提供所需访问的文件的名字,便能够快速准确地找到指定文件在外存上的存储位置,这是目录管理中最基本的功能。
  2. 提高对目录检索速度:通过合理地组织目录结构的方法,可加快对目录的检索速度,从而提高对文件的存取速度;
  3. 文件共享:在多用户系统中,应该允许用户共享一个文件;
  4. 允许文件重名:系统应允许不同用户对不同文件采用相同的名字,以便用户按照自己的习惯给文件命令和使用文件。

1. 文件控制块

为了能够对文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为文件控制块 FCB,文件管理程序可借助于文件控制块中的信息,对文件施加各种操作,文件与文件控制块一一对应,而人们把文件控制块的有序集合称为文件目录,一个文件控制块就是一个文件目录项。通常,一个文件目录也可被看成是一个文件,称为目录文件

文件控制块包含基本信息、存取控制信息、使用信息。

  • 基本信息:包括文件名、文件物理位置、文件逻辑结构(指示文件是流式文件还是记录式文件、记录数,文件是定长还是变长记录);文件物理结构(指示文件是顺序文件、链式文件还是索引文件);
  • 存取控制信息:包括文件主的存取权限、核准用户的存取权限以及一般用户的存取权限;
  • 使用信息:包括文件的建立日期和时间、文件上一次修改的日期和时间以及当前使用信息(这项信息包括当前已打开该文件的进程数、是否被其他进程锁住、文件在内存中是否已被修改但尚未拷贝到盘上)

在这里插入图片描述

2. 目录结构

目录结构的组织,关系到文件系统的存取速度,也关系到文件的共享性和安全性,目录的结构形式有单级目录、两级目录、多级目录。

2.1 单级目录

在整个系统中只建立一张表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址、状态位(标识目录是否空闲)等。

每当要建立一个新文件时,必须先检查所有的目录项,以保证新文件在目录中是唯一的,然后再从目录表中找到一个空闲目录项,填入新文件的文件名及其他说明信息,并置状态位为1,删除文件时,先从目录中找到该文件所占用的存储空间,然后再清除该目录项。

单级目录的优点是简单并且能够实现目录管理的基本功能:按名存取。但是查找速度慢(查找一个目录项要花费较多的时间),不允许重名(在一个目录表中的所有文件,都不能与另一个文件有相同的名字,这是难以避免的),不便于实现文件共享(每一个用户都有自己的命名空间或命名习惯,因此需允许不同用户使用不同的文件名来访问同一文件)。

在这里插入图片描述

2.2 两级目录

为每个用户建立一个单独的用户文件目录 UFD(User File Directory),这些文件目录具有相似的结构,由用户所有文件的文件控制块组成。此外,系统中还有一个主文件目录MFD(Master File Directory),在主文件目录中,每个用户目录文件都占有一个目录项,其目录项包括用户名和指向用户目录文件的指针。

在这里插入图片描述

两级目录结构克服了单级目录的缺点,具有以下优点:

  1. 提高了检索目录的速度(如果在主目录中有n个子目录,每个用户目录最多为m个目录项,则为查找一指定的目录项,最多只需要检索n+m个目录项;
  2. 在不同的用户目录中,可以使用相同的文件名(只要在用户自己的UFD中,每个文件名都是唯一的,不同用户可以有文件名相同的文件);
  3. 不同用户还可使用不同的文件名来访问系统中同一个共享文件。但在多个用户需要合作完成一个大任务时,不便于用户之间共享文件。
2.3 多级目录

对于大型文件系统,通常采用三级及以上的目录结构,以提高对目录的检索速度和文件系统的性能。多级目录结构又称为树形目录结构,主目录被称为根目录,把数据文件称为树叶,其他的目录均作为树的节点。

在这里插入图片描述

在树形目录结构中,从根目录到任何数据文件,都只有一条唯一的通路,在该路径上从树的根开始,把所有目录文件名和数据文件依次用“/”连接起来,即构成该数据文件的路径名。系统中的每个文件都有唯一的路径名。例如,用户B访问文件J,则使用路径名 /B/F/J 来访问。

当一个文件系统含有很多级时,每访问一个文件,都要使用从树根开始直到树叶(数据文件)为止的、包含各中间节点(目录)的全路径名,这非常麻烦,可为每个进程设置一个当前目录,又称为工作目录,进程对各文件的访问都相对于当前目录而进行的。把从当前目录开始值得数据文件为止所构成的路径名称为相对路径名,而把从树根开始的路径名称为绝对路径名

3. 增删目录

在树形目录结构中,用户可为自己建立 UFD,并可再创建子目录,在用户要创建一个新文件时,只需要查看自己的 UFD 及其子目录中有无与新建文件相同的文件名,若无,便可在 UFD 或其某个子目录中增加一个新目录项。

在树形目录中,如何删除一个目录,应该视情况而定,若要删除的目录为空,则简单地将其删除,使它在其上一级目录中所对应的目录项为空,若不为空,可采用如下方法:不删除非空目录(当目录不为空时,为了删除一个非空目录,必须先删除目录中所有的文件,使之称为空目录,然后再删除,如果目录中包含有子目录,则应该递归调用方式删除),可删除非空目录(将目录中的所有文件和子目录同时删除)。

4. 索引结点

文件目录通常是存放在磁盘上的,当文件很多时,文件目录可能要占用大量的盘块,在查找的过程中,先将存放目录文件的第一个盘块中的目录调入内存,然后把用户给定的文件名和目录项中的文件名逐一对比。若未找到指定文件,则再将下一盘块中的目录项调入内存。在检索目录文件时,只用到了文件名,仅当找到一个目录项(即其中的文件名与指定要查找的文件名相匹配)时,才需要从该目录项中读出该文件的物理地址,而其他一些对该文件进行描述的信息,在检索目录时一概不用,显然,这些信息在检索目录时不需要调入内存。

为此,在有的系统中,如UNIX系统,便采用了把文件名和文件描述信息分开的方法,即将文件描述信息单独形成一个称为索引结点的数据结构,简称为 i 结点,在文件目录中的每个目录项由文件名和指向该文件所对应的i结点的指针所构成。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值