一、 实验目的和要求
1. 了解虚拟存储技术的特点。
2. 掌握请求页式存储管理的页面置换算法,如最佳(Optimal)置换算法、先进先出(Fisrt In First Out)置换算法和最近最久未使用(LeastRecently Used)置换算法。
二、 实验内容
设计模拟实现OPT、FIFO和LRU页面置换算法的C语言程序。
1. OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。
2. FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。
3. LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。
三、 实验步骤
1. 使用C++语言编译程序。
2. 完成算法代码。
3. 运行程序,算出结果。
四、 实验源程序
代码:
//’*’代表缺页
#include
#include
#include
#include
#include
#include
#include
#include
#define MAX 1111
int 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
PRA pra[MAX];
int n,m;
printf("请输入页面走向(字符表示)和物理块数(整型):\n");
scanf("%d %d",&n,&m);
getchar();
printf("请输入n个字符(不要有空格):\n");
for(int i=0; i scanf("%c",&pra[i].page); q.push(pra[i].page); } queue int cnt = 0,tot = 0; for(int i=0; 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 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 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 printf("\n"); for(int i=0; i printf("%6s%2d:","物理块",i+1); for(int j=0; j printf("\n"); } printf("%8s:","缺页中断"); for(int r=0; r 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 for(int i=0; i for(int j=0; j<=i; j++){ ans[j][i] = pra[j].page; } pra[i].interrupt = '*'; } for(int i=m; i bool flag = true; for(int j=0; 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 if(ans[j][i] == pra[i-m].page){ ans[j][i] = pra[i].page; break; } } } } printf("最近最久未使用置换算法:\n"); printf("%8s:","页面走向"); for(int r=0; r printf("\n"); for(int i=0; i printf("%6s%2d:","物理块",i+1); for(int j=0; j printf("\n"); } printf("%8s:","缺页中断"); for(int r=0; r 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 for(int i=0; i for(int j=0; j<=i; j++){ ans[j][i] = pra[j].page; } pra[i].interrupt = '*'; } for(int i=m; i bool flag = true; for(int j=0; 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 for(int j=0; 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 printf("\n"); for(int i=0; i printf("%6s%2d:","物理块",i+1); for(int j=0; j printf("\n"); } printf("%8s:","缺页中断"); for(int r=0; r 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; } 五、 实验结果 最佳置换算法: 先进先出置换算法: 最近未使用置换算法: