408 操作系统 知识点记忆(4)文件管理

408 操作系统 知识点记忆(4)文件管理

前言

本文基于王道考研《操作系统考研复习指导》与汤小丹《计算机操作系统》(第4版)教材内容,结合 408 考研大纲,系统梳理文件管理的核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。

本章把磁盘抽象成"文件"这一用户可见的持久性对象,主线是:文件如何组织(逻辑结构与物理结构)→ 如何按名检索(目录)→ 文件系统如何在外存与内存中布局并挂载。

核心知识记忆点+理解性说明

第四章 文件管理

1. 文件

A. 文件的基本概念

文件系统由两部分组成:文件集合和目录。

文件系统的管理功能是通过将其管理的程序和数据组织成一系列文件的方式实现的,而文件则是指具有文件名的若干相关元素的集合。

元素通常是记录,而记录又是一组有意义的数据项的集合。

基于文件系统的概念,可以把数据的组成分为文件、记录和数据项三级。

在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位。

数据项 文件系统中最低级的数据组织形式。

基本数据项:描述一个对象的某种属性一个值,数据中的最小逻辑单元。组合数据项:多个基本数据项构成。

记录:一组相关数据项的集合,描述一个对象在某方面的属性。

文件。是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。在有结构文件中,文件由若干个相似的记录组成,如一个班的学生记录;

而无结构文件则被视为一个字符流,比如一个二进制文件或字符文件。

文件属性/文件元数据:名称、类型、创建者、所有者、位置、大小、保护、创建时间、最后一次修改时间、存取时间

文件分类方法。

  1. 按性质和用途分类,分为系统文件(只允许用户调用,但不允许用户去读,更不允许用户修改)、用户文件、库文件。2)按文件中数据的形式分类,分为源文件(由源程序和数据构成的文件)、目标文件("把源程序经过编译程序编译后、但尚未经过链接程序链接的目标代码"所构成的文件,其后缀名是".obj")、可执行文件(源程序经过编译程序编译后所产生的目标代码,再经过链接程序链接后所形成的文件,在Windows系统中,其后缀名是.exe或.com)。
  2. 按存取控制属性分类,分为可执行文件(只允许被核准的用户调用执行,不允许读和写)、只读文件、读/写文件。4)按组织形式和处理方式分类,分为普通文件(用户建立的源程序文件、数据文件以及OS自身的代码文件、实用程序等)、目录文件、特殊文件(特指系统中的各类I/O设备)。

文件系统的模型可分为3个层次:最低层是对象及其属性,中间层是对对象进行操纵和管理的软件集合,最高层是文件系统(提供给用户的)接口。

文件系统所管理的对象有3类。1文件 2目录 3磁盘(磁带)存储空间。

对对象进行操纵和管理的软件集合该层是文件系统的核心部分,文件系统的功能大多是在这一层实现的,其中包括:

1 文件存储空间管理功能;

2 文件目录管理功能;

3 用于将文件的逻辑地址变换为物理地址的机制;

4 文件读/写管理功能;

5 文件的共享与保护功能等。

一般地,把与文件系统有关的软件分为4个层次:

1 I/O控制层,是文件系统的最低层,主要由磁盘驱动程序等组成,也可称为设备驱动程序层;

2 基本文件系统,主要用于实现内存与磁盘之间数据块的交换;

3 文件组织模块,也称为基本I/O管理程序,该层负责完成与磁盘I/O有关的事务,如将文件逻辑块号变换为物理块号、管理磁盘中的空闲盘块、指定I/O缓冲等;

4 逻辑文件系统,用于处理并记录同文件相关的操作,如允许用户和应用程序使用符号文件名访问文件和记录、保护文件和记录等。文件系统接口 常用的两类接口是:1命令接口;2程序接口。

B. 文件元数据和索引节点(inode)
  1. 磁盘索引节点
    是指存放在磁盘上的索引节点。每个文件有一个唯一的磁盘索引节点,主要包括以下内容:
    ● 文件主标识符,拥有该文件的个人或小组的标识符。
    ● 文件类型,包括普通文件、目录文件或特别文件。
    ● 文件存取权限,各类用户对该文件的存取权限。
    ● 文件物理地址,每个索引节点中含有13个地址项,即iaddr(0)~iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号。● 文件长度,指以字节为单位的文件长度。
    ● 文件链接计数,在本文件系统中所有指向该文件的文件名的指针计数。
    ● 文件存取时间,本文件最近被进程存取、修改的时间及索引节点最近被修改的时间。
  2. 内存索引节点
    是指存放在内存中的索引节点。当文件被打开时,要将磁盘索引节点复制到内存的索引节点中,便于以后使用。在内存索引节点中增加了以下内容:
    ● 索引节点号,用于标识内存索引节点。
    ● 状态,指示i节点是否上锁或被修改。
    ● 访问计数,每当有一进程要访问此i节点时,计数加1;访问结束减1。
    ● 逻辑设备号,文件所属文件系统的逻辑设备号。
    ● 链接指针,设置分别指向空闲链表和散列队列的指针。
C. 文件的操作:建立,删除,打开,关闭,读,写

文件的基本操作:

  1. 创建文件。为新文件分配外存空间;在目录中为之创建一个目录项,目录项记录了新文件名、文件在外存中的地址等信息。2)删除文件。为了删除文件,根据文件名查找目录,删除指定文件对应的目录项和文件控制块,然后回收该文件所占用的存储空间(包括磁盘空间和内存缓冲区)。
  2. 读文件。为了读文件,根据文件名查找目录,找到指定文件的目录项后,从中得到被读文件在外存中的地址;在目录项中,还有一个指针用于对文件进行读操作。
  3. 写文件。为了写文件,根据文件名查找目录,找到指定文件的目录项后,再利用目录项中的写指针对文件进行写操作。每当发生写操作时,便更新写指针。
  4. 设置文件的读/写位置。可以从所设置的位置开始操作,因此可以改顺序存取为随机存取。

文件打开与关闭

当用户对一个文件实施多次读/写等操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,大多数操作系统要求,当用户首次对某文件发出操作请求时,须先利用系统调用open将该文件打开。系统维护一个包含所有打开文件信息的表,称为打开文件表。所谓"打开",是指系统检索到指定文件的目录项后,将该目录项从外存复制到内存中的打开文件表的一个表目中,并将该表目的索引号(也称文件描述符)返回给用户。当用户再次对该文件发出操作请求时,可通过索引号在打开文件表中查找到文件信息,从而节省了大量的检索开销。当文件不再使用时,可利用系统调用close关闭它,则系统将从打开文件表中删除这一表目。

在多个进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表和每个进程表。整个系统的打开文件表包含与进程无关的信息,如文件在磁盘上的位置、访问日期和文件大小。每个进程的打开文件表保存的是进程对文件的使用信息,如文件的当前读/写指针、文件访问权限,并包含指向系统表中适当条目的指针。一旦有进程打开了一个文件,系统表就包含该文件的条目。当另一个进程执行调用open时,只不过是在其打开文件表中增加一个条目,并指向系统表的相应

条目。通常,系统打开文件表为每个文件关联一个打开计数器(Open Count),以记录多少进程打开了该文件。当文件不再使用时,利用系统调用close关闭它,会删除单个进程的打开文件表中的相应条目,系统表中的相应打开计数器也会递减。当打开计数器为0时,表示该文件不再被使用,并且可从系统表中删除相应条目。

对于访问打开文件表的索引号,UNIX称之为文件描述符,而Windows称之为文件句柄。因此,只要文件未被关闭,所有文件操作都是通过文件描述符(而非文件名)来进行。

每个打开文件都具有如下关联信息:

  1. 文件指针。系统跟踪上次的读/写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
  2. 文件打开计数。计数器跟踪当前文件打开和关闭的数量。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。
  3. 文件磁盘位置。大多数文件操作要求系统修改文件数据。查找磁盘上的文件所需的信息保存在内存中,以便系统不必为每个操作都从磁盘上读取该信息。
  4. 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读/写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝后续的I/O请求。
D. 文件的保护

为了确保文件系统的安全性,可针对上述因素而采取3个方面(人为、系统、自然)的措施:1 通过存取控制机制,防止人为因素导致文件不安全;

2 采取系统容错技术,防止系统某部分的故障导致文件不安全;

3 建立后备系统,防止自然因素导致文件不安全。

为了对系统中的对象加以保护,应由系统来控制进程对对象的访问。对象可以是硬件对象,如磁盘驱动器、打印机等;也可以是软件对象,如文件、程序等。进程对对象所施加的操作也有所不同,如对文件可以进行读操作,也可以进行写或执行操作。我们把一个进程能对某对象进行操作的权力,称为访问权(access right)。每个访问权都可以用一个有序对(对象名,权集)来表示,例如,某进程有对文件F1进行读和写操作的权力,则可将该进程的访问权表示成(F1,{RW})。

为了对系统中的资源进行保护,引入了保护域的概念。保护域简称为"域",是进程对一组对象的访问权的集合。进程只能在指定域内执行操作,这样,"域"也就规定了进程所能访问的对象和所能执行的操作。

进程和域之间可以一一对应,即一个进程只联系着一个域。这意味着,在进程的整个生命期中,其可用资源是固定的,我们把这种进程联系的域称为"静态域"。在这种情况下,进程运行的全过程都受限于同一个域,这将会使赋予进程的访问权超过实际需要。

在进程和域之间,也可以是一对多的关系,即一个进程可以联系着多个域。我们把这种一对多的联系方式称为动态联系方式,在采用这种联系方式的系统中,应增设保护域切换功能,以使进程能在不同的运行阶段从一个保护域切换到另一个保护域。

基本的访问矩阵

我们可以利用一个矩阵来描述系统的访问控制,并把该矩阵称为访问矩阵(access matrix)。访问矩阵中的行代表域,列代表对象,矩阵中的每一项都是由一组访问权所组成的。

具有域切换权的访问矩阵

域D1和域D2所对应的项目中有一个S(即switch),故而允许在域D1中运行的进程切换到域D2中。类似地,在域D2和域D3所对应的项中也有一个S,这表示在域D2中运行的进程可以切换到域D3中,但不允许该进程再从域D3返回域D1。

