os4 存储管理

其实就是页面置换算法的简单实现。
FIFO和LRU 思想比较简单。。
直接贴代码了。

#coding=utf8
"""
页面大小为1k
用户虚拟内存容量为32k
用户内存容量为4页到32页。

一共320条指令 [0~319]
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
。。。
10条指令占用1k
用户指令可以组成32页


"""
import random


"""计算并输出下属算法在不同内存容量下的命中率。
1)先进先出的算法(FIFO);总是淘汰最先进入内存的页面
2)最近最少使用算法(LRU);最近最久未使用
"""
def produceSeq(length):
    print '[+]producing a instruction run Seq'
    p=[]
    #length=320
    #每次产生3条指令
    for i in range(length/3+1):
        m=random.randint(0+1,length-1-2)#为了保证不会取到边界 我这里还是留一个空间吧
        p.append(m+1)  #执行 第 m+1 条指令
        n=random.randint(0,m+1)
        p.append(n+1)
        q=random.randint(m+2,length-1)
        p.append(q)
    print '[+]producted !'
    return p
##################################################################
class FIFOAlgorithm:
    def __init__(self,length):
        self.size=length
        self.q=[]

        self.sum=0  #执行指令的总数
        self.ins=0  #命中的次数
    def run(self,target):
        self.sum+=1
        page=target/10
        if len(self.q)==0:
            self.q.append(page)
            self.alert()
        else:
            if page in self.q:
                pass
            else:
                if len(self.q)<self.size:
                    self.q.append(page)
                else:
                    del self.q[0]
                    self.q.append(page)
                self.alert()
    def alert(self):
        self.ins+=1

    def output(self):
        q=1.0*self.ins/self.sum

        print u'[+]FIFO:用户内存:%2d,命中率 %.2f%%'%(self.size,100.0*(1-q))

##################################################################
class LRUAlgorithm:
    def __init__(self,length):
        self.size=length
        self.q=[]

        self.sum=0  #执行指令的总数
        self.ins=0  #命中的次数

    def run(self,target):
        self.sum+=1
        page=target/10
        if (not len(self.q)==0) and (page in self.q):
            del self.q[self.q.index(page)]
            self.q.append(page)

        else:
            self.alert()    #产生置换       
            if len(self.q)==0:
                self.q.append(page)

            else:
                if len(self.q)<self.size:
                    self.q.append(page)
                else:
                    del self.q[0]
                    self.q.append(page)


    def alert(self):
        self.ins+=1

    def output(self):
        q=1.0*self.ins/self.sum

        print u'[+]LRU:用户内存:%2d,命中率 %.2f%%'%(self.size,100.0*(1-q))

##################################################################
class MemoryManage:
    def __init__(self):
        self.userSpace=-1 #实际的用户空间
        self.virtualSpace=32 #虚拟内存32k
        self.tool=None

    def  setCondition(self,us=4,vs=32):
        self.userSpace=us
        self.virtualSpace=vs

    def setTool(self,tool):
        name=str(tool+'Algorithm')
        self.tool=eval(name)(self.userSpace)

    def start(self,seq):
        for i in range(320):
            self.tool.run(seq[i])
        self.tool.output()



if __name__=="__main__":
    print 'Start memory management.'
    print 'Producing address flow, wait for while, please.'

    seq=produceSeq(320)
    mm=MemoryManage()

    print u"""
There are algorithms in the program

1、Least recently used algorithm(LRU)
2、First in first out algorithm(FIFO)

Select an algorithm number, please.
"""
    dict={}
    dict[2]='FIFO'
    dict[1]='LRU'

    while True:
        n=raw_input('which one?(1/2/q):')
        if (n=='q'):break
        if not n.isdigit():
            print '[-]Error Input!'
            continue
        n=int(n,10)
        if n not in dict.keys():
            print '[-]Error Number'
            continue
        print '------------------------------------'
        for i in range(4,32+1):
            mm.setCondition(us=i)
            mm.setTool(dict[n])
            mm.start(seq)
        print '------------------------------------'
    print 'All Done !'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值