FIFOLRUOPT三种置换算法之间的性能比较

Posted osea

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FIFOLRUOPT三种置换算法之间的性能比较相关的知识,希望对你有一定的参考价值。

技术图片
  1 #include <set>
  2 #include <ctime>
  3 #include <queue>
  4 #include <cstdio>
  5 #include <utility>
  6 #include <cstdlib>
  7 #include <iomanip>
  8 #include <iostream>
  9 #include <fstream>
 10 #define sec second
 11 using namespace std;
 12 typedef pair <int,int> PII;
 13 int * Count;
 14 typedef struct CMP 
 15     bool operator () (int U,int V)
 16         return Count[U] < Count[V] ;
 17     
 18 CMP;
 19 
 20 void Menu   ( );                          //  程序菜单
 21 void Test   ( int [] , int );             //  文件读入测试
 22 void Random ( int [] , int ,int );        //  随机生成数组
 23 void Print  ( int [] ,int ,int);          //  显示原数组的值
 24 void Print  ( int [] ,int ,int ,int );    //  FIFO 展示过程
 25 void Print  ( set<PII> );                 //  LRU 展示过程
 26 void Print  ( set<int> );                 //  OPT 展示过程
 27 void FIFO   ( int ,int ) ;                // "先进先出"(FIFO)页面置换算法
 28 void LRU    ( int ,int ) ;                // "最近最久未使用"(LRU)页面置换算法
 29 void OPT    ( int ,int ) ;                // "最佳"(OPT)页面置换算法
 30 void Compute( int , int , int );          //  计算不同页面置换算法的命中率
 31 
 32 int a[100050];
 33 int b[500][4];
 34 int Number = 0 ;
 35 int main()
 36 
 37     ifstream fin ("test.txt");
 38     //FILE *p=fopen("test.txt","r");
 39     int cnt = 0 ;
 40     while ( fin >> a[cnt] ) 
 41         cnt ++ ;
 42     
 43     //fclose (p);
 44     cout << "Cnt " << cnt << endl ;
 45 
 46     /*Test
 47       FIFO , LRU , OPT
 48     */
 49     //Menu();
 50 
 51     // /*
 52     ofstream fout("FIFO.txt");
 53     for( Number = 1 ; Number <= 100 ; Number ++ )
 54         FIFO ( cnt , Number );
 55         fout << b[Number][1] << " " ;
 56     
 57     fout.close();
 58     // */
 59 
 60     /*
 61     ofstream fout("LRU.txt");
 62     for( Number = 1 ; Number <= 100 ; Number ++ )
 63         LRU ( cnt , Number );
 64         fout << b[Number][2] << " " ;
 65     
 66     fout.close();
 67     */
 68 
 69     /*
 70     ofstream fout("OPT.txt");
 71     for( Number = 1 ; Number <= 100 ; Number ++ )
 72         OPT ( cnt , Number );
 73         fout << b[Number][3] << " ";
 74     
 75     fout.close();
 76     */
 77     /*
 78     FIFO( cnt , 25 );
 79     LRU ( cnt , 25 );
 80     OPT ( cnt , 25 );
 81      */
 82     return 0;
 83 
 84 
 85 void Compute(int Cnt , int n ,int Way )
 86     //cout << "—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·—·" << endl ;
 87     double res =( (double) Cnt / (double ) n ) * 100 ;
 88     /*
 89     cout<<setiosflags(ios::fixed)<<setprecision(2);
 90     if( Way == 1 )
 91         cout << "\"先进先出\"(FIFO)页面置换算法的命中率为: " ;
 92     else if( Way == 2 )
 93         cout << "\"最近最久未使用\"(LRU)页面置换算法的命中率为" ;
 94     else 
 95         cout << "\"最佳\"(OPT)页面置换算法的命中率为" ;
 96     
 97     cout << res << "%" << endl;
 98     */
 99     b[ Number ][Way] = res ;
