实验三 页面置换算法

news2024/11/19 4:17:11

一.  实验目的:

1、熟悉虚存管理的各种页面淘汰算法

二、实验环境:

硬件环境:计算机一台,局域网环境;

软件环境:Windows XP及以上版本 Professional操作系统平台,Visual C++ 6.0专业版或企业版。

三 . 实验指导:     

  制定为进程分配的物理块数;给出该进程的调页顺序,然后采用不同的页面置换算法,给出具体的页面调用情况。

  1. 输入具体的物理块数;
  2. 给出进程的调页顺序;
  3. 选择具体的页面置换算法;
  4. 给出该页面置换算法的调页结果,并计算缺页率。

四、实验步骤(含流程图,实验过程分析等)

算法流程:

  1. 初始化一个大小为物理块数的数组,用于存储当前在内存中的页面。
  2. 遍历给定的引用串中的每个页面。
  3. 对于每个页面,检查它是否已经在数组中。如果是,则跳过该页面并继续遍历下一个页面。
  4. 如果该页面不在数组中,则需要进行页面置换。
  5. 重复步骤3和4,直到遍历完引用串中的所有页面。
  6. 计算缺页次数和缺页率。

五、实验结果及分析

图表 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;

    }

}    //初始化,全部置为-1



void _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;

       }

    }

}



/*

3

20

7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1



*/

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

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

相关文章

企业计算机服务器中了mallox勒索病毒怎么解决,勒索病毒解密文件恢复

随着科技技术的不断发展&#xff0c;网络技术得到了快速提升&#xff0c;但网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心陆续接到很多企业的求助信息&#xff0c;企业的计算机服务器遭到了mallox勒索病毒攻击&#xff0c;导致企业的所有业务中断&#…

网站被攻击怎么办

随着互联网的普及和网络攻击的日益增多&#xff0c;网站安全成为了众多企业和个人必须面对的重要问题。为了保护网站和用户数据的安全&#xff0c;内容分发网络&#xff08;CDN&#xff09;成为了一种有效的解决方案。本文将介绍CDN在保护网站安全、抵御网络攻击方面的作用和应…

C++之函数对象

C之函数对象 #include<iostream> using namespace std; #include<string> ///函数对象 (仿函数) //函数对象在使用时&#xff0c;可以像普通函数那样调用&#xff0c;可以有参数&#xff0c;可以有返回值 //函数对象超出普通函数的概念&#xff0c;函数对象可以有自…

优质好文链接

文章目录 1.开放源码有利于系统安全2.yum源配置&#xff0c;这一篇就够了&#xff01;(包括本地&#xff0c;网络&#xff0c;本地共享yum源)3.rpm包是什么4.SSH是什么意思&#xff1f;有什么功能&#xff1f; 1.开放源码有利于系统安全 开放源码有利于系统安全 2.yum源配置…

SQL零基础入门教程,贼拉详细!贼拉简单! 速通数据库期末考!(七)

LEFT JOIN LEFT JOIN 同样用于关联两个表&#xff0c;ON 关键字后指定两个表共有的字段作为匹配条件&#xff0c;与 INNER JOIN 不同的地方在于匹配不上的数据行&#xff0c;INNER JOIN 对两表匹配不上的数据行不返回结果&#xff0c;而 LEFT JOIN 只对右表&#xff08;table2…

80C51单片机的七种寻址方式

首先理解这样的等式 地址是20H的寄存器中&#xff0c;存放的内容是01H (20H)#01H 符号指令的书写格式 单个操作数的指令&#xff1a; 操作助记符 [目的操作数] 两个操作数的指令&#xff1a; 操作助记符[目的操作数],[源操作数] 描述符号 Rn(n0~7)当前工作寄存器组中的寄…

Pandas分组聚合_Python数据分析与可视化

Pandas分组聚合 分组单列和多列分组Series 系列分组通过数据类型或者字典分组获取单个分组对分组进行迭代 聚合应用单个聚合函数应用多个聚合函数自定义函数传入 agg() 中对不同的列使用不同的聚合函数 分组聚合的流程主要有三步&#xff1a; 分割步骤将 DataFrame 按照指定的…

【如何将任何直流电机变成伺服电机】

【如何将任何直流电机变成伺服电机】 1 前沿2 伺服电机工作原理3 如何制作定制伺服电机4 AS5600 编码器 – 磁性旋转位置传感器5 定制伺服电机电路图6 PCB设计7 自定义伺服3D模型8 定制伺服齿轮箱的 3D 打印零件9 对控制器进行编程9.1 引导加载程序刻录9.2 代码上传9.3 源代码9…

