当前位置: 高中信息技术 / 综合题
  • 1. (2024·) 在计算机的操作系统中,经常需要给应用程序“分配内存”和“释放内存”。若有大小为1024B的内存,如1图所示:

    使用列表["+",5]表示申请连续5B的内存,使用列表[2,2]表示回收位置2开始连续2B的内存。若指令集表示为:order=[["+",5],[2,2],["+",8],[8,3]]。随着指令集被执行,1024B连续的内存块会被分割成若干个占用内存空闲内存。为方便起见,“占用内存”用1表示,“空闲内存”用0表示,故执行上述指令集后,内存占用情况如2图所示:

    若将空闲块用链表组织起来,就可以快速查找空闲块和删除空闲块。把连续的空闲块定义为一个节点,每个节点由[空闲块起点, 空闲块长度, 下一个空闲块位置]三部分内容构成。根据2图内存占用情况,创建的空闲块链表如3图所示:

    1. (1) 根据2图所示的内存占用情况,执行指令[4,4]后(连续空闲块要合并),内存中“空闲块”的数量变为个。
    2. (2) 根据内存占用情况列表allot,创建空闲块链表代码如下:

      def linkList(allot): #linkList函数功能:根据内存占用0/1列表allot,创建空闲块链表link

       link = [ [-1,-1,-1] ] #链表包含一个空头节点

       head = tail = 0 ; n = len( allot ) ; i = 0

       while i < n :

       if allot[ i ] == 0 :

       j = i + 1

       while j<n and allot[ j ] == 0: 

       j = j + 1

       link.append( [ i , j – i , -1 ] )

       link[ tail ][ 2 ] =     ▲

       tail = len( link ) - 1

                  

       else:

       i += 1

      return head , link

      请在▲处填入合适的代码

      若将加框处的代码修改为i = j,是否影响程序的执行结果(选填:是/否)。

    3. (3) 模拟上述内存操作的Python程序如下,请在划线处填入合适的代码。

      #通过文件读入内存分配表allot和指令集order,其代码略。

      head , link = linkList ( allot )

      for i in range( len( order ) ):

       if order[ i ][ 0 ] == " + ": #必须分配连续的空闲块,且由第一个满足空间大小的节点分配

       p = head ; q = link[ head ][ 2 ]

       while 

       p = q ; q = link[ q ][ 2 ]

       if  q == -1:

       print( "内存不足!" )

       else:

       if link[q][1] == order[i][1]: 

                      

       else:

       link[ q ][ 0 ] = link[ q ][ 0 ] + order[ i ][ 1 ]

       link[ q ][ 1 ] = link[ q ][ 1 ] - order[ i ][ 1 ]

       else:

       p = head ;  q = link[ head ][ 2 ]

       while q != -1 and link[ q ][ 0 ]<order[ i ][ 0 ]:

       p = q ; q = link[ q ][ 2 ]

       if link[ p ][ 0 ] + link[ p ][ 1 ] == order[ i ][ 0 ]: #前面节点合并

       link[ p ][ 1 ] = link[ p ][ 1 ] + order[ i ][ 1 ]

       else:

       link.append([ order[ i ][ 0 ] , order[ i ][ 1 ] , q]) #添加节点

       link[ p ][ 2 ] = len( link ) - 1

                  p = link[ p ][ 2 ]

         if q != -1 and : #后面节点合并

       link[ p ][ 1 ] = link[ p ][ 1 ] + link[ q ][ 1 ]

       link[ p ][ 2 ] = link[ q ][ 2 ]

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