一、文件块、磁盘块

二、文件分配方式

1、连续分配

2、链接分配

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

3、索引分配

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

三、总结


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

按索引分割列表 索引分配方式_按索引分割列表

按索引分割列表 索引分配方式_显式_02

一、文件块、磁盘块

按索引分割列表 索引分配方式_显式_03

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

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

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

 

 

二、文件分配方式

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

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

按索引分割列表 索引分配方式_文件分配_04

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

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

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

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

 

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

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

 

③是否方便拓展文件?

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

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

按索引分割列表 索引分配方式_数据块_05

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

 

按索引分割列表 索引分配方式_文件分配_06

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

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

⑤小结

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

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

 

 

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

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

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

按索引分割列表 索引分配方式_数据块_07

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

用户给出要访问的逻辑块号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)。

那么文件分配表如下图

按索引分割列表 索引分配方式_数据块_08

注:一个磁盘仅设置一张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:显式链接不会产生外部碎片,页可以很方便地对文件拓展。

 

按索引分割列表 索引分配方式_显式_09

 

3、索引分配

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

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

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

按索引分割列表 索引分配方式_数据块_10

 

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

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

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

 

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

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

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

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

 

②思考一个问题

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

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

1)链接方案

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

按索引分割列表 索引分配方式_文件分配_11

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

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

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

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

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

2)多层索引

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

按索引分割列表 索引分配方式_数据块_12

如上图,假设磁盘块大小为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个直接地址,一个一级间接索引和一个二级间接索引。

按索引分割列表 索引分配方式_数据块_13

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

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

按索引分割列表 索引分配方式_按索引分割列表_14

本节重要考点:

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

 

 

三、总结

按索引分割列表 索引分配方式_按索引分割列表_15