页面置换算法(opt, lru, fifo, lfu) python
(1) 通过计算不同算法的命中率比较算法的优劣。同时也考虑了用户内存容量对命中率的影响。
页面失效次数为每次访问相应指令时,该指令所对应的页不在内存中的次数。
在本实验中,假定页面大小为1k,用户虚存容量为32k,用户内存容量为4页到32页。
(2) produce_addstream通过随机数产生一个指令序列,共320条指令。
A、 指令的地址按下述原则生成:
1) 50%的指令是顺序执行的
2) 25%的指令是均匀分布在前地址部分
3) 25%的指令是均匀分布在后地址部分
B、 具体的实施方法是:
1) 在[0,319]的指令地址之间随机选取一起点m;
2) 顺序执行一条指令,即执行地址为m+1的指令;
3) 在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m’;
4) 顺序执行一条指令,地址为m’+1的指令
5) 在后地址[m’+2,319]中随机选取一条指令并执行;
6) 重复上述步骤1)~5),直到执行320次指令
C、 将指令序列变换称为页地址流
在用户虚存中,按每k存放10条指令排列虚存地址,即320条指令在虚存中的存放方式为:
第0条~第9条指令为第0页(对应虚存地址为[0,9]);
第10条~第19条指令为第1页(对应虚存地址为[10,19]);
。。。。。。
第310条~第319条指令为第31页(对应虚存地址为[310,319]);
按以上方式,用户指令可组成32页。
(3) 计算并输出下述算法在不同内存容量下的命中率。
1) 最佳置换算法(OPT);
2) 先进先出算法(FIFO);
3) 最近最久未使用页面置换(LRU);
4) 最少使用页面淘汰算法(LFU)
代码如下
"""
存储管理
"""
import random
random.seed(2019)
stream = [] # 页面走向
Len = 320 #
def produce_addstream():
"""
1) 50%的指令是顺序执行的
2) 25%的指令是均匀分布在前地址部分
3) 25%的指令是均匀分布在后地址部分
:return:
"""
ret = []
count = 320
while count > 0:
count -= 4
m = random.randint(0, 319)
pre = random.randint(0, m + 1)
next = random.randint(pre + 2, 319)
ret.extend([m + 1, pre, pre + 1, next])
print(m + 1, pre, pre + 1, next)
print("地址流", ret)
return [(i - 1) // 10 for i in ret]
def fifo(seq):
ps =