操作系统15:文件和文件目录

目录

1、文件和文件系统

(1)数据项、记录和文件

(2)文件名和类型

(3)文件的层次结构

(4)文件的操作

2、文件的逻辑结构

(1)文件逻辑结构的类型

1.1 - 有结构文件和无结构文件

1.2 - 按文件的组织方式分类

(2)顺序文件(Sequential File)

(3)索引文件(lndex File)

3.1 - 根据关键字建立索引

3.2 - 具有多个索引表的索引文件

(4)索引顺序文件 (ndex Sequential File)

4.1 - 索引顺序文件的特征

4.2 - 一级索引顺序文件

4.3 - 两级索引顺序文件

(5)直接文件和哈希文件

5.1 - 直接文件

5.2 - 哈希(Hash)文件

3、文件目录

(1)文件控制块和索引结点

1.1 - 文件控制块 FCB(File Control Block)中的内容

1.2 - 为什么要引入索引结点?

(2)简单的目录文件

2.1 - 单级文件目录

2.2 - 两级文件目录

(3)树形结构目录(Tree-Structured Directory)

3.1 - 路径名和当前目录(相对路径和绝对路径)

(4)目录查询技术

4.1 - 线性检索法

4.2 - Hash 方法


1、文件和文件系统

        文件系统的管理功能是将其管理的程序和数据通过组织为一系列文件的方式实现的。

        文件是指具有文件名的若干相关元素的集合。元素通常是记录,而记录又是一组有意义的数据项的集合。

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

(1)数据项、记录和文件

        数据项:在文件系统中,数据项是最低级的数据组织形式,可分为基本数据项(字段)和组合数据项,基本数据项除了数据名外,还对应有数据类型。//类似于数据库的字段

        记录:记录是一组相关数据项的集合,用于描述一个对象在某方面的属性。通常使用关键字(key)唯一标识一个记录。//数据库中的主键,唯一标识一条记录

        文件:指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件无结构文件两种。

        有结构文件由若干条相关记录组成,无结构文件则是一个字符流。文件在文件系统中是一个最大的数据单位,它描述了一个对象集。例如,可以将一个班的学生记录作为一个文件。//相当于数据库中的表,表就是一个文件

        文件属性可以包括:文件类型、文件长度、文件的物理位置、文件的建立时间等。

(2)文件名和类型

        文件名:用于标识不同的文件。

        扩展名:添加在文件名后面的若干个附加字符,又称为后缀名,用于指示文件的类型。例如,myprog.bin 中的扩展名 bin,表示该文件是一个可执行的二进制文件。

        文件的类型:按文件中数据的形式分类

  1. 源文件:这是指由源程序和数据构成的文件。通常,由终端或输入设备输入的源程序和数据所形成的文件都属于源文件。它通常是由 ASCII 码或汉字所组成的。
  2. 目标文件:这是指把源程序经过编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件。目标文件所使用的后缀名是“.obj”。
  3. 可执行文件:指把编译后所产生的目标代码经过链接程序链接后所形成的文件。其后缀名是 “.exe”。

        文件的类型还可以按用途、控制属性、组织形式和处理方式等进行分类。

(3)文件的层次结构

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

        对象及其属性:文件管理系统管理的对象有:文件、目录、磁盘存储空间

        对对象操纵和管理的软件集合:其中包括文件存储空间的管理,文件目录的管理,文件的逻辑地址转换为物理地址的机制,文件的读写管理,文件的共享与保护等功能。//文件系统的核心

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

  • I/O 控制层,是文件系统的最低层,主要由磁盘驱动程序等组成,也可称为设备驱动程序层。
  • 基本文件系统层,主要用于处理内存与磁盘之间数据块的交换。
  • 基本 I/O 管理程序,该层用于完成与磁盘 I/O 有关的事务,如将文件逻辑块号转换为物理块号,管理磁盘中的空闲盘块,I/O 缓冲的指定等。
  • 逻辑文件系统,用于处理与记录和文件相关的操作,如允许用户和应用程序使用符号文件名访问文件及记录,实现对文件和记录的保护等。

        文件系统的接口:包括命令接口(使用命令直接交互)和程序接口(通过程序交互),主要是为了方便用户的使用。//为方便用户使用,产品一般都会提供两种方式的交互,即命令行式和程序方式

