实验三 页面置换算法
一. 实验目的:
1、熟悉虚存管理的各种页面淘汰算法
二、实验环境:
硬件环境:计算机一台,局域网环境;
软件环境:Windows XP及以上版本 Professional操作系统平台,Visual C++ 6.0专业版或企业版。
三 . 实验指导:
制定为进程分配的物理块数;给出该进程的调页顺序,然后采用不同的页面置换算法,给出具体的页面调用情况。
- 输入具体的物理块数;
- 给出进程的调页顺序;
- 选择具体的页面置换算法;
- 给出该页面置换算法的调页结果,并计算缺页率。
四、实验步骤(含流程图,实验过程分析等)
算法流程:
- 初始化一个大小为物理块数的数组,用于存储当前在内存中的页面。
- 遍历给定的引用串中的每个页面。
- 对于每个页面,检查它是否已经在数组中。如果是,则跳过该页面并继续遍历下一个页面。
- 如果该页面不在数组中,则需要进行页面置换。
- 重复步骤3和4,直到遍历完引用串中的所有页面。
- 计算缺页次数和缺页率。
五、实验结果及分析
图表 1 先进先出算法
图表 2 最近最久未使用算法
图表 3 最佳置换算法
六、实验源代码
#include<stdio.h>#define N 100 //物理块数量上限#define M 1000 //页面数量上限int list[N], num; //队列存放物理块对应数据 ,物理块数量int n, yebiao[M]; //n总数 ,yebiao[M]存放页面号引用串int miss = 0, missl[N] = { 0 }; //缺页数,missl[n]判断缺页情况int pro[N], prol[N] = { 0 }; //优先级int temp; //最久-》存在时记录调用页面int k = 0; //打印页面号int cun[M][N], Re = 0; //存放物理块信息,用于后续输出void init() {Re = 0;k = 0;miss = 0;for (int i = 0;i < n;i++) {missl[i] = 0;}for (int i = 0; i < num; i++) {list[i] = -1;}} //初始化,全部置为-1void _print() {printf("页面号: ");for (int i = 0;i < n;i++) {printf(" %d", yebiao[i]);}printf("\n\n");for (int i = 0; i < num; i++) {printf("物理块: ");for (int j = 0;j < n;j++) {if (cun[j][i] == -1) {printf(" *");}else {printf("%4d", cun[j][i]);}}printf("\n");}printf("缺页位置:");for (int i = 0;i < n;i++) {if (missl[i] == 1) {printf(" #");}else {printf(" ");}}k++;printf("\n");} //打印队列结果void jilu() {for (int i = 0;i < num;i++) {cun[Re][i] = list[i];}Re++;}bool cunzai(int x) {for (int i = 0;i < num;i++) {if (x == list[i]) {temp = i; //最近最久未使用存在时排序return true;}}return false;} //判断是否在队列内void inlist(int x) {for (int i = 0;i < n;i++) {list[i] = list[i + 1];}list[num - 1] = x;} //进队列void _printmiss() {printf("缺页次数:%d \n缺页率:%d/%d\n", miss, miss, n);}void priority(int x) {for (;x < n;x++) {for (int i = 0;i < num;i++) {if (list[i] == yebiao[x] && prol[i] == 0) {pro[i] = x; // 队列i在页表中的位置越靠后优先级越高prol[i] = 1;}}}for (int i = 0;i < num;i++) { //页表中不存在队列i 优先级最大if (prol[i] == 0) {pro[i] = 1000;}}}//判断优先级void prosort() {int templ;for (int i = 0;i < num - 1;i++) {for (int j = 0;j < num - 1 - i;j++) {if (pro[j] < pro[j + 1]) {templ = pro[j];pro[j] = pro[j + 1];pro[j + 1] = templ;templ = list[j];list[j] = list[j + 1];list[j + 1] = templ;}}}for (int i = 0;i < num;i++) { //复原prol[i] = 0;}} //优先级排序void optimal() {init(); //初始化int count = n;int i = 0;while (count != 0) {if (i < num) {list[i] = yebiao[i];miss++;missl[i] = 1;}else if (cunzai(yebiao[i])) {}else {priority(i);prosort();inlist(yebiao[i]);miss++;missl[i] = 1;}jilu();count--;i++;}_print();_printmiss();}void fifo() { //先进先出init(); //初始化int count = n;int i = 0;while (count != 0) {if (i < num) {list[i] = yebiao[i];miss++;missl[i] = 1;}else if (cunzai(yebiao[i])) {}else {inlist(yebiao[i]);miss++;missl[i] = 1;}count--;i++;jilu();}_print();_printmiss();}void lru() { //最近最久未使用init(); //初始化int count = n;int i = 0;while (count != 0) {if (i < num) {list[i] = yebiao[i];miss++;missl[i] = 1;}else if (cunzai(yebiao[i])) {list[num] = list[temp];for (int j = temp;j <= num;j++) {list[j] = list[j + 1];}}else {inlist(yebiao[i]);miss++;missl[i] = 1;}jilu();count--;i++;}_print();_printmiss();}int main() {printf("请输入物理块数量:");scanf("%d", &num);printf("请输入要访问的页面总数:");scanf("%d", &n);printf("请输入要访问的页面号:");for (int i = 0; i < n; i++) {scanf("%d", &yebiao[i]);}int chose = 1;while (chose) {printf("请选择所需的置换算法:\n");printf("1.FIFO 2.LRU 3.0PT 4.退出\n");scanf("%d", &chose);if (chose == 1) {fifo();}if (chose == 2) {lru();}if (chose == 3) {optimal();}if (chose == 4) {break;}}}/*3207 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1*/
相关文章:

实验三 页面置换算法
一. 实验目的: 1、熟悉虚存管理的各种页面淘汰算法 二、实验环境: 硬件环境:计算机一台,局域网环境; 软件环境:Windows XP及以上版本 Professional操作系统平台,Visual C 6.0专业版或企业版…...
Node.js中的Buffer和Stream
Node.js中的Buffer和Stream 计算机只能理解二进制数据,即0和1形式的数据。这些数据的顺序移动称为流。以称为块(chunk)的破碎部分流式传输数据;计算机一收到数据块就开始处理数据,而不用等待整个数据。 我们这篇文章…...

3.5 Windows驱动开发:应用层与内核层内存映射
在上一篇博文《内核通过PEB得到进程参数》中我们通过使用KeStackAttachProcess附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存…...

【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!
导读:关于大学数学教材的吐槽似乎从来没停止过。有人慨叹:数学教材晦涩难懂。错!难懂,起码还可以读懂。数学教材你根本读不懂;也有人说:数学教材简直就是天书。 数学教材有好有坏,这话不假&…...

MatLab的下载、安装与使用(亲测有效)
1、概述 MatLab是由MathWorks公司开发并发布的,支持线性代数、矩阵运算、绘制函数和数据、信号处理、图像处理以及视频处理等功能。广泛用于算法开发、数据可视化、数据分析以及数值计算等。 Matlab 的主要特性包括: 简单易用的语法,使得程…...

无人智能货柜:引领便捷购物新体验
无人智能货柜:引领便捷购物新体验 无人智能货柜利用人工智能技术,将传统货架与电子商务相结合,形成智能销售终端。其采用先拿货后付款的购物模式,用户只需扫码、拿货、关门三个简洁流畅的步骤,极大地提升了消费者的购物…...

4.6 Windows驱动开发:内核遍历进程VAD结构体
在上一篇文章《内核中实现Dump进程转储》中我们实现了ARK工具的转存功能,本篇文章继续以内存为出发点介绍VAD结构,该结构的全程是Virtual Address Descriptor即虚拟地址描述符,VAD是一个AVL自平衡二叉树,树的每一个节点代表一段虚…...

基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码
基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于世界杯优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络…...

NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!
之前分享过搭建可以与宝塔共存的一个 “魔法” 服务器状态监控应用 ——xui,支持 VmessWSTLS。 最近 Docker 视频出的比较多,前阵子又出现了宝塔国内版存在隐私泄露的问题,很多小伙伴其实都不用宝塔了,那么,在我们现在…...

【网络奇遇记】那年我与计算机网络的浅相知
🌈个人主页:聆风吟 🔥系列专栏:网络奇遇记、数据结构 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 一. 计算机网络的定义1.1 计算机早期的一个最简单的定义1.2 现阶段计算机网络的一个较好的定义 二. …...
LeetCode26.删除有序数组中的重复项(双指针法)
LeetCode26.删除有序数组中的重复项 1.问题描述2.解题思路3.代码 1.问题描述 给你一个 非严格递增排列 的数组 nums ,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然…...

原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8
文章目录 前言一、原始代码二、对每一行代码的解释:总结 前言 这是该系列原型网络的最后一段代码及其详细解释,感谢各位的阅读! 一、原始代码 if __name__ __main__:##载入数据labels_trainData, labels_testData load_data() # labels_…...

黑马点评回顾 redis实现共享session
文章目录 传统session缺点整体访问流程代码实现生成验证码登录 问题具体思路 传统session缺点 传统单体项目一般是把session存入tomcat,但是每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat,并且把自己的信息存放到第一台服务器…...

Redis篇---第八篇
系列文章目录 文章目录 系列文章目录前言一、说说 Redis 哈希槽的概念?二、Redis 常见性能问题和解决方案有哪些?三、假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?前言 前些天发现了一个巨牛的人工智能学习网站…...

Unity使用Visual Studio Code 调试
Unity 使用Visual Studio Code 调试C# PackageManager安装Visual Studio EditorVisual Studio Code安装Unity 插件修改Unity配置调试 PackageManager安装Visual Studio Editor 打开 Window->PackageManger卸载 Visual Studio Code Editor ,这个已经被官方废弃安…...

【Linux】进程替换|exec系列函数
文章目录 一、看一看单进程版的进程替换二、进程替换的原理三、多进程版——验证各种程序替换接口exec系列函数execlexeclpexecvexecvp tipsexecleexecve 四、总结 一、看一看单进程版的进程替换 #include<stdio.h> #include<unistd.h> #include<stdlib.h>i…...
Java编程技巧:将图片导出成pdf文件
目录 一、pom依赖二、代码三、测试链接 一、pom依赖 <!-- pdf插件 start --> <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.3</version> </dependency> <dependency…...
二项分布和泊松分布
一、二项分布 1.1 n重伯努利试验 若是二项分布,则必是n重伯努利试验概型。即:每次试验只有两种结果 与 ,且在每次试验中A发生的概率相等,即P(A)p,将这种试验独立重复n次,则称这种试验为n重伯努利试验&#…...

【飞控调试】DJIF450机架+Pixhawk6c mini+v1.13.3固件+好盈Platinium 40A电调无人机调试
1 背景 由于使用了一种新的航电设备组合,在调试无人机起飞的时候遇到了之前没有遇到的问题。之前用的飞控(Pixhawk 6c)和电调(Hobbywing X-Rotor 40A),在QGC里按默认参数配置来基本就能平稳飞行࿰…...

Android studio配置Flutter开发环境报错问题解决
博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 报错问题截图 报错原因已经给出: You need Java 11 or higher to build your app with this version of G…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...