100 
101 
102 void FIFO ( int n,int m )                  // "先进先出"(FIFO)页面置换算法
103                                             //  初始化
104     int *page = new int [n]();
105     int *Visit = new int [n]();
106     int *Queue = new int [m+1]();
107     int Q_Front = 0 , Q_Rear = 0 , Cnt = 0 ;
108 
109     //Random( page , n , 500 );
110     Test(page , n );
111     //Print( page , n ,1);                      //  打印页面访问序列
112 
113     for ( int i = 0 ; i < n ; i++ )
114         if( Visit[ page[i] ] ==  0 )       // 当前页面是否在内存中
115             Visit[ page[i] ] = 1 ;
116                                             // 如果当前的内存满,使用FIFO算法调出
117             if( ( Q_Rear + 1 )%( m+1 ) == Q_Front )
118                 Visit[ Queue[Q_Front] ] = 0 ;
119                 Q_Front = ( Q_Front + 1 ) % ( m+1 ) ;
120             
121             Queue[ Q_Rear ] = page[i] ;     //  调入访问的页面
122             Q_Rear = ( Q_Rear + 1 ) % ( m+1 );
123         else                              //  如果在内存中,统计命中次数
124             Cnt ++ ;
125         
126         //Print( Queue , Q_Front , Q_Rear , m );
127     
128     Compute( Cnt, n , 1 );         //  计算命中率
129 
130 void LRU ( int n , int m )         // "最近最久未使用"(LRU)页面置换算法
131                                     //  初始化
132     int *page = new int[n]();
133     int *Visit = new int[n]();
134     int Cnt = 0 ;
135     set<PII> S;
136 
137     //Random( page , n , 500 );
138     Test(page , n );
139     //Print(page, n ,2 );                 //  打印页面访问序列
140     PII tmp;
141     for (int i = 0; i < n; i++) 
142         int Size = S.size();
143         if ( Visit[page[i]] == 0 )     //  当前页面是否在内存中
144             Visit[page[i]] = i + 1 ;
145                                         //  如果当前的内存满,使用LRU算法调出
146             if ( Size == m ) 
147                 tmp = *(S.begin());
148                 Visit[ tmp.sec ] = 0;
149                 S.erase(tmp);
150             
151             tmp = make_pair(i + 1, page[i]);
152             S.insert(tmp);
153          else                         //  如果在内存中,统计命中次数
154             tmp = make_pair( Visit[page[i]], page[i] );
155             S.erase(tmp);
156             tmp = make_pair( i + 1, page[i] );
157             Visit[ page[i] ] = i+1 ;
158             S.insert(tmp);
159             Cnt ++ ;
160         
161         //Print(S);
162     
163     Compute( Cnt, n , 2 );             //  计算命中率
164 
165 void OPT( int n , int m )          //  "最佳"(OPT)页面置换算法
166                                     //  初始化
167     int *page = new int [n]();
168     int Cnt = 0 ;
169     Count = new int [n+1]();
170     set < int > S ;
171     srand(time(0));
172     priority_queue< int ,vector<int> , CMP > Q;
173 
174     //Random( page , n , 500 );
175     Test(page , n );
176     //Print( page , n ,3 );                  //打印页面访问序列
177     int tmp ;
178     for( int i = 0 ; i < n ; i++ ) 
179         int Size = S.size();
180         Count[ page[i] ] -- ;
181         if( S.find(page[i]) == S.end() )   //当前页面是否在内存中
182             if( Size == m )                //如果当前的内存满,使用OPT算法调出
183                 tmp = Q.top( );
184                 S.erase( tmp );
185                 Q.pop( );
186             
187             S.insert( page[i] );
188             Q.push( page[i] );
189         else                              //如果在内存中,统计命中次数
190             S.insert( page[i] );
191             Cnt ++ ;
192         
193         //Print(S);
194     
195     Compute( Cnt , n , 3 );                 //计算命中率
196 
197 void Random ( int a[] , int n , int m = 500 )
198     for (int i=0;i<n;i++)
199         a[i] = rand()%m;
200         //cout << a[i] << endl ;
201     
202 
203 void Test ( int Page[] , int n )
204     //Page = new int [n]();
205     for ( int i=0 ; i<n ; i++ )
206         Page[i] = a[i] ;
207     
208 
209 
210 void Menu()
211     int Ins , n , m ;
212     while(1)
213         puts("\n\n#############################");
214         puts("#\t\t\t\t\t\t\t#");
215         puts("#\t存储管理之虚拟存储器实现\t#");
216         puts("#\t1.执行先进先出算法\t\t\t#");
217         puts("#\t2.执行最近最久未使用算法\t#");
218         puts("#\t3.执行最佳算法\t\t\t#");
219         puts("#\t4.退出程序\t\t\t\t#");
220         puts("#\t\t\t\t\t\t\t#");
221         puts("#############################");
222         puts("请输入你需要执行的操作(序号):");
223         scanf("%d",&Ins);
224         if( 1 <= Ins && Ins <= 3 )
225             cout << " Please input N : " << endl;
226             cin >> n ;
227             cout << " Please input M : " << endl;
228             cin >> m ;
229         
230         switch ( Ins )
231             case 1 : FIFO(n,m);     break;
232             case 2 : LRU(n,m);      break;
233             case 3 : OPT(n,m);      break;
234             case 4 : exit(0);
235             default:
236                 puts("输入有误请重新输入");break;
237         
238     
239 
240 
241 void Print( int Q[] , int F , int R , int m )// FIFO 展示过程
242 
243 
244     cout << " ( " ;
245     for ( int i = F ; i != R ; i = (i+1) % (m+1) )
246         if( i != F ) cout << ",";
247         cout << Q[i] ;
248     
249     cout << " ) " << endl;
250 
251 
252 void Print( set<PII> S)                     // LRU 展示过程
253     int Size = S.size() ;
254     int i = 1 ;
255     cout << " ( ";
256     for( auto X : S )
257         cout << X.sec ;
258         if( i != Size )
259             cout <<",";
260         
261         i++;
262     
263     cout << " ) " << endl ;
264 
265 
266 void Print( set<int> S )                    // OPT 展示过程
267     int Size = S.size() ;
268     int i = 1 ;
269     cout << " ( ";
270     for( auto X : S )
271         cout << X ;
272         if( i != Size )
273             cout <<",";
274         
275         i++;
276     
277     cout << " ) " << endl ;
278 
279 
280 void Print( int A[] , int size ,int No)      // 显示原数组的值
281     cout << " 随机生成页面访问序列: " << endl ;
282     for(int i=0;i<size;i++) 
283         printf("%d%c",A[i],i==size-1?\n: );
284     
285     if( No == 1 ) 
286         cout << "—·—·—·—·—·—·—\"先进先出\"(FIFO)页面置换算法·—·—·—·—·—·—·—·—·" << endl;
287     else if ( No == 2 )
288         cout << "—·—·—·—·—·—·—\"最近最久未使用\"(LRU)页面置换算法·—·—·—·" << endl;
289     else 
290         cout << "—·—·—·—·—·—·—\"最佳\"(OPT)页面置换算法·—··—·—·—·—·" << endl;
291     
292 
View Code

代码如上

以上是关于FIFOLRUOPT三种置换算法之间的性能比较的主要内容,如果未能解决你的问题,请参考以下文章

深入理解缺页中断及FIFOLRUOPT这三种置换算法

深入理解缺页中断及FIFOLRUOPT这三种置换算法

FIFOLRUOPT页面调度算法及样例

操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。

操作系统概念 页面置换算法:分别使用FIFOOPTLRU三种置换算法来模拟页面置换的过程。

C#窗体模拟三种页面置换算法(OPT,FIFO,LRU)