(4)文件的操作

        用户可以通过文件系统提供的系统调用实施对文件的操作。最基本的文件操作包括创建、删除、读、写和设置文件的读/写位置等

        此外,一般的 OS 都提供了更多对文件的操作,如打开和关闭一个文件改变文件名等操作。

        文件的打开和关闭

        “打开”是指系统将指名文件的属性(包括该文件在外存上的物理位置),从外存拷贝到内存打开文件表的一个表目中,并将该表目的编号(索引号)返回给用户。“打开”,就是在用户和指定文件之间建立起一个连接。用户可通过该连接直接得到文件信息,从而避免了再次通过目录检索文件。

        如果用户已不再需要对该文件实施相应的操作,可利用“关闭”(close)系统调用来关闭此文件,即断开此连接,OS 将会把该文件从打开文件表中的表目上删除掉。

//文件的打开和关闭就是建立连接和关闭连接的过程。

//对文件进行操作,一般都会使用到系统调用,文件系统以I/O系统和存储系统为基础

2、文件的逻辑结构

        在进行文件系统高层设计时,所涉及的是文件的逻辑结构,即如何将这些逻辑记录构成一个逻辑文件。在进行文件系统低层设计时,所涉及的是文件的物理结构,即如何将一个文件存储在外存上。

        因此,在系统中的所有文件都存在着以下两种形式的文件结构:

  • 文件的逻辑结构(File Logical Structure),文件是由一系列的逻辑记录组成,用户可以直接处理数据及其结构,它独立于文件的物理特性,又称为文件组织(FileOrganization)。//用户使用且可见,软件层
  • 文件的物理结构,又称为文件的存储结构。指系统将文件存储在外存上所形成的一种存储组织形式,用户不可见。文件的物理结构不仅与存储介质的存储性能有关,而且与所采用的外存分配方式有关。//系统存储且用户不可见,硬件层

        无论是文件的逻辑结构,还是其物理结构,都会影响对文件的检索速度。

(1)文件逻辑结构的类型

1.1 - 有结构文件和无结构文件

        有结构文件由一个以上的记录构成的文件,又称为记录式文件,在记录式文件中,每个记录都用于描述实体集中的一个实体,各记录有着相同或不同数目的数据项。记录的长度可分为定长和不定长两类。

        无结构文件由字符流构成的文件,又称为流式文件。文件的长度是以字节为单位的。对流式文件的访问,则是利用读、写指针来指出下一个要访问的字符。可以把流式文件看做是记录式文件的一个特例:一个记录仅有一个字节。

1.2 - 按文件的组织方式分类

        根据文件的组织方式,可把有结构文件分为三类:

  • 顺序文件:指由一系列记录按某种顺序排列所形成的文件,其中的记录可以是定长记录或可变长记录。
  • 索引文件:指为可变长记录文件建立一张索引表,为每个记录设置一个表项,以加速对记录的检索速度。
  • 索引顺序文件:这是顺序文件和索引文件相结合的产物,这里,在为每个文件建立一张索引表时,并不是为每一个记录建立一个索引表项,而是为一组记录中的第一个记录建立一个索引表项。

(2)顺序文件(Sequential File)

        在顺序文件中的记录,可以按照各种不同的顺序进行排列。一般地,可分为两种情况:

  • 第一种串结构。在串结构文件中的记录,通常是按存入时间的先后进行排序的,各记录之间的顺序与关键字无关。//按时间顺序
  • 第二种顺序结构,按照关键字大小进行排序。

        顺序文件的优点:最佳应用场合是在对文件中的记录进行批量存取时,即每次要读或写一大批记录。所有逻辑文件中顺序文件的存取效率是最高的。此外,对于顺序存储设备,也只有顺序文件才能被存储并能有效地工作。//适合批量存储,比如范围查找

        顺序文件的缺点:不适合在交互应用的场合,对其中一条记录的查找或修改,也不适合在中间插入或删除一条记录。//不适合单条记录操作

