輸入缺頁次數頁面流:
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 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0
寫出LRU算法實現頁面更換,並給出缺頁次數.(設在內存中占四個頁架)
分析:1題目給了訪問串7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0
2題目給了內存中占四個頁架
3題目給了用LRU算法來實現。
要求:畫出算法實現。
LRU
給出行 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 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 }