對用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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM