目录
1 实验名称
页面置换算法演示
2 实验目的
1. 分析内存管理办法中每个页面置换算法原理;
2. 掌握页面置换算法执行过程。
3 实验内容
C语言完成“OPT、FIFO、LRU”算法的演示置换过程,记录程序运行结果(置换次数和缺页率,以课本例题为例完成实验测试),比较各种置换算法的效率及优缺点,完成实验报告。
4 实验原理及流程图
最佳置换算法、先进先出页面置换算法和最近最久未使用置换算法:
1. 最佳(Optimal)置换算法:
最佳置换算法是由Belady于1966年提出的一种理论上的算法。其所选择的被淘汰页面将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面。
2. 先进先出(FIFO)页面置换算法:
FIFO算法是最早出现的置换算法。该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
3. LRU(Least Recently Used)置换算法:
最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做出决策的。
流程图:
5 实验源代码
#include <stdio.h>
#include <stdlib.h>
#define PNum 12
#define BNum 3
int Page[PNum]={0};
typedef struct{
int block;
int time;
}BLock;
typedef struct LNode{
BLock B[3];
}Mem;
Mem M;
void CreatePage(){
//初始化页面
printf("页面走向:\n");
for(int i=0;i<PNum;i++){
Page[i]=rand()%9+1;
printf("%d ",Page[i]);
}
printf("\n");
}
int max(int a,int b,int c){
int x,z;
if(a>=b)
x=a;
else x=b;
if(x>=c)
z=x;
else
z=c;
return z;
}
void InitM(){
for(int q=0;q<PNum;q++){
M.B[q].block=0;
}
for(int q=0;q<PNum;q++){
M.B[q].time=0;
}
}
void FIFO(){ //先进先出页面置换算法
printf("具体实现过程:\n");
InitM();
int i=0,j=0;
int a=-1,b=-1;
int Max=-1;
int MaxT=0;
int count=0;
for(i=0;i<PNum;i++){
for(j=0;j<BNum;j++)
if(M.B[j].block==0){
a=j; //记住第一个页面为空的下标用于进入内存
break;
}
for(j=0;j<BNum;j++){
if(M.B[j].block==Page[i])
b=j; //记住相同页面的下标不再置换
}
for(j=0;j<BNum;j++){
if(M.B[j].time>MaxT){
MaxT=M.B[j].time;
Max=j; //记住最先进入内存页面的下标
}
}
if(b==-1){ //内存中没有相同的页
if(a!=-1){ //内存中还有空页面
M.B[a].block=Page[i];
M.B[a].time=0;
for(j=0;j<=a;j++)
M.B[j].time++ ; //
a=-1;
}
else{ //内存中已没有空页需进行置换
M.B[Max].block=Page[i];
M.B[Max].time=0;
for(j=0;j<BNum;j++)
M.B[j].time++;
Max=-1;
MaxT=0;
count++;
}
}
else{ //内存中有相同的页不再置换
M.B[b].block=Page[i];
for(j=0;j<BNum;j++){
M.B[j].time++;
}
b=-1;
}
for(j=0;j<BNum;j++){
printf("%d ",M.B[j].block);
}
printf("\n");
}
float rate;
float n=PNum-count;
rate=(n/PNum)*100;
printf("命中率为%.2lf%%\n",rate);
}
void LRU(){ //最近最久未使用置换算法
printf("具体实现过程:\n");
InitM();
int i=0,j=0;
int a=-1,b=-1;
int Max=-1;
int MaxU=0;
int count=0;
for(i=0;i<PNum;i++){
for(j=0;j<BNum;j++)
if(M.B[j].block==0){
a=j; //记住第一个页面为空的下标用于进入内存
break;
}
for(j=0;j<BNum;j++){
if(M.B[j].block==Page[i])
b=j; //记住相同页面的下标不再置换
}
for(j=0;j<BNum;j++){
if(M.B[j].time>MaxU){
MaxU=M.B[j].time;
Max=j; //记住最先进入内存页面的下标
}
}
if(b==-1){ //内存中没有相同的页
if(a!=-1){ //内存中还有空页面
M.B[a].block=Page[i];
M.B[a].time=0;
for(j=0;j<=a;j++)
M.B[j].time++;
a=-1;
}
else{//内存中已没有空页需进行置换
M.B[Max].block=Page[i];
M.B[Max].time=0;
for(j=0;j<BNum;j++)
M.B[j].time++;
Max=-1;
MaxU=0;
count++;
}
}
else{//内存中有相同的页不再置换
M.B[b].block=Page[i];
M.B[b].time=0; //再次使用,置其为0
if(a!=-1){
M.B[a].time=0;
}
for(j=0;j<BNum;j++){
M.B[j].time++;
}
Max=-1;
MaxU=0;
b=-1;
}
for(j=0;j<BNum;j++){
printf("%d ",M.B[j].block);
}
printf("\n");
}
float rate;
float n=PNum-count;
rate=(n/PNum)*100;
printf("命中率为%.2lf%%\n",rate);
}
void OPT(){ //最佳置换算法
printf("具体实现过程:\n");
for(int q=0;q<PNum;q++){
M.B[q].block=0;
}
int i=0,j=0;
int a=-1,b=-1;
int Max=-1;
int count=0;
for(i=0;i<PNum;i++){
for(j=0;j<BNum;j++)
if(M.B[j].block==0){
a=j; //记住第一个页面为空的下标用于进入内存
break;
}
for(j=0;j<BNum;j++){
if(M.B[j].block==Page[i])
b=j; //记住相同页面的下标不再置换
}
if(b==-1){//内存中没有相同的页
if(a!=-1){ //内存中还有空页面
M.B[a].block=Page[i];
//V[a]=0;
a=-1;
}
else{ //内存中已没有空页需进行置换
int c,d,e;
int x,y,m;
for(c=i+1;c<=PNum-1;c++){
if(Page[c]==M.B[0].block){
x=c;
break;
}
else{
x=PNum;
}
}
for(d=i+1;d<=PNum-1;d++){
if(Page[d]==M.B[1].block){
y=d;
break;
}
else{
y=PNum;
}
}
for(e=i+1;e<=PNum-1;e++){
if(Page[e]==M.B[2].block){
m=e;
break;
}
else{
m=PNum;
}
}
int z=max(x,y,m);
if(z==x)
Max=0;
if(z==y)
Max=1;
if(z==m)
Max=2;
M.B[Max].block=Page[i];
Max=-1;
b=-1;
count++;
}
}
else{//内存中有相同的页不再置换
M.B[b].block=Page[i];
}
for(j=0;j<BNum;j++){
printf("%d ",M.B[j].block);
}
printf("\n");
}
float rate;
float n=PNum-count;
rate=(n/PNum)*100;
printf("命中率为%.2lf%%\n",rate);
}
void Printf(){
printf("***********页面置换算法******************\n");
printf("***** 1-先进先出页面置换算法*************\n");
printf("***** 2-最近最久未使用页面置换算法*******\n");
printf("***** 3-最佳置换算法*********************\n");
printf("***** 0-退出*****************************\n");
printf("*****************************************\n");
}
int main(){
int n;
while(1){
Printf();
printf("请选择您要进行的操作:\n");
scanf("%d",&n);
CreatePage();
switch(n){
case 1:
FIFO();
break;
case 2:
LRU();
break;
case 3:
OPT();
break;
case 0:
exit(0);
break;
}
}
return 0;
}
6 实验结果
7 实验总结
在这次实验的三个算法中,最佳置换算法是从主存中移出永远不再需要的页面;如无这样的页面存在,则选择将来最长时间不需要访问的页面。于是所选择的被淘汰页面是将来永不在使用的,或者是在将来的最长时间内不被访问的,这样可以保证获得最低的缺页率。但是将来的会不会访问操作系统并不知道,因此该算法不能被实现,只是理想的。