页面替换算法 - LRU

时间:2012-05-19 20:08:27

标签: algorithm

我正在尝试使用此youtube video自学LRU算法。在下面的示例(taken from here)中,为什么将0替换为3.不应该将4替换为3,因为4是最少使用的吗?

enter image description here

4 个答案:

答案 0 :(得分:5)

LRU代表“最近最近已使用”。它基于利用参考的“时间局部性”,即在一段时间内将使用相同内容的想法。

在你的情况下,在当前版本之前的过去三次访问是0 - 4 - 2.这意味着在物理内存中的页面中,0是最近最少使用的,因此它被分页。

答案 1 :(得分:0)

不要混淆LRU和Optimal Replacement Algo的概念。 在上面的堆栈中,在使用4之前使用了0,所以当要进行替换时,最近使用的是0,而4和2也是在堆栈中。

答案 2 :(得分:0)

最近最少使用意味着如果我们有3帧内存并且我们有4 9 7 5.那么4,9和7将被添加到帧中。现在我们要替换第5页。所以我们将在内存中检查哪个页面最近最少使用在我们的案例页面中,第4号是LRU所以我们将用5替换4。

在您的情况下 2是Ist最近使用,4是第2次最近使用,0是最近最少使用所以我们将用3替换0。

答案 3 :(得分: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;
}