实验八 页面置换模拟程序设计

2024-06-06 21:52

本文主要是介绍实验八 页面置换模拟程序设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

网上找到的程序得到的答案经过手算验证是错的,所以自己实现了一个,具体实现看代码吧,多余的操作已经去掉了。 

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define VM_PAGE 7 /*假设每个页面可以存放10条指令,则共有32个虚页*/
#define PM_PAGE 4 /*分配给作业的内存块数为41*/
#define TOTAL_INSERT 18
typedef struct
{int vmn;int pmn;int exist;int time;
} vpage_item;
vpage_item page_table[VM_PAGE];vpage_item *ppage_bitmap[PM_PAGE];int vpage_arr[TOTAL_INSERT] = {1, 2, 3, 4, 2, 6, 2, 1, 2, 3, 7, 6, 3, 2, 1, 2, 3, 6};void init_data() // 数据初始化
{for (int i = 0; i < VM_PAGE; i++){page_table[i].vmn = i + 1; // 虚页号page_table[i].pmn = -1;    // 实页号page_table[i].exist = 0;page_table[i].time = -1;}for (int i = 0; i < PM_PAGE; i++) /*最初4个物理块为空*/{ppage_bitmap[i] = NULL;}
}void FIFO() /*FIFO页面置换算法*/
{int k = 0;int i;int sum = 0;int missing_page_count = 0;int current_time = 0;bool isleft = true; /*当前物理块中是否有剩余*/while (sum < TOTAL_INSERT){if (page_table[vpage_arr[sum] - 1].exist == 0){missing_page_count++;if (k < 4){if (ppage_bitmap[k] == NULL) /*找到一个空闲物理块*/{ppage_bitmap[k] = &page_table[vpage_arr[sum] - 1];ppage_bitmap[k]->exist = 1;ppage_bitmap[k]->pmn = k;ppage_bitmap[k]->time = current_time;k++;}}else{int temp = ppage_bitmap[0]->time; /*记录物理块中作业最早到达时间*/int j = 0;                        /*记录应当被替换的物理块号*/for (i = 0; i < PM_PAGE; i++){if (ppage_bitmap[i]->time < temp){temp = ppage_bitmap[i]->time;j = i;}}ppage_bitmap[j]->exist = 0;ppage_bitmap[j] = &page_table[vpage_arr[sum] - 1]; /*更新页表项*/ppage_bitmap[j]->exist = 1;ppage_bitmap[j]->pmn = j;ppage_bitmap[j]->time = current_time;}}current_time++;sum++;}printf("FIFO算法缺页次数为:%d\t缺页率为:%f\t置换次数为:%d\t置换率为:%f\n", missing_page_count, missing_page_count / (float)TOTAL_INSERT, missing_page_count - 4, (missing_page_count - 4) / (float)TOTAL_INSERT);
}
void LRU()
{int k = 0;int i;int sum = 0;int missing_page_count = 0;int isfill = 0;while (sum < TOTAL_INSERT){int page_index = vpage_arr[sum] - 1;if (page_table[page_index].exist == 0){missing_page_count++;if (isfill < PM_PAGE){ppage_bitmap[isfill] = &page_table[page_index];page_table[page_index].pmn = isfill;page_table[page_index].exist = 1;isfill++;}else{int k = 0, mintime = ppage_bitmap[0]->time;for (int i = 0; i < PM_PAGE; i++){if (ppage_bitmap[i]->time < mintime){mintime = ppage_bitmap[i]->time;k = i;}}ppage_bitmap[k]->exist = 0;ppage_bitmap[k]->time = 0;ppage_bitmap[k] = &page_table[page_index];page_table[page_index].exist = 1;ppage_bitmap[k]->pmn = k;}}elsepage_table[page_index].time = 0;for (int i = 0; i < PM_PAGE; i++) // 更新时间if (ppage_bitmap[i] != NULL)ppage_bitmap[i]->time++;sum++;}printf("LRU 算法缺页次数为:%d\t 缺页率为:%f\t置换次数为:%d\t置换率为:%f\n", missing_page_count, missing_page_count / (float)TOTAL_INSERT, missing_page_count - 4, (missing_page_count - 4) / (float)TOTAL_INSERT);
}
int LastestIndex(int l)//找到最久访问页面
{int k = 0;for (int i = 0; i < PM_PAGE; i++){for (int j = l + 1; j < TOTAL_INSERT; j++){if (ppage_bitmap[i]->pmn == vpage_arr[j]){k = k > j ? k : j;break;}}}return vpage_arr[k];
}
void OPT()
{int i, j;int sum = 0;int missing_page_count = 0;int isfill = 0;while (sum < TOTAL_INSERT){int page_index = vpage_arr[sum] - 1;if (page_table[page_index].exist == 0){                         // 如果页面不在内存中missing_page_count++; // 缺页次数加1if (isfill < PM_PAGE){// 查找空闲物理块ppage_bitmap[isfill] = &page_table[page_index];page_table[page_index].pmn = isfill;page_table[page_index].exist = 1;isfill++;}else{ // 内存已经满了,置换int last = LastestIndex(sum);for (int i = 0; i < PM_PAGE; i++)if (ppage_bitmap[i]->vmn == last){last = i;break;}page_table[ppage_bitmap[last]->vmn].exist = 0;ppage_bitmap[last] = &page_table[page_index];page_table[page_index].exist = 1;}}sum++;}// 输出结果printf("OPT算法缺页次数为:%d\t 缺页率为:%f\t置换次数为:%d\t置换率为:%f\n", missing_page_count, missing_page_count / (float)TOTAL_INSERT, missing_page_count - 4, (missing_page_count - 4) / (float)TOTAL_INSERT);
}int main()
{int a;printf("请输入需要选择的页面置换算法:1.FIFO\t2.LRU\t3.OPT\t输入0结束\n");do{scanf_s("%d", &a);switch (a){case 1:init_data();FIFO();break;case 2:init_data();LRU();break;case 3:init_data();OPT();break;}} while (a != 0);return 0;
}

这篇关于实验八 页面置换模拟程序设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037338

相关文章

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

SpringBoot如何访问jsp页面

《SpringBoot如何访问jsp页面》本文介绍了如何在SpringBoot项目中进行Web开发,包括创建项目、配置文件、添加依赖、控制层修改、测试效果以及在IDEA中进行配置的详细步骤... 目录SpringBoot如何访问JSP页python面简介实现步骤1. 首先创建的项目一定要是web项目2. 在

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu4431麻将模拟

给13张牌。问增加哪些牌可以胡牌。 胡牌有以下几种情况: 1、一个对子 + 4组 3个相同的牌或者顺子。 2、7个不同的对子。 3、13幺 贪心的思想: 对于某张牌>=3个,先减去3个相同,再组合顺子。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOExcepti

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码  2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法,这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列 算法分析 这道题其实就是要将连续且相同的字符替换成字符重复的次数+