while(i<320){
order[i]=rand()%320;
if((order[i]+1)/10==mem_volume[0])
;//如果所调页数同第一个内存块中页数相同,则执行空操作
elseif((order[i]+1)/10==mem_volume[1]){
temp=mem_volume[1];
mem_volume[1]=mem_volume[0];
mem_volume[0]=temp;//如果所调页数同第二个内存块相同,则排序只需交换一次
}
elseif((order[i]+1)/10==mem_volume[2]){
for(j=2;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
elseif((order[i]+1)/10==mem_volume[3]){
for(j=3;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}//如果所调页数同第3、4个内存块中页数相同,则通过循环进行排序
else{
l++;
if(mem_volume[3]==100)
mem_volume[3]=(order[i]+1)/10;//保证刚开始调入内存块中就产生缺页
else{
mem_volume[3]=(order[i]+1)/10;
for(num=3;num>0;num--){
ex_chan=mem_volume[num];
mem_volume[num]=mem_volume[num-1];
mem_volume[num-1]=ex_chan;//写人后重新排序
}
}
}
i++;
order[i]=rand()%(order[i-1]+2);
if(order[i]/10==mem_volume[0])
;
elseif(order[i]/10==mem_volume[1]){
temp=mem_volume[1];
mem_volume[1]=mem_volume[0];
mem_volume[0]=temp;
}
elseif(order[i]/10==mem_volume[2]){
for(j=2;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
elseif(order[i]/10==mem_volume[3]){
for(j=3;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
else{
l++;
if(mem_volume[2]==100)
mem_volume[2]=order[i]/10;
else{
mem_volume[3]=order[i]/10;
for(num=3;num>0;num--){
ex_chan=mem_volume[num];
mem_volume[num]=mem_volume[num-1];
mem_volume[num-1]=ex_chan;
}
}
}
i++;
order[i]=order[i-1]+1;
if(order[i]/10==mem_volume[0])
;
elseif(order[i]/10==mem_volume[1]){
temp=mem_volume[1];
mem_volume[1]=mem_volume[0];
mem_volume[0]=temp;
}
elseif(order[i]/10==mem_volume[2]){
for(j=2;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
elseif(order[i]/10==mem_volume[3]){
for(j=3;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
else{
l++;
if(mem_volume[1]==100)
mem_volume[1]=order[i]/10;
else{
mem_volume[3]=order[i]/10;
for(num=3;num>0;num--){
ex_chan=mem_volume[num];
mem_volume[num]=mem_volume[num-1];
mem_volume[num-1]=ex_chan;
}
}
}
i++;
order[i]=rand()%(319-order[i-1]-2)+(order[i-1]+2);
if(order[i]/10==mem_volume[0])
;
elseif(order[i]/10==mem_volume[1]){
temp=mem_volume[1];
mem_volume[1]=mem_volume[0];
mem_volume[0]=temp;
}
elseif(order[i]/10==mem_volume[2]){
for(j=2;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
elseif(order[i]/10==mem_volume[3]){
for(j=3;j>0;j--){
temp=mem_volume[j];
mem_volume[j]=mem_volume[j-1];
mem_volume[j-1]=temp;
}
}
else{
l++;
if(mem_volume[0]==100)
mem_volume[0]=order[i]/10;
else{
mem_volume[3]=order[i]/10;
for(num=3;num>0;num--){
ex_chan=mem_volume[num];
mem_volume[num]=mem_volume[num-1];
mem_volume[num-1]=ex_chan;
}
}
}
i++;
}
value=l/320.0*100;
sum=sum+value;
add=add+l;
}
printf("*******************LRU页面置换算法******************\n");
printf("*******************指令序列******************");
for(i=0;i<320;i++){
if(i%10==0)
printf("\n");
printf("%5d",order[i]);
}
printf("\n");
printf("**********************************************************\n");
printf("\t\t%d次的平均缺页数为%d\n\t\t%d次的平均缺页率为%.3f%%\n",N,add/N,N,sum/N);
printf("\n");
}
LFU页面置换算法设计说明:
该算法主要是将最近时期页面使用最少的页面作为淘汰页。
这里通过设立count[32]这个计数数组记录32页的调用次数,通过比较来确定要调出的页面。
但如果没产生缺页就只需对所调页数对应的count值加1即可。
源代码:
//储存管理.cpp:
定义控制台应用程序的入口点。
//
#include"stdafx.h"
int_tmain(intargc,_TCHAR*argv[])
{
return0;
}
#include
#include
#include
#defineN5//定义运行次数
voidmain()
{
intorder[320],count[32]={0},compare[4]={0},mem_volume[4]={100,100,100,100};
//compare数组中存放了每次要比较的四个内存块中页数的调用次数
intl=0,i=0,j,k=0,cx=0;
intmin,num=0,n,sign=0,add=0;
floatvalue=0,sum=0;
srand(time(NULL));
for(cx=0;cxwhile(i<320){
order[i]=rand()%320;
for(j=0;j<4;j++)
if((order[i]+1)/10==mem_volume[j]){
n=(order[i]+1)/10;
count[n]+=1;
sign=1;//相同执行加1操作
}
if(sign)
sign=0;
else{
l++;
if(mem_volume[3]==100){
mem_volume[3]=(order[i]+1)/10;
n=(order[i]+1)/10;
count[n]+=1;
}
else{min=1000;
for(num=0;num<4;num++){
k=mem_volume[num];
compare[num]=count[k];
if(compare[num]min=compare[num];
j=num;//通过比较确定最少使用的页数,
}
}
mem_volume[j]=(order[i]+1)/10;
}
}
i++;
order[i]=rand()%(order[i-1]+2);
for(j=0;j<4;j++)
if(order[i]/10==mem_volume[j]){
n=order[i]/10;
count[n]+=1;
sign=1;
}
if(sign)
sign=0;
else{
l++;
if(mem_volume[2]==100){
mem_volume[2]=(order[i]+1)/10;
n=(order[i]+1)/10;
count[n]+=1;
}
else{min=1000;
for(num=0;num<4;num++){
k=mem_volume[num];
compare[num]=count[k];
if(compare[num]min=compare[num];
j=num;
}
}
mem_volume[j]=(order[i]+1)/10;
}
}
i++;
order[i]=order[i-1]+1;
for(j=0;j<4;j++)
if(order[i]/10==mem_volume[j]){
n=order[i]/10;
count[n]+=1;
sign=1;
}
if(sign)
sign=0;
else{
l++;
if(mem_volume[1]==100){
mem_volume[1]=(order[i]+1)/10;
n=(order[i]+1)/10;
count[n]+=1;
}
else{min=1000;
for(num=0;num<4;num++){