页面置换算法;最佳置换算法、先进先出置换算法、最近最久未使用置换算法

news/2024/11/29 4:50:57/

一、  实验目的和要求

1.  了解虚拟存储技术的特点。

2.  掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(LeastRecently Used)置换算法。

二、    实验内容

设计模拟实现OPT、FIFO和LRU页面置换算法的C语言程序。

1.  OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。

2.  FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。

3.  LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

三、  实验步骤

1.  使用C++语言编译程序。

2.  完成算法代码。

3.  运行程序,算出结果。

四、     实验源程序

代码:

//’*’代表缺页#include <stdio.h>#include <iostream>#include <queue>#include <stack>#include <set>#include <string>#include <cstring>#include <cmath>#define MAX 1111int mark[MAX];using namespace std;typedef structpage_replacement_algorithm{char page;char interrupt;}PRA;char ans[MAX][MAX];void FIFO(){memset(ans,'0',sizeof(ans));queue<char> q;PRA pra[MAX];int n,m;printf("请输入页面走向(字符表示)和物理块数(整型):\n");scanf("%d %d",&n,&m);getchar();printf("请输入n个字符(不要有空格):\n");for(int i=0; i<n; i++){scanf("%c",&pra[i].page);q.push(pra[i].page);}queue<char> qq;int cnt = 0,tot = 0;for(int i=0; i<m; i++){qq = q;for(int j=0; j<=i; j++){ans[j][i] = qq.front();qq.pop();}pra[i].interrupt = '*';}q = qq;for(int j=m,i=0; j<n; j++,i=0){bool flag = true;while(i < m){ans[i][j] = ans[i][j-1];if(ans[i][j] == q.front()&& flag){q.pop();flag = false;}i++;}if(flag){pra[j].interrupt = '*';for(int r=0; r<m-1; r++)ans[r][j] = ans[r+1][j];ans[m-1][j] = q.front();q.pop();}else{pra[j].interrupt = ' ';}}printf("\n先进先出置换算法:\n");printf("%8s:","页面走向");for(int r=0; r<n; r++) printf("%3c ",pra[r].page);printf("\n");for(int i=0; i<m; i++){printf("%6s%2d:","物理块",i+1);for(int j=0; j<n; j++) printf("%3c ",ans[i][j]);printf("\n");}printf("%8s:","缺页中断");for(int r=0; r<n; r++) printf("%3c ",pra[r].interrupt);printf("\n");}void LRU(){memset(ans,'0',sizeof(ans));PRA pra[MAX];int n,m;printf("请输入页面走向(字符表示)和物理块数(整型):\n");scanf("%d %d",&n,&m);getchar();printf("请输入n个字符(不要有空格):\n");for(int i=0; i<n; i++) scanf("%c",&pra[i].page);for(int i=0; i<m; i++){for(int j=0; j<=i; j++){ans[j][i] = pra[j].page;}pra[i].interrupt = '*';}for(int i=m; i<n; i++){bool flag = true;for(int j=0; j<m; j++){ans[j][i] = ans[j][i-1];if(ans[j][i] == pra[i].page){pra[i].interrupt = ' ';flag = false;}}if(flag){pra[i].interrupt = '*';for(int j=0; j<m; j++);if(ans[j][i] == pra[i-m].page){ans[j][i] = pra[i].page;break;}}}}printf("最近最久未使用置换算法:\n");printf("%8s:","页面走向");for(int r=0; r<n; r++) printf("%3c ",pra[r].page);printf("\n");for(int i=0; i<m; i++){printf("%6s%2d:","物理块",i+1);for(int j=0; j<n; j++) printf("%3c ",ans[i][j]);printf("\n");}printf("%8s:","缺页中断");for(int r=0; r<n; r++) printf("%3c ",pra[r].interrupt);printf("\n");}void OPT(){memset(ans,'0',sizeof(ans));memset(mark,0,sizeof(mark));PRA pra[MAX];int n,m;printf("请输入页面走向(字符表示)和物理块数(整型):\n");scanf("%d %d",&n,&m);getchar();printf("请输入n个字符(不要有空格):\n");for(int i=0; i<n; i++) scanf("%c",&pra[i].page);for(int i=0; i<m; i++){for(int j=0; j<=i; j++){ans[j][i] = pra[j].page;}pra[i].interrupt = '*';}for(int i=m; i<n; i++){bool flag = true;for(int j=0; j<m; j++){ans[j][i] = ans[j][i-1];if(ans[j][i] == pra[i].page){pra[i].interrupt = ' ';flag = false;}}int im;bool Goto = true;int tot = 0;if(flag){pra[i].interrupt = '*';for(int t=i; t<n;t++){for(int j=0; j<m; j++){if(ans[j][i] == pra[t].page&& !mark[pra[i].page]){mark[pra[i].page] = 1;tot++;if(tot == 3){ans[j][i] =pra[i].page;Goto = false;break;}}else if(ans[j][i] !=pra[t].page) im = j;}if(!Goto) break;}if(tot<3) ans[im][i] =pra[i].page;}}printf("\n最佳置换算法:\n");printf("%8s:","页面走向");for(int r=0; r<n; r++) printf("%3c ",pra[r].page);printf("\n");for(int i=0; i<m; i++){printf("%6s%2d:","物理块",i+1);for(int j=0; j<n; j++) printf("%3c ",ans[i][j]);printf("\n");}printf("%8s:","缺页中断");for(int r=0; r<n; r++) printf("%3c ",pra[r].interrupt);printf("\n");}int main(){printf("*********************************************************************欢迎您!*********************************************************************\n");int ca = 0;do{printf("\n请选择置换算法或结束程序:\n");printf("0、结束程序\n1、最佳置换\n2、先进先出\n3、最近最久未使用\n");scanf("%d",&ca);if(ca == 1) OPT();if(ca == 2) FIFO();if(ca == 3) LRU();}while(ca);return 0;}

五、  实验结果

最佳置换算法:

先进先出置换算法: 

最近未使用置换算法:


http://www.ppmy.cn/news/660612.html

相关文章

置换 置换群 应用 +置换群对某些算法问题的解释

置换 置换群 应用 http://hi.baidu.com/foreverlin1204/item/5bafa5e7e95629acc10d758b http://blog.163.com/myq_952/blog/static/863906320110211731329/ 置换的概念是什么&#xff1f;一个有限集合的一一变换叫做置换,一对对置换组成了置换群。对于一个集合a(a[1],a[2],a…

逆置换

******* 提交 输入一个1到n的排列&#xff0c;p[1], p[2], …, p[n]&#xff0c; 即1到n都出现了1次的一个长度为n的数组p。 对于每个满足1 < i < n的i&#xff0c;求下标j使得p[j] i。 1 < n < 100000 收起 输入 第一行一个整数n&#xff0c;表示排列长度 接下…

单陷门置换

陷门置换定义 一个陷门置换族是一个PPT算法元组 ( G e n , S a m p l e , E v a l , I n v e r t ) (Gen,Sample,Eval,Invert) (Gen,Sample,Eval,Invert)&#xff1a; PPT&#xff0c;运行步数是安全参数的多项式函数。 G e n ( l K ) Gen(l^{\mathcal{K}}) Gen(lK)是一个概率…

HTML - 替换(置换)元素和非替换(置换)元素

通常我们都将html元素分为块级元素、行内元素以及行内块级元素&#xff0c;但是今天冲浪时发现一个将html元素分类的新名词对——替换元素和非替换元素&#xff0c;其实也可以称为置换元素和非置换元素。接下来就记录一下个人对于这个新名词对的一些浅显见解&#xff0c;如有问…

数据结构和算法的概念以及时间复杂度空间复杂度详解

⭐️ 什么是数据结构&#xff1f; 百度百科给数据结构的定义&#xff1a; 数据结构(Data Structure)是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。 数据结构就是数据在内存中的存储方式。 ⭐️ 什么是算法&#xff1f; 百度百…

置换密码

置换密码又称换位密码&#xff0c;是根据一定的规则重新排列明文&#xff0c;以便打破明文的结构特性。置换密码的特点是保持明文的 所有字符不变&#xff0c;只是利用置换打乱了明文字符的位置和次序。也就是说&#xff0c;改变了明文的结构&#xff0c;不改变明文的内容。 例…

4.5 置换矩阵

4.5 置换矩阵 是不是任意可逆矩阵都可进行 L D U LDU LDU 分解呢&#xff1f;其实不能&#xff0c;消元操作需要除以对角元素 a i i a_{ii} aii​ &#xff0c;当其为 0 0 0 时&#xff0c;则会失败。这时可在下面行中选择任一对角元素不为 0 0 0 的行&#xff0c;对调这两…

重点!!!页面置换算法(最佳置换算法(OPT) 、先进先出置换算法(FIFO) 、最近最久未使用置换算法(LRU) 、时钟置换算法(CLOCK) 、改进型的时钟置换算法)

文章目录 前言知识总览最佳置换算法&#xff08;OPT&#xff09;先进先出置换算法&#xff08;FIFO&#xff09;最近最久未使用置换算法&#xff08;LRU)时钟置换算法&#xff08;CLOCK)改进型的时钟置换算法知识回顾与重要考点 前言 此篇文章是我在B站学习时所做的笔记&#…