模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断
(下面代码有问题,并不是内存自己要满才启动FIFO算法的,而是内存只分配给进程7个页框,页框满了就是所谓的内存紧张,可能,有空再改改 )
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 10 19:03:55 2019
@author: MyPC
"""
# 实验三:模拟分页式存储管理中硬件的地址转换和产生缺页中断,然后分别用
# FIFO算法实现分页管理的缺页中断。
# 要求:显示每个页面在内存中的绝对地址,页表信息、列出缺页情况等。
import copy
PAGE_MEMORY = 7 #此参数无用,只是表示页表长度为7
#Memory_occpuied=[1,5,8,9] # 内存设为0-9,初始化1,5,8,9已被占用
Memory_occpuied=[0,1,2,3,4,6,5,8,9] # 让内存空间紧张,从而启用FIFO置换算法
Memory_FREE=[]
#################### FIFO置换算法 #############################
def FIFO(pages_,table_pages_):
pages=copy.deepcopy(pages_)
table_pages=copy.deepcopy(table_pages_)
#初始化当前存在内存中的页
table_list=[table_pages[0]['memoryPageNum'],
table_pages[1]['memoryPageNum'],
table_pages[2]['memoryPageNum'],
table_pages[3]['memoryPageNum']
]
print('')
print('页面请求序列为 0 1 2 3 0 6 4 5 1 2 4 6')
print('############ FIFO ################')
for p in pages:
if p['PageNum']>=7: # 其实没必要,输入数据没有越界存在
print("越界错误");break;
i=p['PageNum']
if table_pages[i]['label']==1: # 判断页号是否在内存中
print('命中,形成绝对地址:%d'%(128 * table_pages[i]['memoryPageNum']+p['offset']))
print("页表状况:",table_pages)
else:
print("*%d发生缺页中断"%(p['PageNum']))
print("修改%d页标志位为1"%(p['PageNum']))
table_pages[i]['label']=1 # 标志位为1,放入内存
# 检测是否有空闲块
if len(Memory_occpuied)==10: #当内存满时,启用FIFO算法
# 内存中淘汰页表中存在内存中的第一个
Memory_occpuied.remove(table_list[0])
# 页表中增加新的内存地址,在这之前找出了空闲块地址
Memory=[0,1,2,3,4,5,6,7,8,9] # 内存块地址容量
for x in Memory_occpuied: # 找空闲块
Memory.remove(x)
Memory_FREE=Memory # 得到空闲块
free_block=Memory_FREE[0] # 取所有空闲块的第一块
table_list.remove(table_list[0]) # 去除(换出)页表中最先存在内存中的页
table_list.append(free_block) # 加入,中断页(p['PageNum'])新的空闲块地址
#修改一下页表中的内存块地址
table_pages[p['PageNum']]['memoryPageNum']=free_block
Memory_occpuied.append(free_block) # 加入已占据的内存
#table_pages[i]['memoryPageNum']=free_block # 内存空闲块号放入页表中
print("页表状况:",table_pages)
print("页表中在内存中的页的内存地",table_list)
print("内存状况:",Memory_occpuied)
else:
# 将空闲内存块地址放入页表
Memory=[0,1,2,3,4,5,6,7,8,9] # 内存块地址容量
for x in Memory_occpuied: # 找空闲块
Memory.remove(x)
Memory_FREE=Memory # 得到空闲块
free_block=Memory_FREE[0] # 取所有空闲块的第一块 ..
table_list.append(free_block)
#修改一下页表中的内存块地址
table_pages[p['PageNum']]['memoryPageNum']=free_block
# 加入已占据的内存
Memory_occpuied.append(free_block)
print("页表中在内存中的页的内存地址:",table_list)
print("内存状况:",Memory_occpuied)
# Memory_occpuied.append(p['memoryPageNum'])
# print("调入主存的页:",Memory)
#占据内存哪一个空闲块
# Memory=[0,1,2,3,4,5,6,7,8,9] # 内存块地址容量
# for x in Memory_occpuied: # 找空闲块
# Memory.remove(x)
# Memory_FREE=Memory # 得到空闲块
# Memory_occpuied.append(Memory_FREE[0]) # 取所有空闲块的第一块
# table_pages[i]['memoryPageNum']=Memory_FREE[0]
#
# print('绝对地址:')
# print('调入主存的页',)
def normal(pages_,table_pages_):
pages=copy.deepcopy(pages_)
table_pages=copy.deepcopy(table_pages_)
# table_list=[table_pages[0],table_pages[1],table_pages[2],table_pages[3]]
# 用于只输出一个中断
print('')
print('页面请求序列为 0 1 2 3 0 6 4 5 1 2 4 6')
print('############ NORMAL ################')
for p in pages:
for t_p in table_pages:
if p['PageNum']==t_p['PageNum']:
if t_p['label']==1: # label为1,表示在内存中
print('命中,形成绝对地址:%d'%(128 * t_p['memoryPageNum']+p['offset']))
else:
print("*%d发生缺页中断"%(p['PageNum']))
# elif t_p['memoryPageNum']<0:
# print("*%d发生缺页中断"%(p['PageNum']))
#
def normal_1(pages_,table_pages_):
pages=copy.deepcopy(pages_)
table_pages=copy.deepcopy(table_pages_)
# 用于只输出一个中断
print('')
print('页面请求序列为 0 1 2 3 0 6 4 5 1 2 4 6')
print('############ NORMAL ################')
for p in pages:
if p['PageNum']>=7: # 其实没必要,输入数据没有越界存在
print("越界错误");break;
i=p['PageNum']
table_pages[i]
if table_pages[i]['label']==1: # 判断页号是否在内存中
print('命中,形成绝对地址:%d'%(128 * table_pages[i]['memoryPageNum']+p['offset']))
else:
print("*%d发生缺页中断"%(p['PageNum']))
#
# for t_p in table_pages:
# if p['PageNum']==t_p['PageNum']:
# if t_p['label']==1: # label为1,表示在内存中
# print('命中,形成绝对地址:%d'%(128 * t_p['memoryPageNum']+p['offset']))
# else:
# print("*%d发生缺页中断"%(p['PageNum']))
# elif t_p['memoryPageNum']<0:
# print("*%d发生缺页中断"%(p['PageNum']))
#
def init(pages):
for p in pages:
p['operator']="op" # 初始化操作
if __name__ == '__main__':
PAGE_TABLE=[
{'PageNum': 0,'label':1,'memoryPageNum':5,'diskLocation':11},{'PageNum': 1,'label':1,'memoryPageNum':8,'diskLocation':12},
{'PageNum': 2,'label':1,'memoryPageNum':9,'diskLocation':13},{'PageNum': 3,'label':1,'memoryPageNum':1,'diskLocation':21},
{'PageNum': 4,'label':0,'memoryPageNum':-1,'diskLocation':22},{'PageNum': 5,'label':0,'memoryPageNum':-1,'diskLocation':23},
{'PageNum': 6,'label':0,'memoryPageNum':-1,'diskLocation':121}
]
pages = [
{'PageNum': 0,'offset':70},{'PageNum': 1,'offset':50},
{'PageNum': 2,'offset':15},{'PageNum': 3,'offset':21},
{'PageNum': 0,'offset':56},{'PageNum': 6,'offset':40},
{'PageNum': 4,'offset':53},{'PageNum': 5,'offset':23},
{'PageNum': 1,'offset':37},{'PageNum': 2,'offset':78},
{'PageNum': 4,'offset':1},{'PageNum': 6,'offset':84},
]
init(pages) # 基本没意义,初始化操作,可在控制台输入 pages进行查看
# normal_1(pages,PAGE_TABLE)
FIFO(pages,PAGE_TABLE)
normal_1(pages,PAGE_TABLE)