我正在编写一个执行3页替换算法的程序。 FIFO,LRU和OPT 我在这里假设“需求”分页。
我有FIFO,LRU完成了。但我不知道如何解决OPT问题。 我提示输入一个我正在阅读的文件并逐行解析为pid和一个类中的ref编号。我也提示画框大小。
文件的结构如下:
1 45 // 1= pid, 45 = ref
1 46
1 45
对于LRU,我使用第二个数组来跟踪最近最少使用的计数器插槽。
我只是不确定如何选择。我需要在文件中向前看我正在解析吗? 我需要第二个阵列吗?
我正在逐行解析文件并将其添加到类中,如下所示。这是我为其他2个算法所做的,需要逐行解析文件并提示帧大小。我可以将文件存储在一个数组中,然后处理数组。
class pagetable
{
public:
int pid;
int ref;
int faults;
pagetable();
};
并在main()
中ifstream inputStream;
cout << "\n\n\t*********** 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;
我只是不确定当我解析文件并且缓存已满并且文件中的数字不在缓存中时我该怎么办?我怎么知道放在哪里?你能用编码术语解释一下吗?
用数组编码是怎么回事?我在第二个阵列中保留一个计数器吗? 有人可以解释最简单的方法吗?
请记住,该文件可能长达数百行。
答案 0 :(得分:0)
不清楚“最佳”是什么意思。最优化的替换算法将是无所不知的,并且将事先知道将来的页面将被引用的顺序。
如果您正在假设“需求”分页,那么您将选择替换将在下一次引用最远距离的页面。
如果你还假设无所不知的预测性分页,它可能会变得更复杂 - 我不知道是否有一个简单的规则。
如果你不假设全知,那么“最佳”可能是由分页统计推动的,而你选择替换将来最不可能引用的页面。
答案 1 :(得分:0)
**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("\033[0;31m");
printf(" %2c ",x[i]);
printf("\033[0m");
printf("|");
}
else
{
printf("\033[0;32m");
printf(" %2c ",x[i]);
printf("\033[0m");
printf("|");
}
}
//printf("\033[0m")
printf("\n");
for(i = 0 ; i < no_of_pages*5+2*frame_size+1; i ++)
{
printf("-");
}
hit = no_of_pages-page_faults;
printf("\n\n 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