(3)索引文件(lndex File)

3.1 - 根据关键字建立索引

        定长记录的文件可以通过简单的计算,很容易地实现随机查找。但变长记录文件查找记录必须从第一个记录查起,一直顺序查找到目标记录为止,耗时很长。//定长记录很容易寻址

        所以,为变长记录文件建立一张索引表,为主文件中的每个记录在索引表中分别设置一个表项,记录指向记录的指针(即记录在逻辑地址空间的首址)以及记录的长度 L,索引表按关键字排序,因此,索引表本身也是一个定长记录的顺序文件,这样就把对变长记录顺序文件的顺序检索转变为对定长记录索引文件的随机检索,从而加快对记录检索的速度,实现直接存取。// 变长记录 -> 索引表(定长记录),这也就是索引表高效的原因

        由于是按关键字建立的索引,所以在对索引文件进行检索时,可以根据用户提供的关键字利用折半查找法去检索索引表,从中找到相应的表项。再利用该表项中给出的指向记录的指针值去访问所需的记录。而每当要向索引文件中增加一个新记录时,便须对索引表进行修改//利用关键字实现对半查找,所以关键字最好是有顺序的

3.2 - 具有多个索引表的索引文件

        使用按关键字建立的索引表与顺序文件一样,都只能按该关键字进行检索。而在实际情况中,不同的用户,为了不同的目的,希望能按不同的属性(关键字)来检索一条记录。为实现此要求,需要为顺序文件建立多个索引表,即为每一个关键字都配置一张索引表。在每一个索引表中,都按相应的一种属性或关键字进行排序。//多个关键字,多个索引表

        检索索引文件的主要优点是,它将一个需要顺序查找的文件改造成一个可随机查找的文件,极大地提高了对文件的查找速度//优点

        但是,它除了有主文件外,还须配置一张索引表,而且每个记录都要有一个索引项,因此增加了存储开销//缺点

(4)索引顺序文件 (ndex Sequential File)

4.1 - 索引顺序文件的特征

        索引顺序文件是对顺序文件的一种改进,它基本上克服了变长记录的顺序文件不能随机访问,以及不便于记录的删除和插入的缺点,它是顺序文件和索引文件相结合的产物。

        索引顺序文件保留了顺序文件的关键特征,即记录是按关键字的顺序组织起来的。它又增加了两个新特征:

  • 引入了文件索引表,通过该表可以实现对索引顺序文件的随机访问。
  • 增加了溢出(overfow)文件,用它来记录新增加的、删除的和修改的记录

4.2 - 一级索引顺序文件

        首先将变长记录顺序文件中的所有记录分为若干个组,如 50 个记录为一个组。然后为顺序文件建立一张索引表,并为每组中的第一个记录在索引表中建立一个索引项,其中含有该记录的关键字和指向该记录的指针。// 对记录进行分组,为分组建立索引,可减少索引表的大小

        在对索引顺序文件进行检索时,首先也是利用关键字以及某种查找算法去检索索引表,找到该记录所在记录组中第一个记录的表项,从中得到该记录组第一个记录在主文件中的位置。然后,再利用顺序查找法去查找主文件,从中找到所要求的记录。//顺序索引文件的查找

4.3 - 两级索引顺序文件

        对于一个非常大的文件,为找到一个记录而须查找的记录数目仍然很多,为了进一步提高检索效率,可以为顺序文件建立多级索引,即为索引文件再建立一张索引表,从而形成两级索引表

//建立多级索引表可以减少查找次数

(5)直接文件和哈希文件

