操作系统实验之“进程调度与资源管理”

一、前言

笔者看来,这个实验主要是模拟进程的状态转换以及与资源的关系。
因此难度说不上很大,但是比较复杂,这里上传一份python版本供大家参考,疏漏之处还请不吝赐教。

二、基本流程

因为在本实验程序中先来先服务视为最高优先级的一种子情况,因此只分析最高优先级即可。
1、创建进程:按照预定的序号id、优先级pri等五项创建进程。

2、创建资源:同理,根据序号rid、状态state等三项创建资源。

3、尝试运行所有进程,最终一定是优先级最高的运行,其他进程按照优先级在ready队列中排队。

4、申请资源,若资源为空,则占用,否则加入此资源的等待队列中排队;

5、释放资源,释放后若有进程等待,则立即将资源重新分配下去。

6、删除进程,删除进程关于资源的引用以及资源队列中的进程信息。

三、源代码


class PCB(object):
    class Struct(object):
        def __init__(self,id,mem,src,state,tree,pri):
            self.id = id        #int        序号
            self.mem = mem      #list       内存
            self.src = src      #list       其他资源
            self.state = state  #(int,int)  (状态类型,列表位置)
            self.tree = tree    #(int,int)  (父节点id,子节点id)0表示没有父子节点
            self.pri = pri      #int        (优先级)

    def make_struct(self,id,mem,src,state,tree,pri):
        return self.Struct(id,mem,src,state,tree,pri)

    def delete_p(self,p):
        del p


class RCB(object):
    class Struct(object):
        def __init__(self,rid,state,queue):
            self.rid = rid      #int          资源序号,大于0表示内存资源,小于0表示其他资源
            self.state = state  #int          状态,0空闲,1占用
            self.queue=queue    #Queue        等待队列

    def make_struct(self,rid,state,queue):
        return self.Struct(rid,state,queue)

#用于优先级排序
def way(elem):
        return elem.pri
#创建线程
def create_pro(pcb,ready_queue,parameter):
    id,mem,src,state,tree,pri=parameter[0],parameter[1],parameter[2],parameter[3],parameter[4],parameter[5]
    p1=pcb.make_struct(id,mem,src,state,tree,pri)
    ready_queue.append(p1)
    #根据优先级从大到小排序
    ready_queue.sort(key=way,reverse=True)
    return p1

#运行线程
def run_pro(p,ready_queue,running_queue):
    if len(running_queue)==0:
        ready_queue.remove(p)
        running_queue.append(p)
        print(p.id,"运行成功!")
    elif len(running_queue)==1:
        #如果原进程的优先级更高
        if(running_queue[0].pri>p.pri):
            print("原进程",running_queue[0].id,"的优先级更高,",p.id,"无法抢占运行!")
        elif(running_queue[0].pri==p.pri):
            print(running_queue[0].id,"与",p.id,"优先级相同,",p.id,"无法抢占运行,需要排队!")
        else:
            print(p.id,"的优先级更高,",running_queue[0].id,"被抢占运行!")
            ready_queue.append(running_queue[0])
            running_queue.remove(running_queue[0])
            ready_queue.remove(p)
            running_queue.append(p)
            ready_queue.sort(key=way,reverse=True)
            
        

#挂起进程
def hang_up(p,ready_queue,block_queue,running_queue,hangup_queue):
    if p in ready_queue:
        ready_queue.remove(p)
        hangup_queue.append(p)
    elif p in block_queue:
        block_queue.remove(p)
        hangup_queue.append(p)
    elif p in running_queue:
        running_queue.remove(p)
        hangup_queue.append(p)
    else:
        print(p," already in hangup_queue;")

#激活进程
def act_pro(p,block_queue,hangup_queue):
    hangup_queue.remove(p)
    block_queue.append(p)

#删除线程(即将p从引用、队列中删除)
def delete_pro(p,pcb,rcb,ready_queue,block_queue,running_queue,hangup_queue):
    pcb.delete_p(p)
    for r in rcb:
        if p.id in r.queue:
            r.queue.remove(p.id)
            print("已删除",p.id,"对资源",r.rid,"的占用!")

    for mem in p.mem:
        p.mem.remove(mem)
        print(p.id,"已经释放关于",mem,"的信息")
    if p in ready_queue:
        ready_queue.remove(p)
    elif p in block_queue:
        block_queue.remove(p)
    elif p in running_queue:
        running_queue.remove(p)
    elif p in hangup_queue:
        hangup_queue.remove(p)
    else:
        print(p," don't exists;")

def show(rcb,ready_queue,block_queue,running_queue,hangup_queue):
    print("当前系统状态如下(进程id:[内存资源],[其他资源],优先级):")
    print("ready_queue:")
    for p in ready_queue:
        print(p.id,":",p.mem,",",p.src,",",p.pri,"\t")
    print("block_queue:")
    for p in block_queue:
        print(p.id,":",p.mem,",",p.src,",",p.pri,"\t")
    print("running_queue:")
    for p in running_queue:
        print(p.id,":",p.mem,",",p.src,",",p.pri,"\t")
    print("hangup_queue:")
    for p in hangup_queue:
        print(p.id,":",p.mem,",",p.src,",",p.pri,"\t")
    for r in rcb:
        print("资源",r.rid,"中的使用队列如下:[",end=" ")
        for p in r.queue:
            print(p.id,end=" ")
        print("]")
    print("*****************************************************")

#申请资源
def apply_rsc(r,p,running_queue,ready_queue,block_queue):
    if p in running_queue:
        running_queue.remove(p)
        if r.state==0:
            r.state=1
            if r.rid<0:
                p.src.append(r.rid)
            elif r.rid>0:
                p.mem.append(r.rid)
            r.queue.append(p)
            ready_queue.append(p)
            print(p.id,"申请资源",r.rid,"成功!")
            if len(running_queue)==0:
                if len(ready_queue)>=1:
                    running_queue.append(ready_queue[0])
                    ready_queue.remove(ready_queue[0])
                    print(p.id,"因申请资源被移出运行状态,申请成功而加入就绪队列!而",running_queue[0].id,"进入运行状态!")
                    ready_queue.sort(key=way,reverse=True)
                else:
                    print(p.id,"因申请资源被移出运行状态,因当前没有就绪进程而特此提示!")
            
        else:
            block_queue.append(p)
            r.queue.append(p)
            print(p.id,"申请资源",r.rid,"时失败,但已经加入队列中")
            r.queue.sort(key=way,reverse=True)
    elif p in block_queue:
        if r.state==0:
            r.state=1
            if r.rid<0:
                p.src.append(r.rid)
            elif r.rid>0:
                p.mem.append(r.rid)
            if p not in r.queue:
                r.queue.append(p)
            print(p.id,"申请资源",r.rid,"成功!")
        else:
            block_queue.append(p)
            r.queue.append(p)
            r.queue.sort(key=way,reverse=True)
            print(p.id,"申请资源",r.rid,"时失败,但已经加入队列中")
    else:
        print(p.id,"既不在运行也不在等待队列中,不能申请资源",r.rid,"!")

#释放资源
def release_rsc(r,p,running_queue,ready_queue,block_queue):
    if p in r.queue:
        if r.queue[0]==p:
            r.state=0
            r.queue.remove(p)
            if r.rid>0:
                p.mem.remove(r.rid)
            elif r.rid<0:
                p.src.remove(r.rid)
            print(p.id,"释放资源",r.rid,"成功!")
            #释放资源后,若有等待使用,则分配给等待进程
            if len(r.queue)>0:
                apply_rsc(r,r.queue[0],running_queue,ready_queue,block_queue)
            
        elif r.state==1:
            print(p.id,"无法释放资源",r.rid,",因为还没有排上!")
        else:
            print(p.id,"释放资源",r.rid,"时失败")
    else:print(p.id,"不占用资源",r.rid,",无需释放!")

if __name__=='__main__':
  #初始化创建队列以及配置资源
    pcb=PCB()
    ready_queue=[]
    block_queue=[]
    running_queue=[]
    hangup_queue=[]
    #id,mem,src,state,tree,pri
    pro1=[1,[],[],(5,3),(0,2),5]
    pro2=[2,[],[],(5,3),(1,0),4]
    pro3=[3,[],[],(5,3),(1,0),6]
    #rid,state,queue
    rcb1=[1,0,[]]
    rcb2=[2,0,[]]
    rcb3=[-1,0,[]]
    r1=RCB().make_struct(rcb1[0],rcb1[1],rcb1[2])
    r2=RCB().make_struct(rcb2[0],rcb2[1],rcb2[2])
    r3=RCB().make_struct(rcb3[0],rcb3[1],rcb3[2])
    rcb=[]
    rcb.append(r1)
    rcb.append(r2)
    rcb.append(r3)
    #开始模拟系统操作,创建进程p1,p2
    p1=create_pro(pcb,ready_queue,pro1)
    p2=create_pro(pcb,ready_queue,pro2)
    p3=create_pro(pcb,ready_queue,pro3)
    print("创建完进程后的系统状态如下:")
    show(rcb,ready_queue,block_queue,running_queue,hangup_queue)
    #尝试运行进程
    run_pro(p1,ready_queue,running_queue)
    run_pro(p2,ready_queue,running_queue)
    run_pro(p3,ready_queue,running_queue)
    print("尝试运行完进程后的系统状态如下:")
    show(rcb,ready_queue,block_queue,running_queue,hangup_queue)

    #申请资源
    apply_rsc(r1,p3,running_queue,ready_queue,block_queue)
    apply_rsc(r2,p3,running_queue,ready_queue,block_queue)
    apply_rsc(r1,p1,running_queue,ready_queue,block_queue)
    apply_rsc(r3,p1,running_queue,ready_queue,block_queue)
    apply_rsc(r2,p1,running_queue,ready_queue,block_queue)

    print("申请完资源后的系统状态如下:")
    show(rcb,ready_queue,block_queue,running_queue,hangup_queue)
    #释放资源
    release_rsc(r1,p3,running_queue,ready_queue,block_queue)
    release_rsc(r2,p1,running_queue,ready_queue,block_queue)
    release_rsc(r3,p2,running_queue,ready_queue,block_queue)
    print("释放完资源后的系统状态如下:")
    show(rcb,ready_queue,block_queue,running_queue,hangup_queue)
    ##最终删除所有进程
    delete_pro(p1,pcb,rcb,ready_queue,block_queue,running_queue,hangup_queue)
    delete_pro(p2,pcb,rcb,ready_queue,block_queue,running_queue,hangup_queue)
    delete_pro(p3,pcb,rcb,ready_queue,block_queue,running_queue,hangup_queue)
    print("删除完所有进程后,最终系统状态如下:")
    show(rcb,ready_queue,block_queue,running_queue,hangup_queue)
    input("输入回车退出")
    



四、运行截图

在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41584385/article/details/103377976