其实就是页面置换算法的简单实现。
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 !'