最佳页面替换算法
Optimal page replacement algorithm
我正在编写一个程序,它可以执行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
相关文章:
- 打印所有儿童树元素的最佳算法?
- 使用 Rcpp 加速替换迭代算法中的列表和向量元素是否合法?
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 从整数向量向量搜索整数向量的最佳算法
- 替换枚举以最大化编译时间检查的最佳方法
- 查找和替换子阵列的最佳方法
- 绘制线条的最佳算法
- 为一群追逐兔子的狐狸创建蜂群算法的最佳方法
- 最佳地将窗口标题替换为新的 QString
- 找到多组对象的最佳匹配的算法
- 从QTcpSocket上的数据流中连续运行复杂算法的最佳Qt线程解决方案是什么
- 比较阵列相似性的最佳比较算法是什么?
- 在 c++ 中用 '1' 替换整数'0'的最佳方法是什么
- 最佳页面替换算法
- 实施第二次机会需求页面替换算法
- 正在寻找元组替换算法
- 搜索子集、算法(最佳或启发式)
- 时钟分页替换算法
- 最近未使用 (NUR) 页面替换算法