重学操作系统之文件管理

·  阅读 2574

文件管理.png

前言

文件管理是操作系统的功能之一,由于系统的内存有限并且不能长期存储,故平时总是把数据以文件的形式存储在外存中,需要时再将其调入内存。

文件和文件系统

文件的定义

文件系统的管理功能是通过把它所管理的程序和数据组织成一系列文件的方法来实现的。而文件则是指具有文件名的若干相关元素的集合。元素通常是记录,而记录是一组有意义的数据项的集合。可以把数据组成分为数据项、记录、文件。

  1. 数据项,数据项是最低级数据组织形式。分为基本数据项(用于描述一个对象某种属性的字符集,是数据组织中可以明明的最小逻辑数据单位,即原子数据,又称为数据元素或字段)和组合数据项(由若干个基本数据项组成)。
  2. 记录,是一组相关数据项的集合,用于描述一个对象在某方面的属性,为了能够唯一标识一个记录,需要在记录中确定一个或集合数据项,把他们的集合称为关键字,关键字是能够唯一标识一个记录的数据项。
  3. 文件,文件是指具有文件名的一组相关元素的集合,文件是文件系统的最大数据单位,逻辑上可分为:有结构文件:由一组相关记录组成,又称记录式文件;无结构文件:可看作一个字符流,比如一个二进制文件或字符文件,又称流式文件。。

文件的属性

文件有自己的属性,这根据系统的不同而有所不同,但通常具有以下属性:

  1. 名称:文件名称唯一,以容易读取的形式保存;

  2. 标识符:标识文件系统内文件的唯一标签,通常为数字,是对用户不可读的一种内部名称;

  3. 类型:被支持不同类型的文件系统所使用;

  4. 位置:指向设备和设备上文件的指针;

  5. 大小:文件当前大小(用字节、字或块表示),也可包含文件允许的最大值;

  6. 保护:对文件进行保护的访问控制信息;

  7. 时间、日期和用户标识:文件创建、上次修改和上次访问的相关信息,用于保护和跟踪文件的使用。

总述,所有文件的信息都保存在目录结构中,而目录结构也保存在外存上,文件及其相关信息在需要时再调入内存,通常,目录条目包括文件名称及其唯一标识符,而标识符定位其他属性的信息。

文件系统模型

所谓文件系统,是指操作系统中与文件管理有关的那部分软件以及被它们管理的文件和文件属性的集合。可将文件系统的模型分成以下几个层次:

  1. 对象及其属性:文件系统管理的对象有文件、目录和文 文件系统接口 件存储器。
  2. 对对象操纵和管理的软件集合:这是文件系统的核心部分,它实现了文件存储空间管理、文件目录管理、文件的逻辑地址向物理地址的转换、文件的读和写管理以及文件的共享和保护等功能。
  3. 文件系统的接口:文件系统向用户提供的接口有命令接口、程序接口以及图形用户接口三类,用户可通过它们来使用文件系统。

文件的操作

  1. 创建文件,在创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项,目录项中应该记录新文件的文件名及其在外存的地址等属性。

  2. 删除文件,当已不再需要某文件时,可将其从文件系统中删除,在删除时,系统应先从目录中找到要删除文件的目录项,使之成为空项,然后回收该文件所占用的存储空间。

  3. 读文件,读文件时,须在相应系统调用中给出文件名和应读入的内存目标地址。此时,系统要查找目录,找到指定目录项,从中得到被读文件在外存中的位置。在目录项中,还有一个指针用于对文件进行读/写。

  4. 写文件,写文件时,须在相应系统调用中给出文件名和其在内存源地址。此时,系统要查找目录,找到指定目录项,从再利用目录中的写指针进行写操作。

  5. 设置文件的读写指针,用于设置文件读/写指针的位置,以便每次读/写文件时,不需要从始端开始而是从所设置的位置开始操作。可以改顺序存取为随机存取。

  6. 打开文件,打开文件的主要功能是将指定文件的属性信息复制到内存中,并返回内存中的该文件属性信息的指针。以后,用户需要对该文件进行操作时,便可直接在存中找到文件的外存地址等属性,从而显著地提高对文件的操作速度。

  7. 关闭文件,当用户目前不再要求访问某个打开的文件时,可对它进行关闭操作。将从内存中删除指定文件的属性信息,如果其中的文件属性信息已被修改过,则还将它写回外存。关闭文件后,若要再次访问该文件,则必须重新进行打开文件的操作。

文件的逻辑结构

对任何的文件,都存在以下两种形式的结构:

  1. 文件的逻辑结构,这是从用户观点出发所观察到的文件组织形式,是用户可以直接处理的数据及其结构,独立于文件的物理特性,又称为文件组织。
  2. 文件的物理结构,又称为文件的存储结构,是指文件在外存上的存储组织形式,不仅与存储介质有关,还与外存分配方式有关。 image.png

文件的逻辑结构是指从用户角度出发所观察到的文件组织形式。从逻辑结构的角度考可将文件分成有结构文件和无结构文件两大类。 image.png

无结构文件

无结构文件是最简单的文件组织形式,其长度以字节(Byte)为单位。由于没有结构,因而对记录的访问只能通过穷举搜索的方式,故对大多数应用不适用,但字符流的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多的文件较适于釆用字符流的无结构方式,如源程序文件、可执行文件、库函数等。

有结构文件

有结构文件是由一个以上的记录构成的文件,故又称记录式文件。每个记录都用于描述实体集中的一个实体,各记录有着相同或不同数目的数据项,记录分为定长记录(文件中所有记录的长度都是相同的,所有记录中的各数据项都处在记录中相同的位置,具有相同的顺序和长度)和变长记录(文件中个记录的长度不相同,可能由于一个记录中所包含的数据项目并不相同)。按记录的组织形式可分为:

  1. 顺序文件

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

image.png

顺序文件有两种结构 image.png 2. 索引文件

对于定长记录文件,可以方便的实现顺序存取和直接存取,然而对于变长记录就很难实现,因此,可为变长记录文件建立一张索引表,对于主文件中的每个记录,在索引表中设有一个表项用来存储该记录的长度m及指向该记录的指针ptr(指向逻辑地址空间的首址)。由于索引表是按记录键排序的,因此索引表本身是一个定长记录的顺序文件。

image.png 在对索引文件进行检索时,首先根据用户提供的关键字,利用折半查找检索索引表,找到相应的表项,再利用该表项给出的指向记录的指针值,访问所需的记录。每当要向索引文件中增加一个新纪录时,便须对索引表进行修改。索引表的问题在于除了有主文件外,还需要配置一张索引表,每个记录需要有一个索引项,因此提高了存储费用。

  1. 索引顺序文件

索引顺序文件是顺序和索引两种组织形式的结合。索引顺序文件将顺序文件中的所有记录分为若干个组,为顺序文件建立一张索引表,在索引表中为每组中的第1个记录建立一个索引项,其中含有该记录的关键字值和指向该记录的指针。

image.png 如上图所示,主文件名包含姓名和其他数据项。姓名为关键字,索引表中为每组的第一个记录(不是每个记录)的关键字值,用指针指向主文件中该记录的起始位置。索引表只包含关键字和指针两个数据项,所有姓名关键字递增排列。主文件中记录分组排列,同一个组中关键字可以无序,但组与组之间关键字必须有序。查找一个记录时,通过索引表找到其所在的组,然后在该组中使用顺序查找就能很快地找到记录。

  1. 直接文件和散列文件(又称哈希文件,Hash File)

直接文件是根据给定的记录键值,直接获得指定记录的物理地址,即记录键值本身就决定了记录的物理地址,这种由记录键值到记录物理地址的转换被称为键值转换;

哈希文件是利用Hash函数将记录键值转换为相应的记录地址,为了能实现文件存储空间的动态分配,通常由Hash函数所求得的并非是相应记录的地址,而是指向一目录表相应表目的指针,该表目的内容指向相应记录所在的物理块。

注: 直接文件和散列文件这种映射结构不同于顺序文件和索引文件,没有顺序的特性。

文件目录

image.png

文件控制块

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

  1. 基本信息:如文件名、文件的物理位置、文件的逻辑结构(指示文件是流式文件还是记录式文件、记录数,文件是定长还是变长记录)、文件的物理结构等(指示文件是顺序文件、链式文件还是索引文件);

  2. 存取控制信息:包括文件主的存取权限、核准用户的存取权限及一般用户的存取权限;

  3. 使用信息:如文件建立时间、修改时间等。

image.png

索引结点

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

image.png

目录结构

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

  1. 单级目录结构,在整个系统中只建立一张目录表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址、状态位(表示目录项是否空闲)等。每当要建立一个新文件时,必须先检查所有的目录项,以保证新文件名在目录中是唯一的,然后再从目录表中找到一个空白目录项,填入新文件的文件名及其他说明信息,并置状态为1,删除文件时,先从目录中找到该文件的目录项,回收该文件所占用的存储空间,然后再清除该目录项。单级目录的有点是简单并且能够实现目录管理的基本功能-按名存取,但是查找速度慢(查找一个目录项要花费较多的时间),不允许重名(在一个目录表中的所有文件,都不能与另一个文件有相同的名字,这是难以避免的),不便于实现文件共享(每一个用户都有自己的名字空间或命名习惯,因此,应该允许不同用户使用不同的文件名来访问同一个文件。

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

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

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

image.png 在树形目录结构中,用户可为自己建立UFD,并可再创建子目录,在用户要创建一个新文件时,只需要查看自己的UFD及其子目录中有无与新建文件相同的文件名,若无,便可在UFD或其某个子目录中增加一个新目录项。在树形目录中,如何删除一个目录,应该视情况而定,若要删除的目录为空,则简单地将其删除,使它在其上一级目录中所对应的目录项为空,若不为空,可采用如下方法:不删除非空目录(当目录不为空时,为了删除一个非空目录,必须先删除目录中所有的文件,使之称为空目录,然后再删除,如果目录中包含有子目录,则应该递归调用方式删除),可删除非空目录(将目录中的所有文件和子目录同时删除)。

目录查询技术

当用户要访问一个已存在的文件时,系统首先利用用户提供的文件名对目录进行查询,找出该文件的文件控制块或对应索引结点,然后,根据FCB或索引结点中所记录的文件物理地址(盘块号),换算出文件在磁盘上的物理位置,最后,再通过磁盘驱动程序,将所需文件读入内存。目前常用的方式有线性检索法Hash方法。

  1. 线性检索法,其又称为顺序检索法,在树形目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时须对多级目录进行查找。
  2. Hash方法,系统利用用户提供的文件名并将它转换为文件目录的索引值,再利用该索引值到目录中去查找,这将提高检索速度。

文件共享

文件共享使多个用户(进程)共享同一份文件,系统中只需保留该文件的一份副本。如果系统不能提供共享功能,那么每个需要该文件的用户都要有各自的副本,会造成对存储空间的极大浪费。随着计算机技术的发展,文件共享的范围已由单机系统发展到多机系统,进而通过网络扩展到全球,这些文件的分享是通过分布式文件系统、远程文件系统、分布式信息系统实现的。这些系统允许多个客户通过C/S模型共享网络中的服务器文件。 image.png

基于索引结点的共享方式(硬链接)

在这种情况下,文件的属性和文件的地址不再放在文件的目录中,而是存在索引中,文件目录中存放着文件名和指向索引的指针。Linux操作系统中把这种索引的结点称为 Inode 结点。在索引的结点中还有一个计数器,用来统计文件被多少用户访问。

image.png 当 count = 1 时候,创建文件的用户才能删除文件,否则不能删除文件,这是在这种共享文件系统下系统的规定,因为如果建立共享文件的用户删除了共享文件,系统又在共享的位置建立了新的文件,这样其他用户在共享文件的时候就会访问成了其他文件,失去了共享文件的意义。

因此,创建共享文件的用户在不再需要此文件时,不能直接删除,只是将该文件的 count 减1,然后删除自己目录中的相应目录项。其他用户仍可以使用该共享文件,当 count = 0 时,表示没有用户使用该文件,系统将负责删除该文件。由此引出了下一种文件共享方式。

利用符号链实现文件共享(软链接)

当用户需要访问共享文件的时候,由系统生成一个链接的文件,用来指向共享文件的目录,其他用户根据这个链接文件来访问共享文件,这时候如果文件所有者删除了文件或者修改了文件,就需要其他用户重新生成链接文件,原来的链接就会失效。 image.png 在利用符号链方式实现文件共享时,只有文件的拥有者才拥有指向其索引结点的指针。而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引结点的指针。这样,就不会发生在文件主删除一共享文件后留下悬空指针的情况。

符号链方式有一个很大的优点,即网络共享只需提供该文件所在机器的网络地址以及该机器中的文件路径即可。但也仍然存在问题,例如:一个文件釆用符号链方式共享,当文件拥有者将其删除,而在共享的其他用户使用其符号链接访问该文件之前,又有人在同一路径下创建了另一个具有同样名称的文件,则该符号链将仍然有效,但访问的文件已经改变,从而导致错误。

文件保护

为了防止文件共享可能会导致文件被破坏或未经核准的用户修改文件等问题,文件系统必须控制用户对文件的存取,即解决对文件的读、写、执行的许可问题。为此,必须在文件系统中建立相应的文件保护机制。

文件保护通过口令保护加密保护访问控制等方式实现。其中,口令保护和加密保护是为了防止用户文件被他人存取或窃取,而访问控制则用于控制用户对文件的访问方式。

访问类型

对文件的保护可以从限制对文件的访问类型中出发。可加以控制的访问类型主要有以下几种:

  • 读:从文件中读。
  • 写:向文件中写。
  • 执行:将文件装入内存并执行。
  • 添加:将新信息添加到文件结尾部分。
  • 删除:删除文件,释放空间。
  • 列表清单:列出文件名和文件属性。

访问控制

解决访问控制最常用的方法是根据用户身份进行控制。而实现基于身份访问的最为普通的方法是为每个文件和目录增加一个访问控制列表(Access-Control List, ACL),以规定每个用户名及其所允许的访问类型。

这种方法的优点是可以使用复杂的访同方法。其缺点是长度无法预期并且可能导致复杂的空间管理,使用精简的访问列表可以解决这个问题。

精简的访问列表釆用拥有者、组和其他三种用户类型。

  • 拥有者:创建文件的用户。
  • 组:一组需要共享文件且具有类似访问的用户。
  • 其他:系统内的所有其他用户。

这样只需用三个域列出访问表中这三类用户的访问权限即可。文件拥有者在创建文件时,说明创建者用户名及所在的组名,系统在创建文件时也将文件主的名字、所属组名列在该文件的FCB中。用户访问该文件时,按照拥有者所拥有的权限访问文件,如果用户和拥有者在同一个用户组则按照同组权限访问,否则只能按其他用户权限访问。UNIX操作系统即釆用此种方法。

口令和密码是另外两种访问控制方法。

口令指用户在建立一个文件时提供一个口令,系统为其建立FCB时附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时必须提供相应口令。这种方法时间和空间的开销不多,缺点是口令直接存在系统内部,不够安全。

密码指用户对文件进行加密,文件被访问时需要使用密钥。这种方法保密性强,节省了存储空间,不过编码和译码要花费一定时间。

口令和密码都是防止用户文件被他人存取或窃取,并没有控制用户对文件的访问类型。

分类:
后端
收藏成功!
已添加到「」, 点击更改