操作系统4.1.4 文件的物理结构(文件分配方式)

 

一、文件块、磁盘块

二、文件分配方式

1、连续分配

2、链接分配

    1)隐式分配
    2)显式分配

3、索引分配

   1)链接方案
   2)多层索引
   3)混合索引

三、总结


本节内容非常重要,必考选择题,甚至出大题。

一、文件块、磁盘块

在内存管理中,进程的逻辑地址地址空间被分为了一个个页面。同样的,在外存管理中,为了方便对文件数据的管理,文件的逻辑地址空间被分为了一个个文件“块”

在很多操作系统中,磁盘块的大小与内存块、页面的大小相同

于是文件的逻辑地址页可以表示为(逻辑块号,块内地址)的形式。

 

 

二、文件分配方式

1、连续分配【访问第n条记录,需访问磁盘1次】

连续分配方式要求每个文件在磁盘上占有一组连续的块。

① Q:用户通过逻辑地址操作自己的文件,操作系统如何实现从逻辑地址到物理地址的映射?

A:用户给出要访问的逻辑块号,操作系统会找到该文件对应的目录项(FCB),文件目录项(FCB)中记录存放的起始块号和长度(总共占用几个块)。所以物理块号 = 起始块号 + 逻辑块号

当然,还需要检查用户提供的逻辑块号是否合法(逻辑块号 >= 长度 就是不合法)。

优点1:连续分配方式可以直接算出逻辑块号对应的物理块号,因此连续分配支持顺序访问和直接访问(即随机访问)

 

读取某个磁盘时,需要移动磁头。访问的两个磁盘块相隔越远移动磁头锁的时间越长

优点2:连续分配的文件在顺序读/写时速度最快。

 

③是否方便拓展文件?

如下图所示,如果此时A文件想要拓展,由于连续分配要求在物理上占用的磁盘块必须是连续的,而此时A后面的物理块都被占用,所以A只能全部迁移到后面没有被占用且空间足够连续的区域。

这样的话需要巨大的开销。

缺点1:物理上采用连续分配的文件不方便拓展。

 

缺点2:物理上采用连续分配,存储空空间利用率低,会产生难以利用的磁盘碎片

可以使用紧凑处理碎片问题,但是需要耗费很大的时间代价。
 

⑤小结

连续分配方式要求每个文件在磁盘上占有一组连续的块

优点:支持顺序访问和直接访问(随机访问);连续分配的文件在顺序访问时速度最快。
缺点:不方便文件拓展;存储空间利用率低,会产生难以利用的磁盘碎片。

 

 

2、链接分配【访问第n条记录,需访问磁盘n次】

链接分配采用离散分配的方式,可以为文件分配离散的磁盘块。分为隐式链接显式链接

1)隐式分配(隐式链接)【默认】

①如何实现逻辑块号到物理块号的转变?

用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项FCB...

目录项FCB中记录了起始块号和结束块号...

从FCB中找到起始块号(即0号逻辑块对应的物理块),将0号逻辑块读入内存(除了结束块号,每个物理块都保存了指向下一个物理块的指针),由此知道1号逻辑块的物理内存,于是读入1号逻辑块,再找到2号逻辑块的存放位置..........以此类推。

因此,读入i号逻辑块,总共需要 i+1 次磁盘I/O。

结论:采用链式分配(隐式链接)方式的文件,只支持顺序访问,不支持随机访问,查找效率低。另外,指向下一个磁盘块的指针也需要耗费少量的存储空间

隐式链接

  1. 除文件的最后一个盘块之外,每个盘块中都存有指向下一个盘块的指针
  2. 文件目录包括文件第一块的指针和最后一块的指针

 

 

②是否方便拓展文件?

若要扩展文件,可以随便找一个空闲磁盘块,挂到文件的磁盘块链尾,并修改文件的FCB。

优点:方便文件的扩展,不会有碎片问题,外存利用率高。
缺点:只支持顺序访问,不支持随机访问,查找效率低。指向下一个盘块的指针也需要耗费一定的存储空间。

 

 

2)显式分配(显式链接)

显示链接:把用于链接文件的各物理块的指针存放在一张表中,即文件分配表(FAT,File Allocation Table)

例如,假设某个新创建的文件“aaa”依次存放的磁盘块为2-->5-->0-->1(逻辑块为0、1、2、3)。新创建的文件“bbb”一次存放在磁盘块4-->23-->3(逻辑块为0、1、2)。

那么文件分配表如下图

注:一个磁盘仅设置一张FAT。开机时将FAT读入内存,并常驻内存FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此物理块号字段可以是隐含的。

 

①如何实现逻辑块号到物理块号的转变?

用户想访问逻辑块号i,操作系统找到该文件对应的目录项(FCB)...

从目录项FCB中找到起始块号,若i > 0,则查询内存中的文件分配表,往后找到i号逻辑块对应的物理块号。逻辑块号转换成物理块号过程不需要读磁盘操作都是直接在内存中直接读取FAT表即可找到逻辑块号与物理块号的对应关系。

如用户想要访问aaa文件的2号逻辑块,根据页目录项的起始块号2号块(0号逻辑块),查询FAT表,得到1号逻辑块对应的物理块为5号块,再查5号物理块的下一块即为2号逻辑块所对应的物理块,整个查询过程都是在内存中进行的,没有访问过磁盘。

 

②结论

优点1:采用链式分配(显式链接)方式的文件,支持顺序访问,也支持随机访问(想访问第i号块不需要依次访问之前的0~i-1号逻辑块),由于块号转换过程不需要访问磁盘,所以相比于隐式链接来说,访问速度快很多

优点2:显式链接不会产生外部碎片,页可以很方便地对文件拓展

 

 

3、索引分配

索引分配允许文件离散的分配在各个磁盘中,系统会为每个文件建立一张索引表,索引表只记录了文件的各个逻辑块所对应的物理块(索引表功能类似内存管理中的页面——建立逻辑页面到物理页之间的映射关系)。

索引表存放的磁盘称为索引块。文件数据存放的磁盘块称为数据块

例如,假设某个新创建的文件“aaa”依次存放的磁盘块为2-->5-->13-->9。7号磁盘作为“aaa”的索引块,索引块中保存了索引表的内容。如下图所示

 

注:链接分配的显示链接中,文件分配表FAT是一个磁盘对应一张。而索引分配方式中,索引表是一个文件对应一张。

可以用固定长度表示物理块号(如假设磁盘总容量为1TB = 240B,磁盘块大小为1KB,则共有2^30个磁盘块,则可用4个字节表示磁盘号,即可用4B表是索引表的表项。

因此,索引表中的逻辑块号可以是隐含的

 

①如何实现文件的逻辑块号到物理块号的转换?

用户给出要访问的逻辑块号i,操作系统找到该文件对应的目录项(FCB)...

从目录项中找到索引表的存放位置,将索引表读入内存,并查找索引表即可知道i号逻辑块在外存中存放的位置。

索引分配可以支持随机访问文件扩展也很容易实现(只需要给文件分配一个空闲块,并增加一个索引表项即可),但是索引表需要占用一定的存储空间

 

②思考一个问题

若一个磁盘块1KB,一个索引项4B,则一个磁盘只能放下1K / 4 = 256个索引项(逻辑块号隐含),如果文件大小超过了256个索引块,那么一个磁盘块就装不下整张索引表了,如何解决这个问题?

通常有以下三种解决方案:链接方案、多层索引、混合索引。

1)链接方案

如果索引表太大,一个索引块装不下,那么可以将多个索引块链接起来存放。

假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。

若一个文件的大小为256 * 256KB = 655,36KB = 64MB

一个磁盘块1KB,所以有256 * 256个块,也就共有256 * 256个索引项,也就需要256个索引块来存储,这些索引块用链接方案连起来。

若想要访问最后一个索引块(第256个索引块),而各个索引块之间是用指针链接起来的,因此必须顺序地读入前255个索引块。

显然,这种方案的效率是很低的。为此,人们又提出了多层索引。 

2)多层索引

多层索引:建立多层索引(原理类似多级页表)。使第一层索引块执行第二层索引块。还可以根据文件大小的要求建立第三层、第四层....

如上图,假设磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放256个索引项。

若某文件采用两层索引,则该文件最大长度可以到256 * 256 * 1KB = 655,36KB = 64MB

 

可以根据逻辑块号算出应该查找索表中的哪个表项。

如:访问1026号逻辑块,则1026 / 256 = 4,1026 % 256 = 2

因此可以先将一级索引表调入内存,查询4号表项,将其对应的二级索引表调入内存,再查询二级索引表的2号表项即可得到1026号逻辑块存放的磁盘号了。

访问目标数据块需要3次磁盘I/O


若采用三层索引,则文件的最大长度为256 * 256 * 256 * 1KB = 16GB

访问目标数据块需要4次磁盘I/O

 

对于K层索引结构,且顶级索引表未调入内存,则访问一个数据块需要K+1次读磁盘操作。

3)混合索引

混合索引多种索引分配方式的结合。

对于多层索引,如果文件占用几个磁盘块,每次访问都要多次访问磁盘,这显然不合理;并且一般计算机中小文件更多,如果还用多层索引访问就非常不合理,所以就有了混合索引。

如在一个文件的顶级索引表中,即包含直接地址索引(直接指向数据块),又包含以及间接索引(指向单层索引表),还包含两级间接索引(指向两层索引表)。

如下图,顶级索引表中有8个直接地址,一个一级间接索引和一个二级间接索引。

对于上图,如果顶级索引表还没有读入内存
访问0~7号逻辑块:两次磁盘。
访问8~263号逻辑块:三次磁盘。
访问264~65799逻辑块:四次读操作。

对于小文件,这种混合索引只需较少的读磁盘次数就可以访问目标数据块。

本节重要考点:

  1. 根据多层索引、混合索引的结构计算出文件的最大长度(KEY:各级索引表最大不能超过一个块)
  2. 要能自己分析访问某个数据块所需要的读磁盘操作次数(KEY:FCB中会存有指向顶级索引块的指针,因此可以根据FCB读入顶级索引块。每次读入下一级的索引块都需要一次读磁盘操作。另外要注意题目条件——是否有说顶级索引块已调入内存

 

 

三、总结

  • 17
    点赞
  • 94
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

烟敛寒林o

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

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

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

打赏作者

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

抵扣说明:

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

余额充值