一、 实验目的和要求
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 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<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;
}
五、 实验结果
最佳置换算法:
先进先出置换算法:
最近未使用置换算法: