操作系统第四章——文件管理(中)

竹本无心,却节外生枝,藕虽有孔,但出淤泥而不染,人生如梦,却不随人愿,万般皆是命,半点不由人


4.1.4 文件的物理结构(文件分配方式)

前面说过,文件实际上是一种抽象数据类型,我们要研究它的逻辑结构、物理结构,以及关于它的一系列操作。文件的物理结构就是研究文件的实现,即文件数据在物理存储设备上是如何分布和组织的。同一个问题有两个方面的回答:一是文件的分配方式,讲的是对磁盘非空闲块的管理:二是文件存储空间管理,讲的是对磁盘空闲块的管理。
请添加图片描述
文件分配对应于文件的物理结构,是指如何为文件分配磁盘块。常用的磁盘空间分配方法有三种:连续分配、链接分配和索引分配。有的系统(如RDOS操作系统)对三种方法都支持,但更普遍的是一个系统只支持一种方法。
请添加图片描述

文件块,磁盘块

若是能够保证外存的一个磁盘块和内存的一个内存块的大小是相同的,进行数据交换的时候就会很方便,
请添加图片描述
用户对于自己文件的各个逻辑块存放的位置是不可知的,因此用户在操作文件的时候是使用逻辑块号和块内地址这样的形式,,

连续分配

请添加图片描述
所谓的逻辑块号就是这个文件的第几块,加上这个文件的真实的起始地址自然就是这个块的真实地址。
读取某个磁盘块时,需要移动磁头。访问的两个磁盘块相隔越远,移动磁头所需时间就越长。磁盘地址定义了磁盘的一个线性排序,这种排序使得作业访问磁盘时需要的寻道数和寻道时间最小
结论:连续分配的文件在顺序读/写时速度最快
请添加图片描述
请添加图片描述
优点:支持顺序访问和直接访问(即随机访问)﹔连续分配的文件在顺序访问时速度最快
缺点:不方便文件拓展;存储空间利用率低,会产生磁盘碎片(外部碎片)

链接分配

链接分配是一种采用离散分配的方式。它消除了磁盘的外部碎片,提高了磁盘的利用率。可以动态地为文件分配盘块,因此无须事先知道文件的大小。此外,对文件的插入、删除和修改也非常方便。链接分配又可分为隐式链接和显式链接两种形式。

隐式链接

请添加图片描述
因为这里并不是像显示链接一样有一个FAT表,所以不能进行随机访问,
隐式链接的缺点是只适合顺序访问,若要访问文件的第i个盘块,则只能从第1个盘块开始通过盘块指针顺序查找到第i块,随机访问效率很低。隐式链接的稳定性也是一个问题,系统在运行过程中由于软件或硬件错误导致链表中的指针丢失或损坏,会导致文件数据的丢失。
通常的解决方案是将几个盘块组成簇,按簇而不按块来分配,可以成倍的减少查找时间,比如一簇为4块,这样,指针所占的磁盘空间比例也要小得多。这种方法的代价是增加了内部碎片。簇可以改善许多算法的磁盘访问时间,因此应用于大多数操作系统。
请添加图片描述

显式链接

请添加图片描述
请添加图片描述
FAT一个磁盘对应一张,这里FAT表中不止一个-1,也就意味着可能一个FAT中存放的可能不止一个文件(一个磁盘只有一个FAT表或者说一个磁盘中不止一个文件,FAT表在系统启动时就会被读入内存,因此查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且明显减少了访问磁盘的次数),可以用-2表示这个磁盘块是空闲的,当一个进程请求操作系统分配一个磁盘块时,操作系统只需从FAT中找到-2的表项,并将对应的磁盘块分配给进程即可,而下面的索引分配中一个索引表对应的是一个文件)
所谓的从逻辑块号到物理块号转化的过程中直接借助这个FAT表就可以实现了。找到对应的实际物理块号之后进行一次IO即可,并且也是因为遍历过程中只是访问了FAT并没有一个一个的访问磁盘所以认为是支持随机访问的。
请添加图片描述

4.1.4 文件的物理结构(下)

索引分配

链接分配解决了连续分配的外部碎片和文件大小管理的问题。但依然存在问题:链接分配不能有效支持直接访问(FAT除外):FAT需要占用较大的内存空间。事实上,在打开某个文件时,只需将该文件对应磁盘块的编号调入内存即可,完全没有必要将整个FAT调入内存,为此,索引分配将每个文件所有的盘块号都集中放在一起构成索引表
请添加图片描述
(个人理解:若是一个文件太小,所对应的索引表自然也很小,所以一个磁盘中是否可以存放多个索引表?当然不能这样就不知道一个索引表对应的是哪一个文件,并且在所难免会有块内碎片)