5.1 - 直接文件

        采用前述几种文件结构对记录进行存取时,都须利用给定的记录键值,先对线性表或链表进行检索,然后找到指定记录的物理地址。

        对于直接文件,则可根据给定的关键字直接获得指定记录的物理地址。换而言之,关键字本身就决定了记录的物理地址。这种由关键字到记录物理地址的转换被称为键值转换(Key to address transformation)。组织直接文件的关键在于用什么方法进行从记录值到物理地址的转换。//键值映射:关键字->物理地址

5.2 - 哈希(Hash)文件

        目前应用最为广泛的一种直接文件。它利用 Hash 函数(或称散列函数)可将关键字转换为相应记录的地址

        但为了能实现文件存储空间的动态分配,通常由 Hash 函数所求得的并非是相应记录的地址,而是指向某一目录表相应表目的指针,该表目的内容指向相应记录所在的物理块,如下图所示。

        通常,把 Hash 函数作为标准函数存于系统中,供存取文件时调用

3、文件目录

        文件目录也是一种数据结理构,用于标识系统中的文件及其物理地址,供检索时使用

        对目录管理的包括:实现“按名存取”、提高目录的检索速度、实现文件共享、允许文件重名等。

(1)文件控制块和索引结点

        为了能对一个文件进行正确的存取,必须为文件设置用于描述和控制文件的数据结构,称之为“文件控制块”。

        文件管理程序可借助于文件控制块中的信息对文件施以各种操作,文件与文件控制块一一对应,文件控制块的有序集合称为文件目录,即一个文件控制块就是一个文件目录项。通常,一个文件目录也被看做是一个文件,称为目录文件。//目录也是一种数据结构,文件控制块

1.1 - 文件控制块 FCB(File Control Block)中的内容

        基本信息包括:文件名,文件物理位置,文件逻辑结构,文件的物理结构,指示文件是顺序文件,还是链接式文件或索引文件。

  • 文件逻辑结构:指文件是流式文件还是记录式文件记录数,文件是定长记录还是变长记录等。
  • 文件的物理结构,指示文件是顺序文件,还是链接式文件或索引文件。

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

        使用信息:使用信息类包括文件的建立日期和时间、文件上一次修改的日期和时间,以及当前使用信息。

// FCB跟PCB一样,保存了控制对象的所有信息

1.2 - 为什么要引入索引结点?

        在检索目录文件的过程中,只用到了文件名,仅当找到一个目录项时,才需从该目录项中读出该文件的物理地址。而其它一些对该文件进行描述的信息在检索目录时一概不用。显然,这些信息在检索目录时不需调入内存。//只调度有用信息,无用信息应该暂放磁盘,减少内存占用

        为此,便采用了把文件名与文件描述信息分开的办法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称为 i 结点。//把有用信息汇聚成一张表,节省磁盘调度

        在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针所构成,有利于减少磁盘 I/O,节省系统开销。

        磁盘索引结点:存放在磁盘上的索引结点。每个文件有唯一的一个磁盘索引结点,它主要包括:文件主标识符文件类型文件存取权限文件物理地址文件长度文件连接计数文件存取时间等

        内存索引结点:存放在内存中的索引结点。当文件被打开时,要将磁盘索引结点拷贝到内存的索引结点中,便于以后使用。在内存索引结点中又增加了:索引结点编号锁和修改状态访问计数所属文件系统的逻辑设备号链接指针等。

(2)简单的目录文件

2.1 - 单级文件目录

        单级文件目录是最简单的文件目录。在整个文件系统中只建立一张目录表,每个文件占一个目录项,目录项中含文件名、文件扩展名、文件长度、文件类型、文件物理地址以及其它文件属性。此外,为表明每个目录项是否空闲,又设置了一个状态位。单级文件目录如下图所示。

        单级文件目录的优点是简单,但它只能实现目录管理中最基本的功能:按名存取。但是它查找速度慢,不允许重名,也不便于实现文件共享//只适用于单用户环境

