我正在尝试使用此youtube 视频自学 LRU 算法。在下面的示例中(取自此处)为什么 0 被 3 替换。不应该将 4 替换为 3,因为 4 是最少使用的吗?
问问题
8006 次
4 回答
5
LRU 代表“最近最少使用”。它基于利用参考的“时间局部性”,即认为相同的东西将在一段时间内使用。
在您的情况下,当前访问之前的过去三个访问是 0 - 4 - 2。这意味着在物理内存中的页面中,0 是最近最少使用的,因此它被分页。
于 2012-05-19T20:12:30.427 回答
0
不要混淆 LRU 和最优替换算法的概念。在上面的堆栈中,在使用 4 之前使用了 0,因此当要进行替换时,最近使用的是 0,而堆栈中也使用了 4 和 2。
于 2013-09-25T06:14:32.730 回答
0
最近最少使用意味着如果我们有 3 帧内存并且我们有页面 4 9 7 5。所以 4、9 和 7 将被添加到帧中。现在我们要替换第 5 页。因此,我们将检查内存中哪个页面最近最少使用,在我们的案例中,第 4 页是 LRU,因此我们将用 5 替换 4。
在您的情况下,2 是最近使用的,4 是最近使用的第二个,0 是最近最少使用的,所以我们将用 3 替换 0。
于 2013-11-09T11:39:06.397 回答
0
页面替换算法 LRU(最近最少使用) C 语言代码
#include<stdio.h>
int findLRU(int time[], int n);
int main()
{
int frame_size, no_of_pages, counter = 0, flag1,f, flag2, i, j, m, pos, page_faults = 0;
int frames[10], pages[30], time[10], pri[20][20];
char x[20];
float fault_ratio,hit_ratio;
printf("Enter Total number of pages: ");
scanf("%d", &no_of_pages);
printf("Enter value of page number: ");
printf("\n");
for(i = 0; i < no_of_pages; i++)
{
scanf("%d", &pages[i]);
}
printf("\n");
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] = 0;
}
for(i = 0; i < no_of_pages; ++i)
{
flag1 = flag2 = 0;
for(j = 0; j < frame_size; ++j)
{
if(frames[j] == pages[i])
{
counter++;
time[j] = counter;
flag1 = flag2 = 1;
page_faults--;
x[i]='*';
page_faults++;
break;
}
}
if(flag1 == 0)
{
for(j = 0; j < frame_size; ++j)
{
if(frames[j] == 0)
{
counter++;
page_faults++;
frames[j] = pages[i];
time[j] = counter;
flag2 = 1;
break;
}
}
}
if(flag2 == 0)
{
pos = findLRU(time, frame_size);
counter++;
page_faults++;
frames[pos] = pages[i];
time[pos] = counter;
}
for(j = 0; j < frame_size; j++)
{
pri[j][i]=frames[j];
}
}
printf("\n");
for(i = 0 ; i <no_of_pages*5+2*frame_size+1; i ++)
{
printf("-");
}
printf("\n| |");
for(i=1;i<=(no_of_pages*4)/2;i++)
{
printf(" ");
}
printf("Pages");
for(i=(no_of_pages*4)/2;i<=(no_of_pages*4)+13;i++)
{
printf(" ");
}
printf("|\n");
printf("|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+1 ; i ++)
{
printf("-");
}
printf("\n");
for(i=0;i<frame_size;i++)
{
printf("| %3d",i);
printf("\t|");
for(f=0;f<no_of_pages;f++)
{
if(pri[i][f]==0)
{
printf(" - |");
}
else
{
printf(" %2d |",pri[i][f]);
}
}
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("\n");
for(i = 0 ; i < no_of_pages*5+2*frame_size+1; i ++)
{
printf("-");
}
printf("\n\n Total Page Faults = Total No of pages - Total Pages hits \n");
printf(" = %d - %d \n",no_of_pages,(no_of_pages-page_faults));
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",(no_of_pages-page_faults));
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);
return 0;
}
int findLRU(int time[], int n)
{
int i, minimum = time[0], pos = 0;
for(i = 1; i < n; ++i)
{
if(time[i] < minimum)
{
minimum = time[i];
pos = i;
}
}
return pos;
}
于 2020-01-08T03:55:49.850 回答