允许系统或用户可控性地修改访问矩阵中的内容,这可通过在访问权中增加复制权、所有权及控制权的方法来实现。在域D2中对文件F2的读访问权加上"'"号时,表示运行在域D2中的进程可以将它对文件F2的读访问权扩展到域D3中去。再如,在域D1中对文件F3的写访问权加上"'"号时,表示运行在域D1中的进程可以将它对文件F3的写访问权扩展到域D3中去,使在域D3中运行的进程也具有对文件F3的写访问权。

应该注意的是,把带有"'"号的复制权,如R',由access(i,j)复制成access(k,j)后,其所建立的访问权只是R而不是R',这使得域Dk上运行的进程不能再将其复制权进行扩散,从而限制了访问权的进一步扩散。这种复制方式被称为限制复制。

人们不仅要求能将已有的访问权进行有控制的扩散,而且要求能增加某种访问权,或者能删除某种访问权。此时,可利用所有权(ownerright)来实现这些操作。

若在access(D2,D3)中包括了控制权,则一个在域D2中运行的进程能够改变在域D3中运行的进程对各对象的访问权。可知,在域D3中已无对文件F6的写访问权。

访问矩阵的实现

  1. 访问控制表
    对访问矩阵按列(对象)进行划分,并为每一列建立一张访问控制表。在该表中,已把矩阵中属于该列的所有空项删除,此时的访问控制表由一有序对(域,权集)组成。由于在大多数情况下矩阵中的空项远多于非空项,因而使用访问控制表可以显著地减少所占用的存储空间,并能提高查找速度。在不少系统中,当对象是文件时,便把访问控制表存放在该文件的文
    件控制表中,或存放在文件的索引节点中,作为该文件的存取控制信息使用。
  2. 访问权限表
    对访问矩阵按行(即域)进行划分,并为每一行建立一张访问权限表,该表是由一个域对每个对象可以执行的一组操作所构成的表。表中的每一项即该域对某对象的访问权限。当域为用户(进程)、对象为文件时,访问权限表便可用于描述一个用户(进程)对每个文件所能执行的一组操作。
    目前,大多数系统都同时采用访问控制表和访问权限表,在系统中为每个对象配置一张访问控制表。

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

● 写。向文件中写数据。

● 执行。将文件装入内存并执行。

● 添加。将新信息添加到文件结尾部分。

● 删除。删除文件,释放空间。

● 列表清单。列出文件名和文件属性。

访问控制表 规定每个用户名及其所允许的访问类型

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

  1. 拥有者。创建文件的用户。
  2. 组。一组需要共享文件且具有类似访问的用户。
  3. 其他。系统内的所有其他用户。
    口令指用户在建立一个文件时提供一个口令,系统为其建立FCB时附上相应口令,同时告诉允许共享该文件的其他用户。用户请求访问时必须提供相应的口令。这种方法时间和空间的开销不多,缺点是口令直接存在系统内部,不够安全。
    密码指用户对文件进行加密,文件被访问时需要使用密钥。这种方法保密性强,节省了存储空间,不过编码和译码要花费一定的时间。
E. 文件的逻辑结构

文件逻辑结构的基本要求,有助于提高系统对文件的检索速度,即在将大批记录组成文件时,应采用一种有利于提高检索记录速度和效率的逻辑结构;

该结构应方便用户对文件进行维护,即便于用户在文件中增加、删除、修改一个或多个记录;

降低文件存放在外存上的存储费用,即尽量减少文件所占用的存储空间,使其不要求系统为其提供大片的连续存储空间。

文件的逻辑结构 (无结构文件、有结构文件) 物理结构(存储结构) 用户看不见

无结构文件是最简单的文件组织形式,它是由字符流构成的文件,所以也称流式文件,其长度以字节为单位。对流式文件的访问,是通过读/写指针来指出下一个要访问的字节。在系统中运行的大量源程序、可执行文件、库函数等,所采用的就是无结构文件。有结构文件是指由一个以上的记录构成的文件,所以也称记录式文件。 定长记录 变长记录

顺序文件 串结构 顺序结构

索引文件 索引表 索引号 长度 指针

索引顺序文件

索引顺序文件是顺序文件和索引文件的结合。最简单的索引顺序文件只使用了一级索引,先将变长记录顺序文件中的所有记录分为若干组,然后为文件建立一张索引表,并为每组中的第一个记录建立一个索引项,其中包含该记录的关键字和指向该记录的指针。直接文件或散列文件

顺序文件的排列方式 串结构 顺序结构

顺序文件的最佳应用场合是在对文件中的记录进行批量存取时,即每次要读/写一大批记录时。在所有逻辑文件中,顺序文件的存取效率是最高的。

在交互应用的场合中,如果用户(程序)要求查找或修改单个记录,则系统需要在文件的记录中逐个地进行查找,此时,顺序文件所表现出的性能就可能很差。

不论是想增加还是删除一个记录,都比较困难。可以为顺序文件配置一个运行记录文件(log file)或称之为事务文件(transactionfile),把试图增加、删除或修改的信息记录于其中,规定每隔一定时间(例如4小时)就将运行记录文件与原来的主文件加以合并,产生一个按关键字排序的新文件。

隐式寻址 读写指针 读写完加1 显式寻址 利用文件中记录的位置 利用关键字

完全索引 部分索引

索引表存放的磁盘块称为索引块。

文件数据存放的磁盘块称为数据块。索引表一个文件对应一张 支持随机访问。

索引顺序文件在在顺序文件上增加了两个特征:一个是引入了文件索引表,通过该表可以实现对索引顺序文件的随机访问;另一个是增加了溢出(overflow)文件,用它来记录新增加的、删除的和修改的记录。

F. 文件的物理结构

文件物理结构 文件的实现 文件数据在物理存储设备上如何分布、组织

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

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

类似于内存分页,磁盘中的存储单元也被分为一个个的块,称为磁盘块,其大小通常与内存的页面大小相同。内存与磁盘之间的数据交换(磁盘I/O)都是以块为单位进行的。

连续分配 目录 file start length 支持随机访问 直接访问

链接分配 只支持顺序访问,不支持随机访问

隐式链接 目录 file start end 除文件最后一个盘块外,每个盘块都有指向文件下一个盘块指针将几个盘块组成簇,按簇而不按块分配

大幅度减少查找时间,改善访盘时间,但增加内部碎片

显式链接 文件分配表FAT文件 开机FAT读入常驻内存 地址转换无需访问磁盘

盘块号(可以隐藏) 下一块

特殊数字 -1表示文件的最后一块 -2表示磁盘空闲

索引分配 索引表 逻辑页面与物理页之间映射关系

单级索引分配

多级索引分配 一级索引:主索引 第二级索引......

混合索引分配 直接块(存储文件数据块的盘块号) 一级间址(inode) 二级间址 三级间址

在FAT中引入了"卷"(volume)的概念后,其便支持将一个物理磁盘分成四个逻辑磁盘,每个逻辑磁盘就是一个卷(也称为分区),换言之,每个卷都是一个能够被单独格式化和使用的逻辑单元,供文件系统分配空间时使用。一个卷中包含文件系统信息、一组文件以及空闲空间。每个卷都专门划出一个单独区域来存放自己的目录、FAT以及逻辑驱动器字母。

  1. 以盘块为单位的FAT文件系统。

    早期的FAT12以盘块为基本分配单位。由于FAT是文件系统中最重要的数据结构,为了安全起见,在每个分区中都配有两张相同的文件分配表,即FAT1和FAT2。在FAT的每个表项中均存放下一个盘块号,它实际上是用于盘块之间进行链接的指针,通过它可以将一个文件的所有盘块链接起来;另外,FAT会将文件的第一个盘块号放在自己的FCB中。

  2. 以簇为单位的FAT文件系统。

    如果把每个盘块(扇区)的容量均增大n倍,则磁盘的最大容量便可增加n倍。但要增加盘块的容量是不方便和不灵活的。为此,引入了簇的概念。簇是一组相邻的扇区,其在FAT中被视作一个虚拟扇区。在进行盘块分配时,以簇为基本分配单位。簇的大小一般是 2n2^{n}2n(n为整数)个盘块。

2. 目录

A. 目录的基本概念
  1. 实现"按名存取",即用户只须向系统提供所须访问文件的名字,便能快速准确地找到指定文件在外存中的存储位置。这是目录管理中最基本的功能,也是文件系统向用户提供的最基本的服务。
  2. 提高对目录的检索速度,通过合理地组织目录结构,可加快对目录的检索速度,从而提高对文件的存取速度。这是在设计一个大、中型文件系统时所追求的主要目标。
  3. 文件共享,在多用户系统中,应允许多个用户共享一个文件。这样,只须在外存中保留一份该文件的副本供不同用户使用即可,如此便可节省大量的存储空间,同时还可以方便用户使用和提高文件利用率。
  4. 允许文件重名,系统应允许不同用户对不同文件采用相同的名字,以便用户按照自己的习惯给文件命名和使用文件。

文件控制块FCB,文件与FCB一一对应,FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。通常,一个文件目录也被视为一个文件,称为目录文件。每当创建一个新文件,系统就要为其建立一个FCB,用来记录文件的各种属性。

FCB主要包含以下信息:

  1. 基本信息,如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
  2. 存取控制信息,包括文件主的存取权限、核准用户的存取权限以及一般用户的存取权限。
  3. 使用信息,如文件建立时间、上次修改时间等。

UNIX采用了文件名和文件描述信息分离的方法,使文件描述信息单独形成一个称为索引节点的数据结构,简称i节点(inode)。在文件目录中的每个目录项仅由文件名和相应的索引节点号(或索引节点指针)构成。

磁盘索引节点:指存放在磁盘上的索引节点。每个文件都有唯一的一个磁盘索引节点,它主要包括以下内容:

1文件拥有者标识符;2文件类型;3文件存取权限;4文件物理地址,每个索引节点中均含有13个地址项,即i.addr(0)~i.addr(12);5文件长度,指以字节为单位的文件长度;6文件连接计数,表明在本文件系统中,所有指向该(文件的)文件名的指针计数;7文件存取时间,指出本文件最近被进程存取的时间、本文件最近被修改的时间以及索引节点最近被修改的时间。

内存索引节点:是指存放在内存中的索引节点。当文件被打开时,要将磁盘索引节点复制到内存索引节点中,便于以后使用。在内存索引节点中又增加了以下内容:1索引节点编号,用于标志内存索引节点;2状态,指示索引节点是否上锁或被修改;3访问计数,每当有一进程要访问此索引节点时,就将该访问计数加1,访问完再减1;4文件所属文件系统的逻辑设备号;5链接指针,设置有分别指向空闲链表和散列队列的指针。

单级目录结构按名存取

查找速度慢

不允许重名

不便于实现文件的共享

两级目录结构

主文件目录MFD

用户文件目录UFD

  1. 提高了检索目录的速度。
  2. 在不同的UFD中,可以使用相同的文件名,只要在用户自己的UFD中每个文件名都是唯一的即可。(3)不同用户还可以使用不同的文件名来访问系统中的同一个共享文件。这种隔离会使各用户之间不便于共享文件。

无环图目录结构

为每个共享节点设置一个共享计数器,每当图中增加对该节点的共享链时,计数器加1;每当某用户提出删除该节点时,计数器减1。仅当共享计数器为0时,才真正删除该节点,否则仅删除请求用户的共享链。

B. 树形目录

MFD在这里被称为根目录,在每个文件目录中,只能有一个根目录,每个文件和每个目录都只能有一个父目录。

把数据文件称为树叶,其他的目录均作为树的节点,或称它们为子目录。

为了提高文件系统的灵活性,应允许在一个目录文件中的目录项既是目录文件的FCB,又是数据文件的FCB,这可以通过用目录项中的一位来指示它属于哪一种FCB加以实现。

"当前目录",又称为"工作目录"。

若想在树形目录中查找一个文件,则须按路径名逐级访问中间节点,这样就增加了磁盘访问次数,无疑会影响查询速度。

  1. 创建目录。在树形目录中,用户可为自己建立UFD,并可再创建子目录。当用户要创建一个新文件时,只须查看在自己的UFD及其子目录中有无与新建文件相同的文件名。若无,便可在UFD或其某个子目录中增加一个新目录项。
  2. 删除目录。对于一个已不再需要的目录,应如何删除其目录项,须视情况而定。如果所要删除的目录是空的,即在该目录中已不再有任何文件,则可简单地将该目录项删除,使它在其上一级目录中对应的目录项为空。
    如果要删除的目录不空,即其中尚有几个文件或子目录,则可采用下述两种方法进行处理。
  3. 不删除非空目录。当目录(文件)不空时,不能将其删除;若要删除一个非空目录,则必须先删除目录中的所有文件,使之成为空目录,然后再予以删除。如果目录中还包含有子目录,则必须采取递归调用方式来将其删除,在MS-DOS系统中就采用了这种删除方式。2. 删除非空目录。当要删除一个目录时,如果在该目录中还包含有文件,则目录中的所有文件和子目录也会同时被删除。上述两种方法实现起来都比较容易,第二种方法比较方便,但却比较危险,因为整个目录结构虽然用一条命令即能删除,但如果是一条错误的命令,则后果可能会很严重。
  4. 改变目录。使用绝对路径名对用户来说是比较麻烦的。用户可利用改变目录的命令,通过指定目录的绝对或相对路径名来设置当前目录。如果在使用改变目录的命令时没有明确指明任何目录,则在默认的情况下当前目录通常会自动地改变到主目录(与指定用户相关的最顶层目录)。
  5. 移动目录。到了一个阶段,通常需要对目录组织进行调整,即将文件或子目录在不同的父目录之间移动。文件或子目录经移动后,它们的路径名将随之改变。
  6. 链接操作。对于树形目录,每个文件和每个目录都只允许有一个父目录,这样不利于文件共享,但可以通过链接操作让指定文件具有多个父目录,从而方便了文件共享。
  7. 查找操作。当文件目录非常庞大时,要查找一个指定文件是比较困难的。因此在所有的OS中都支持以多种方式进行查找,例如,可以从根目录或当前目录位置开始进行查找,查找方式可选用精确匹配或局部匹配等。
C. 目录的操作

1 搜索。当用户使用一个文件时,需要搜索目录,以找到该文件的对应目录项。

2 创建文件。当创建一个新文件时,需要在目录中增加一个目录项。

3 删除文件。当删除一个文件时,需要在目录中删除相应的目录项。

4 创建目录。在树形目录结构中,用户可创建自己的用户文件目录,并可再创建子目录。

5 删除目录。有两种方式:1不删除非空目录,删除时要先删除目录中的所有文件,并递归地删除子目录。2可删除非空目录,目录中的文件和子目录同时被删除。

6 移动目录。将文件或子目录在不同的父目录之间移动,文件的路径名也会随之改变。

7 显示目录。用户可以请求显示目录的内容,如显示该用户目录中的所有文件及属性。

8 修改目录。某些文件属性保存在目录中,因此这些属性的变化需要改变相应的目录项。

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

线性检索法又称为顺序检索法。在单级文件目录中,基于用户提供的文件名,可以利用顺序查找法直接从文件目录中找到指定文件的目录项。在树形目录中,用户提供的文件名是由多个文件分量名所组成的路径名,此时须对多级文件目录进行查找。假设用户指定的文件路径名是/usr/ast/mbox,则查找/usr/ast/mbox的过程如下所示。

首先,系统应读入第一个文件分量名usr,用它与根目录文件(或当前目录文件)中各目录项中的文件名依次进行比较,从中找出匹配项,并得到匹配项的索引节点编号为6;再从6号索引节点中得知usr目录文件放在132号盘块中,将该盘块内容读入内存。然后,系统读入路径名中的第二个分量名ast,用它与放在132号盘块中的第二级目录文件中各目录项的文件名依次进行比较,从中找到匹配项,并得知ast的目录文件放在26号索引节点中,再从26号索引节点中得知/usr/ast存放在496号盘块中,将该盘块的内容读入内存。

最后,系统读入该文件的第三个分量名mbox,用它与第三级目录文件/usr/ast中各目录项中的文件名依次进行比较,得知/usr/ast/mbox的索引节点编号为60,即在60号索引节点中存放了指定文件的物理地址。目录查询操作到此结束。如果在顺序查询过程中发现有一个文件分量名不能被找到,则应停止查询,并返回"文件未找到"信息。

D. 硬链接和软链接

文件共享

有向无环图

基于索引节点共享方式(硬链接)索引节点中存在链接计数count查找速度硬链接>软链接

多个指针指向一个索引节点存在指针,不能删除

利用符号链接(symbolic link)实现文件共享的基本思想是,允许一个文件或子目录有多个父目录,但其中仅有一个作为主(属主)父目录,其他父目录都是通过符号链接方式与之相链接的,故将它们简称为链接父目录。

为使链接父目录D5能共享文件F,可以由系统创建一个LINK类型的新文件,也取名为F,并将F写入链接父目录D5中,以实现D5与文件F8的链接。在新文件F的内容中只包含被链接文件F8的路径名。这样的链接方法被称为符号链接或软链接。新文件F中的路径名被看作符号链。当用户通过D5访问被链接的文件F8且正要读LINK类型的新文件时,此要求将被OS截获,OS会根据新文件中的路径名去查询文件F8,然后对它进行读/写操作,这样就实现了用户D5对文件F的共享。

在利用符号链接实现文件共享时,只是文件拥有者才拥有指向其索引节点的指针,而共享该文件的其他用户则只有该文件的路径名,并不拥有指向其索引节点的指针。这样,也就不会发生在文件拥有者删除一个共享文件后留下一个悬空指针的情况。当文件的拥有者把一个共享文件删除后,如果其他用户又试图通过符号链接去访问一个已被删除的共享文件,则会因系统找不到该文件而使访问失败,此时再将符号链接删除,则不会产生任何影响。

利用符号链接实现文件共享也存在着一些问题:当其他用户去读共享文件时,系统会根据给定的文件路径名逐个分量(名)地去查找目录,直至找到该文件的索引节点。因此,在每次访问共享文件时都可能要多次读盘。这使每次访问文件的开销甚大,且增加了启动磁盘的频率。此外,要为每个共享用户建立一条符号链接,而由于链接本身实际上是一个文件(尽管该文件非常简单),因此要为它配置一个索引节点,这也要耗费一定的磁盘空间。

需要说明的是,上述链接方式存在一个问题,即每个共享文件都有多个文件名,换言之,每增加一条符号链接,就增加一个文件名。这在实质上就是每个用户都会使用自己的路径名去访问共享文件。当我们试图去遍历(traverse)整个文件系统时,将会多次遍历到该共享文件。例如,当有一个程序员要将一个目录中的所有文件都转存到磁盘上时,就可能会使一个共享文件产生多个复制。

3. 文件系统

A. 文件系统的全局结构(layout):文件系统在外存中的结构,文件系统在内存中的结构

文件系统在磁盘中的结构

主引导记录MBR 引导快 超级块 文件系统中空闲块信息+图

在一个卷中,存放文件数据的空间(文件区)和FCB的空间(目录区)是分离的。因为存在很多种类的文件表示和存放格式,所以现代操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的卷中的文件。卷在提供文件服务前,必须由对应的文件程序进行初始化,划分好目录区和文件区,建立空闲空间管理表格及存放卷信息的超级块。

物理格式化 低级格式化 划分扇区 检测坏扇区 并用扇区替换坏扇区

B. 外存空闲空间管理办法

空闲表法 连续分配方式

不适合大型文件系统 空闲表 序号 第一个空闲盘块号 空闲盘块号 空闲表项盘块分配 采用首次适应法 最佳适应法等

回收 类似于内存回收

空闲链表法

不适合大型文件系统

  1. 空闲盘块链
    空闲盘块链是指将磁盘上的所有空闲空间以盘块为单位拉成一条链。每个盘块都有指向下一个空闲盘块的指针。当用户请求分配存储空间时,从链首开始,依次摘下适当数量的空闲盘块分配给用户。当用户释放存储空间时,将回收的盘块依次插入空闲盘块链的末尾。(2)空闲盘区链
    空闲盘区链是指将磁盘上的所有空闲盘区拉成一条链,每个盘区包含若干相邻的盘块。每个盘区含有指向下一个空闲盘区的指针和本盘区的盘块数。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。回收盘区时,同样也要将回收区与相邻接的空闲盘区合并。

位示图 行和列都从1开始

