操作系统实验之“存储器管理”

一、前言

笔者此次实验主要涉及内存分配,使用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)
        
    

猜你喜欢

转载自blog.csdn.net/qq_41584385/article/details/103425391
今日推荐