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

2020-12-13 02:43

阅读:587

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

技术图片技术图片
  1 #include set>
  2 #include   3 #include   4 #include   5 #include   6 #include   7 #include   8 #include   9 #include  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 );                 //  LRU 展示过程
 26 void Print  ( setint> );                 //  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 "  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 1] " " ;
 56     }
 57     fout.close();
 58     // */
 59 
 60     /*
 61     ofstream fout("LRU.txt");
 62     for( Number = 1 ; Number  63         LRU ( cnt , Number );
 64         fout  65     }
 66     fout.close();
 67     */
 68 
 69     /*
 70     ofstream fout("OPT.txt");
 71     for( Number = 1 ; Number  72         OPT ( cnt , Number );
 73         fout  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 
 87     double res =( (double) Cnt / (double ) n ) * 100 ;
 88     /*
 89     cout 90     if( Way == 1 ){
 91         cout  92     }else if( Way == 2 ){
 93         cout  94     }else {
 95         cout  96     }
 97     cout  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  ){
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 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 ) {
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_queueint ,vectorint> , 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  ) {
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){
199         a[i] = rand()%m;
200         //cout 
201     }
202 }
203 void Test ( int Page[] , int n ){
204     //Page = new int [n]();
205     for ( int i=0 ; 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 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 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( setint> 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) {
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


评论


亲,登录后才可以留言!