FCB中记录的是索引块,通过索引块找索引表,接下来就可以找到这个文件各个逻辑块所对应的物理块号了,
请添加图片描述
所谓的是否支持随机访问就是通过逻辑地址是否能很快的找到对应的物理地址。并且注意这个索引表不是常驻内存的
所以我们知道索引表的起始位置,我们就可以根据逻辑块号直接计算出物理块号,
每个文件都有其索引块,这是一个磁盘块地址的数组。索引块的第i个条目指向文件的第i个块。要读第i块,通过索引块的第i个条目的指针来查找和读入所需的块。
索引分配的优点是支持直接访问,且没有外部碎片问题。缺点是由于索引块的分配,增加了系统存储空间的开销。索引块的大小是一个重要的问题,每个文件必须有一个索引块,因此索引块应尽可能小,但索引块太小就无法支持大文件。可以采用以下机制来处理这个问题。
请添加图片描述

链接方案

请添加图片描述
若是一个文件一个索引块装不下,可能给它分配多个索引块,这个文件所对应的FCB中只需要记录第一个索引块,各个索引块之间使用链接的方式链接起来的,若是读第二个索引块则需要将第一个索引块读入内存,并且根据第一个索引块的指针来找第二个索引块,然后把第二个索引块读入内存,

多层索引

请添加图片描述
就是链接是将下一个磁盘块的地址是通过上一个磁盘来获得的,这个索引表是将所有的地址集中存放了,所以要找那个地址,直接查便可。
在文件的FCB中只需要记录顶级索引表的索引块便可,
文件的最大长度是通过叶子节点乘每一个块的大小来算的
这里所说的一个索引表的大小不能超过一个磁盘块,简单来说就是计数不能像上面一样255 256 这种,每一个索引表最多255,(因为每一个磁盘块都是从0开始的,所以顶级的自然只能有一张)
逻辑块是相当是我们使用的是一直累加的,计算机每一个磁盘块都是从零开始的,所以要计算这个逻辑块在那个索引块中就用这个逻辑块除这个磁盘块的大小取整,而哪一个表项就是通过取余了
采用K层索引结构,且顶级索引表未调入内存,则访问一个目标数据块只需要K+1次磁盘IO操作
若是一个文件很小只有1KB大,若是在物理上采用的是两级索引的方式,那么读入目标文件依然是需要三次磁盘IO,所以就引出了混合索引,

混合索引

为了能够较全面地照顾到小型、中型、大型和特大型文件,可采用混合索引分配方式。对于小文件,为了提高对众多小文件的访问速度,最好能将它们的每个盘块地址直接放入FCB,这样就可以直接从FCB中获得该文件的盘块地址,即为直接寻址。对于中型文件,可以采用单级索引方式,需要先从FCB中找到该文件的索引表,从中获得该文件的盘块地址,即为一次间址。对于大型或特大型文件,可以采用两级和三级索引分配方式。UNIX 系统采用的就是这种分配方式,在其索引结点中,共设有13个地址项,即 i.addr(0)一i.addr(12),请添加图片描述
1 )直接地址。为了提高对文件的检索速度,在索引结点中可设置10个直接地址项,即用i.addr(0)~i.addr(7)来存放直接地址,即文件数据盘块的盘块号。假如每个盘块的大小为1KB,当文件不大于8KB时,便可直接从索引结点中读出该文件的全部盘块号。
2)一次间接地址,对于中、大型文件,只采用直接地址并不现实的。为此,可再利用索引结点中的地址项i.addr(7)来提供一次间接地址。这种方式的实质就是一级索引分配方式。图中的一次间址块也就是索引块,系统将分配给文件的多个盘块号记入其中。在一次间址块中可存放256个盘块号,因而允许文件长达256KB+8KB。
3 )多次间接地址,当文件长度大于256KB +8KB(一次间接地址与8个直接地址项)时,系统还需采用二次间接地址分配方式。这时,用地址项 i.addr(8)提供二次间接地址。该方式的实质是两级索引分配方式。系统此时在二次间址块中记入所有一次间址块的盘号。地址项i.addr(8)作为二次间址块,允许文件最大长度可达 (256256+256+8)KB。同理,地址项iaddr(9)作为三次间址块、其允许的文件最大长度可达(256256256+256256+256+8)KB。

索引分配总结

请添加图片描述
顶级索引表是存放于FCB中的,索引文件由逻辑文件和索引表组成,对索引文件存取时,必须先查找索引表。索引项只包含每条记录的长度和在逻辑文件中的起始位置。因为每条记录都要有一个索引项,因此提高了存储代价。

知识总结

请添加图片描述

4.1.5 逻辑结构VS物理结构

请添加图片描述
请添加图片描述

请添加图片描述

请添加图片描述
从用户的角度来看所有的字符占用的是一片连续的逻辑地址空间,所以我们只需要提供我们要访问的逻辑地址便可找到任何一个我们要找到的数据,但是从操作系统来看这些不过是一堆二级制数据而已,由于每一个磁盘块的大小是固定的,操作系统会将这个文件拆分成一个个逻辑块,然后他们的逻辑块0,1,2,3是一个连续的范围,然后操作系统会根据文件管理的策略是连续分配还是其他的分配方式,我们使用的库函数只是指明了要访问的是哪一个逻辑地址,将逻辑地址转化成物理地址不是我们关心的,交给操作系统来完成,然后根据存储分配策略将逻辑块号转化为物理块号,

请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
或者说我们(从用户的角度)存储信息的时候使用链式存储的方式,我们自己也知道信息不是连续存储的,我们通过学生1算学生2的逻辑结构也就有所不同就是和顺序储存的方式不同,但是也是可以算出来学生1的逻辑地址,但是这种链式存储的顺序文件操作系统也会将其拆分成一个个的块,这些块存储于磁盘块中,同样的磁盘块是连续的还是链式的,这个也是操作系统完成的,我们也是不得而知的,

请添加图片描述
请添加图片描述

请添加图片描述
索引文件同样是由文件的创建者决定的,我们可以先把前面这个索引项读入内存,然后根据这个索引项去找学生信息确定这个目标学生的逻辑地址,
请添加图片描述
然后操作系统会将上面索引文件拆分成一个个的小块,小块之间也是可以使用索引分配,也就是操作系统会维护一个索引表,这个表记录了各个逻辑块号到物理块号之间的映射关系,

请添加图片描述
也就是说文件的创建者可以创建一个顺序文件,索引文件,索引顺序文件,通过创建方式的不同创建者在逻辑上更好的管理逻辑上的块,然后通过不同的方式获得逻辑地址,将逻辑地址给操作系统,操作系统也有一套自己的方式来将文件分成相同大小的块,不过分配方式却不要求和上面对应,可以是连续分配,链接分配(隐式链接,显示连接),索引分配

文件的逻辑结构是用户可见的结构,即从用户角度看到的文件的全貌。文件的物理结构是文件在存储器上的组织结构,它表示一个文件在辅存上安置、链接、编目的方法。它和文件的存取方法以及存储设备的特性等都有着密切的联系。单个文件的逻辑结构和物理结构之间虽无明显的制约或关联关系,但是如果物理结构选择不慎,也很难体现出逻辑结构的特点,比如一个逻辑结构是顺序结构,而物理结构是隐式链接结构的文件,即使理论上可以很快找出某条记录的地址,而实际找时仍然需要在磁盘上一块一块地找。

4.1.6 文件存储空间管理

请添加图片描述

请添加图片描述
注意这几种管理方式更偏重于空闲空间的管理
一个存储设备可以按整体用于文件系统,也可以细分。例如,一个磁盘可以划分为4个分区.每个分区都可以有单独的文件系统。包含文件系统的分区通常称为卷(volume)。卷可以是磁盘的部分,也可以是整个磁盘,还可以是多个磁盘组成RAID集
在一个卷中,存放文件数据的空间(文件区)和 FCB 的空间(目录区)是分离的。由于存在很多种类的文件表示和存放格式,所以现代操作系统中一般都有很多不同的文件管理模块,通过它们可以访问不同格式的卷中的文件。卷在提供文件服务前,必须由对应的文件程序进行初始化,划分好目录区和文件区,建立空闲空间管理表格及存放卷信息的超级块
文件存储设备分成许多大小相同的物理块,并以块为单位交换信息,因此,文件存储设备的管理实质上是对空闲块的组织和管理,它包括空闲块的组织、分配与回收等问题
请添加图片描述
空闲表,位示图也是存放于目录区中,文件区就是用来存放普通的数据

