文件实现

         文件实际上是一种抽象数据类型,我们要研究它的逻辑结构、物理结构,还有关于它的一系列的操作(不是统考关注的内容)。文件的实现就是研究文件的

    物理结构,即文件数据在物理存储设备上是如何分布以及组织起来的。同一个问题有两方面的回答:一是文件的分配方式,讲的是对磁盘非空闲块的管理,第二

     个方面是文件存储空间管理,讲的是对磁盘空闲块的管理

       1.文件分配方式

            文件分配对应于文件的物理结构,是指如何为文件分配磁盘块。常用的磁盘空间分配方法有三种:连续分配链接分配索引分配。 有的系统(如RDOS操

       作系统)对三种方法都支持,但是更普遍是一个系统只提供一种方法的支持。

          (1)、连续分配

            连续分配方法要求每个文件在磁盘上占有一组连续的块,磁盘地址定义了磁盘上的一个线性排序。这种排序使作业访问磁盘时需要的寻道数和寻道时间最小

          文件的连续分配可以用第一块的磁盘地址和连续块的数量来定义。如果文件有  n 块长并从位置 b 开始,那么该文件将占有块 b , b + 1 , b + 2 , ..., b + n -1 。一个

          文件的目录条目包括开始块的地址该文件所分配区域的长度

             连续分配支持顺序访问和直接访问。其优点是实现简单、存取速度块。缺点在于,文件长度不宜动态增加,因为一个文件末尾后的盘块可能已经分配给其他文件,

          一旦需要增加,就需要大量移动盘块。此外,反复增删文件会产生外部碎片(与内存管理分配方式中的碎片相似),并且很难确定一个文件需要的空间大小,因而

          只适用于长度固定的文件。

          (2)、链接分配

              链接分配是采取离散分配的方式,消除了外部碎片,故而显著地提高了磁盘空间的利用率;又因为是根据文件的当前需求,为它分配必需的盘块,当文件动态增长

           时,可以动态地再为它分配盘块,故而无需事先知道文件的大小。此外,对文件的增、删、改也非常方便。链接分配又可以分为隐式链接显示链接两种形式。

               隐式链接。每个文件对应一个磁盘块的链表;磁盘块分布在磁盘的任何地方,除了最后一个盘块外,每一个盘块都有指向下一个盘块的指针,这些指针对用户是

          透明的。目录包括文件第一块的指针最后一块的指针

              创建新文件时,目录中增加一个新条目。每个目录项都有一个指向文件首块的指针。该指针初始化为 NULL 以表示空文件,大小字段都为 0 。写文件会通过空闲

           空间管理系统找到空闲块,将该块链接到文件的尾部,以便写入。读文件则通过块到块的指针顺序读块。

              隐式链接分配的缺点在于无法直接访问盘块,只能通过指针顺序访问文件,以及盘块指针消耗了一定的存储空间。隐式链接分配的稳定性也是一个问题,系统在运

          行过程中由于软件或者硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。

              显式链接,是指把用于链接文件各物理块的指针,从每个物理块中的块末尾中提取出来,显式地存放在内存的一张链表中。该表在整个磁盘仅设置一张每个表项中存放对应块的下一块链接指针,即下一个盘块号。在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址

 被填入相应文件的  FCB 的“物理地址” 字段中。当某文件要查找当前块的下一块地址时,只需找到链接表中相应的位置,即可以找到下一块的指针。

              由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。由于分配给文件的所有盘块号都放在表中,故称该表

         为文件分配表(FAT)

            (3)、索引分配

              链接分配解决了连续分配的外部碎片和文件大小管理的问题。但是链接分配不能有效支持直接访问(FAT 除外) 。索引分配解决了这个问题,它把每个文件的所有

         的盘块号都集中放在一起构成索引块(表)

              每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第 i 个条目指向文件的第 i 个块。目录条目包括索引块的地址。要读第 i 块,通过索引块的第 i 个条目

         指针来查找和读入所需的块。

              创建文件时,索引块的所有指针都设为空。当首次写入第 i 块时,先从空闲空间中取得一个块,再将其地址写到索引块的第 i  个条目。索引分配支持直接访问,且没

         有外部碎片问题。其缺点是由于索引块的分配,增加了系统存储空间的开销。索引块的大小是一个重要的问题,每个文件必须有一个一个索引块,因此索引块应尽可能

         小,但索引块太小就无法支持大文件。可以采用以下机制来处理这个问题。

              ------------------------------------------------------------------------------------------------------

               链接方案:一个索引块通常为一个磁盘块,因此,它本身能直接读写。为了处理大文件,可以将多个索引块链接起来。

               多层索引:多层索引使第一层索引块指向第二层的索引块,第二层索引块再指向文件块。这种方法根据最大文件大小的要求,可以继续到第三层或第四层。例如,

                                   4096B 的块,能在索引块中存放 1024 个  4 B  的指针。两层索引允许 1048576 个数据块,即允许最大文件为 4 GB 。

               混合索引:将多种索引分配方式相结合的分配方式。例如,系统既采用直接地址,又采用单级索引分配方式或两级索引分配方式。

               

                《三种分配方式的比较》

                 

                  此外,访问文件需要两次访问外存------------首先要读取索引块的内容,然后再访问具体的磁盘块,因而降低了文件 的存取速度;为了解决这一问题,

              通常将文件的索引块读入内存的缓冲区中,以加快文件的访问速度。


              2.文件存储空间管理

              (1)、文件存储空间的划分与初始化。一般来说,一个文件存储在一个文件卷中。文件卷可以是物理盘的一部分,也可以是整个物理盘,支持超大型文件的

                  文件卷也可以由多个物理盘组成,如下图所示:

                              

                           在一个文件卷中,文件数据信息的空间(文件区)和存放文件控制信息 FCB 的空间(目录区是分离的。由于存在很多种类的文件表示和存放

                  格式,所以现在操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的逻辑卷中的文件。逻辑卷在提供文件服务前,必须由对

                  应的文件程序进行初始化,划分好目录区文件区,建立空闲空间管理表格存放逻辑卷信息的超级块

                     (2)、文件存储空间管理。文件存储设备分成许多大小相同的物理块,并为单位交换信息,因此,文件存储设备的管理实质上是对空闲块的组织和

                   管理,它包括空闲块的组织、分配与回收等问题。

             3.

                (1)、空闲表法

                  空闲表法属于连续分配方式,它与内存的动态分配方式类似,为每个文件分配一块连续的存储空间。系统为外存上的所有空闲区建立一张空闲盘块表,

                每个空闲区对应一个空闲表项,其中包括表项序号、该空闲区第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序

                排列,如下图:

                    

                       空闲盘区的分配与内存的动态分配类似,同样是采用首次适应算法、循环首次适应算法等。例如,在系统为某新创建的文件分配空闲盘块时,先

              顺序地检索空闲盘块表的各表项,直至找到第一个其大小能满足要求的空闲区,再将该盘区分配给用户,同时修改空闲盘块表。

                       系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即要考虑回收区是否与空闲表中插入点的前区和后区相邻接,对相

               邻接者应予以合并。

                    (2)、空闲链表法

                          将所有空闲盘区拉成一条空闲链,根据构成链所用的基本元素不同,可把链表分成两种形式:空闲盘块链空闲盘区链


                          》》空闲盘链是将磁盘上的所有空闲空间,以盘块为单位拉成一条链。当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下

                                 适当的数目的空闲盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。这种方法的优点

                                 是分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时,可能要重复多次操作。

                          》》空闲盘链是将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。在每个盘区上除含有用于指示下一个空闲盘区的指针外,

                                 还应有能指明盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。在回收盘区时,同样也要

                                 将回收区与相邻接的空闲盘区相合并。

                    (3)、位示图法

                           位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。当其值为"0"时,表示对应的盘块

                        空闲;当其值为“1”时,表示对应的盘块已分配。

                           

                              盘块的分配:

                              a. 顺序扫描位示图,从中找出一个或一组其值为“0” 的二进制位

                              b.将所找到的一个或一组二进制位,转换成与之对应的盘块号。假定找到的其值为"0"的二进制位,位示图的第 i 行、第 j 列 ,则其相应的盘块号

                                 应下式计算(n 代表每行的位数):

                        

                                                                                         b = n ( i - 1 ) + j

                              c.修改位示图,令 map[ i , j ] = 1

           

                             盘块的回收:

                             a. 将回收盘块的盘块号转换成位示图中的行号和列号。

                                 转换公式为:

                                                                                         i = (b -1 )DIV  n + 1

                                                                                         j = (b - 1)MOD n + 1 

                             b.修改位示图,令 map[ i , j ] = 0


                   (4)、成组链接法

                       空闲表法空闲链表法都不适合用于大型文件系统,因为这会使空闲表或空闲链表太大。在 UNIX 系统中采用的是成组链接法,这种方法结合了空闲

                 表和空闲链表两种方法,克服了表太大的缺点。其大致的思想是:把顺序的 n 个空闲扇区地址保存在第一个空闲扇区内,其后一个空闲扇区内则保存另一

                顺序空闲扇区的地址,如此继续,直至所有空闲扇区均予以链接。系统只需要保存一个指向第一个空闲扇区的指针假设磁盘最初全为空闲扇区,其

                成组链接如下图所示,通过这种方式可以迅速找到大批空闲块地址。

                          

                          

                                   表示文件存储器空闲空间的“位向量”表或第一个成组链块以及卷中的目录区、文件区划分信息都需要存放在辅存储器中,一般放在卷头位置,

                          在 UNIX 系统中称为“超级块”。在对卷中的文件进行操作前,“超级块”需要预先读入系统空闲的主存,并且经常保持主存“超级块”与辅存卷中的

                          “超级块”的一致性。

                                       

                       


                   

                            

                          

 

                

               

           


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小达人Fighting

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值