# 2013秋リストによるメモリ管理 class MemoryBlock: def __init__(self, addr, size, status, name=""): self.addr = addr # 先頭アドレス(シミュレーション用) self.size = size # データ部分のサイズ self.status = status # 'A' or 'F' self.name = name # デバッグ用ラベル self.prev = None self.next = None # 1. 初期設定 (図6の数値を反映) HSIZE = 24 heap_start = 1000 # ブロックの生成 (図6の左から順に) b1 = MemoryBlock(1000, 200, 'F', "Block1") b2 = MemoryBlock(1224, 400, 'A', "Block2") # addr = 1000 + 200 + 24 b3 = MemoryBlock(1648, 300, 'F', "Block3") # ...以下省略 (EDGEとの循環リスト構造) # --- 図4の「ケ」のケースを再現 --- # Block2(A) を解放し、直後の Block3(F) と結合する場合 def simulate_free_case_ke(q): print(f"【解放前】{q.name}: size={q.size}, status={q.status}") r = q.next # Block3 (status='F') if r.status == 'F': # 結合処理 (空欄「ケ」のロジック) # もとのサイズ(400) + 次のサイズ(300) + 消えるヘッダ(24) new_size = q.size + r.size + HSIZE q.size = new_size q.next = r.next q.next.prev = q q.status = 'F' print(f"【解放後】{q.name}: size={q.size} (400+300+{HSIZE}), status={q.status}") # 実行例 b2.next = b3 b3.prev = b2 b3.next = MemoryBlock(0,0,'A') # 仮の終端 simulate_free_case_ke(b2)