操作系統-頁式虛擬存儲器管理系統設計


(大三下學期開學)操作系統課程設計

題外話:

介個系統的算法啊其實很簡單很好理解,就是當時自己實踐的時候整了好久,各種調bug各種惆悵啊!

但是此乃100%原創哇!真是老老實實光啃操作系統書自己設計出來的,啥參考都沒有

寫完的時候真是太有成就感了(流淚)

還為此特別手寫了算法研究了好久,剛剛翻出筆記本發現自己為了研究地址變換畫了個小漫畫!(見最下頁)

當時的計划:
2/27實現的目標:能夠根據作業大小為作業分配空間,建立頁表。
2/28實現的目標:完成兩種算法的設計與調試
3/1實現的目標:完善展示界面


功能分析:

請求分頁式存儲管理是基於分頁式存儲管理的一種虛擬存儲器。

它可以把內存空間划分成尺寸相同、位置固定的塊,虛擬地址空間的一頁可以裝入到內存的任何一塊中。

進程運行時,並不是把整個作業程序全部裝到內存中,只裝入當前要使用的若干頁,此時根據頁號查找頁表,如果該頁不在內存中,沒有具體的塊號與之對應,出現“缺頁”,無法繼續運行,此時就要根據頁號把該頁調入內存使用。

 

 

1、數據結構設計

 1 struct yeb
 2 {
 3     int yebxiang[20];
 4     int flag=0;
 5 } yebb[20];
 6 struct block
 7 {
 8     int num=88;
 9 } bk[30];
10 int pgclub[2000];//內存物理塊初始化為pgcnum
11 int pgcnum=50;
12 int bknum=1;
13 int surplus;//記錄剩余物理塊數量
14 int pgnum,pgsize;
15 int voidornot=0;
16 int num=0;

2、功能函數設計與檢測

(1)可以按照作業的大小分配空間,建立頁表;

(2)可以模擬進程的運行過程,如果發生缺頁的情況則可以按照一定的頁面置換算法選出淘汰頁面序列,並展示淘汰頁面序列;

(3)可以展示空間使用情況與頁表的情況。

  1 void initpgc()
  2 {
  3     for(int i=0; i<pgcnum; i++)//內存物理塊的初始化
  4     {
  5         pgclub[i]=0;
  6     }
  7     num=pgcnum/bknum;
  8     cout<<" 內存物理塊已經成功初始化!本系統共有"<<num<<"個可用物理塊,每個塊的大小為"<<bknum<<"KB!(^_^)"<<endl;
  9     cout<<"☆---------------------------------------------------------------------------☆"<<endl;
 10 }
 11 void checksurplus()//檢查可用空間
 12 {
 13     surplus=0;
 14     for(int i=0; i<pgcnum; i++)
 15     {
 16         if(pgclub[i]==0)surplus++;
 17     }
 18 }
 19 void showsurplus()
 20 {
 21     cout<<"現在輸出物理塊的存儲信息:"<<endl;
 22     cout<<"※--------------------※"<<endl;
 23     for(int i=0; i<num; i++)
 24     {
 25         if(i==0||(i%10)==0) cout<<"| ";
 26         cout<<pgclub[i]<<" ";
 27         if((i+1)%10==0) cout<<"|"<<endl;//每十個換行
 28     }
 29     cout<<"※--------------------※"<<endl<<endl;
 30 }
 31 void showyebiao(int pgnum)
 32 {
 33     cout<<"現在輸出作業"<<pgnum<<"的頁表:"<<endl;
 34     int last=0;
 35     cout<<"*------※------*"<<endl;
 36     cout<<"| 頁號 | 塊號  |"<<endl;
 37     for(int i=0;; i++,last++)
 38         if(yebb[pgnum].yebxiang[i]==88) break;
 39     for(int i=0; i<last; i++)
 40     {
 41 
 42         cout<<"|  "<<i<<"   |   "<<yebb[pgnum].yebxiang[i]<<"   |"<<endl;
 43     }
 44 
 45     cout<<"*------※------*"<<endl;
 46 }
 47 void creathomework()
 48 {
 49 
 50     cout<<"輸入新建立的作業號(0~19)與大小(單位:KB)"<<endl;
 51     cin>>pgnum>>pgsize;
 52     int pgsize2=pgsize;
 53     int danwei=pgsize/bknum;
 54     int pgnum2=pgnum;
 55     checksurplus();//檢查可用空間
 56     if(danwei>surplus)
 57         cout<<"空間不足。"<<endl;
 58     else
 59     {
 60         for(int i=0; i<20; i++)
 61             yebb[pgnum].yebxiang[i]=88;//預用初始化
 62         int yebnum=0;
 63         cout<<"將為你分配"<<danwei<<"個物理塊!"<<endl;
 64         cout<<"請順序輸入對應存儲的物理塊號:"<<endl;
 65         while(danwei)
 66         {
 67             int anum;
 68             //計數變量
 69             cin>>anum;
 70 
 71             if(!pgclub[anum])
 72             {
 73                 pgclub[anum]=pgnum;//表示被占用
 74                 danwei--;
 75                 yebb[pgnum].yebxiang[yebnum]=anum;
 76                 yebnum++;
 77                 //存儲檢查(調試)
 78                 //  cout<<yebnum<<" "<<anum<<endl;
 79                 // cout<<yebb[pgnum].yebxiang[yebnum-1]<<endl;
 80             }
 81             else cout<<"該物理塊已經被占用。請重新輸入其它物理塊號(T_T)"<<endl;
 82         }
 83         voidornot=1;
 84         yebb[pgnum].flag=1;
 85         showsurplus();
 86         showyebiao(pgnum);
 87     }
 88 }
 89 int check()
 90 {
 91     if(voidornot==0) return 1;
 92     else return 0;
 93 }
 94 
 95 void createjc()
 96 {
 97     int flag=check();
 98     if(flag)
 99     {
100         cout<<"作業都沒有,跑什么跑"<<endl;
101     }
102     else
103     {
104         cout<<"請選擇一種頁面置換算法。"<<endl;
105         cout<<"1、FIFO"<<endl;
106         cout<<"2、LRU"<<endl;
107         int lob;
108         cin>>lob;
109         if(lob==1)
110         {
111             cout<<"你要跑的進程是哪家的?"<<endl;
112             int win;
113             cin>>win;
114             if(!yebb[win].flag)
115                 cout<<"沒有你這個兒子進程!"<<endl;
116             else
117             {
118                 int last=0;
119                 for(int i=0;; i++,last++)
120                     if(yebb[win].yebxiang[i]==88) break;
121                 cout<<"請輸入15個由作業"<<win<<"的物理塊號所組成的序列:"<<endl;
122                 for(int i=0; i<last; i++)
123                 {
124                     cout<<yebb[win].yebxiang[i];
125                     if(!(i==(last-1))) cout<<"";
126                     else cout<<endl;
127                 }
128                 int number[15];
129                 for(int i=0; i<15; i++)
130                 {
131                     cin>>number[i];
132                 }
133                 int error=0;
134                 cout<<"你想要給它分配多少個物理塊?(1~10)以內";
135                 int X;
136                 cin>>X;
137                 int countt=0;
138                 for(int i=0; i<30; i++)
139                 {
140                     bk[i].num=88;
141                 }
142                 for(int i=0; i<15; i++)
143                 {
144                     int flag1=0;
145                     for(int j=0; j<X; j++)
146                     {
147                         if(number[i]==bk[j].num)
148                         {
149                             cout<<number[i]<<endl;
150                             flag1=1;
151                         }
152                     }
153                     if(!flag1)
154                     {
155                         error++;
156                         //cout<<"error="<<error<<endl;
157                         if(error<=X)//未滿
158                         {
159                             bk[error-1].num=number[i];
160                             cout<<number[i]<<"|";
161                             for(int k=0; k<i+1; k++)
162                                 if(bk[k].num!=88)
163                                     cout<<bk[k].num<<" ";
164                             cout<<endl;
165                         }
166                         else //已經滿,要置換
167                         {
168                             bk[(error-1)%X].num=number[i];
169                             cout<<number[i]<<"|";
170                             for(int k=0; k<X; k++)
171                                 if(bk[k].num!=88)
172                                     cout<<bk[k].num<<" ";
173                             cout<<endl;
174                         }
175                     }
176                 }
177                 cout<<"使用FIFO算法在分配的物理塊為"<<X<<"個情況下,缺頁次數是"<<error<<"次。命中率為"<<(1-((double)error/15))*100<<"%!"<<endl;
178             }
179         }
180         else
181         {
182             cout<<"你要跑的進程是哪家的?"<<endl;
183             int win;
184             cin>>win;
185             if(!yebb[win].flag)
186                 cout<<"沒有你這個兒子"<<endl;
187             else
188             {
189                 int last=0,flag3=0;
190                 for(int i=0;; i++,last++)
191                     if(yebb[win].yebxiang[i]==88) break;
192                 cout<<"請輸入15個由作業"<<win<<"的物理塊號所組成的序列:"<<endl;
193                 for(int i=0; i<last; i++)
194                 {
195                     cout<<yebb[win].yebxiang[i];
196                     if(!(i==(last-1))) cout<<"";
197                     else cout<<endl;
198                 }
199                 int number[15];
200                 for(int i=0; i<15; i++)
201                 {
202                     cin>>number[i];
203                 }
204                 int error=0;
205                 cout<<"你想要給它分配多少個物理塊?(1~10)以內";
206                 int X,flag2=1;
207                 int topnumber=0;
208                 cin>>X;
209                 for(int i=0; i<30; i++)//物理塊初始化
210                 {
211                     bk[i].num=88;
212                 }
213                 for(int i=0; i<15; i++)
214                 {
215                     int flag=0;
216                     for(int o=0; o<X; o++)//查詢棧中是否存在要訪問的頁面
217                     {
218                         if(number[i]==bk[o].num)//如果訪問的頁面在棧中
219                         {
220                             //int flag4=0;
221                             if(number[i-1]!=number[i])
222                             {
223                                 for(int p=o; p<topnumber; p++) //棧元素向后推,將最近訪問的頁號存到棧頂元素。
224                                 {
225                                     bk[p].num=bk[p+1].num;
226                                 }
227                                 bk[topnumber-1].num=number[i];
228                             }
229 
230                             cout<<number[i]<<"|";//輸出棧的情況
231                             for(int j=0; j<10; j++)
232                                 if(bk[j].num!=88)
233                                     cout<<bk[j].num<<" ";
234                             //cout<<"top"<<topnumber;
235                             cout<<endl;
236                             flag=1;
237                             break;
238                         }
239                     }
240                     if(!flag)//缺頁
241                     {
242 
243                         //cout<<topnumber<<endl;
244                         error++;
245                         if(!flag3)
246                         {
247                             if(topnumber<X)//如果此時棧未滿
248                             {
249                                 topnumber++;
250                                 bk[topnumber-1].num=number[i];
251                             }
252                             else if(topnumber==X)//此時棧已經滿了
253                             {
254                                 //topnumber=X-1;
255                                 flag3=1;//表示滿了
256                             }
257                         }
258                         if(flag3) //棧滿了,首先將棧頂以下的都向下移,再將新的頁面放到棧頂,topnumber=X
259                         {
260                             for(int m=0; m<X-1; m++)
261                             {
262                                 bk[m].num=bk[m+1].num;
263                             }
264                             bk[X-1].num=number[i];
265                         }
266                         cout<<number[i]<<"|";//輸出
267                         for(int k=0; k<10; k++)
268                         {
269                             if(bk[k].num!=88)
270                                 cout<<bk[k].num<<" ";
271                         }
272                         //cout<<"top"<<topnumber;
273                         cout<<"缺頁(T_T)";
274                         cout<<endl;
275                     }
276 
277                 }
278                 cout<<"使用LRU算法在分配的物理塊為"<<X<<"個情況下,缺頁次數是"<<error<<"次。命中率為"<<(1-((double)error/15))*100<<"%!"<<endl;
279             }
280 
281 
282         }
283     }
284 
285 }
286 
287 void menu1()
288 {
289     int c;
290 
291     cout<<"請設定內存塊總大小以及每一個頁面的大小。"<<endl;
292     while(1)
293     {
294         cin>>pgcnum>>bknum;
295         if(pgcnum%bknum!=0)
296             cout<<"你輸入的數不合法,請重新輸入。"<<endl;
297         else break;
298     }
299 
300 
301     initpgc();//內存物理塊的初始化
302     while(1)
303     {
304         cout<<"                 歡迎來到小系統,請輸入數字執行你想要執行的操作。"<<endl;
305         cout<<"☆---------------------------------------------------------------------------☆"<<endl;
306         cout<<"                             1、我要寫作業"<<endl<<endl;
307         cout<<"                             2、我要跑進程"<<endl<<endl;
308         cout<<"                             3、查看物理塊的存儲信息"<<endl<<endl;
309         cout<<"                             9、我走了"<<endl;
310         cout<<"☆---------------------------------------------------------------------------☆"<<endl;
311         int choose;
312         cin>>choose;
313         if(choose==1)
314         {
315 
316             creathomework();
317         }
318         else if(choose==2)
319         {
320             createjc();
321         }
322         else if(choose==3)
323         {
324             showsurplus();
325         }
326         else if(choose==9)
327             break;
328         else cout<<"非法參數,重新輸入,好嗎!"<<endl;
329     }
330     cout<<"byebye!"<<endl;
331 
332 }
333 int main()
334 {
335     //int start=0;
336     menu1();
337     return 0;
338 }

3、附系統運行截圖

 

 

 


 

 

 

 

附圖:當時為研究地址變換畫了個小漫畫,雖然……最后這個代碼里沒具體實現地址變換

 


免責聲明!

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



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