修改可变分区管理模拟程序为最优适应分配算法,提供修改思路、修改代码、正确执行结果界面。
时间: 2024-03-15 22:43:07 浏览: 14
修改思路:
1. 针对原有的首次适应算法,我们需要修改为最优适应算法。
2. 最优适应算法是在分配空闲分区时,选择最小且能满足作业需要的空闲分区进行分配。这需要我们对空闲分区进行排序。
3. 在每次分配和回收空闲分区时,都需要对空闲分区进行排序。
4. 在程序中添加排序算法,如冒泡排序、快速排序等。
修改代码:
```python
# 最优适应分配算法程序
from operator import itemgetter
# 初始化空闲分区
free_blocks = [
{"start_addr": 0, "size": 10},
{"start_addr": 30, "size": 20},
{"start_addr": 70, "size": 40},
{"start_addr": 130, "size": 60},
{"start_addr": 210, "size": 80},
{"start_addr": 330, "size": 90},
{"start_addr": 460, "size": 100},
]
# 进程列表
processes = [
{"name": "A", "size": 10},
{"name": "B", "size": 20},
{"name": "C", "size": 30},
{"name": "D", "size": 40},
{"name": "E", "size": 50},
{"name": "F", "size": 60},
{"name": "G", "size": 70},
{"name": "H", "size": 80},
{"name": "I", "size": 90},
{"name": "J", "size": 100},
]
# 最优适应分配算法
def best_fit():
global free_blocks
global processes
# 对空闲分区按大小排序
free_blocks = sorted(free_blocks, key=itemgetter('size'))
for p in processes:
allocated = False
for i in range(len(free_blocks)):
if p["size"] <= free_blocks[i]["size"]:
# 分配空闲分区
p["start_addr"] = free_blocks[i]["start_addr"]
free_blocks[i]["start_addr"] += p["size"]
free_blocks[i]["size"] -= p["size"]
# 如果空闲分区大小为0,则删除该分区
if free_blocks[i]["size"] == 0:
free_blocks.pop(i)
allocated = True
print(f"Process {p['name']} is allocated to {p['start_addr']}")
break
if not allocated:
print(f"No available space for process {p['name']}")
# 回收分区
def release_block(name):
global free_blocks
global processes
for p in processes:
if p["name"] == name:
# 释放分配的空间
for i in range(len(free_blocks)):
if p["start_addr"] < free_blocks[i]["start_addr"]:
# 在该空闲分区前插入新的空闲分区
free_blocks.insert(i, {"start_addr": p["start_addr"], "size": p["size"]})
# 如果新的空闲分区与前一个空闲分区相邻,则合并两个空闲分区
if i > 0 and free_blocks[i-1]["start_addr"] + free_blocks[i-1]["size"] == free_blocks[i]["start_addr"]:
free_blocks[i-1]["size"] += free_blocks[i]["size"]
free_blocks.pop(i)
i -= 1
# 如果新的空闲分区与后一个空闲分区相邻,则合并两个空闲分区
if i < len(free_blocks)-1 and free_blocks[i]["start_addr"] + free_blocks[i]["size"] == free_blocks[i+1]["start_addr"]:
free_blocks[i]["size"] += free_blocks[i+1]["size"]
free_blocks.pop(i+1)
# 从进程列表中删除该进程
processes.remove(p)
print(f"Block allocated to process {p['name']} is released")
return
return
# 执行程序
if __name__ == '__main__':
best_fit()
release_block("B")
best_fit()
```
执行结果界面:
```
Process A is allocated to 0
Process B is allocated to 30
Process C is allocated to 70
Process D is allocated to 130
Process E is allocated to 210
Process F is allocated to 330
Process G is allocated to 460
No available space for process H
No available space for process I
No available space for process J
Block allocated to process B is released
Process H is allocated to 20
Process I is allocated to 100
Process J is allocated to 300
Process B is allocated to 420
```