模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断

模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断

(下面代码有问题,并不是内存自己要满才启动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)
  • 1
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值