【SCAU操作系统】实验二页面置换算法的模拟实现及命中率对比python源代码及实验报告参考

一、课程设计目的
通过请求页式管理方式中页面置换算法的模拟设计,了解虚拟存储技术的特点,掌握请
求页式存储管理中的页面置换算法。
二、课程设计内容
模拟实现 OPT (最佳置换)、 FIFO LRU 算法,并计算缺页率。
三、要求及提示
1 、首先用随机数生成函数产生一个“指令将要访问的地址序列”,然后将地址序列变换
成相应的页地址流(即页访问序列),再计算不同算法下的命中率。
2 、通过随机数产生一个地址序列,共产生 400 条。其中 50% 的地址访问是顺序执行的,
另外 50% 就是非顺序执行。且地址在前半部地址空间和后半部地址空间均匀分布。具体产
生方法如下:
1) 在前半部地址空间,即 [0 199] 中随机选一数 m ,记录到地址流数组中(这是
非顺序执行);
2) 接着“顺序执行一条指令”,即执行地址为 m+1 的指令,把 m+1 记录下来;
3) 在后半部地址空间, [200 399] 中随机选一数 m’ ,作为新指令地址;
4) 顺序执行一条指令,其地址为 m’+1
5) 重复步骤 1~4 ,直到产生 400 个指令地址。
3 、将指令地址流变换成页地址(页号)流,简化假设为:
1) 页面大小为 1K (这里 K 只是表示一个单位,不必是 1024B );
2) 用户虚存容量为 40K 7
3) 用户内存容量为 4 个页框到 40 个页框;
4) 用户虚存中,每 K 存放 10 条指令,所以那 400 条指令访问地址所对应的页地
址(页号)流为:指令访问地址为 [0 9] 的地址为第 0 页;指令访问地址为 [10
19] 的地址为第 1 页;……。按这种方式,把 400 条指令组织进“ 40 页”,并
将“要访问的页号序列”记录到页地址流数组中。
4 、循环运行,使用户内存容量从 4 页框到 40 页框。计算每个内存容量下不同页面置换
算法的命中率,命中率 =1- 缺页率。输出结果可以为:
页框数 OPT 命中率 FIFO 命中率 LRU 命中率
[4] OPT 0.5566 FIFO 0.4455 LRU 0.5500
[5] OPT 0.6644 FIFO 0.5544 LRU 0.5588
…… ……
…… ……
[39] OPT 0.9000 FIFO 0.9000 LRU 0.9000
[40] OPT 1.0000 FIFO 1.0000 LRU 1.0000
1 :在某一次实验中,可能 FIFO LRU 性能更好,但足够多次的实验表明 LRU
的平均性能比 FIFO 更好。
2 :计算缺页率时,以页框填满之前和之后的总缺页次数计算。

需求分析
(1)输入的形式和输入值的范围
         地址序列生成:
                随机数生成器用于产生地址序列,范围为 [0, 399] 的整数,共计 400 条指令地址。
                地址序列的生成应满足题目中描述的规则,即 50% 的地址是顺序执行的,另外 50% 是非顺序执行的,并在前半部地址空间 [0, 199] 和后半部地址空间 [200, 399] 中均匀分布。
        页框数量:
                用户内存容量为 4 到 40 个页框,需要循环遍历这些数量以计算不同内存大小下的命中率。
        页面大小与用户虚存容量:
                页面大小为 1K。
                用户虚存容量为 40K。

(2)    输出的形式
        输出应为表格形式,显示不同页框数下 OPT、FIFO 和 LRU 算法的命中率。
        命中率可以通过 1 - 缺页率 计算得出。
        输出:
                页框数 OPT 命中率 FIFO 命中率 LRU 命中率  
                [4]    OPT:0.xxxx FIFO:0.xxxx LRU:0.xxxx   
                [5]    OPT:0.xxxx FIFO:0.xxxx LRU:0.xxxx   
                ...  
                [40]   OPT:1.0000 FIFO:1.0000 LRU:1.0000

(3)程序所能达到的功能
         程序应能模拟请求页式管理方式中的页面置换算法,包括 OPT、FIFO和 LRU算法。
         程序应能计算并输出在不同内存大小下,各页面置换算法的命中率。
        程序应能处理生成的地址序列,将其转换为页地址流,并模拟页面置换过程。

(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果
        输入: 无(地址序列生成规则,页框数量从 4 到 40)
        输出: 如上所示的命中率表格,每个算法在不同页框数下的命中率

概要设计 
(1)    抽象数据类型定义
        指令流(instruct):
                类型:列表(List)
                元素:整数(Integer)
                描述:存储模拟产生的指令地址序列,每个地址通过除以10转换为页号。
        用户内存(user_mem):
                类型:列表(List)
                元素:整数(Integer)
                描述:模拟的物理内存中的页号,存储最近使用或选定的页面。
        访问频率计数(temp):
                类型:列表(List)
                元素:整数(Integer)
                描述:在LFU算法中,用于记录用户内存中每个页面在过去一段时间内的访问频率。
        结果矩阵(result):
                类型:NumPy数组(Array)
                元素:浮点数(Float)
                描述:存储不同页面数量(n)下,各个页面置换算法(FIFO、LRU、OPT、LFU)的命中率。

(2)    主程序流程
        调用produceAddstream()函数生成指令地址序列,并转换为页号流。
        初始化一个NumPy数组result,用于存储不同页面数量下的各种算法命中率。
        通过循环,遍历从4到40的页面数量(n)。
        对于每个n,分别调用OPT(n, ins)、FIFO(n, ins)、LRU(n, ins)和LFU(n, ins)函数计算各种算法的命中率。
        将结果存储在result数组中,并打印出来。
        使用matplotlib库绘制命中率随页面数量变化的图形,并显示图例。
        调用plt.show()显示图形。

(3)    模块间层次关系
        主程序(main()):
                调用produceAddstream()生成指令流。
                初始化结果矩阵result。
                循环遍历页面数量,调用OPT()、FIFO()、LRU()和LFU()函数计算命中率。
                打印结果。
                调用matplotlib库绘制图形并显示。
        produceAddstream():
                生成并返回指令地址序列。
        OPT(n, ins)、FIFO(n, ins)、LRU(n, ins)、LFU(n, ins):
                输入:页框数量n和指令流ins。
                根据不同的页面置换算法逻辑,遍历指令流,计算命中率。
                返回命中率。

调用关系图

用户使用说明 
        本程序用于比较和分析四种不同的页面替换算法:OPT(最佳页面替换算法)、FIFO(先进先出)、LRU(最近最少使用)和LFU(最少使用频率)。这些算法在模拟的缓存环境中运行,以评估它们在不同缓存大小(k)下的性能。
1. 安装必要的库
2. 运行程序
        本程序包含一个main函数,它负责生成指令流、执行四种页面替换算法,并打印结果。可以直接运行这个程序,无需任何命令行参数。
3. 生成结果
        程序会打印出一个表格,其中包含缓存大小(k)从4到40以及每种算法在对应缓存大小下的命中率。表格的列标题分别是“k”、“FIFO”、“LRU”、“OPT”和“LFU”。每一行表示一个特定的缓存大小,以及在该缓存大小下每种算法的命中率。
4. 修改参数
        可以修改produceAddstream函数来改变指令流的生成方式。
        在main函数中,x = np.arange(4, 41)定义了缓存大小的范围,可以根据需要修改这个范围。
        result = np.zeros([4, 37])定义了一个用于存储结果的二维数组。这个数组的大小根据想要比较的算法数量和缓存大小范围来调整。
5. 注意事项
        性能:对于较大的缓存大小和指令流长度,程序可能需要一些时间来运行。这是因为页面替换算法需要对每个页面引用进行迭代和计算。
        结果分析:可以根据打印出的表格来分析不同算法在不同缓存大小下的性能。通常,OPT算法会表现出最高的命中率,因为它总是选择未来最不可能被引用的页面进行替换。FIFO和LRU算法的性能通常较差,因为它们不考虑页面的使用频率或未来引用模式。

运行结果(局部图片):

源代码(参考):

import numpy as np
import matplotlib.pyplot as plt
def produceAddstream():
    instruct = []
    m = np.random.randint(0, 399)
    for i in range(100):
        instruct.append(m+1)
        n = np.random.randint(0, m+1)
        instruct.append(n)
        instruct.append(n+1)
        m = np.random.randint(n+2, 399)
        instruct.append(m)
    return instruct
def FIFO(n, ins):
    user_mem = []
    hit = 0
    for i in ins:
        if i // 10 in user_mem:
            hit += 1
        else:
            if len(user_mem) == n:
                user_mem.pop(0)
            user_mem.append(i // 10)
    return hit / len(ins)
def OPT(n, ins):
    hit = 0
    user_mem = []
    dic = dict.fromkeys(range(40), [])
    for (ind, i) in enumerate(ins):
        dic[i // 10] = dic[i // 10] + [ind]
    for (ind, i) in enumerate(ins):
        dic[i // 10].pop(0)
        if (i // 10) in user_mem:
            hit += 1
        else:
            if len(user_mem) == n:
                temp = [401] * n
                for (index, page) in enumerate(user_mem):
                    if len(dic[page]) > 0:
                        temp[index] = dic[page][0]
                user_mem.pop(np.argmax(temp))
            user_mem.append(i // 10)
    return hit / len(ins)
def LRU(n, ins):
    user_mem = []
    hit = 0
    for i in ins:
        if i // 10 in user_mem:
            hit += 1
            temp = user_mem.pop(user_mem.index(i//10))
            user_mem.append(temp)
        else:
            if len(user_mem) == n:
                user_mem.pop(0)
            user_mem.append(i//10)
    return hit / len(ins)
def LFU(n, ins):
    user_mem = []
    hit = 0
    for (ind, i) in enumerate(ins):
        if i // 10 in user_mem:
            hit += 1
        else:
            if len(user_mem) == n:
                temp = [0] * n
                for item in ins[max(0, ind - 20):ind]:
                    for k in range(n):
                        if user_mem[k] == item // 10:
                            temp[k] += 1
                            break
                user_mem.pop(np.argmin(temp))
            user_mem.append(i // 10)
    return hit / len(ins)
def main():
    ins = produceAddstream()
    result = np.zeros([4, 37])
    x = np.arange(4, 41)
    print('k     FIFO        LRU        OPT         LFU')
    for i in x:
        result[0, i-4] = OPT(i, ins)
        result[1, i-4] = FIFO(i, ins)
        result[2, i-4] = LRU(i, ins)
        result[3, i-4] = LFU(i, ins)
        print(i,'  ',result[0, i-4],'  ',result[1, i-4],'  ',result[2, i-4],'  ',result[3, i-4])
    plt.figure(figsize=(10, 4))
    plt.plot(x, result[0], label="OPT")
    plt.plot(x, result[1], label="FIFO")
    plt.plot(x, result[2], label="LRU")
    plt.plot(x, result[3], label="LFU")
    plt.legend()
    plt.show()
    return
main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/657291.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux快速定位日志 排查bug技巧和常用命令

1. 快速根据关键字定位错误信息 grep 在 Linux 系统中,可以使用 grep 命令来查找日志文件中包含特定关键字的行。假设你的日志文件路径为 /var/log/myapp.log,你想要查找包含关键字 "abc" 的日志内容,可以按照以下步骤操作&#…

【浅水模型MATLAB】尝试完成一个数值模拟竞赛题

【浅水模型MATLAB】尝试完成一个数值模拟竞赛题 前言题目描述问题分析理论基础控制方程数值方法边界条件 代码框架与关键代码结果展示写在最后 更新于2024年5月25日 前言 最近看到第四届水科学数值模拟创新大赛的通知,就好奇翻看了前几年的比赛试题。发现去年的一个…

信息安全法规和标准

《全国人民代表大会常务委员会关于维护互联网安全的决定》规定,威胁互联网运行安全的行为:(1)侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统,(2)故意制作、传播计算机病毒等破坏性…

[ue5]建模场景学习笔记(1)——混合材质

卷首:这部分会记录建模场景等相关学习内容,与ue引擎学习笔记不同的是,可能会略过一些基础内容,因为部分知识在blender中已经学习过了,不再继续记录。 1.需求分析: 想构建一个山地的场景,在ue5中…

在豆包这事上,字节看得很明白

大数据产业创新服务媒体 ——聚焦数据 改变商业 导语: 1.基于豆包的话炉/猫箱APP市场反响一般 2.价格战对于豆包来说是副产物 3.价格战对大模型市场是良性的 4.豆包接下来会推广至国际社会 因为宣称价格比行业便宜99.3%,豆包成功出圈了。根据火山引擎公…

通过安全的云开发环境重新发现 DevOps 的心跳

云开发平台如何“提升” DevOps 首先,我来简单介绍一下什么是云开发环境:它通常运行带有应用程序的 Linux 操作系统,提供预配置的环境,允许进行编码、编译和其他类似于本地环境的操作。从实现的角度来看,这样的环境类…

猫耳 WebSocket 跨端优化实践

前言 在现代的移动应用程序中,长连接是一种不可或缺的能力,包括但不限于推送、实时通信、信令控制等常见场景。在猫耳FM的直播业务中,我们同样使用了 WebSocket 长连接作为我们实时通信的基础。 在我们推进用户体验优化的工作中,…

如何将音频中的人声分离出来?

想要把一段视频中的人声跟背景音乐分离开来,找个好一点的音频处理软件就能把声音分离了,常见的有以下方法,一起来看看吧。 pr 打开软件,然后将电脑上的音频文件,上传到软件中,然后按住[ctrla]选择所有音频…

6-继承

6-继承 1、基本语法和方式2、继承的基本特点2.1 三种继承方式相同的基本点2.2 三种继承方式的差别2.3 公有继承的独有特点 3、子类的构造、析构3.1 子类的构造3.2 子类的析构3.3 子类的拷贝构造函数3.4 子类的拷贝赋值 4、多重继承4.1 内存布局4.2 类型转换4.3 名字冲突问题 5、…

C语言 | Leetcode C语言题解之第117题填充每个节点的下一个右侧节点指针II

题目: 题解: void handle(struct Node **last, struct Node **p, struct Node **nextStart) {if (*last) {(*last)->next *p;}if (!(*nextStart)) {*nextStart *p;}*last *p; }struct Node *connect(struct Node *root) {if (!root) {return NULL…

【小呆的力学笔记】连续介质力学的知识点回顾一:运动和变形

文章目录 1. 运动的描述2. 拉格朗日描述下的变形2.1 线元的变化2.2 体元的变化2.3 面元的变化 1. 运动的描述 在连续介质力学中,存在着两种对运动的描述,一种为拉格朗日描述,即通过描述每个物质点的运动来描述整个变形体的运动,也…

解决IDEA菜单栏找不到VCS的问题,且使用IDEA推送新项目到托管仓库

问题描述: 在idea软件中使用git推送项目,idea页面顶部菜单栏无VCS 解决方案: 一:File->Settings->Version Control-> 点击 ->选择项目->VCS:->点击ok: 二:托管平台创建一个Git仓库来保…

基于遗传优化的货柜货物摆放优化问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于遗传优化的货柜货物摆放优化问题求解matlab仿真。在一个货架上,初始状态下,随机将货物放在货柜上,优化之后,整…

openresty(Nginx) 隐藏 软包名称及版本号 升级版本

1 访问错误或者异常的URL 2 修改配置,重新编译,升级 #修改版本等 vim ./bundle/nginx-1.13.6/src/core/nginx.h #define nginx_version 1013006 #define NGINX_VERSION "1.13.6" #define NGINX_VER "openresty/&q…

玩转STM32-直接存储器DMA(详细-慢工出细活)

文章目录 一、DMA介绍1.1 DMA简介1.2 DMA结构 二、DMA相关寄存器(了解)三、DMA的工作过程(掌握)四、DMA应用实例4.1 DMA常用库函数4.2 实例程序 一、DMA介绍 1.1 DMA简介 DMA用来提供外设与外设之间、外设与存储器之间、存储器与…

中国企业出海,哪些业务需要负载均衡?

国内企业出海的进程正在加速。中国的出海企业剑指跨境电商、社交、游戏、短剧等市场,其中尤其以跨境电商的数据最为突出。据官方数据,2023年我国跨境电商进出口总额达到2.38万亿元,比2016年增长近50倍,占货物贸易总规模的5.7%。 …

【Mybatis】映射文件中获取单个参数和多个参数的写法

xml的映射文件中获取接口方法中传来的参数是直接用#{}的方式来获取的 那么接下来,我们就具体来说一下获取参数里边的各种规则和用法 1.单个参数,比如上面的getOneUser,只有一个id值作为参数 Mybatis对于只有一个参数的情况下,不…

机器学习-5-如何进行交叉验证

参考一文带您了解交叉验证(Cross-Validation):数据科学家必须掌握的7种交叉验证技术 参考如何在机器学习中使用交叉验证(实例) 1 交叉验证 1.1 交叉验证的本质 针对中小型数据集常用的一种用于观察模型稳定性的方法——交叉验证。 交叉验证是用来观察模型的稳定性的一种方…

计算机毕业设计hadoop+spark+hive物流大数据分析平台 物流预测系统 物流信息爬虫 物流大数据 机器学习 深度学习

流程: 1.Python爬虫采集物流数据等存入mysql和.csv文件; 2.使用pandasnumpy或者MapReduce对上面的数据集进行数据清洗生成最终上传到hdfs; 3.使用hive数据仓库完成建库建表导入.csv数据集; 4.使用hive之hive_sql进行离线计算&…

基于NAMUR开放式架构(NOA)的工业设备数据采集方案

一 NAMUR开放式架构 传统自动化金字塔结构的优越性在过去许多年里已被证明。然而,传统的自动化金字塔在获取和利用对物联网和工业4.0有价值的数据方面却存在一定挑战。这是因为传统系统通常是封闭的,数据访问受到限制,难以集成到新的数字化解…