【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 = 0for i in ins:if i // 10 in user_mem:hit += 1else:if len(user_mem) == n:user_mem.pop(0)user_mem.append(i // 10)return hit / len(ins)
def OPT(n, ins):hit = 0user_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 += 1else:if len(user_mem) == n:temp = [401] * nfor (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 = 0for i in ins:if i // 10 in user_mem:hit += 1temp = 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 = 0for (ind, i) in enumerate(ins):if i // 10 in user_mem:hit += 1else:if len(user_mem) == n:temp = [0] * nfor item in ins[max(0, ind - 20):ind]:for k in range(n):if user_mem[k] == item // 10:temp[k] += 1breakuser_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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JUC从实战到源码:CompletableFuture详细学习

【JUC】- CompletableFuture详细学习 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得&#xf…

阅读c++ primer plus指针部分内容

最近一直在阅读c primer plus中文第六版,不愧是c经典教程,让我这个小白从几乎0基础入手c。翻译的可以,当然原版作者更是大神。 指针部分,介绍指针的略过。主要纪录细节问题 1.指针与数字 不能简单地将整数赋值给指针。因为指针和…

读人工智能时代与人类未来笔记17_人类未来

1. 人类未来 1.1. 在印刷读物出现之前,中世纪的欧洲人主要通过社区传统获取知识 1.1.1. 通过参与收割和季节轮作积累民间智慧 1.1.2. 在礼拜场所践行信仰并遵守圣礼 1.1.3. 加入行业公会,学习技术&…

fix leakage脚本

芯片的PPA追求是无止境的,因而在修时序的过程中我们需要对设计修复leakage,降低芯片的静态功耗。 以下分享一个典型的leakage脚本 set design 1 set version "V1" set date [exec date %m%d%H%M] set working_directory ${design}_${version}…

补环境——A股市场

补环境 吐环境 1.Proxy对象 Proxy对象由两个部分组成:target、handler target:目标对象 handler:是一个对象,声明了代理target的指定行为,支持的拦截操作,一共13种: get(target,propKey,receiver)&…

Leetcode:找出峰值

普通版本 题目链接&#xff1a;2951. 找出峰值 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<int> findPeaks(vector<int>& mountain) {int sz mountain.size();vector<int> newMountain;for(int i 1;i < sz-1;i){…

return _VF.meshgrid(tensors, **kwargs) 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法三、调用示例参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04, anaconda 一、问题描述 /home/wong/ProgramFiles/anaconda3/envs/pytorch_env/lib/python3.8/site-packages/torch/functional.py:504: UserWarning: tor…

Java特性之设计模式【备忘录模式】

一、备忘录模式 概述 备忘录模式&#xff08;Memento Pattern&#xff09;保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象&#xff0c;备忘录模式属于行为型模式 备忘录模式允许在不破坏封装性的前提下&#xff0c;捕获和恢复对象的内部状态 主要解决&#xff…

【硬核测评】猫咪主食冻干测评揭秘SC、希喂、爱立方真实对比测评

主食冻干喂养是否必要&#xff1f; 来自七年经验的铲屎官明确告诉你&#xff0c;这是非常必要的喂养方式&#xff01; 随着宠物经济的蓬勃发展和科学养宠知识的普及&#xff0c;如今养猫已不仅仅是让猫咪吃饱那么简单。越来越多的养猫人开始重视猫咪的饮食健康。大量实际喂养案…

电脑如何远程访问?

【天联】的使用场景 电脑远程访问在现代科技的发展中扮演了重要的角色。对于企业和个人用户来说&#xff0c;远程访问的便利性提供了许多机会和可能性。作为一种高效的工具&#xff0c;【天联】具有广泛的应用场景&#xff0c;可以实现异地统一管理、协同办公以及远程数据采集…

C++单元测试覆盖率统计工具:GCOV+LCOV

1. gcov基础 1.1 gcov概述 gcov是GNU编译器集合&#xff08;GCC&#xff09;的一个测试覆盖分析工具&#xff0c;它能够测量程序的执行覆盖率。gcov可以分析源代码中哪些行被执行过&#xff0c;哪些分支被采取过&#xff0c;以及哪些函数被调用过。这对于软件开发者来说是一个…

Spring AOP原理详解:动态代理与实际应用

1. Spring AOP概述 1.1 什么是AOP AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;旨在将横切关注点&#xff08;Cross-Cutting Concerns&#xff09;从业务逻辑中分离出来。横切关注点是指那些分散在应用程序多…

Android基础-Service的介绍

在Android系统中&#xff0c;Service是一个重要的后台组件&#xff0c;用于执行长时间运行的操作&#xff0c;而不需要提供用户界面。以下是对Service的功能、作用以及生命周期的详细介绍。 Service的功能和作用 后台执行&#xff1a; Service允许应用程序在后台执行操作&…

【数据结构】AVL树——平衡二叉搜索树

个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 祝福语&#xff1a;愿你拥抱自由的风 目录 二叉搜索树 AVL树概述 平衡因子 旋转情况分类 左单旋 右单旋 左右双旋 右左双旋 AVL树节点设计 AVL树设计 详解单旋 左单旋 右单旋 详解双旋 左右双旋 平衡因子情况如…

阿里开源React应用动效解决方案:ant-motion

ant-motion&#xff1a;简化动效开发&#xff0c;提升用户体验 - 精选真开源&#xff0c;释放新价值。 概览 Ant Motion是由Ant Design团队精心打造&#xff0c;专为React应用设计的动画规范和组件库。它不仅仅是一套动画规范&#xff0c;更是一个完整的解决方案&#xff0c;旨…

C# yolov8 TensorRT Demo

C# yolov8 TensorRT Demo 目录 效果 说明 项目 代码 下载 效果 说明 环境 NVIDIA GeForce RTX 4060 Laptop GPU cuda12.1cudnn 8.8.1TensorRT-8.6.1.6 版本和我不一致的需要重新编译TensorRtExtern.dll&#xff0c;TensorRtExtern源码地址&#xff1a;https://githu…

2024年JAVA、C++、Pyhton学哪种语言更容易进国央企?

对于不同编程语言在进入国有企业的观点大体是正确的&#xff0c;不过在实际选择时还需考虑一些因素。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信…

【CSDN独家公开】Python解析.SchDoc格式文件转换为json文件

前情提要 因工作需求&#xff0c;需要解析.SchDoc格式文件&#xff0c;提取文本和位置关系&#xff0c;通常方式是转换为图片或PDF&#xff0c;再进行OCR&#xff0c;但是这样识别精度太低了 Github找了好些项目&#xff0c;都不支持 PyAltium不支持 https://github.com/plu…

apexcharts数据可视化之饼图

apexcharts数据可视化之饼图 有完整配套的Python后端代码。 本教程主要会介绍如下图形绘制方式&#xff1a; 基础饼图单色饼图图片饼图 基础饼图 import ApexChart from react-apexcharts;export function SimplePie() {// 数据序列const series [44, 55, 13, 43, 22]// …

AI大模型:掌握未知,开启未来

AI大模型的工作原理 AI大模型是指通过大量数据和复杂算法训练出的能够理解和生成自然语言文本的人工智能模型。它们背后的核心技术主要包括深度学习、神经网络和自然语言处理。以下是详细的工作原理以及通俗易懂的类比&#xff1a; 1. 数据收集和预处理 AI大模型的训练首先需…