码迷,mamicode.com
首页 > 编程语言 > 详细

FIFO、LRU、OPT三种置换算法之间的性能比较

时间:2019-06-19 10:44:29      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:页面   算法   置换   管理   命中率   生成   fstream   sed   com   

技术图片
  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

代码如上

FIFO、LRU、OPT三种置换算法之间的性能比较

标签:页面   算法   置换   管理   命中率   生成   fstream   sed   com   

原文地址:https://www.cnblogs.com/Osea/p/11049862.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!