空闲表法属于连续分配方式,它与内存的动态分配方式类似,为每个文件分配一块连续的存储空间。系统为外存上的所有空闲区建立一张空闲表,每个空闲区对应一个空闲表项,其中包括表项序号、该空闲区的第一个盘块号、该区的空闲盘块数等信息。再将所有空闲区按其起始盘块号递增的次序排列,
空闲盘区的分配与内存的动态分配类似,同样采用首次适应算法和最佳适应算法等。例如,在系统为某新创建的文件分配空闲盘块时,先顺序地检索空闲盘块表的各表项,直至找到第一个其大小能满足要求的空闲区,再将该盘区分配给用户,同时修改空闲盘块表。系统在对用户所释放的存储空间进行回收时,也采取类似于内存回收的方法,即要考虑回收区是否与空闲盘块表中插入点的前区和后区相邻接,对相邻接者应予以合并。
请添加图片描述

请添加图片描述
空闲表法主要注意三个问题,系统是如何记录这些空闲分区的,第二个就是怎么样进行磁盘块的回收的,第三个就是如何进行磁盘块的回收的
将所有空闲盘区拉成一条空闲链。根据构成链所用基本元素的不同,分为两种形式;
请添加图片描述
1)空闲盘块链。将磁盘上的所有空闲空间以盘块为单位拉成一条链。当用户因创建文件而请求分配存储空间时,系统从链首开始,依次摘下适当数目的空闲盘块分配给用户。当用户因删除文件而释放存储空间时,系统将回收的盘块依次插入空闲盘块链的末尾。这种方法的优点是分配和回收一个盘块的过程非常简单,但在为一个文件分配盘块时可能要重复操作多次,效率较低。又因它是以盘块为单位的,空闲盘块链会很长。这个也就对应着很像文件逻辑结构中的链接分配一样,同时保存链头和链尾也是为了方便分配与回收
请添加图片描述
2)空闲盘区链。将磁盘上的所有空闲盘区(每个盘区可包含若干个盘块)拉成一条链。每个盘区除含有用于指示下一个空闲盘区的指针外,还应有能指明本盘区大小(盘块数)的信息。分配盘区的方法与内存的动态分区分配类似,通常采用首次适应算法。在回收盘区时,同样也要将回收区与相邻接的空闲盘区合并。这种方法的优缺点刚好与第一种方法的相反,即分配与回收的过程比较复杂,但效率通常较高,且空闲盘区链较短
请添加图片描述请添加图片描述
请添加图片描述

请添加图片描述
在UNIX系统中采用的是成组链接法,这种方法结合了空闲表和空闲链表两种方法,它具有上述两种方法的优点,克服了两种方法均有的表太长的缺点
用来存放一组空闲盘块号(空闲盘块的块号)的盘块称为成组链块。成组链接法的大致思想是:把顺序的n个空闲盘块号保存在第一个成组链块中,其最后一个空闲盘块(作为成组链块)则用于保存另一组空闲盘块号,如此继续,直至所有空闲盘块均予以链接。系统只需保存指向第一个成组链块的指针。假设磁盘最初全为空闲盘块,(看不懂木关系,往下看,再回来看,你就会恍然大明白)
请添加图片描述
注意这里画的其实是一种链状结构,不是树状结构,每一个结点有100个空闲块,每一个结点的的第一个块用来保存下一个结点中空闲块的数量信息
这里需要注意的就是每一个表中第一个记录的是下一组空闲盘块的数目,上面的块号表示这个空闲块的起始块号,比如这里400号盘块会记录再下一组盘块的块数100,以及各个盘块的盘块号,这里分组-1 表示没有下一个分组了,另外成组链接法中每一组块的数量是有一个上限,另外最后一个分组的盘块号比其他是更少的,原因是这里有一个-1,
(所以每一组的空闲磁块的数目是一定的吗?当然是不一样的,你看下图)
请添加图片描述
若是分出去一个空闲块,修改超级块的计数为99,并且最后一个位置201删去
请添加图片描述
请添加图片描述
也就是将300这个磁盘块从这个链接中去掉,但是因为保留着信息,所以将这个400磁盘块的信息直接存放于超级块中便可,超级快就是相当于一个链头的作用,永远指向下一个,

请添加图片描述
修改超级块的存储信息,99改为100并且最后加一个空闲块号
若是空闲块未满,可以将空闲块插入第一个分组中,并且需要修改记录空闲块的数目的值
请添加图片描述
若是空闲块已满,新回收的块作为一个新的分组就有了保存下一个分组的能力,而超级快一直都是要指向第一个分组,所以需要修改超级快的值,其实有的像带头结点的头插法
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值