【问题标题】:Page replacement algorithm - LRU页面替换算法 - LRU
【发布时间】:2023-04-05 08:09:02
【问题描述】:

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

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    LRU 代表“最少最近使用”。它基于利用参考的“时间局部性”,即认为相同的东西将在一段时间内使用。

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

    【讨论】:

    • 谢谢,这个概念我明白了
    【解决方案2】:

    不要混淆 LRU 和最优替换算法的概念。 在上面的堆栈中,在使用 4 之前使用了 0,因此当要进行替换时,最近使用的是 0,而堆栈中也有 4 和 2。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        页面替换算法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;
        }
        

        【讨论】:

          猜你喜欢
          • 2013-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多