图a
(1)根据文件的起始地址,能方便地找到文件的其它盘块。如图a中,文件abc在磁盘中的盘块号依次是
(2)如果目录结构损坏,就不能获取文件的基本信息和起始地址。但我们可以借助文件分配表来恢复部分数据(不考虑恢复文件名、存储时间等信息)。函数regain的功能是模拟数据恢复,找到各个文件的起始地址和大小(盘块数量),并返回以[[起始地址,文件大小],…]形式的列表lst。变量allot存储文件分配表信息。
def regain(allot):
lst=[]
visited=[]#记录allot的访问情况
for i in range(len(allot)):
if allot[i]!=0xff and i not in visited:
fsize=0
p=i
while p!=-1 and p not in visited:
visited.append(p)
fsize+=1
p=allot[p]
if p==-1:
lst.append([i,fsize])
else:
for j in range(len(lst)):
if lst[j][0]==p:
lst[j][0]=i
return lst
若 allot 为[3,7,13,9,0xff,0xff,0xff,8,-1,-1,0xff,1,0,11,0xff,0xff],调用regain函数,
①加框语句 lst[j][1]=lst[j][1]+fsize一共会被执行
②如果把while p!=-1 and p not in visited 改写为while p!=-l,对程序的影响是
A.会增加while的循环体执行次数B.返回的lst中的节点数量保持不变
C.while循环不能正常结束D.返回的lst中,文件的起始地址部分不正确
(3)在创建文件时,若新文件需要占据5个盘块大小,只需要从头到尾找到空闲盘块,并依次链接,并把首地址存放到文件项中。为了有效管理空闲块,我们可以将所有空闲盘区(每个空闲盘区可以包括若干个空闲盘块)构建到一条空闲链freelst中。freelst每个节点存储本空闲盘区的盘块号、长度和指向下个盘块的指针,创建时把新节点链接到freelst尾部。
图b
如图b所示,共有3个空闲盘区,盘块号依次为4、5、6、10、14、15,请在划线处填上合适的代码。
def mergefree(allot):#mergefree 的功能是从头到尾扫描文件分配表,创建空白盘区链
freeh=-1;freelst=[]
n=len(allot)
i=0
while i<n:
if allot[i]==0xff:
j=i+1
while ①
j+=1
freelst.append([i,j-i,-1])
if freeh==-1:
freeh=cur=len(freelst)-1
else:
freelst[cur][2]=len(freelst)-1
②
i=j+1
else:
i+=1
return freeh,freelst
#读取文件分配表信息存储到allot中,代码略
allot=[3,7,13,9,0xff,0xff,0xff,8,-1,-1,0xff,1,0,11,0xff,0xff]
head,freelst=mergefree(allot)
p=head
while p!=-1:#打印出所有空闲盘块号
for i in range(freelst[p][1]):
print(③
p=freelst[p][2]
同类型试题
y = sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x = (π/2) + kπ 为对称轴
y = arcsin x, x∈[–1,1], y∈[–π/2,π/2]
sin x = 0 ←→ arcsin x = 0
sin x = 1/2 ←→ arcsin x = π/6
sin x = √2/2 ←→ arcsin x = π/4
sin x = 1 ←→ arcsin x = π/2
y = sin x, x∈R, y∈[–1,1],周期为2π,函数图像以 x = (π/2) + kπ 为对称轴
y = arcsin x, x∈[–1,1], y∈[–π/2,π/2]
sin x = 0 ←→ arcsin x = 0
sin x = 1/2 ←→ arcsin x = π/6
sin x = √2/2 ←→ arcsin x = π/4
sin x = 1 ←→ arcsin x = π/2