利用二进制的一位来表示磁盘中一个盘块的使用情况,当其值为"0"时,表示对应的盘块空闲;为"1"时,表示已分配。也可相反。盘块的分配:

  1. 顺序扫描位示图,从中找出一个或一组其值为"0"的二进制位。
  2. 将找到的一个或一组二进制位转换成与之对应的盘块号。假设找到值为"0"的二进制位
    处在位示图的第i行、第j列,则其对应的盘块号b应按下式计算(n为每行位数):
    b=n(i−1)+jb=n(i-1)+jb=n(i−1)+j
  3. 修改位示图,令 mapi,j=1mapi,j=1mapi,j=1。
    盘块的回收:
  4. 将回收盘块的盘块号转换成位示图中的行号和列号。转换公式为:
    i=(b−1)DIVn+1i=(b-1) \mathrm{DIV} n+1i=(b−1)DIVn+1
    j=(b−1)MODn+1j=(b-1) \mathrm{MOD} n+1j=(b−1)MODn+1
  5. 修改位示图,令 mapi,j=0mapi,j=0mapi,j=0。

成组链接法(unix系统)适用于大型文件系统

C. 虚拟文件系统

Linux 虚拟文件系统 VFS 只存在于内存中,不存在于任何外存中在系统启动时建立,在系统关闭时消亡 提供统一调用函数(1)超级块对象

表示一个已安装(或称挂载)的特定文件系统。超级块对象对应于磁盘上特定扇区的文件系统超级块,用于存储已安装文件系统的元信息。其操作方法包含一系列可在超级块对象上调用的操作函数,主要有分配inode、销毁inode、读inode、写inode等。

  1. 索引节点对象

表示一个特定的文件。索引节点和文件是一对一的关系。只有当文件被访问时,才在内存中创建索引节点对象,每个索引节点对象都会复制磁盘索引节点包含的一些数据。索引节点对象还提供许多操作函数,如创建新索引节点、创建硬链接、创建新目录等。

  1. 目录项对象

表示一个特定的目录项。目录项对象是一个路径的组成部分,它包含指向关联索引节点的指针,还包含指向父目录和指向子目录的指针。不同于前面两个对象,目录项对象在磁盘上没有对应的数据结构,而是VFS在遍历路径的过程中,将它们逐个解析成目录项对象的。

  1. 文件对象

表示一个与进程相关的已打开文件。可以通过调用open()打开一个文件,通过调用close()关闭一个文件。文件对象和物理文件的关系类似于进程和程序的关系。文件对象仅是进程视角上代表已打开的文件,它反过来指向其索引节点。文件对象包含与该文件相关联的目录项对象,包含该文件的文件系统、文件指针等,还包含在该文件对象上的一系列操作函数。

  1. 超级块(superblock):记录整个文件系统的信息。
  2. 组描述符(group description):即描述每个组块的开始与结束时的数据块号码。
  3. 块位图(block bitmap):即数据块位示图,用一个二进制位来表示数据块是否空闲。通过块位图可以知道并快速找到空的数据块,进而进行文件的添加操作。
  4. 索引节点位图(iNode bitmap):类似数据块位示图,用一个二进制位来表示索引节点是否被使用。通过索引节点位图可以快速找到未被使用的索引节点编号。
  5. 索引节点表(iNode table):每个索引节点的固定大小为128B,每个文件仅占用一个索引节点,文件系统能够创建的文件数量与索引节点的数量有关。系统读取文件时需要先找到索引节点,并分析索引节点所记录的权限与用户权限是否符合,若符合,才能开始实际读取数据块的内容。
  6. 数据块(data block):ext2文件系统中支持的数据块的大小有1KB、2KB、4KB三种,每个数据块中只能放一个文件的数据,而不能将多个文件的数据放在一个数据块中,如果文件的数据大于数据块的大小,则该文件将会占用多个数据块,但是一般只有一个索引节点。

向上提供统一标准系统调用接口,屏蔽底层文件系统差异

要求下层文件系统必须实现某些规定的函数功能eg open read write每打开一个文件 新建vnode文件(只存在于主存)

函数指针功能:指向对应文件系统的函数功能

D. 文件系统挂载(mounting)

文件系统在进程使用之前必须先安装,也称挂载(Mounting)。安装文件系统目录称为安装点。

总结(本章速记)

本章知识骨架:

    1. 文件
    • A. 文件的基本概念
    • B. 文件元数据和索引节点(inode)
    • C. 文件的操作:建立,删除,打开,关闭,读,写
    • D. 文件的保护
    • E. 文件的逻辑结构
    • F. 文件的物理结构
    1. 目录
    • A. 目录的基本概念
    • B. 树形目录
    • C. 目录的操作
    • D. 硬链接和软链接
    1. 文件系统
    • A. 文件系统的全局结构(layout):文件系统在外存中的结构,文件系统在内存中的结构
    • B. 外存空闲空间管理办法
    • C. 虚拟文件系统
    • D. 文件系统挂载(mounting)

关键速记清单:

  • 文件系统由两部分组成:文件集合和目录。
  • 元素通常是记录,而记录又是一组有意义的数据项的集合。
  • 基于文件系统的概念,可以把数据的组成分为文件、记录和数据项三级。
  • 数据项 文件系统中最低级的数据组织形式。
  • 记录:一组相关数据项的集合,描述一个对象在某方面的属性。
  • 而无结构文件则被视为一个字符流,比如一个二进制文件或字符文件。
  • 文件分类方法。
  • 文件系统所管理的对象有3类。1文件 2目录 3磁盘(磁带)存储空间。
  • 1 文件存储空间管理功能;
  • 2 文件目录管理功能;
  • 3 用于将文件的逻辑地址变换为物理地址的机制;
  • 4 文件读/写管理功能;
  • 5 文件的共享与保护功能等。
  • 一般地,把与文件系统有关的软件分为4个层次:
  • 2 基本文件系统,主要用于实现内存与磁盘之间数据块的交换;
  • 磁盘索引节点
  • ● 文件主标识符,拥有该文件的个人或小组的标识符。
  • ● 文件类型,包括普通文件、目录文件或特别文件。
  • ● 文件存取权限,各类用户对该文件的存取权限。
  • ● 文件链接计数,在本文件系统中所有指向该文件的文件名的指针计数。
  • 内存索引节点
  • ● 索引节点号,用于标识内存索引节点。
  • ● 状态,指示i节点是否上锁或被修改。
  • ● 访问计数,每当有一进程要访问此i节点时,计数加1;访问结束减1。
  • ● 逻辑设备号,文件所属文件系统的逻辑设备号。
  • ● 链接指针,设置分别指向空闲链表和散列队列的指针。
  • 文件的基本操作:
  • 文件打开与关闭
  • 每个打开文件都具有如下关联信息:
  • 2 采取系统容错技术,防止系统某部分的故障导致文件不安全;
  • 3 建立后备系统,防止自然因素导致文件不安全。
  • 基本的访问矩阵
  • 具有域切换权的访问矩阵
  • 访问矩阵的实现
  • 访问控制表
  • 件控制表中,或存放在文件的索引节点中,作为该文件的存取控制信息使用。
  • 访问权限表
  • ● 写。向文件中写数据。
  • ● 执行。将文件装入内存并执行。
  • ● 添加。将新信息添加到文件结尾部分。
  • ● 删除。删除文件,释放空间。
  • ● 列表清单。列出文件名和文件属性。
  • 访问控制表 规定每个用户名及其所允许的访问类型
  • 精简的访问控制列表可采用拥有者、组和其他三种用户类型。
  • 拥有者。创建文件的用户。
  • 组。一组需要共享文件且具有类似访问的用户。
  • 其他。系统内的所有其他用户。
  • 顺序文件 串结构 顺序结构
  • 索引文件 索引表 索引号 长度 指针
  • 索引顺序文件
  • 顺序文件的排列方式 串结构 顺序结构
  • 完全索引 部分索引
  • 索引表存放的磁盘块称为索引块。
  • 文件物理结构 文件的实现 文件数据在物理存储设备上如何分布、组织
  • 文件分配方式 对磁盘非空闲块的管理
  • 文件存储空间管理 对磁盘空闲块的管理
  • 链接分配 只支持顺序访问,不支持随机访问
  • 大幅度减少查找时间,改善访盘时间,但增加内部碎片
  • 盘块号(可以隐藏) 下一块
  • 特殊数字 -1表示文件的最后一块 -2表示磁盘空闲

结语

文件系统的全部努力,都是在"磁盘慢、断电不丢、容量巨大"这三个物理约束下,为用户提供按名存取、方便共享、持久保存的抽象。索引节点(inode)是 UNIX 系文件系统的核心发明------把文件名与文件元数据分离,从而使硬链接、软链接与树形目录结构得以自然成立。文件的物理结构决定了访问效率:连续分配快却会碎片化,链接分配解决了碎片却难以随机访问,索引分配则折中出多级索引与混合索引。复习时请抓住两条线:一条是"从路径名到磁盘块"的解析链路(目录项 → inode → 索引表 → 物理块),另一条是空闲空间的管理(位示图、空闲链表、成组链接)。把这两条线走通,文件系统便不再是零散的概念堆砌。

参考资料

  1. 王道考研《操作系统考研复习指导》
  2. 汤小丹.计算机操作系统(第4版).西安:西安电子科技大学出版社
  3. Abraham Silberschatz.操作系统概念(Operating System Concepts).北京:机械工业出版社
相关推荐
Heorine3 小时前
408 操作系统 知识点记忆(5)输入/输出管理
考研
IT毕设实战小研6 小时前
基于大数据的DAX40成分股金融新闻情感趋势可视化分析
android·大数据·python·考研·金融·课程设计
Heorine2 天前
408 计算机组成原理 知识点记忆(1)计算机系统概述
考研
Heorine2 天前
408 计算机组成原理 知识点记忆(4)指令系统
考研
Heorine2 天前
408 计算机组成原理 知识点记忆(5)中央处理器
考研
2601_949950633 天前
考研英语资料太散?用小程序把真题、词汇和错题放到一起
人工智能·学习·考研·小程序·刷题·小程序推荐
搜词研究员5 天前
# 德立教育和达德教育哪个好?学历提升选哪家?
考研·职场和发展·学习方法·高考
博界IT精灵5 天前
浮点数的表示--IEEE 754浮点数标准
考研
唐维康5 天前
昆明理工891计算机考研真题:2022—2026五年完整收录整理
考研