文件的物理结构——文件分配方式(知识篇)

一、引入

作为计算机系统资源的管理者,OS自然需要对外存(磁盘)资源进行管理,主要考虑两件事:

①对存放了文件数据的那些磁盘块怎样管理,即文件分配方式的问题;

②对空闲的磁盘块怎样管理,即文件存储空间管理的问题。

其中,“文件分配方式”要探讨的就是文件数据怎样存放在外存中,也就是本节内容。

类似于内存的分页,磁盘中的存储单元也会被分成一个个的磁盘块/物理块,其大小与内存块页面大小相同,这样内存与磁盘之间的数据交换(即读/写操作、磁盘I/O)都以“块”为单位进行,故数据交换比较方便。

对比内存管理,进程的逻辑地址空间被分为一个个页面,同样,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间也被分为了一个个的“文件块”,于是文件的逻辑地址也可以表示为(逻辑块号,块内地址)的形式,被分块后,OS 为文件分配存储空间也都是以块为单位的,因此用户通过逻辑地址来操作自己的文件,OS负责实现从逻辑地址到物理地址的映射。(逻辑地址物理地址一定要搞清楚)

在分块的体系基础上,我们就可以深入研究分块后的文件的具体分配方式了。主要有以下三大类:

二、文件分配的三类方式

(一)连续分配

思想就是:要求每个文件在磁盘上占有一组连续的块

比如,下图中一个文件file在逻辑上分为三个块,采用连续分配方式,让这些逻辑上相邻的块在物理上也相邻且保持相对顺序:

此方式下,考虑OS如何实现逻辑地址到物理地址的映射呢?

由于文件块与物理块的大小一致,故在块内的相对位置显然相同,即物理、逻辑地址的块内地址相同,故只需考虑块号是什么对应关系即可,即(逻辑块号,块内地址)——>(物理块号,块内地址)。为了实现这一映射,在文件的目录表中必须记录文件的起始存放块号和长度(即占了几块),比如上述的file文件,有目录表:

有了这些信息准备,OS就可以完成地址转换了:

当用户给出要访问的逻辑块号,OS找到该文件对应的目录项(FCB)得到起始块号,则物理块号=起始块号+逻辑块号。

【注】OS还要检查用户提供的逻辑块号是否合法,若逻辑块号>=长度就非法(因为逻辑块号从0开始编号,故=时也非法)。

由上述地址转换过程,可以看到,只要用户给出了要访问的逻辑块号,OS可以直接算出逻辑块对应的物理块号,因此连续分配支持顺序访问和直接访问(即随机访问),这是其一个优点。

【补】“顺序访问”是指若要访问逻辑块号n的话,就必须先顺序访问逻辑块号0,1,...,n-1,才能找到逻辑块号n;“直接访问(随机访问)”是指要访问n号逻辑块时不需要访问其他的,可以直接访问。

由连续分配的方式与特点考虑下面两种情况:

情况一:

下图中有两种方式在外存读取3个物理块:①依次读1,2,3;②依次读4,5,6

在读取一个磁盘块时,要把磁头移动到对应的磁盘块位置,访问不同的磁盘块是需要移动磁头的,且相隔越远,移动时间越长。因此,显然①移动距离更短更快,故连续分配的文件在顺序读写时速度快,是其另一个优点。

【说明】外存(磁盘)的结构事实上是盘片的形式,这里为了清晰说明画出矩阵形式,不过道理一致。

情况二:

如下图,黑边黑方块表示文件A占用了连续3个物理块,绿边方块表示空闲块,黑边白方块表示其他文件已占。

此时,如果A采用连续分配,要加一个块(即要4个连续块),为了扩展,必须将A的数据全体迁移到空闲的4块连续区中,而这需要较大的开销,因此物理上采用连续分配的文件不方便拓展,是其一个缺点。

还是在上图中,若要创建一个连续的大小为5个块的文件B,则在上图中将无法为其分配足够的连续空间,故可知连续分配的存储利用率低,会产生难以利用的磁盘碎片,虽然可用紧凑处理,但代价较大,是其另一个缺点。

(二)链接分配

思想是,采用离散分配方式,动态地为文件分配盘块,无须事先知道文件大小。

一般地,链式分配有两种方式:

(Ⅰ)隐式链接

方式:将文件离散地分配在磁盘的物理块中,每个块之间形成链表,每个文件则对应一个盘块链表。文件的目录项中含有文件的第一块指针和最后一块指针,除最后一块,每个盘块都含有指向文件下一个盘块的指针,这些指针对用户透明(即不可见)。如下图示意

此方式如何实现地址转换?

用户给出要访问的逻辑块号i,OS找到该文件对应的目录项FCB,从中找到起始块号(逻辑0号块),将此块读入内存,由此知道逻辑1号块位置,再读入逻辑1号块的对应物理块,即可知逻辑2号块位置,以此类推,读入i号逻辑块共要i+1次磁盘I/O。

根据上述方式与特点,此方式在扩展文件时,只需在外存中找到空闲的块,把它挂到文件链尾,修改目录项中的结束块号即可,因此隐式链接很方便文件扩展;此外,所有的空闲块都可以利用,不会有碎片问题,外存的利用率高。这是其优点。

仔细分析不难发现,隐式链接只适合顺序访问,要想访问文件第n号块,只能从文件的第一块开始依次查找,随机访问效率低;另外,还有一个问题:如果在系统运行中,链表内的指针意外丢失或损坏,将导致文件数据丢失,其文件存储的稳定性存在隐患。这是其缺点。

除了上述缺点,仍然存在一些问题,比如当文件比较大时,文件对应的那个链表也会很长,既不便维护,查找也比较麻烦,这是因为隐式链接采用了链表的方式。同样是离散分配,显示链接则给出了不同的方案。

(Ⅱ)显式链接

方式:显示链接不采用链表,而是将外存中所有物理块的下一个块的信息统一放在一张表中,这张表就是文件分配表FAT(File Allocation Table),此表在整个磁盘中仅设置一张,每个表项中存放链接指针,指向下一个盘块号。文件的第一个块号记录在目录项中,后续的盘块通过FAT找到。

不难发现,FAT的表项与全部磁盘块一一对应,不仅记录了文件各块的顺序,而且还记录了空闲块。

在开机时,FAT会被读入内存,并常驻内存,FAT的各表项在物理上连续存储,且每个表项长度相同,因此“盘块号”字段是可以隐含的。

那么此方式如何实现地址转换?

用户给出逻辑块号i,OS先找到其目录项,从中找出起始块号,查询内存中的FAT,依此往后找到I号逻辑块对应的物理块号,由于FAT常驻内存,故查找过程是在内存中进行,无需读磁盘操作。

由此可知,显示链接方式支持顺序访问,也支持随机访问,且由于变址不需访问磁盘,比隐式链接快很多,且同样不会产生外部碎片,方便文件扩展。唯一小小的缺点就是FAT占用一定的内存。

【注】若题目未指明显示还是隐式链接,默认链接分配为隐式。、

(三)索引分配

允许文件离散地分配在各个磁盘块中,系统会为每一个文件建立一张索引表,表中记录了文件各个逻辑块对应的物理块。存放索引表的磁盘块称为索引块,文件数据存放的磁盘块称为数据块。

如,文件aaa的数据依次存放在磁盘块2,5,13,9中,系统为其建立一张索引表,记录了其各个逻辑块和物理块对应的关系:

逻辑块号物理块号
02
15
213
39

若此索引表存放在7号磁盘块,则7号磁盘块就是该文件的索引块,2,5,13,9磁盘块就是数据块。

此方式下,要找到文件的数据显然要知道其索引表,故而要在文件的目录项(FCB)中记录自己的索引块号。

【注】索引表中,可采用固定长度表示物理块号,因此逻辑块号是可以隐含的。

那么,此方式如何实现地址转换呢?

①给出要访问的逻辑块号i

②OS找到其FCB,找出索引块块号

③在索引块中读出索引表

④由索引表的映射关系,根据逻辑块号即可查出物理块号。

由查找过程可知,索引分配可支持随机访问,也容易实现文件拓展(只需给文件分配一个空闲块,并增加一个索引表即可)

讲到这里,不知道你有没有考虑过这样一个问题:索引分配依赖于索引表,索引表也需要存储,如果索引表过大,那么索引表就需要存放多个磁盘块,这对索引表的查找又带来了麻烦。

【例】设每个磁盘块1KB,一个索引表的表项有4B,则一个磁盘块最多存放1KB/4B=256个索引项,若文件大小超过了256个块,即需要有超过256个索引对应项,故一个磁盘块装不下整个索引表。

对于这种问题,主要有以下三种解决方案:

(Ⅰ)链接方案

索引表要占用多个块,那就把这些索引块都链接起来就好了,相当于管理一个链表

方法是:为文件分配多个索引块,每个索引块中用一定的空间存储指向下一个索引块的指针,而在FCB中,只需记录第一个索引块号,如

采用链式的方式后,如果想要读取第n个索引块的话,就必须要读取前n-1个。基于此特性,若有很多索引块,要访问最后一个,则要很多的读磁盘操作,这样显然是低效的,为此改进为:

(Ⅱ)多层索引

通过第一级索引块指向一组二级索引块,第二级索引块再指向文件块,根据文件的大小可以继续到第三、四级。如

若像上图采用两层索引,该文件的最大长度就为256*256*1KB=64MB。

【注】若要采用多层索引,则最顶层索引表的大小不超过一个磁盘块

此方式如何将逻辑块号转为物理块号?

在FCB中,只需记录顶层索引表的位置,OS只需从一级索引表中找到下一级索引块号,依次往下找即可。若采用k层,且顶级索引表未调入内存,则访问一个数据块需要k+1次读磁盘操作。

(Ⅲ)混合索引

将多种索引分配方式相结合的分配方式,系统既采用直接地址,又采用单级或多级索引分配方式。对于小型文件,可以只采用直接索引,从而加快查找速度;对于中型文件,可采用单级索引方式;对于大型文件,可采用多级索引分配方式,这样就可以全面地照顾到小中大型文件。示意图为:

用一个块作为顶级索引,顶级索引当中包含直接索引(直接指向文件的数据块),一级索引(指向下一个索引块,需通过下一级索引块找到数据块),二级索引(往下还有两级索引表),三级索引......

思考一下:若顶级索引未调入主存,欲访问直接索引指向的数据块,要几次磁盘IO(即需要调内存几次)?访问一级间接的数据块要几次?二级索引呢?

要找到这些数据块,要从顶级索引表开始找,因此首先要将顶级索引调入内存,即1次;如果访问直接索引的数据块,从顶级索引中找到其地址后,就可调入该数据块到内存(1次)即可访问,即共需2次磁盘IO;若要访问一级索引的数据块,则相比于直接索引还多一个索引表调入,因此共需3次;同理,访问二级索引的数据块就需4次。更高级索引也依此类推了。做题时注意是不是已经将顶级索引调入内存了。


文件分配方式的有关题目篇,有时间再补。嗯。。。就这样吧,再会

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值