OSページ置換アルゴリズム
3328 ワード
アドレスマッピング中に、アクセスするページがメモリに含まれていないことがページに表示されると、欠落したページ中断が発生します.欠ページ割り込みが発生した場合、オペレーティングシステムは、呼び出されるページにスペースを空けるために、メモリからページを選択する必要があります.どのページを淘汰するかを選択するためのルールをページ置換アルゴリズムと呼ぶ.
一般的なアルゴリズムには、最適置換アルゴリズム、先進的な先出しアルゴリズム、最近最も長く使用されていないアルゴリズム、clock置換アルゴリズムなどがある.本明細書では、FIFOおよびLRUアルゴリズムを使用します.
海訳翻訳会社
一般的なアルゴリズムには、最適置換アルゴリズム、先進的な先出しアルゴリズム、最近最も長く使用されていないアルゴリズム、clock置換アルゴリズムなどがある.本明細書では、FIFOおよびLRUアルゴリズムを使用します.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
#define PageMAX 12
#define pMAX 10240.0//
int PG[PageMAX];//
int P[PageMAX];//
int py[PageMAX];// /* 1024*/
int page[3][PageMAX]={{-1,-1,-1},{-1,-1,-1},{-1,-1,-1}};// ,NULL
int Q_flag=0;//
int MZ;//
void createPage()
{
int i;
srand(time(NULL));
for(i=0;i<PageMAX;i++)
{
int j;
j=1+(int)(pMAX*rand()/(RAND_MAX+rand()));
PG[i]=j;
P[i]=(int)j/1024;
py[i]=j%1024;
}
}
void LRU()
{
int i,min,j,m,k;
int flag[3]={0,0,0};
MZ=0;
for(i=0;i<PageMAX;i++)
{
printf("%5d",P[i]);
}
putchar(10);
for(i=0;i<PageMAX;i++)
{
min=0;
if(i!=0)
{
for(j=0;j<3;j++)
{
page[j][i]=page[j][i-1];
}
}
for(j=0;j<3;j++)
{
if(page[j][i]==P[i])
{
Q_flag=1;
break;
}
}
if(Q_flag==1)//zhong
{
MZ+=1;
for(k=0;k<3;k++)
flag[k]--;
flag[j]=3;
}
if(Q_flag==0)
{
for(m=0;m<3;m++)
{
if(flag[min]>flag[m])
{
min=m;
// break;
}
}
page[min][i]=P[i];
for(k=0;k<3;k++)
flag[k]--;
flag[min]=3;
}
Q_flag=0;
}
putchar(10);
for(i=0;i<3;i++)
{
for(j=0;j<12;j++)
{
if(page[i][j]!=-1)
printf("%5d",page[i][j]);
else
printf("%5c",32);
}
putchar(10);
}
printf(" :%5d
",MZ);
printf(" :%0.2f%%
",(MZ/(float)PageMAX)*100);
}
void fifo()
{
int i,min,j,k;
int flag[3]={1,0,0};
MZ=0;
for(i=0;i<PageMAX;i++)
{
printf("%5d",P[i]);
}
putchar(10);
for(i=0;i<PageMAX;i++)
{
if(i!=0)
for(j=0;j<3;j++)
{
page[j][i]=page[j][i-1];
}
for(j=0;j<3;j++)
{
if(page[j][i]==P[i])
{
Q_flag=1;
break;
}
}
if(Q_flag==0)
{
int min;
for(k=0;k<3;k++)
{
if(flag[k]==1)
{
min=k;
break;
}
}
page[min][i]=P[i];
int tmp;
tmp=flag[2];
flag[2]=flag[1];
flag[1]=flag[0];
flag[0]=tmp;
}
if(Q_flag==1)
{
MZ+=1;
}
Q_flag=0;
}
putchar(10);
for(i=0;i<3;i++)
{
for(j=0;j<12;j++)
{
if(page[i][j]!=-1)
printf("%5d",page[i][j]);
else
printf("%5c",32);
}
putchar(10);
}
printf(" :%5d
",MZ);
printf(" :%0.2f%%
",(MZ/(float)PageMAX)*100);
}
int main()
{
int i;
createPage();
printf("********************************************
");
printf(" ( :1024B):
");
printf(" :
");
for(i=0;i<PageMAX;i++)
printf("%6d",PG[i]);
putchar(10);
printf(" :
");
for(i=0;i<PageMAX;i++)
printf("%5d",py[i]);
putchar(10);
printf(" :
");
for(i=0;i<PageMAX;i++)
printf("%5d",P[i]);
putchar(10);
printf("FIFO :
");
fifo();
putchar(10);
printf("LRU :
");
LRU();
putchar(10);
return 0;
}
海訳翻訳会社