22222設計一個程序,有一個虛擬存儲區和內存工作區,實現下述三種算法中的任意兩種,計算訪問命中率(命中率=1-頁面失效次數/頁地址流長度)。附加要求:能夠顯示頁面置換過程。算法包括:先進先出的算法(FIFO)、最少使用算法(LFU)、最近未使用算法(NUR)


 第二部分

 

 

 

/*取得在內存中停留最久的頁面,默認狀態下為最早調入的頁面*/
int GetMax(Page *b)
{
int i;
int max=-1;
int tag=0;
for(i=0;i<bsize;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
/*判斷頁面是否已在內存中*/
int Equation(int fold,Page *b)
{
int i;
for(i=0;i<bsize;i++)
{
if (fold==b[i].num)
return i;
}
return -1;
}
/*LRU核心部分*/
void Lruu(int fold,Page *b)
{
int i;
int val;
val=Equation(fold,b);
if (val>=0)
{
b[val].time=0;
for(i=0;i<bsize;i++)
if (i!=val)
b[i].time++;
}
else
{
queue[++K]=fold;/*記錄調入頁面*/
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<bsize;i++)
if (i!=val)
b[i].time++;
}
}
void LRU()
{
int i,j;
K=-1;
Init(b, c);
for(i=0;i<psize;i++)
{
Lruu(pro[i],b);
c[0][i]=pro[i];
/*記錄當前的內存單元中的頁面*/
for(j=0;j<bsize;j++)
c[j][i]=b[j].num;
}
/*結果輸出*/
printf("內存狀態為:\n");
for(j=0;j<psize;j++)
printf("|%2d ",pro[j]);
printf("|\n");
for(i=0;i<bsize;i++)
{ for(j=0;j<psize;j++)
{
if(c[i][j]==-1)
printf("|%2c ",32);
else
printf("|%2d ",c[i][j]);
}
printf("|\n");
}
printf("\n調入隊列為:");
for(i=0;i<K+1;i++)
printf("%3d",queue[i]);
printf("\n缺頁次數為:%6d\n缺頁率:%16.6f",K+1,(float)(K+1)/psize);
}
//主函數
int main()
{
int sel ;
do{

printf(" \t1、產生隨機序列 \n ");
printf(" \t2、最久未使用(LRU) \n ");
printf(" \t3、先進先出(FIFO) \n ");
printf(" \t4、二種算法的比較() \n ");
printf(" \t0、退出(Exit) \n ");
printf("請選擇所要執行的操作(0/1/2/3/4):");
scanf("%d",&sel);
switch(sel)
{
case 0:printf("\t\t\t^-^再見!^-^ \t\t\t\n");system("pause");break;
case 1:build();break;
case 2:printf("最久未使用算\n");LRU();empty();printf("\n");break;
case 3:printf("先進先出算\n");FIFO();empty();printf("\n");break;
case 4:printf("先進先出算法\n");FIFO();empty();
printf("\t");
printf("最久未使用算法\n");LRU();
empty();break;
default: printf("請輸入正確的選項號!");printf("\n\n");break;
}
}while(sel!=0);
return 0;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM