zoukankan      html  css  js  c++  java
  • 对用LRU和FIFO算法计算“缺页中断”的理解

    输入缺页次数页面流:

    0 1 2 3 2 1 3 2 5 2 3 6 2 1 4 2 FIFO

    分析:
    012發別調入內存, 則內存:012(3次缺頁)
    調入3逃汰最先進入的0,則內存:123(4次缺頁)
    調入2來命中,則內存:123(內存中有2不缺頁)
    調入1來命中,則內存:123(內存中有1不缺頁)
    調入3來命中,則內存:123(內存中有3不缺頁)
    調入5逃汰最先進入的1,則內存:235(5次缺頁)
    2,3別別命中,則內存:235
    調入6逃汰最先進入的,則內存:356(6次缺頁)
    調入2逃汰最先進入的,則內存:562(7次缺頁)
    調入1逃汰最先進入的,則內存:621(8次缺頁)
    最后2命中,
    所以缺页8次

    =============================

    在LRU算法中,最近最少使用的页面被先换出

    输入:7 
    写出LRU算法实现页面更换,并给出缺页次数.(设在内存中占四个页架)
    分析:1题目给了访问串7 
           2题目给了内存中占四个页架
           3题目给了用LRU算法来实现。
    要求:画出算法实现。
    LRU
    给出行                     0

    头----->          2  0  3  0  4  2  3  0  3  2  1  2  0  1  7  0
                      1  2  0  3  0  4  2  3  0  3  2  1  2  0  1  7
                      0  1  2  2  3  0  4  2  2  0  3  3  1  2  0  1
    底----->          7  7  1  1  2  3  0  4  4  4  0  0  3  3  2  2

    淘汰出内存的页面:       7     1                 4           3

    整个的表格是怎么来的呢?请注意:
    题目给了7, 写7;
    题目给了0,写0, 7下一格;
    题目给了1, 写1,0下一格;
    题目给了2, 写2,1下一格;
    注意:已经四个了从上到下是:2107
    达到了2的要求:内存中占四个页架。
    至此与FIFO没有什么两样。接着:

    题目给了0, 寻找  有0,FIFO的不写不变,变成了0调到最上面
    题目给了3, 寻找没有3,写3,最底7的淘汰,现在是3021,发生了一次缺页中断,记下7;一样。
    题目给了0, 寻找  有0,0调到最上面,0321
    题目给了4, 寻找没有4,写4,最底1的淘汰,发生了一次缺页中断,记下1;4032
    题目给了2, 寻找  有2,2调到最上面,2403
    题目给了3, 寻找  有3,3调到最上面;3240
    题目给了0, 寻找  有0,0调到最上面;0324
    题目给了3, 寻找  有3,3调到最上面;3024
    题目给了2, 寻找  有2,2调到最上面  2304
    题目给了1, 寻找没有1,写1,最底4的淘汰,发生了一次缺页中断,记下4;1230
    题目给了2, 寻找  有2,2调到最上面 2130
    题目给了0, 寻找  有0,0调到最上面 0213 
    题目给了1, 寻找  有1,1调到最上面 1023
    题目给了7, 寻找没有7,写7,最底3的淘汰,发生了一次缺页中断,记下3;7102
    题目给了0,寻找  有0,0调到最上面 0712
    至此整个表格都做好了。详尽吧。再不会的要打屁屁了。

    计算  缺页中断率:
    缺页中断次数(先填空的+淘汰的次数)除以页面引用次数。(就是人家给你的数的总数)*100%
    (4+4)/19*100%=42.3%
    好了。都完成了。

    三句话总结:
    lru算法是也从上往下放数字,
    有的调到最上面,(就这点与FIFO不同)
    没有的就把最下面的挤出去(淘汰,发生缺页中断)

    上面码的过程有些小失误,不过过程能理解就行,下面是用C++实现的代码:

      1 #include <iostream>
      2 using namespace std;
      3 
      4 int exit (int queue[],int head,int tail,int num);//返回在数组中的位置
      5 void show (int queue[],int head,int tail);
      6 void FIFO (int in[],int length);
      7 void LRU (int in[],int length);
      8 #define Len 100
      9 int memory[Len];
     10 
     11 int main()
     12 {
     13     int in[16]={0,1,2,3,2,1,3,2,5,2,3,6,2,1,4,2};
     14     int in2[19]={7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0};
     15     FIFO(in,16);
     16     cout<<endl<<endl<<endl;
     17     LRU(in2,19);
     18     return 0;
     19 }
     20 
     21 
     22 int exit (int queue[],int head,int tail,int num)
     23 {
     24     int i;
     25     for( i=head;i<tail;i++)
     26     {
     27         if(queue[i] == num)
     28         return i;
     29     }
     30     if(i == tail)//判别写错了
     31     return -1;
     32 }
     33 void show (int queue[],int head,int tail)
     34 {
     35     for(int i=head;i<tail;i++)
     36     cout<<queue[i]<<"  ";
     37 }
     38 void FIFO (int in[],int length)
     39 {
     40     int tail = 0;
     41     int head = 0;
     42     int target = 0;
     43     for(int i=0;i<length;i++)
     44     {
     45         if(tail - head - 3 == 0)
     46         {
     47             //cout<<"FIFO中输出头尾";
     48             //cout<<"tail = "<<tail<<"    "<<"head = "<<tail<<"      tail - head = "<<tail - head<<endl;
     49             if(exit(memory,head,tail,in[i]) > -1)//内存中存在in[i]
     50             {
     51                 cout<<in[i]<<"命中,命中次数:"<<++target<<endl;
     52             }
     53             else
     54             {
     55                 memory[tail++] = in[i];
     56                 cout<<in[i]<<"调入内存,"<<memory[head++]<<"调出内存,内存为";
     57                 show(memory,head,tail);
     58                 cout<<"缺页次数为"<<tail<<endl;
     59             }
     60         }
     61         else
     62         {
     63             memory[tail++] = in[i];
     64             cout<<in[i]<<"调入内存,内存为";
     65             show(memory,head,tail);
     66             cout<<"缺页次数"<<tail<<endl;
     67         }
     68     }
     69     cout<<"缺页次数"<<tail<<endl<<"命中次数"<<target<<endl;
     70 }
     71 
     72 void LRU(int in[],int length)
     73 {
     74     int tail = 0;
     75     int head = 0;
     76     for(int i=0;i<length;i++)
     77     {
     78         if(tail - head - 4 == 0)
     79         {
     80             if(exit(memory,head,tail,in[i]) > -1)//内存中存在in[i]
     81             {
     82                 int local = exit(memory,head,tail,in[i]);
     83                 int temp = memory[local];
     84                 int j;
     85                 for(j=local;j<tail-1;j++)
     86                     memory[j] = memory[j+1];
     87                 memory[j] = temp;
     88 
     89                 cout<<in[i]<<"命中,内存为:";
     90                 show(memory,head,tail);
     91                 cout<<endl;
     92             }
     93             else
     94             {
     95                 memory[tail++] = in[i];
     96                 cout<<memory[head++]<<"淘汰,"<<in[i]<<"调入内存,内存为";
     97                 show(memory,head,tail);
     98                 cout<<"缺页中断次数为"<<tail<<endl;
     99             }
    100         }
    101         else
    102         {
    103             memory[tail++] = in[i];
    104             cout<<in[i]<<"调入内存,内存为";
    105             show(memory,head,tail);
    106             cout<<"缺页中断次数为"<<tail<<endl;
    107         }
    108     }
    109 }
  • 相关阅读:
    Intellij IDEA + Jrebel
    WebConfig配置详解大全
    .Net 获取前端传递的数据
    js 格式验证大全
    EasyUI DataGrid 时间格式化、字符串长度截取
    SQL取某个字符串最后一次出现的位置后面的字符串方法
    公民身份号码校验码算法(C#版)
    组织机构代码校验码生成算法(C#版)
    MySQL实现根据当前ID读取上一条和下一条记录
    js jquery.pagination.js分页
  • 原文地址:https://www.cnblogs.com/freeyiyi1993/p/3084956.html
Copyright © 2011-2022 走看看