'''
目的:
熟悉页面置换算法及其实现,引入计算机系统性能评价方法的概念。
内容:
编制页面置换算法的模拟程序。
要求:
(1) 用随机数方法产生页面走向,页面走向长度为L。
(2) 根据页面走向,分别采用FIFO和LRU算法进行页面置换,统计缺页率。
(3) 假定可用内存块和页表长度 (作业的页面数)分别为m和k,初始时,作业页面都不在内存。
'''
# write on 2019/5/6 12:49
from numpy import *
import random
class pageReplacement:
page_length = 0 #页面长度
available_memory_block = 0 #可用内存块
n = 0 #用来产生随机数的种子
page = [] #访问的...
memory = [] #内存
k = 0 #缺页中断的次数
page_fault_rate = 0.0 #缺页率 = k/page_length
def __init__(self, page_length = 0 ,available_memory_block = 0 ,n = 0):
self.available_memory_block = available_memory_block
self.n = n
self.page_length = page_length
for i in range(available_memory_block):
self.memory.append(None)
for i in range(page_length):
self.page.append(random.randint(0,n-1))
def __FIFO__(self):
index = 0
for i in range(self.page_length):
index = index % self.available_memory_block
if self.page[i] not in self.memory : #如果在内存中没有,则从外存中搬到内存,且发生了缺页中断
self.memory[index] = self.page[i]
self.k += 1
index += 1
self.page_fault_rate = self.k/self.page_length
def __LRU__(self):
for i in range(self.page_length):
if (self.page[i] not in self.memory) : #如果在内存中没有,则从外存中搬到内存,且发生了缺页中断
if None in self.memory:
for j in range(self.available_memory_block):
if self.memory[j] == None:
self.memory[j] = self.page[i]
self.k += 1
break
else:
for j in range(self.available_memory_block-1):
self.memory[j] = self.memory[j+1]
self.memory[-1] = self.page[i]
self.k += 1
else:
if None in self.memory:
for j in range(self.available_memory_block):
#if j == self.available_memory_block -1:
#break
if self.memory[j] == self.page[i]:
for k in range(j,self.available_memory_block-1):
if self.memory[k+1] == None:
self.memory[k] = self.page[i]
break
else:
self.memory[k] = self.memory[k+1]
break
else:
for j in range(self.available_memory_block):
if j == self.available_memory_block - 1:
break
if self.memory[j] == self.page[i]:
for k in range(j,self.available_memory_block-1):
self.memory[k] = self.memory[k+1]
self.memory[-1] = self.page[i]
break
self.page_fault_rate = self.k/self.page_length
if __name__ == '__main__':
al = pageReplacement(40,3,7)
'''
al.__FIFO__()
print(al.page)
print(al.k,al.page_length)
print(al.page_fault_rate)
'''
al.__LRU__()
print(al.page)
print(al.k, al.page_length)
print(al.page_fault_rate)