实验三 页面置换算法

一.  实验目的:

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



*/

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

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

相关文章

C++之谓词

C之谓词 一元谓词 #include<iostream> using namespace std; #include<vector> #include<algorithm> //仿函数 返回值类型是boo1数据类型&#xff0c;称为谓词 //一元谓词class GreaterFive { public:bool operator()(int val){return val > 5;} };void …

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,/…

Egress-TLS-Origination

目录 文章目录 目录本节实战1、出口网关TLS发起2、通过 egress 网关发起双向 TLS 连接关于我最后 本节实战 实战名称&#x1f6a9; 实战&#xff1a;Egress TLS Origination-2023.11.19(failed)&#x1f6a9; 实战&#xff1a;通过 egress 网关发起双向 TLS 连接-2023.11.19(测…

[Linux] PXE批量装机

一、PXE批量装机简介 1.1 常见的三种系统安装方式 u启动安装&#xff1a;在U盘中下载相关的安装系统及镜像文件&#xff0c;u盘插机安装 光驱安装&#xff1a;将带有所需系统的光盘放进电脑服务器中&#xff0c;按照官方引导装机 网络下载安装&#xff1a;在网上下载相关镜…

vue之浏览器存储方法封装实例

我们在项目中通常会对缓存进行一些操作&#xff0c;为了便于全局调用&#xff0c;会对缓存的设置、获取及删除方法进行封装成一个工具类。 首先我们在src目录下创建一个plugins文件夹&#xff0c;在plugins下创建cache文件夹并创建index.js&#xff0c;代码如下&#xff1a; c…

C++之函数对象

C之函数对象 #include<iostream> using namespace std; #include<string> ///函数对象 (仿函数) //函数对象在使用时&#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…

橱柜的装修干货|板材、五金、高度、配色4个方面。福州中宅装饰,福州装修

引言 橱柜的装修干货。 橱柜是厨房的核心&#xff0c;一个好的橱柜能让厨房变得实用又美观。以下是关于橱柜装修的几个问题解答。 1. 橱柜的柜门常用的板材有哪些&#xff1f; 橱柜的柜门常用的板材有实木板、防火板、烤漆板、包复框、PVC板、膜压板等。不同板材有不同的特点…

macOS 后台项目已添加 “Google Updater添加了可在后台运行的项目。你可以在“登陆项”设置中管理

文章目录 Intro解决查看三个文件夹分析 & 操作确认结果是否生效 Intro 我的macbook上经常弹出这样的通知狂&#xff1a; macOS 后台项目已添加 “Google Updater添加了可在后台运行的项目。你可以在“登陆项”设置中管理 不胜其扰&#xff0c;终于决定禁用它。以下为方法…

大厂数仓专家实战分享:企业级埋点管理与应用

一.什么是埋点 埋点&#xff08;Event Tracking&#xff09;&#xff0c;是互联网数据采集工作中的一个俗称&#xff0c;正式应该叫事件跟踪&#xff0c;英文为 Event Tracking&#xff0c;它主要是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。 二.埋…

C# 电脑程序控制电路开关

最近在做系统的监控&#xff0c;想到能不能做一个酷点的功能&#xff0c;当收到异常消息时桌面上的红色小灯&#xff08;或报警灯&#xff09;会亮起来。于是在淘宝上找了一下&#xff0c;有这种小设备&#xff0c;插入USB设备&#xff0c;通过串口控制这个设备的继电器来实现&…

【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!

导读&#xff1a;关于大学数学教材的吐槽似乎从来没停止过。有人慨叹&#xff1a;数学教材晦涩难懂。错&#xff01;难懂&#xff0c;起码还可以读懂。数学教材你根本读不懂&#xff1b;也有人说&#xff1a;数学教材简直就是天书。 数学教材有好有坏&#xff0c;这话不假&…

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;兴许有你想要的内容呢。…

如何使用websocket+node.js实现pc后台与小程序端实时通信

如何使用websocketnode.js实现pc后台与小程序端实时通信 一、使用node.js创建一个服务器二、pc后台连接ws三、小程序端连接ws四、实现效果 实现功能:实现pc后台与小程序端互发通信能够实时检测到 一、使用node.js创建一个服务器 1.安装ws依赖 npm i ws2.创建index.js const…

知道数字孪生发展的四个阶段,你就能明白数字孪生的真正价值了

数字孪生的发展经历了四个阶段。以下是每个阶段的详细描述&#xff1a; 1、数字孪生萌芽期&#xff1a;这个阶段以模型仿真驱动为特征。20世纪80年代以来&#xff0c;CAD、CAE、CAM等计算机建模、模拟仿真技术开始迅猛发展&#xff0c;并在制造业领域广泛应用。该阶段主要通过…

【C语言期末不挂科——指针初阶篇】

C语言指针初阶 文章目录 C语言指针初阶**什么是指针&#xff1f;**   **1&#xff09;初识指针**  **2&#xff09;地址的大小**  **3&#xff09;指针变量** **指针的类型**   **1)指针对整数加减运算**  **2&#xff09;指针的解引用** **野指针**  **1&#xff…

【LLM】基于LLM的agent应用(上)

note 在未来&#xff0c;Agent 还会具备更多的可扩展的空间。 就 Observation 而言&#xff0c;Agent 可以从通过文本输入来观察来理解世界到听觉和视觉的集成&#xff1b;就 Action 而言&#xff0c;Agent 在具身智能的应用场景下&#xff0c;对各种器械进行驱动和操作。 Age…

Java Swing垃圾分类器

内容要求 1) 本次程序设计是专门针对 Java 课程的,要求使用 Java 语言进行具有一定代码量的程序开发。程序的设计要结合一定的算法&#xff0c;在进行代码编写前要能够设计好自己的算法。 本次程序设计涉及到 Java 的基本语法&#xff0c;即课堂上所介绍的变量、条件语句、循…

如何从Android恢复出厂设置后的手机恢复数据

如果您已使用出厂设置删除了Android设备上的所有数据&#xff0c;或者有一段时间未使用&#xff0c;则需要恢复出厂设置以从Android设备中检索数据。 奇客数据恢复安卓版是一个有用的工具&#xff0c;可以在重置后检索Android数据。 将Android设备恢复出厂设置 如果您需要将A…