echarts 中如何添加左右滚动条 数据如何进行堆叠如何配置那些数据使用那个数据轴

左右滚动条的效果 此项的具体配置可参考 https://echarts.apache.org/zh/option.html#dataZoom-inside.moveOnMouseWheel dataZoom: [{id: dataZoomX,type: inside,// start: 0,// end: this.xAxis.length > 5 ? 10 : 100,startValue: this.xAxis.length > 5 ? 5 : 0,/…

linux如何重置root密码

目录 当我们想要重置root管理员密码时&#xff0c;我们可以有两种方法进行&#xff1a; 方法一、init方法 1、重启系统&#xff0c;在下图所示界面按e键 2、随后进入以下界面&#xff0c;、将ro修改为rw&#xff0c;在行末尾添加init/bin/sh。​编辑 3、随后按Ctrlx启动到s…

Java集合大总结——Iterator(迭代器)接口

Iterator接口 在程序开发中&#xff0c;经常需要遍历集合中的所有元素。针对这种需求&#xff0c;JDK专门提供了一个接口java.util.Iterator。 Iterator接口也是Java集合中的一员&#xff0c;但它与Collection、Map接口有所不同。 Collection接口与Map接口主要用于存储元素Ite…

C语言--有 n 个人围成一圈,顺序排号。 从第 1 个人开始报数,从 1 到 3 报数,凡是报到 3 的人退出圈子,问最后留下的是原来的第几号?

今天小编给大家分享以下约瑟夫环问题的处理。 一.题目描述 有 n 个人围成一圈,顺序排号。 从第 1 个人开始报数,从 1 到 3 报数,凡是报到 3 的人退出圈子,问最后留下的是原来的第几号? 这是一个典型的约瑟夫环的问题。 二.思路分析 难点一&#xff1a;我们如何表示人退出圈…

QEMU显示虚拟化的几种选项

QEMU可以通过通过命令行"-vga type"选择为客户机模拟的VGA卡的类别,可选择的类型有多个: -vga typeSelect type of VGA card to emulate. Valid values for type arecirrusCirrus Logic GD5446 Video card. All Windows versions starting from Windows 95 should …

【设计模式】设计模式基础

设计模式基础 文章目录 设计模式基础一、七大设计原则1.1 概述1.2 单一职责原则1.3 接口隔离原则1.4 依赖倒转原则1.5 里氏替换原则1.6 开闭原则1.7 迪米特法则1.8 合成复用原则 二、UML类图2.1 概述2.2 依赖关系&#xff08;Dependence&#xff09;2.3 泛化关系(generalizatio…

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.79】改进损失函数为VariFocal Loss

前言 作为当前先进的深度学习目标检测算法YOLOv8&#xff0c;已经集合了大量的trick&#xff0c;但是还是有提高和改进的空间&#xff0c;针对具体应用场景下的检测难点&#xff0c;可以不同的改进方法。此后的系列文章&#xff0c;将重点对YOLOv8的如何改进进行详细的介绍&…

Linux MMC子系统 - 5.eMMC 5.1工作模式-引导模式

By: Ailson Jack Date: 2023.11.19 个人博客&#xff1a;http://www.only2fire.com/ 本文在我博客的地址是&#xff1a;http://www.only2fire.com/archives/164.html&#xff0c;排版更好&#xff0c;便于学习&#xff0c;也可以去我博客逛逛&#xff0c;兴许有你想要的内容呢。…

Windows 下 Sublime Text 3.2.2 下载及配置

1 下载地址&#xff1a; https://www.sublimetext.com/3 Sublime Text 3.2.2 (此版本选择了 portable version)&#xff0c;直接解压就可以使用。 https://download.sublimetext.com/Sublime Text Build 3211.zip 2 相关配置 2.1 取消自动更新(需重启)&#xff1a; Preferen…

新手必看!!超详细!STM32-基本定时器

一、基本定时器的作用 定时触发输出直接驱动DAC。 二、基本定时器的框图 以STM32F103系列为例&#xff0c;具体开发板请查看开发手册。 类别定时器总线位数计数方向预分频系数是否可以产生DMA捕获/比较通道互补输出基本定时器TIM6 / TIM7APB116位向上1~65536可以0无通用定时…

关于MySQL安装时一直卡在starting sever......手把手教你搞定

&#x1f388;&#x1f388;&#x1f388;很多人刚开始安装MySQL的时候会出现卡在starting sever..的情况&#xff0c;今天手把手教大家轻松搞定&#xff01; 首先出现这个问题的原因有两个&#xff1a; 1. 你的电脑用户名是中文的。 2. 你前一次安装的MySQL没有完全删除干净。…