當前位置:編程學習大全網 - 編程語言 - 壹個程序的頁面走向,FIFO和LRU頁面置換算法

壹個程序的頁面走向,FIFO和LRU頁面置換算法

#include"stdio.h"

#include"stdlib.h"

#include"time.h"

void FIFO(void);

void LRU(void);

char a;

int m=4,n=12,i,y[12]={1,2,3,4,1,2,5,1,2,3,4,5}; /*m為物理塊數,n為要訪問的頁面數*/

typedef struct page{

int num;

int time;

}Page;

Page x[10];

int GetMax(page *x) /*求出那個物理塊中的頁面呆的時間最長,返回物理塊號*/

{

int i;

int max=-1;

int tag=0;

for(i=0;i<m;i++)

{

if(x[i].time>max)

{ max=x[i].time;

tag=i;

}

}

return tag;

}

void Xunhuan()

{

printf("Please select 1:FIFO算法\n 2:LRU算法\n");

scanf("%s",&a);

printf("物理塊數:4\n");

//scanf("%d",&m);

for(i=0;i<m;i++) /*將空的物理塊中數據置為-1*/

{

x[i].num=-1;

}

printf("所要訪問的頁面數:12\n");

//scanf("%d",&n);

//srand(time(NULL));

printf("所要訪問的頁面號序列為:");

for(i=0;i<n;i++)

printf("%d ",y[i]);

printf("\n");

printf("頁面置換步驟如下:\n");

switch(a)

{

case '1':FIFO();break;

case '2':LRU(); break;

}

}

void main()

{

char a;

Xunhuan();

while(1)

{

printf("Continue or Exit:C/Anykey:\n");

scanf("%s",&a);

if(a=='c'||a=='C')

Xunhuan();

else break;

}

exit(0);

}

void FIFO(void)

{

int i,j,u;

for(i=0;i<m;i++)

x[i].time=0;

x[0].num=y[0];

x[0].time=1;

printf(" %d \n",x[0].num);

for(i=1;i<n;i++)

{ u=0;

for(j=0;j<m;j++)

if(x[j].num==y[i])

{

u=1;

break;

}

if(u!=1&&x[m-1].num!=-1)

{

j=GetMax(x);

x[j].num=y[i];

x[j].time=0;

}

if(u!=1&&x[m-1].num==-1)

{

for(j=0;j<m;j++)

{

if(x[j].num==-1)

{x[j].num=y[i];

break;}

}

}

for(j=0;j<m;j++)

if(x[j].num!=-1)

x[j].time++;

for(j=0;j<m;j++)

if(x[j].num==-1)

printf("%2c ",32);

else

printf("%2d ",x[j].num);

printf("\n");

}

}

void LRU()

{

int i,j,u;

for(i=0;i<m;i++)

x[i].time=0;

x[0].num=y[0];

x[0].time=1;

printf(" %d \n",x[0].num);

for(i=1;i<n;i++)

{ u=0;

for(j=0;j<m;j++)

if(x[j].num==y[i]) /*物理塊中存在相同頁面*/

{

x[j].time=0; /*將相同的物理塊的time置為0*/

u=1;

break;

}

if(u!=1&&x[m-1].num!=-1) /*物理塊中無相同頁面且物理塊已填滿*/

{

j=GetMax(x);

x[j].num=y[i];

x[j].time=0; /*將剛替換的頁面所在的物理塊time置為0*/

}

if(u!=1&&x[m-1].num==-1) /*物理塊中無相同頁面且物理塊未填滿*/

{

for(j=0;j<m;j++)

{

if(x[j].num==-1)

{x[j].num=y[i];

break;}

}

}

for(j=0;j<m;j++)

if(x[j].num!=-1)

x[j].time++; /*每執行完壹次time加1*/

for(j=0;j<m;j++)

if(x[j].num==-1)

printf("%2c ",32);

else

printf("%2d ",x[j].num);

printf("\n"); /*格式化輸出*/

}

}

  • 上一篇:橢圓編程數控
  • 下一篇:數控切削工藝的走刀路線的規劃方案是什麽?
  • copyright 2024編程學習大全網