一、前言
笔者此次实验主要涉及内存分配,使用python列表来模拟内存。
分配策略可以分别采用最先适应算法、最佳适应算法和最坏适应算法等。
带有简单的交互,如有问题欢迎指出!
二、源代码
def allocation(lst,lst_admin,n,order):
ret=-1
for i in range(len(lst_admin)):
if lst_admin[i][1]==0:
if lst_admin[i][2]<n:
continue
elif lst_admin[i][2]==n:
lst_admin[i][1]=order
for j in range(n):
lst[lst_admin[i][0]+j]=order
ret=lst_admin[i][0]
return ret
elif lst_admin[i][2]>n:
#添加0的小块
lst_admin.append([lst_admin[i][0]+n,0,lst_admin[i][2]-n])
#将原来的修改为新块标志
lst_admin[i][1]=order
lst_admin[i][2]=n
for j in range(n):
lst[lst_admin[i][0]+j]=order
ret=lst_admin[i][0]
return ret
return ret
def FF(lst,lst_admin,n,order):
ret=-1
def fway(item):
return item[0]
lst_admin.sort(key=fway)
ret=allocation(lst,lst_admin,n,order)
return ret
def BF(lst,lst_admin,n,order):
def bway(item):
return item[2]
lst_admin.sort(key=bway)
ret=allocation(lst,lst_admin,n,order)
return ret
def WF(lst,lst_admin,n,order):
ret=-1
def wway(item):
return item[2]
lst_admin.sort(key=wway,reverse = True)
ret=allocation(lst,lst_admin,n,order)
return ret
def recovery(lst,lst_admin,order):
def fway(item):
return item[0]
lst_admin.sort(key=fway)
for i in range(len(lst_admin)):
if(lst_admin[i][1])==order:
lst_admin[i][1]=0
for j in range(lst_admin[i][2]):
lst[lst_admin[i][0]+j]=0
if i==0 and i+1<=len(lst_admin)-1:
if lst_admin[i+1][1]==0:
lst_admin[i][2]=lst_admin[i][2]+lst_admin[i+1][2]
lst_admin.pop(i+1)
break
elif i>0 and i+1<=len(lst_admin)-1:
if lst_admin[i-1][1]==0:
lst_admin[i-1][2]=lst_admin[i-1][2]+lst_admin[i][2]
lst_admin.pop(i)
i-=1
if lst_admin[i+1][1]==0:
lst_admin[i][2]=lst_admin[i][2]+lst_admin[i+1][2]
lst_admin.pop(i+1)
break
elif i==len(lst_admin)-1 and i-1>=0:
if lst_admin[i-1][1]==0:
lst_admin[i-1][2]=lst_admin[i-1][2]+lst_admin[i][2]
lst_admin.pop(i)
break
return 0
def show(lst,lst_admin):
def fway(item):
return item[0]
lst_admin.sort(key=fway)
print(lst_admin)
print(lst)
if __name__=="__main__":
lst=[0]*500
lst_admin=[[0,0,500]]#[开始位置,种类,长度]
while(1):
print("*********************************")
print("请按照提示操作~")
print("-1、退出")
print("0、回收空间")
print("1、调用首次适应(first fit,FF)算法")
print("2、调用最佳适应(best fit,BF)算法")
print("3、调用最坏适应(worst fit,WF)算法")
print("4、输出当前状态表和内存情况")
i=int(input("请输入选择方法,如‘1’,回车确认:"))
if i==-1:
break
elif i==0:
order=int(input("请输入需要操作的内存序号,如‘3’,回车确认:"))
recovery(lst,lst_admin,order)
continue
elif i==4:
show(lst,lst_admin)
continue
else:
order=int(input("请输入需要操作的内存序号,如‘3’,回车确认:"))
n=int(input("请输入需要占用的空间大小,如‘50’,回车确认:"))
if i==1:
ret=FF(lst,lst_admin,n,order)
elif i==2:
ret=BF(lst,lst_admin,n,order)
elif i==3:
ret=WF(lst,lst_admin,n,order)
if ret==-1:
print("分配出错,未能分配合适的空间大小")
else:
print("分配成功,分配空间首地址为:",ret)