2.2 - 两级文件目录

        为了克服单级文件目录所存在的缺点,可以为每一个用户再建立一个单独的用户文件目录UFD(User File Directory)。这些文件目录具有相似的结构,它由用户所有文件的文件控制块组成。

        此外,在系统中再建立一个主文件目录MFD(Master File Directory);在主文件目录中,每个用户目录文件都占有一个目录项,其目录项中包括用户名和指向该用户目录文件的指针。如下图所示,图中的主目录中示出了三个用户名,即 Wang、Zhang 和 Gao。//主目录+用户目录

        优点:相对单级目录而言,两级目录,可以提高检索目录的速度,在不同的用户目录中,可以使用相同的文件名,此外,不同用户还可使用不同的文件名访问系统中的同一个共享文件。

        缺点:两级目录结构虽然能有效地将多个用户隔开,但当多个用户之间要相互合作去完成一个大任务,且一用户又需去访问其他用户的文件时,这种隔离便成为一个缺点,因为这种隔离会使诸用户之间不便于共享文件//隔离使文件不便于共享

(3)树形结构目录(Tree-Structured Directory)

        树形目录可以提高目录的检索速度和文件系统的性能。

        主目录在这里被称为根目录在每个文件目录中,只能有一个根目录,每个文件和每个目录都只能有一个父目录。把数据文件称为树叶,其它的目录均作为树的结点,或称为子目录。下图示出了树形结构目录。//树结构,类似于数据库存储数据的B+树,叶子节点为数据,父节点为索引

        树形目录的缺点:在树形结构目录中查找一个文件,需要按路径名逐级访问中间节点,增加了磁盘访问次数,无疑影响了查询速度。

3.1 - 路径名和当前目录(相对路径和绝对路径)

        路径名(path name)

        在树形结构目录中,从根目录到任何数据文件都只有一条唯一的通路。在该路径上,从树的根(即主目录)开始,把全部目录文件名与数据文件名依次地用 “/” 连接起来,即构成该数据文件唯一的路径名

        当前目录(Current Directory)

        当一个文件系统含有许多级时,每访问一个文件,都要使用从树根开始,直到树叶为止的、包括各中间节点(目录)名的全路径名//路径名太长,从根节点到文件

        全路径名是相当麻烦的事,由于一个进程运行时所访问的文件大多仅局限于某个范围,因而非常不便。基于这一点,可为每个进程设置一个“当前目录”,又称为“工作目录”进程对各文件的访问都相对于“当前目录”而进行。此时各文件所使用的路径名只需从当前目录开始,逐级经过中间的目录文件最后到达要访问的数据文件。

        把从当前目录开始直到数据文件为止所构成的路径名称为相对路径名(relative path name),而把从树根开始的路径名称为绝对路径名(absolutepathname)。

(4)目录查询技术

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

//首先查询目录 -> 获取文件控制块 -> 获取文件的物理地址 -> 定位物理位置 -> 通过 I/O 读入内存

        目前,对目录进行查询的方式主要有两种:线性检索法Hash 方法

4.1 - 线性检索法

        线性检索法又称为顺序检索法。在单级目录中,利用用户提供的文件名,用顺序查找法直接从文件目录中找到指名文件的目录项。在树形目录中,用户提供的文件名是由多个文件分量名组成的路径名,此时需对多级目录进行查找。//按顺序进行查找

        假定用户给定的文件路径名是 /usr/ast/mbox,则查找 /usr/ast/mbox 文件的过程如下图所示。

4.2 - Hash 方法

        如果我们建立了一张 Hash 索引文件目录,便可利用 Hash 方法进行查询,即系统利用用户提供的文件名,并将它变换为文件目录的索引值,再利用该索引值到目录中去查找,这样将显著地提高检索速度。//通过索引一步到位

        顺便指出,在现代操作系统中,通常都提供了模式匹配功能,即在文件名中使用了通配符 “*”、“?” 等。对于使用了通配符的文件名,此时系统便无法利用 Hash 法检索目录,因此,系统还是需要利用线性查找法查找目录。//Hash法的优势在于精确定位,无法进行范围查找

猜你喜欢

转载自blog.csdn.net/swadian2008/article/details/131673759
今日推荐