当前位置: 首页 > news >正文

实验三 页面置换算法

一.  实验目的:

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;}}    //初始化,全部置为-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*/

http://www.lryc.cn/news/235450.html

相关文章:

  • Node.js中的Buffer和Stream
  • 3.5 Windows驱动开发:应用层与内核层内存映射
  • 【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!
  • MatLab的下载、安装与使用(亲测有效)
  • 无人智能货柜:引领便捷购物新体验
  • 4.6 Windows驱动开发:内核遍历进程VAD结构体
  • 基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码
  • NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!
  • 【网络奇遇记】那年我与计算机网络的浅相知
  • LeetCode26.删除有序数组中的重复项(双指针法)
  • 原型网络Prototypical Network的python代码逐行解释,新手小白也可学会!!-----系列8
  • 黑马点评回顾 redis实现共享session
  • Redis篇---第八篇
  • Unity使用Visual Studio Code 调试
  • 【Linux】进程替换|exec系列函数
  • Java编程技巧:将图片导出成pdf文件
  • 二项分布和泊松分布
  • 【飞控调试】DJIF450机架+Pixhawk6c mini+v1.13.3固件+好盈Platinium 40A电调无人机调试
  • Android studio配置Flutter开发环境报错问题解决
  • 2023.11.18 -自用hadoop高可用环境搭建命令
  • 【Linux】常用系统工作命令
  • 深入理解网络协议:通信世界的基石
  • PL/SQL编程
  • Prompt提示词——什么是CRISPE框架?QCIPSPE框架?
  • Nginx的核心配置文件
  • Java,集合框架,关于Collection接口(子接口List和Set)
  • 已安装的nginx追加ssl模块
  • 大语言模型|人工智能领域中备受关注的技术
  • Docker之DockerFile解析
  • NSSCTF第13页(2)