计算访问磁盘数

【知识回顾】

(1)OS给文件分配存储空间是以 簇/物理块 为单位的。如下题的一个目录即一个文件即分配一个对应磁盘块

(2)文件索引结点也是存放在簇中的,并且一个文件对应一个索引结点;但是一个目录文件的目录项比较多的话,是可以存放在多个链接在一起的磁盘块的(下面这题“目录文件组成链接文件”)。

第一题

一文件系统如图,方框表示目录,圆圈表示普通文件。根目录常驻内存,目录文件组织成链接文件,不设FCB,普通文件组织成索引文件。目录表指示下一级文件名及其磁盘地址(各占2B,共4B)。下级文件是目录文件时,指示其第一个磁盘块地址,下级文件是普通文件时,指示其FCB的磁盘地址(注意这句话,举例:从U目录文件找出[找出指每个目录文件的磁盘块的最后指针作用]W的FCB地址读入内存)。每个目录的文件磁盘块的最后4B供拉链使用。下级文件在上级目录文件中的次序在图中为从左至右。每个磁盘块有512B,与普通文件的一页等长。

普通文件的FCB组织如图所示,每个磁盘地址占2B,前10个地址直接指示该文件前10页的地址,第11个地址指示一级索引表地址,一级索引表中的每个磁盘地址指示一个文件页地址;第12个地址指示二级索引表地址,二级索引表中的每个地址指示一个一级索引表地址,第13个地址指示三级索引表地址,三级索引表中的每个地址指示一个二级索引表地址。

(1)一个普通文件最多可有多少个文件页?

【解析】因为磁盘块大小为512B,所以索引块大小也为512B,每个磁盘地址大小为2B,因此一个一级索引表可以容纳256个磁盘地址,所以一个普通文件最多可以有的文件页数为10+256+256×256+256×256×256=16843018。

(2)若要读文件J中的某一页,最多启动磁盘多少次?

【解析】由图可知道,目录文件A和D中的目录项都只有2个,因此这2个目录文件都只占用一个物理块。要读文件J中的某一页,先从内存的根目录中找到目录文件A的磁盘地址,将其读入内存(已访问磁盘1次)。然后从目录A中找出目录文件D的磁盘地址读入内存(已访问磁盘2次)。再从目录D中找出文件J的FCB地址读入内存(一般是读入一个磁盘块即一个扇区!当然一个磁盘块(簇)也可以有多个扇区,如2019年408真题就是一个簇=2个扇区(已访问磁盘3次)。在最坏情况下,该访问页存放在三级索引下,这时候要一级级地读三级索引块才能得到文件J的地址(已访问磁盘6次)。最后读入文件J的相应页(共访问磁盘7次),所以最多7次。

(3)若要读文件W中的某一页,最少启动磁盘多少次?

【解析】由图可知道,目录文件C和U的目录项比较多,可能存放在多个链接在一起的磁盘块中。在最好情况下,所需的目录项都在目录文件的第一个磁盘块中,先从内存的根目录中找到目录文件C的磁盘地址并读入内存(已访问磁盘1次)。。。从P中找到目录文件U的磁盘地址并读入内存(已访问磁盘4次)。从U的第一个磁盘块中找出文件W的FCB地址并读入内存(已访问磁盘5次)。在最好情况下,要访问的页在FCB的前10个直接块中,按照直接块指示的地址读文件Q的相应页(已访问磁盘6次)。所以要读文件W中的某页,最少启动磁盘6次。

(4)由(3)为最大限度地减少启动磁盘次数,可用什么方法?此时磁盘最多启动几次?

【解析】为了减少启动磁盘的次数,可以将需要访问的W文件挂在根目录的最前面的目录项中,此时只需要读内存中的根目录就可找到W的FCB,将FCB读入内存(已访问磁盘1次),最差情况下,需要的W文件的那个页挂在FCB的三级索引下。因此读3个索引块需要访问磁盘3次(已访问磁盘4次),得到该页的物理地址,再去读这个 页即可(已访问磁盘5次)。此时磁盘最多启动5次。

【回顾】一般的FCB,但是上题的FCB结构和这个略不同。

第二题

某个文件系统中,外存为硬盘,物理块大小为512B,有文件A包含598条记录,每条记录占255B,每个物理块放2条记录。文件所在的目录如下图所示,文件目录采用多级树形目录结构,由根目录结构、作为目录文件的中间节点和作为信息文件的树叶组成,每个目录项占127B,每个物理块放4个目录项,根目录的第一块常驻内存,问:

(1)若文件的物理结构采用链式存储方式,链指针地址占2B,

则要将文件A读入内存至少需要存取多少次硬盘?

【解析】

由于根目录的第一块常驻内存(即root所指的/bin等可以直接获得),根目录找到文件A需要读盘5次。由255×2+2=512,一个物理块存放2条记录+下一物理块地址,读完A需访盘598/2=299次(整个文件A占了299个磁盘块),所以将文件A读到内存至少需要读盘299+5=304次。

PS:bin&dev&etc&boot信息存放在root第1块,usr和tmp信息在root的第二块,访盘1次获得前四个目录项的信息,结果发现没找到usr,所以再次访盘1次,找到了usr。(目前访盘两次)
同理,like&marg&mik&za在usr的第一块,you和he在usr第二块,通过从前到后对比,第一块没有匹配的(访盘1次),第二块有匹配的目录项(访盘1次),找到he。(目前访盘4次)
file1和dir1在he的第一块,所以访盘1次获得dir1的目录信息,A文件是dir1目录中的第一份文件它的地址信息在dir1目录的第一块。(目前访盘5次)

所以访盘5次是可以获得A的位置的。

(2)若文件为连续文件,要读文件A的第487条记录至少要存取多少次硬盘?

【解析】和(1)同,找到文件需5次读盘,知道A的地址后通过计算只需一次读盘(就像顺序表中直接存储一样)就能读出第487条记录,至少需要5+1次读盘。

(3)一般为了减少读盘次数,可以采取什么措施减少几次存取操作?

【解析】索引结点。若一个目录项占16B,则一个盘块可存放512/16=32个目录项,而原来的一个盘块存放4个目录。采用索引分配的链接方案(可用1个或多个盘块来存放该文件的所有盘块号)。(由(1)中链指针地址为2B,255 × 2+2=512B)一个盘块可存放255个盘块号(链指针地址),留1个2B作为指向下一个存储索引块的磁盘块号。由前面已知查找目录时需启动5次磁盘。文件A共有299个盘块,则查找文件A的某一记录时需2次取得所有盘块号(2个索引结点),再启动一次磁盘即可把A中的任意一条记录读入内存。

所以查找一条记录最多需要5(目录文件仍旧为链接方式)+3=8次访盘,而原来的链接方法查找一条记录,读盘次数为6~304(即5次找到文件A,然后A一共有299个磁盘,该记录可能在这299个磁盘中任意一个里).

 

PS:虽然连续分配可以实现顺序存储,但缺点较多:需要连续存储空间,会产生碎片,不利于文件的动态扩充;而链接分配在(1)中用了,现在(3)就是想减少访盘次数,所以采用索引分配的链接方式(相当于结合前两种)。

 

猜你喜欢

转载自blog.csdn.net/qq_35812205/article/details/107209960