您的位置:首页 > 其它

【转载】对用LRU和FIFO算法计算“缺页中断”的理解

2015-04-02 14:22 489 查看

输入缺页次数页面流:

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 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: