操作系统精髓与设计原理(十)——文件管理

概述

文件和文件系统

文件系统提供了二级存储相关的资源抽象。文件系统允许用户建立所有需要特性的被称为文件的数据集合。
任何文件系统不但提供了一个手段去存储数据,而且提供一系列对文件进行操纵的功能接口。
文件系统为文件维护一系列属性,包括所有者、创建时间、最后修改时间和访问权限等。

文件结构

讨论文件时通常使用域、记录、文件、数据库等术语。

  • 域:基本的数据单元,一个域包含一个值。例如人员的名字。
  • 记录:一组相关的域的集合。一个人员的完整信息。
  • 文件:一组相似记录的集合,它被用户和程序看作一个实体,并可以通过名字访问。
  • 数据库:一组相关的数据的集合,它的本质特征时数据元素间存在的明确的关系,并且可供不同的应用程序所使用。

文件管理系统

文件管理系统是一组系统软件,为使用文件的用户和应用程序提供服务。通常,文件管理系统是用户访问文件的唯一方式,统一的接口。

文件系统架构

  1. 设备驱动程序:最底层,直接与外围设备通信。
  2. 基本文件系统:这是计算机系统与外部环境的基本接口,它关注的是这些块在二级存储和内存缓冲区的位置,而不是数据内容和文件结构。
  3. 基本IO管理程序:负责所有文件IO的初始和终止。
  4. 逻辑IO:使用用户和应用程序能够访问到记录。

文件组织和访问

文件组织指文件中记录的逻辑结构,它由用户访问记录的方式确定。
选择文件组织的原则:快速访问、易于修改、节约空间、维护简单、可靠性。

堆是最简单的文件组织形式。数据按它们到达的顺序被采集,每个记录由一串数据组成。堆的目的仅仅是积累大量的数据并保存数据。
堆没有结构,对记录的访问只能是穷举查找。查询低效。

顺序文件

顺序文件是最常用的文件组织形式。在这类文件中,每个记录都使用一种固定的格式。所有记录都具有相同的长度,并且由相同数目、长度固定的域按特定的顺序组成。
一个特殊的域称作关键域,是每个记录的第一个域,用来唯一标识这个记录。记录按关键域来存储:文本关键域按字母顺序,数字关键域按数字的顺序。查询低效。

索引顺序文件

克服顺序文件的缺点的一种常用方法是索引顺序文件。
索引顺序文件保留了顺序文件的关键特征:记录按照关键域顺序组织起来。但还增加了两个特征:用于支持随机访问的文件索引溢出文件。索引提供了快速查找能力,溢出文件中的记录可以根据它前面记录的指针定位。

索引文件

索引文件摒弃了顺序性和关键字的概念,只能通过索引来访问记录。
索引文件用于对数据实时性要求比较严格并且很少对所有数据进行处理的应用程序中。

直接文件或散列文件

散列文件开发直接访问磁盘中任何一个地址已知的块的能力。每个记录需要关键域,但是这里没有顺序的概念。
散列文件使用基于关键字的散列,可以快速访问,并且记录长度是固定的,通常只访问一条记录。

文件目录

内容

任何文件管理系统和文件集合相关联的是文件目录,目录包含文件的信息,这些信息包括属性、位置和所有权。

结构

某些信息可以保存在与文件相关联的头记录中,这可以减少目录所需要的存储量,使得可以在内存中保留大部分的目录,从而提高速度。
最简单的目录结构信息是一个目录项列表,每个文件一个目录项。简单的列表难以支持复杂的操作。命名的唯一性成为严重的问题。
解决这些问题的出发点是两级方案。在这种情况下,每个用户都有一个目录,还有一个主目录。主目录由每个用户目录的目录项,并提供地址和访问控制信息。每个用户目录是该用户文件的简单列表。只要在每个用户的文件集合中保证名字的唯一性,文件系统就能容易地实现访问限制。
功能更强大灵活地层次或树状结构方法,这一也是最普遍采用的方法。有一个主目录,它下面是很多用户目录,用户目录下面又有很多子目录,任何一个目录都包括子目录的目录项和文件项。

命名

路径名关联上文件名,就能保证唯一性的同时,又友好。

文件共享

共享导致访问权限和对同时访问的管理。

访问权限

文件系统提供一些选项,使得访问某个特定的文件的方式可以被控制。

同时访问

对整个文件加锁是一种选择。比较好的控制粒度是在修改时对单个记录加锁。

记录组块

记录是访问结构化文件的逻辑单元,而块是与二级存储进行IO操作的基本单位。为了执行IO,记录必须组织成块。
固定组块是记录长度固定的顺序文件的最常用的方式。

二级存储管理

在二级存储中,一个文件是由许多块组成的。操作系统或文件管理系统负责给文件分配块。带来的问题:

  • 二级存储的空间必须分配给文件;
  • 必须知道哪些空间可以用来分配。

文件分配

文件分配涉及问题:

  1. 创建新文件时,是否分配给其所需的最大空间。
  2. 给文件分配的空间是一个或多个连续的单元,这些单元称为分区。分区时一组连续的块,一个分区的大小可以从一个块到一整个文件。分配文件时,分区的大小设计问题。
  3. 使用那种数据结构或者表。

预分配与动态分配

预分配策略要求在文件创建时声明该文件的最大大小。会造成空间浪费。
动态分配只有在需要时才给文件分配空间。

分区大小

需要折衷考虑的内容:

  1. 邻近空间可以提高性能。
  2. 数目较多的小分区会增加用于管理分配信息的表的大小。
  3. 使用固定大小的分区可以简化空间的再分配。
  4. 使用可变大小的分区或者固定大小的小分区可以减少由于超额分配而产生的未使用的存储空间浪费。

两个选择:

  • 可变的大规模连续分区:较好的性能,避免空间浪费,分配表较小,但是着导致空间很难再次利用。
  • 块:小的固定分区提供了更大的灵活性,但是为了分配,需要较大的表和复杂的结构。

文件分配方法

三种方法:连续、链接和索引。

  • 连续分配:是指在创建文件时,给文件分配一组连续的块。这是一种大小克变分区的预分配策略。IO性能好,需要压缩算法去除空间碎片。
  • 链接分配:基于单个的块,链中的每个块都包含向下块的指针。适合顺序处理的文件。
  • 索引分配:每个文件在文件分配中有一个一级索引。可以消除外部碎片,提高局部性能。支持顺序访问和直接访问文件,是最普遍的一种文件分配形式。

卷是一个逻辑的磁盘。磁盘会被分为几个分区,每个分区都会作为一个单独的卷来使用。

可靠性

当系统为了提高效率而在内存中保留磁盘分配表和文件分配表的副本会出现的问题。所以需要通过特定的步骤保证数据可靠。

Linux虚拟文件系统

包含一个通用的、强有力的文件处理机制,利用虚拟文件系统VFS来支持大量的文件管理系统和文件结构。对于任何特定文件系统,需要一个映射模块来转换实际文件系统的特征到虚拟文件系统所期望的特征。
通过特定系统的一个映射函数转换该系统调用的内部的一个特定文件的功能调用。

原文地址:https://www.cnblogs.com/lippon/p/14117701.html