最佳页面替换算法

Optimal page replacement algorithm

本文关键字:替换算法 最佳      更新时间:2023-10-16

我正在编写一个程序,它可以执行3个页面替换算法。FIFO、LRU和OPT我假设这里有"需求"寻呼。

我有先进先出,LRU完成。但我不知道如何应对OPT。我提示输入一个正在读取的文件,并逐行解析为类中的pid和ref编号。我也在提示框的大小。

文件的结构如下:

1 45  // 1= pid,  45 = ref
1 46
1 45

对于LRU,我使用第二个阵列来跟踪最近最少使用的带有计数器的插槽。

我只是不知道该为opt做什么。我需要在我正在分析的文件中向前看吗?我需要第二个数组吗?

我正在逐行分析该文件,并将其添加到类中,如下所示。这是我为其他2种算法所做的,需要逐行解析文件并提示帧大小。我可以将文件存储在一个数组中,然后处理数组。

class pagetable
{
public:
int pid;
int ref;
int faults;
pagetable();
};

和在main()中

ifstream inputStream;
cout << "nnt*********** Virtual Memory Management Simulator ***********n";
cout << "n";

while(!done){
pagetable* page = new pagetable[frames];
getFileName(inputStream);//asks for input filename until it is valid
cout << "nEnter in the number of frames:";
cin >> frames;
faults = runsimLFU2(inputStream, page, frames );
int runsimLFU2(ifstream &inputStream, pagetable* page, int frames ){
int i =0;
int j=0;
int pid =0;
int ref = 0;
int index = 0;
int count = 0;
int pagefaults = 0;
int lowest=0;
int counter = 1;
int * LRU;
LRU = new int[frames];

while(1){
inputStream >> pid;  //parse the file line by line
inputStream >> ref;
page[index].pid = pid;   //lets add it... when needed
page[index].ref = ref;

我只是不知道该怎么办,如果我解析文件,缓存已满,文件中的数字不在缓存中,我怎么知道该把它放在哪里?你能用编码术语解释一下吗。

用数组进行编码的方法是什么?我在第二个数组中保留一个计数器吗?有人能解释一下最简单的方法吗?

请记住,该文件可能长达数百行。

不清楚"最优"是什么意思。最优化的替换算法将是无所不知的,并且将提前知道未来页面将被引用的顺序。

如果你假设"需求"分页,你会选择下一个在未来被引用最大距离的页面来替换。

如果你也假设全知全能的预测分页,它可能会变得更复杂——我不知道是否有一个简单的规则。

如果你不假设无所不知,那么"最优"可能是由页面统计数据驱动的,你会选择在统计数据上未来最不可能被引用的页面来替换。

**Optimal Page Replacement Full Program in C Language**
#include<stdio.h>
int main()
{
int frame_size, no_of_pages, flag1, flag2, flag3, i, j, k, pos, max, page_faults = 0, hit = 0;
int pri[20][30], frames[10], pages[30], temp[10];
char x[20];
printf("Enter number of pages: ");
scanf("%d", &no_of_pages);
printf("Enter the pages: ");
for(i = 0; i < no_of_pages; ++i)
{
scanf("%d", &pages[i]);
}
printf("Enter number of frames: ");
scanf("%d", &frame_size);
for(i=0; i< no_of_pages; i++)
{
x[i]='X';
}
for(i = 0; i < frame_size; ++i)
{
frames[i] = -1;
}

for(i = 0; i < no_of_pages; ++i)
{
flag1 = flag2 = 0;
for(j = 0; j < frame_size; ++j)
{
if(frames[j] == pages[i])
{
flag1 = flag2 = 1;
x[i]='*';
break;
}
}
if(flag1 == 0)
{
for(j = 0; j < frame_size; ++j)
{
if(frames[j] == -1)
{
page_faults++;
//x[j]='*';
frames[j] = pages[i];
flag2 = 1;
break;
}
}
}
if(flag2 == 0)
{
flag3 =0;
for(j = 0; j < frame_size; ++j)
{
temp[j] = -1;
for(k = i + 1; k < no_of_pages; ++k)
{
if(frames[j] == pages[k])
{
temp[j] = k;
break;
}
}
}
for(j = 0; j < frame_size; ++j)
{
if(temp[j] == -1)
{
pos = j;
flag3 = 1;
break;
}
}
if(flag3 ==0)
{
max = temp[0];
pos = 0;
for(j = 1; j < frame_size; ++j)
{
if(temp[j] > max)
{
max = temp[j];
pos = j;
}
}
}
frames[pos] = pages[i];
page_faults++;
}
for(j = 0; j < frame_size; j++)
{
pri[j][i]=frames[j];
}
}
for(i = 0 ; i < no_of_pages*5+2*frame_size+1; i ++)
{
printf("-");
}
//              printf("n|Frames |");
printf("n|       |");
for(i=0; i<= 2* no_of_pages + 6; i++)
{
printf(" ");
}
printf("Pages");
for(i=0; i<= 2*no_of_pages + 6; i++)
{
printf(" ");
}
printf("|");
printf("n|Frames |");
for(i = 0 ; i < no_of_pages*5+2*frame_size - 8; i ++)
{
printf("-");
}
printf("n|t|");

for(i=0 ; i < no_of_pages ; i++)
{
printf(" %2d |",pages[i]);
}
printf("n|");
for(i = 0 ; i < no_of_pages*5+2*frame_size + 0; i ++)
{
printf("-");
}
printf("n");

for(i=0;i<frame_size;i++)
{
printf("| %2d",i);
printf("t|");
for(j = 0; j < no_of_pages; j++)
{
if(pri[i][j]== -1)
{
printf("  - |");
}
else
printf(" %2d |",pri[i][j]);
}
printf("n");
}
for(i = 0 ; i < no_of_pages*5+2*frame_size+1; i ++)
{
printf("-");
}
printf("n|       |");
            for(i = 0; i< no_of_pages; i++)
{
if(x[i]=='X')
{
printf("33[0;31m");
printf(" %2c ",x[i]);
printf("33[0m");
printf("|");
}
else
{
printf("33[0;32m");
printf(" %2c ",x[i]);
printf("33[0m");
printf("|");
}
}
//printf("33[0m")
printf("n");
for(i = 0 ; i < no_of_pages*5+2*frame_size+1; i ++)
{
printf("-");
}
hit = no_of_pages-page_faults;

printf("nn Total Page Faults =  Total No of pages - Total Pages hits  n");
printf("                   =        %d      -       %d      n",no_of_pages,hit);
printf("                   =        %d      n",page_faults);
printf("n Total Page Hits = Total No of pages - Total Pages Miss n ");
printf("                =       %d      -       %d      n",no_of_pages,page_faults);
printf("                 =      %d      n",hit);
printf("nTotal Page Fault ratio = Total Page faults / Total pages n");
printf("                       =        %d      /       %d      n",page_faults,no_of_pages);
printf("                       =        %5.2f   n",((float)page_faults/no_of_pages));
printf("nTotal Page Hit ratio = Total Page hits / Total pages n");
printf("                     =      %d      /       %d      n",(no_of_pages-page_faults),no_of_pages);
printf("                     =      %5.2f   n",((float)no_of_pages-page_faults)/no_of_pages);
printf("n");
return 0;
}
**OUTPUT**
[enter image description here][1]

[1]: https://i.stack.imgur.com/qYG6x.png