实验三 页面置换算法
一. 实验目的:
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…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
【Linux】自动化构建-Make/Makefile
前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具:make/makfile 1.背景 在一个工程中源文件不计其数,其按类型、功能、模块分别放在若干个目录中,mak…...
Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
比较数据迁移后MySQL数据库和ClickHouse数据仓库中的表
设计一个MySQL数据库和Clickhouse数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
Qt/C++学习系列之列表使用记录
Qt/C学习系列之列表使用记录 前言列表的初始化界面初始化设置名称获取简单设置 单元格存储总结 前言 列表的使用主要基于QTableWidget控件,同步使用QTableWidgetItem进行单元格的设置,最后可以使用QAxObject进行单元格的数据读出将数据进行存储。接下来…...
LeetCode - 148. 排序链表
目录 题目 思路 基本情况检查 复杂度分析 执行示例 读者可能出的错误 正确的写法 题目 148. 排序链表 - 力扣(LeetCode) 思路 链表归并排序采用"分治"的策略,主要分为三个步骤: 分割:将链表从中间…...
