⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memory.bas

📁 Memory.bas关于模拟操作系统内存分配
💻 BAS
📖 第 1 页 / 共 2 页
字号:
   mcbe(i).big = mcbu(num).big
   j = emptym
   k = j
   total = 0
   Do While j <> 0                                                     '确定插入位置
      If mcbe(j).Start < mcbe(i).Start Then
         total = total + 1
         If total = 13 Then
            freemm = -1
            MsgBox ("freemm错误 确定插入位置"), 0, "error"
            Exit Function
         End If
         k = j
         j = mcbe(j).next
      Else
         Exit Do
      End If
   Loop
   If k = j Then                                                      '插到最前面
      If mcbe(i).Start + mcbe(i).big = mcbe(k).Start Then             '与后一项合并
         mcbe(k).big = mcbe(i).big + mcbe(k).big
         mcbe(k).Start = mcbe(i).Start
         mcbe(i).flag = False
         mcbe(i).next = 0
         mcbe(i).prior = 0
         Exit Function
      Else                                                            '不能合并
         mcbe(i).prior = 0
         mcbe(i).next = k
         mcbe(k).prior = i
         emptym = i
         mcbe(i).flag = True
         Exit Function
      End If
   Else
       If j = 0 Then                                                     '插到最后
          If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then          '与前一项合并
             mcbe(k).big = mcbe(k).big + mcbe(i).big
             mcbe(i).next = 0
             mcbe(i).prior = 0
             mcbe(i).flag = False
             Exit Function
          Else                                                           '不能合并
             mcbe(i).next = 0
             mcbe(i).prior = k
             mcbe(k).next = i
             mcbe(i).flag = True
             Exit Function
          End If
       Else                                                             '插到中间
          If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then          '与前一项合并
             mcbe(k).big = mcbe(k).big + mcbe(i).big
             mcbe(i).next = 0
             mcbe(i).prior = 0
             mcbe(i).flag = False
             If mcbe(k).Start + mcbe(k).big = mcbe(j).Start Then        '与后一项合并
                mcbe(k).big = mcbe(k).big + mcbe(j).big
                mcbe(k).next = mcbe(j).next
                If mcbe(j).next <> 0 Then                               'j指向最后一项
                   mcbe(mcbe(j).next).prior = k
                End If
                mcbe(j).next = 0
                mcbe(j).prior = 0
                mcbe(j).flag = False
              End If
           Else
              If mcbe(i).Start + mcbe(i).big = mcbe(j).Start Then      '与后一项合并
                 mcbe(j).Start = mcbe(i).Start
                 mcbe(j).big = mcbe(j).big + mcbe(i).big
                 mcbe(i).next = 0
                 mcbe(i).prior = 0
                 mcbe(i).flag = False
              Else
                 mcbe(k).next = i
                 mcbe(i).next = j
                 mcbe(i).prior = k
                 mcbe(j).prior = i
                 mcbe(i).flag = True
              End If
           End If
        End If
    End If
End If
End Function


Public Function jincou(total As Integer) As Integer                              '内存紧凑函数
Dim i As Integer, j As Integer, sum As Integer, k As Integer, total2 As Integer
i = usedm: j = emptym
total2 = 0
Do While i <> 0 And mcbe(j).next <> 0
   If mcbu(i).Start > mcbe(j).Start Then
      pcb(mcbu(i).numpcb).caddr = mcbe(j).Start                    '只改变地址不改变指针
      sum = mcbe(j).Start + mcbu(i).big + 4
      For k = mcbe(j).Start To sum Step 1
          mmu(k) = mmu(k + mcbe(j).big)
      Next k
      mcbu(i).Start = mcbe(j).Start
      mcbe(j).Start = mcbu(i).Start + mcbu(i).big
      sum = mcbu(i).big + mcbu(i).Start - 1
      sum = sum \ 4 - 1
      For k = (mcbu(i).Start - 1) \ 4 To sum Step 1
          frmmain.mmview(k).BackColor = frmmain.yiyong.BackColor
      Next k
      sum = mcbe(j).big + mcbe(j).Start - 1
      sum = sum \ 4 - 1
      For k = (mcbe(j).Start - 1) \ 4 To sum Step 1
          frmmain.mmview(k).BackColor = frmmain.weiyong.BackColor
      Next k
      k = mcbe(j).next
      If mcbe(j).Start + mcbe(j).big = mcbe(k).Start Then    '与后项合并
         mcbe(j).big = mcbe(j).big + mcbe(k).big
         mcbe(k).flag = False
         mcbe(j).next = mcbe(k).next
         If mcbe(k).next <> 0 Then
            mcbe(mcbe(k).next).prior = j
         End If
         mcbe(k).next = 0
         mcbe(k).prior = 0
      End If
   Else
      i = mcbu(i).next
   End If
   total2 = total2 + 1
   If total2 = 23 Then
      jincou = -1
      Exit Function
   End If
Loop
End Function



Public Sub refreemm()                                 '内存回收错误后,再次回收
Dim i As Integer, j As Integer, k As Integer
For i = 1 To 11 Step 1
    If mcbe(i).flag = True Then
       k = emptyp
       Do While k <> 0
          If mcbe(k).Start = mcbe(i).Start Then       '此块已存在于链表中
             Exit Do
          Else
             k = mcbe(k).next
          End If
       Loop
       If k = 0 Then                                   '此块不在于链表中
          j = emptym
          k = j
          Do While j <> 0                                                     '找位置
             If mcbe(j).Start < mcbe(i).Start Then
                k = j
                j = mcbe(j).next
             Else
                Exit Do
             End If
          Loop
          If k = j Then                                                      '插到最前面
             If mcbe(i).Start + mcbe(i).big = mcbe(k).Start Then             '与后一项合并
                mcbe(k).big = mcbe(i).big + mcbe(k).big
                mcbe(k).Start = mcbe(i).Start
                mcbe(i).flag = False
                mcbe(i).next = 0
                mcbe(i).prior = 0
                Exit Sub
             Else                                                            '不能合并
                mcbe(i).prior = 0
                mcbe(i).next = k
                mcbe(k).prior = i
                emptym = i
                Exit Sub
             End If
          Else
             If j = 0 Then                                                     '插到最后
                If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then          '与前一项合并
                   mcbe(k).big = mcbe(k).big + mcbe(i).big
                   mcbe(i).next = 0
                   mcbe(i).prior = 0
                   mcbe(i).flag = False
                   Exit Sub
                Else                                                           '不能合并
                   mcbe(i).next = 0
                   mcbe(i).prior = k
                   mcbe(k).next = i
                   Exit Sub
                End If
             Else                                                             '插到中间
                If (mcbe(k).Start + mcbe(k).big = mcbe(i).Start) Then          '与前一项合并
                   mcbe(k).big = mcbe(k).big + mcbe(i).big
                   mcbe(i).next = 0
                   mcbe(i).prior = 0
                   mcbe(i).flag = False
                   If mcbe(k).Start + mcbe(k).big = mcbe(j).Start Then        '与后一项合并
                      mcbe(k).big = mcbe(k).big + mcbe(j).big
                      mcbe(k).next = mcbe(j).next
                      If mcbe(j).next <> 0 Then                               'j指向最后一项
                         mcbe(mcbe(j).next).prior = k
                      End If
                      mcbe(j).next = 0
                      mcbe(j).prior = 0
                      mcbe(j).flag = False
                   End If
                Else
                   If mcbe(i).Start + mcbe(i).big = mcbe(j).Start Then      '与后一项合并
                      mcbe(j).Start = mcbe(i).Start
                      mcbe(j).big = mcbe(j).big + mcbe(i).big
                      mcbe(i).next = 0
                      mcbe(i).prior = 0
                      mcbe(i).flag = False
                   Else
                      mcbu(k).next = i
                      mcbu(i).next = j
                      mcbu(i).prior = k
                      mcbu(j).prior = i
                   End If
                End If
             End If
          End If
       End If
   End If
Next i
End Sub

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -