頁面置換算法的模擬實現 C


  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 /*全局變量*/
  5 int mSIZE; /*物理塊數*/
  6 int pSIZE; /*頁面號引用串個數*/
  7 static int memery[10]={0}; /*物理塊中的頁號*/
  8 static int page[100]={0}; /*頁面號引用串*/
  9 static int temp[100][10]={0}; /*輔助數組*/
 10 
 11 /*置換算法函數*/
 12 void FIFO();
 13 void LRU();
 14 void OPT();
 15  
 16 /*輔助函數*/
 17 void print(unsigned int t);
 18 void designBy();
 19 void download();
 20 void mDelay(unsigned int Delay);
 21 
 22 /*主函數*/
 23 int main()
 24 {
 25     int i,k,code;
 26 //    system("color 0E");
 27     designBy();
 28     printf("按任意鍵開啟功能");
 29 //    printf(" >>>");
 30     getchar();
 31     system("cls");
 32 //    system("color 0E");
 33     
 34 
 35     printf("請輸入引用串的個數(M<=10):");
 36     scanf("%d",&pSIZE);
 37     printf("請輸入物理塊的個數(M<=10):");
 38     scanf("%d",&mSIZE);
 39     puts("請依次輸入頁面號引用串(連續輸入,無需隔開):");
 40     for(i=0;i<pSIZE;i++)
 41         scanf("%1d",&page[i]);
 42     download();
 43     system("cls");
 44 //    system("color 0E");
 45     do{ 
 46         puts("輸入的頁面號引用串為:");
 47         for(k=0;k<=(pSIZE-1)/20;k++)
 48         {
 49             for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
 50             {
 51                 if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
 52                     printf("%d\n",page[i]);
 53                 else
 54                     printf("%d   ",page[i]);
 55             }
 56         }
 57         printf("* * * * * * * * * * * * * * * * * * * * * * *\n");
 58         printf("* 請選擇頁面置換算法:\t\t\t    *\n");
 59         printf("* ----------------------------------------- *\n");
 60         printf("* 1.先進先出(FIFO)    2.最近最久未使用(LRU) *\n");
 61         printf("* 3.最佳(OPT)         4.退出                *\n");
 62         printf("* * * * * * * * * * * * * * * * * * * * * * *\n");
 63         printf("請選擇操作:[ ]\b\b");
 64         scanf("%d",&code);
 65         switch(code)
 66         {
 67         case 1:
 68             FIFO();
 69             break;
 70         case 2:
 71             LRU();
 72             break;
 73         case 3:
 74             OPT();
 75             break;
 76         case 4:
 77             system("cls");
 78 //            system("color 0C");
 79             designBy(); /*顯示設計者信息后退出*/
 80             printf("謝謝使用頁面置換算法演示器!            \n");
 81             exit(0);
 82         default:
 83             printf("輸入錯誤,請重新輸入:");
 84         }
 85         printf("按任意鍵重新選擇置換算法:>>>");
 86         getchar();
 87         system("cls");
 88     }while (code!=4);
 89     getchar();
 90 }
 91 
 92 /*載入數據*/
 93 void download()
 94 {
 95     int i;
 96     system("color 0B");
 97     printf("正在載入數據,請稍候 !!!\n");
 98     printf("Loading...\n");
 99     printf("                                                  O");
100     for(i=0;i<51;i++)
101         printf("\b");
102     for(i=0;i<50;i++)
103     {
104         mDelay((pSIZE+mSIZE)/2);
105         printf(">");
106     }
107     printf("\nFinish.\n載入成功,按任意鍵進入置換算法選擇界面:>>>");
108     getchar();
109 }
110 
111 /*設置延遲*/
112 void mDelay(unsigned int Delay)
113 { 
114     unsigned int i; 
115     for(;Delay>0;Delay--) 
116     {   
117         for(i=0;i<124;i++) 
118         {
119             printf(" \b");
120         } 
121     } 
122 }
123 
124 /*顯示設計者信息*/ 
125 void designBy()
126 {
127     
128     printf("          課題:頁面置換算法的模擬實現                \n");
129     printf("               學號:1610704202                       \n");
130     printf("                   姓名:xxx                     \n");
131 }
132 
133 
134 void print(unsigned int t)
135 {
136     int i,j,k,l;
137     int flag;
138     for(k=0;k<=(pSIZE-1)/20;k++)
139     {
140         for(i=20*k;(i<pSIZE)&&(i<20*(k+1));i++)
141         {
142             if(((i+1)%20==0)||(((i+1)%20)&&(i==pSIZE-1)))
143                 printf("%d\n",page[i]);
144             else
145                 printf("%d   ",page[i]);
146         }
147         for(j=0;j<mSIZE;j++)
148         {
149             for(i=20*k;(i<mSIZE+20*k)&&(i<pSIZE);i++)
150             {
151                 if(i>=j)
152                     printf(" |%d|",temp[i][j]);
153                 else
154                     printf(" | |");
155             }
156             for(i=mSIZE+20*k;(i<pSIZE)&&(i<20*(k+1));i++)
157             {
158                 for(flag=0,l=0;l<mSIZE;l++)
159                     if(temp[i][l]==temp[i-1][l])
160                         flag++;
161                 if(flag==mSIZE)/*頁面在物理塊中*/
162                     printf("    ");
163                 else
164                     printf(" |%d|",temp[i][j]);
165             }/*每行顯示20個*/
166             if(i%20==0)
167                 continue;
168             printf("\n");
169         }
170     }
171     
172     printf("----------------------------------------\n");
173     printf("缺頁次數:%d\t\t",t+mSIZE);
174     printf("缺頁率:%d/%d\n",t+mSIZE,pSIZE);
175     printf("置換次數:%d\t\t",t);
176     printf("訪問命中率:%d%%\n",(pSIZE-(t+mSIZE))*100/pSIZE);
177     printf("----------------------------------------\n");    
178 }
179 
180 /*計算過程延遲*/
181 void compute()
182 {
183     int i;
184     printf("正在進行相關計算,請稍候");
185     for(i=1;i<20;i++)
186     {
187         mDelay(15);
188         if(i%4==0)
189             printf("\b\b\b\b\b\b      \b\b\b\b\b\b");
190         else
191             printf("Θ");
192     }
193     for(i=0;i++<30;printf("\b"));
194     for(i=0;i++<30;printf(" "));
195     for(i=0;i++<30;printf("\b"));
196 }
197 /*先進先出頁面置換算法*/
198 void FIFO()
199 {
200     int memery[10]={0};
201     int time[10]={0}; /*記錄進入物理塊的時間*/
202     int i,j,k,m;
203     int max=0; /*記錄換出頁*/
204     int count=0; /*記錄置換次數*/
205     /*前mSIZE個數直接放入*/
206     for(i=0;i<mSIZE;i++)
207     {
208         memery[i]=page[i];
209         time[i]=i;
210         for(j=0;j<mSIZE;j++)
211             temp[i][j]=memery[j];
212     }
213     for(i=mSIZE;i<pSIZE;i++)
214     {
215         /*判斷新頁面號是否在物理塊中*/
216         for(j=0,k=0;j<mSIZE;j++)
217         {
218             if(memery[j]!=page[i])
219                 k++;
220         }
221         if(k==mSIZE) /*如果不在物理塊中*/
222         {
223             count++;/*計算換出頁*/
224             max=time[0]<time[1]?0:1;
225             for(m=2;m<mSIZE;m++)
226                 if(time[m]<time[max])
227                     max=m;
228             memery[max]=page[i];
229             time[max]=i; /*記錄該頁進入物理塊的時間*/
230             for(j=0;j<mSIZE;j++)
231                 temp[i][j]=memery[j];
232         }
233         else
234         {
235             for(j=0;j<mSIZE;j++)
236                 temp[i][j]=memery[j];
237         } 
238     }
239     compute();
240     print(count);
241     getchar();
242 }
243 /*最近最久未使用置換算法*/
244 void LRU()
245 {
246     int memery[10]={0};
247     int flag[10]={0}; /*記錄頁面的訪問時間*/
248     int i,j,k,m;
249     int max=0; /*記錄換出頁*/
250     int count=0; /*記錄置換次數*/
251     /*前mSIZE個數直接放入*/
252     for(i=0;i<mSIZE;i++)
253     {
254         memery[i]=page[i];
255         flag[i]=i;
256         for(j=0;j<mSIZE;j++)
257             temp[i][j]=memery[j];
258     }
259     for(i=mSIZE;i<pSIZE;i++)
260     {
261         /*判斷新頁面號是否在物理塊中*/
262         for(j=0,k=0;j<mSIZE;j++)
263         {
264             if(memery[j]!=page[i])
265                 k++;
266             else 
267                 flag[j]=i; /*刷新該頁的訪問時間*/
268         }
269         if(k==mSIZE) /*如果不在物理塊中*/
270         {
271             count++;
272             /*計算換出頁*/
273             max=flag[0]<flag[1]?0:1;
274             for(m=2;m<mSIZE;m++)
275                 if(flag[m]<flag[max])
276                     max=m;
277             memery[max]=page[i];
278             flag[max]=i; /*記錄該頁的訪問時間*/
279             for(j=0;j<mSIZE;j++)
280                 temp[i][j]=memery[j];
281         }
282         else
283         {
284             for(j=0;j<mSIZE;j++)
285                 temp[i][j]=memery[j];
286         }
287     }
288     compute();
289     print(count);
290     getchar();
291 }
292 /*最佳置換算法*/
293 void OPT()
294 {
295     int memery[10]={0};
296     int next[10]={0}; /*記錄下一次訪問時間*/
297     int i,j,k,l,m;
298     int max; /*記錄換出頁*/
299     int count=0; /*記錄置換次數*/
300     /*前mSIZE個數直接放入*/
301     for(i=0;i<mSIZE;i++)
302     {
303         memery[i]=page[i];
304         for(j=0;j<mSIZE;j++)
305             temp[i][j]=memery[j];
306     }
307     for(i=mSIZE;i<pSIZE;i++)
308     {
309         /*判斷新頁面號是否在物理塊中*/
310         for(j=0,k=0;j<mSIZE;j++)
311         {
312             if(memery[j]!=page[i])
313                 k++;
314         }
315         if(k==mSIZE) /*如果不在物理塊中*/
316         {
317             count++;
318             /*得到物理快中各頁下一次訪問時間*/
319             for(m=0;m<mSIZE;m++)
320             {
321                 for(l=i+1;l<pSIZE;l++)
322                     if(memery[m]==page[l])
323                         break;
324                 next[m]=l;
325             }
326             /*計算換出頁*/
327             max=next[0]>=next[1]?0:1;
328             for(m=2;m<mSIZE;m++)
329                 if(next[m]>next[max])
330                     max=m;
331             /*下一次訪問時間都為pSIZE,則置換物理塊中第一個*/
332             memery[max]=page[i];
333             for(j=0;j<mSIZE;j++)
334                 temp[i][j]=memery[j];
335         }
336         else {
337             for(j=0;j<mSIZE;j++)
338                 temp[i][j]=memery[j];
339         }
340     }
341     compute();
342     print(count);
343     getchar();
344 }
頁面置換算法的模擬實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM