【操作系统实验】模拟分页式存储管理中硬件的地址转换和产生缺页中断(python)

本文通过模拟分页式存储管理中的地址转换及缺页中断,使用FIFO、LRU及改进型CLOCK算法处理页面置换过程。展示了不同算法下页面在内存中的绝对地址、页表信息及缺页情况。
部署运行你感兴趣的模型镜像

实验五:模拟分页式存储管理中硬件的地址转换和产生缺页中断,然后分别用LRU、FIFO、改进型的CLOCK算法实现分页管理的缺页中断。

要求:显示每个页面在内存中的绝对地址,页表信息、列出缺页情况等。

# 实验五:模拟分页式存储管理中硬件的地址转换和产生缺页中断,然后分别用
# LRU、FIFO、改进型的CLOCK算法实现分页管理的缺页中断。
# 要求:显示每个页面在内存中的绝对地址,页表信息、列出缺页情况等。
import random
import copy
PAGE_MEMORY = 4
INTERVAL = 1

def time_up(page_list):
    for p in page_list:
        p['time'] += INTERVAL

def print_list(page_list):
    page_num = []
    for p in page_list:
        page_num.append(int(p['No']))
    print('序列为:',end = '')
    print(page_num)

#################### FIFO置换算法 #############################

def FIFO(pages_):
    pages = copy.deepcopy(pages_)
    print('')
    print('页面请求序列为 8 9 10 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1')
    print('############ FIFO ################')
    page_list = []
    for p in pages:
        page_list_data = []
        if len(page_list) < PAGE_MEMORY:
            page_list.append(p)
        else:
            #s = [page_['No'] for page_ in page_list]
            for page_ in page_list:
                page_list_data.append(page_['No'])

            if p['No'] in page_list_data:
                print('----Remind-----: 新页表%d已经在队列中,绝对地址为%d'%(p['No'],1024 * page_list_data.index(p['No'])))
            else:
                print('----Remind-----: 新页面%d将替换旧页面%d'%(p['No'],page_list[0]['No']))
                page_list.remove(page_list[0])
                page_list.append(p)
    #print("目前的队列为[{0[0]},{0[1]},{0[2]}]".format(page_list))
        print_list( page_list)

#################### LRU置换算法 #############################

def LRU(page_):
    print('')
    print('页面请求序列为 8 9 10 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1')
    print('############ LRU ################')
    pages = copy.deepcopy(page_)
    page_list = []
    for p in pages:
        page_list_data = []
        if len(page_list) < PAGE_MEMORY:
            page_list.append(p)
        else:
            for page_ in page_list:
                page_list_data.append(page_['No'])
            time_up(page_list)
            if p['No'] in page_list_data:
                page_list[page_list_data.index(p['No'])]['time'] = 0
                print('----Remind-----: 页表%d已经在队列中,绝对地址为%d' % (p['No'],1024 * page_list_data.index(p['No'])))
            else:
                tran = max(page_list, key=lambda t: t['time'])            #原本是应该位置上的元素替换,但是需要占位,于是直接采取了append的方法
                page_list.remove(tran)
                page_list.append(p)
                print('----Remind-----: 新页表%d将替换%d' % (p['No'], tran['No']))
        print_list(page_list)

####################改进型Clock置换算法#############################

def obsolete_page(page_list):
    while True:
        for page in page_list:
            if page['visited'] == False and page['modified'] == False:
                return page
        for page_ in page_list:
            if page_['visited'] == False and page_['modified'] == True:
                return page_
        for _page in page_list:
            _page['visited'] = False

def getIndex(p, page_list):
    i = 0
    for pages_ in page_list:
        if p['No'] == pages_['No']:
            return i
        i += 1
    return 0

def Improved_Clock(pages_):
    pages = copy.deepcopy(pages_)
    print('')
    print('页面请求序列为 8 9 10 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1')
    print('############ Improved_Clock ################')
    page_list = []
    for p in pages:
        page_list_data = []
        if len(page_list) < PAGE_MEMORY:
            page_list.append(p)
        else:
            for page_ in page_list:
                page_list_data.append(page_['No'])
            if p['No'] not in page_list_data:
                _page = obsolete_page(page_list)
                print('----Remind-----: 新页表%d将会替换页表%d' %(_page['No'], p['No']))
                page_list.remove(_page)
                page_list.append(p)
            else:
                print('----Remind-----: 页表%d已存在,绝对地址为%d'%(page_list[getIndex(p,page_list)]['No'],1024*getIndex(p, page_list)))
                page_list[getIndex(p,page_list)]['visited'] = True
        print_list(page_list)

def init(pages):
    for p in pages:
        p['time'] = 0
        p['visited'] = False
        a = random.random()
        if a<0.5:
            p['modified'] = False
        else:
            p['modified'] = True            #被访问过

if __name__ == '__main__':
    pages = [
        {'No': 8},{'No': 9},{'No': 10},{'No': 7},{'No': 0},{'No': 1},{'No': 2},
        {'No': 0},{'No': 3},{'No': 0},{'No': 4},{'No': 2},{'No': 3},{'No': 0},
        {'No': 3},{'No': 2},{'No': 1},{'No': 2},{'No': 0},{'No': 1},{'No': 7},
        {'No': 0},{'No': 1}
    ]

    init(pages)

    FIFO(pages)

    LRU(pages)

    Improved_Clock(pages)


您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值