请求调页存储管理方式的模拟-python实现

来源:互联网 发布:淘宝商城男装赖克 编辑:程序博客网 时间:2024/06/04 17:44


1实验目的
通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。
2实验内容
(1)假设每个页面中可存放10条指令,分配给一个作业的内存块数为4。
(2)模拟一个作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。
(3)置换算法:请分别考虑OPT、FIFO和LRU算法。
(4)作业中指令的访问次序按下述原则生成:
•50%的指令是顺序执行的。
•25%的指令是均匀分布在前地址部分。
•25%的指令时均匀分布在后地址部分。
3实验结果(给出编写的程序源代码和运行结果的截图)


import random#共有4个内存块,一个内存块存放一个页面,一个页面存放10条指令,共32个页面,指令在页面中顺序存放class Block(object):    def __init__(self,numpage=-1,accessed=0):        self.numpage=numpage        #页号        self.accessed=accessed      #访问情况,数值表示多久未被访问size=4      #内存块数目count=0     #记录指令的序号n=0         #缺页数目block=[]  #内存块zhilin=[]def initdata(block):    for i in range(size):        a=Block(numpage=-1,accessed=0)        block.append(a)def findpage(block,curpage):         #查找物理块中是否有该页面    for i in range(size):        if block[i].numpage==curpage:            return i    return -1def findExchange(block):            #查找置换的页号    pos=0    for i in range(size):        if block[i].accessed>block[pos].accessed:            pos=i    return posdef display(block):    for i in range(size):        if block[i].numpage!=-1:            print block[i].numpage,    printdef randomcin(zhilin):          #生成随机指令序列    flag=0    count=raw_input()    count=int(count)    print ("生成随机指令序列:")    for i in range(320):        zhilin.append(count)        if flag%2==0:            count=count+1            count=count%320        if flag==1:            count=random.randint(0,count-2)        if flag==3:            count=random.randint(count+1,319)            #count=count+1+random.randint(0,320-count-1)        flag=flag+1        flag=flag%4        print zhilin[i],        if (i+1)%10==0:            printdef findspace(block):    for i in range(size):        if block[i].numpage==-1:            return i    return -1def pringpage(zhilin):    for i in range(320):        print zhilin[i]%10,        if i%10==0:            printdef FIFO(block,n):    curpage=-1    exchange=-1    for i in range(320):        count=zhilin[i]        curpage=count/10        exsist=findpage(block,curpage)        if exsist==-1:            space=findspace(block)            if space==-1:                exchange=findExchange(block)                block[exchange].numpage=curpage                display(block)                n=n+1                block[exchange].accessed=-1            else:                block[space].numpage=curpage                display(block)                n=n+1        else:            for i in range(size):                if block[i].numpage != -1:                    print block[i].numpage,            print "指令已在内存,页号为",exsist        for j in range(size):            block[j].accessed+=1    print "缺页次数为:",n    v=n/320.0*100    print "缺页率为:",v,"%"def LRU(blcok,n):    curpage=-1    exchange=-1    for i in range(320):        count=zhilin[i]        curpage=count/10        exsist=findpage(block,curpage)        if exsist==-1:            space=findspace(block)            if space==-1:                exchange=findExchange(block)                block[exchange].numpage=curpage                display(block)                n=n+1                block[exchange].accessed=-1            else:                block[space].numpage=curpage                display(block)                n=n+1        else:            block[exsist].accessed=-1            for i in range(size):                if block[i].numpage != -1:                    print block[i].numpage,            print "指令已在内存,页号为", exsist        for j in range(size):            block[j].accessed += 1    print "缺页次数为:", n    v = n / 320.0 * 100    print "缺页率为:", v, "%"def OPT(block,n):    curpage=-1    exchange=-1    for i in range(320):        count=zhilin[i]        curpage=count/10        exsist=findpage(block,curpage)        if exsist==-1:            space=findspace(block)            if space==-1:                for h in range(size):                    for k in range(i,320):                        if block[h].numpage!=zhilin[k]/10:                            block[h].accessed=1000                        else:                            block[h].accessed=k                            break                exchange=findExchange(block)                block[exchange].numpage=curpage                display(block)                n=n+1            else:                block[space].numpage=curpage                display(block)                n=n+1        else:            for i in range(size):                if block[i].numpage != -1:                    print block[i].numpage,            print "指令已在内存,页号为", exsist    print "缺页次数为:", n    v = n / 320.0 * 100    print "缺页率为:", v, "%"print "输入第一条指令号:"randomcin(zhilin)initdata(block)while 1:    print "输入1运行FIFO,输入2运行LRU,输入3运行OPT:"    a=raw_input()    a=int(a)    if a==1:        FIFO(block, n)    elif a==2:        LRU(block, n)    elif a==3:        OPT(block,n)


阅读全文
0 0
原创粉丝点击