当前位置: 高中信息技术 / 综合题
  • 1. (2023·绍兴模拟) 操作系统在管理磁盘时,会将磁盘分为一个个“盘块”。在为文件分配空间时,可以将文件装到离散的盘块中。读取一个文件时,首先在目录结构中找到文件项。从文件项中可以获取文件名、存储时间、该文件在存储块中的起始地址等基本信息,但不包含文件具体内容,然后在磁盘文件分配表中找到对应的文件。磁盘文件分配表如图 1 所示。

    文件结束块用-1 表示,空闲盘块用 0xff 表示。

    1. (1) 根据文件的起始地址,能方便地找到文件的其它盘块。如图 1中,文件abc在磁盘中的盘块号依次是(注:各盘块号用→分隔)。
    2. (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:       #盘块 i 需要处理

                  fsize=0

                  p=i

                  while p!=-1 and p not in visited:

                      visited.append(p)

                      fsize+=l

                      p=allot[p]

                  if p==-1:

                      lst.append([i,fsize])

                  else:

                      for j in range(len(Ist)):

                          if lst[j][0]==p:

                              lst[j][0]=i

                              lst[j][1]=lst[j][1]+fsize

          return lst

      若allot为[3,7,13,9,0xff,0xff,0xff,8,-l,-l,0xff,l,0,1l,0xff,0xff],调用regain函数,

      ①则语句 lst[j][1]=lst[j][1]+fsize 一共会被执行次。

      ②如果把 while p!=-1 and p not in visited 改写为 while p!=-1,对程序的影响是(多选,填字母)。

      A.会增加 while 的循环体执行次数

      B.返回的 lst 中的节点数量保持不变

      C.while 循环不能正常结束

      D.返回的 lst 中,文件的起始地址部分不正确

    3. (3) 在创建文件时,若新文件需要占据 5 个盘块大小,只需要从头到尾找到空闲盘块,并依次链接,并把首地址存放到文件项中。为了有效管理空闲块,我们可以将所有空闲盘区(每个空闲盘区可以包括若干个空闲盘块)构建到一条空闲链 freelst 中。freelst 每个节点存储本空闲盘区的盘块号、长度和指向下个盘块的指针,创建时把新节点链接到 freelst 尾部。

      如图 2所示,共有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+l

              else:

                  i+=l

          return freeh,freelst

      #读取文件分配表信息存储到 a11ot 中,代码略

      head,freelst=mergefree(allot)

      p=head

      whi1e p!=-1:    #打印出所有空闲盘块号

          for i in range(freelst[p][1]):

              print(,end=',')

          p=freelst[p][2]

微信扫码预览、分享更方便