(大三下學期開學)操作系統課程設計
題外話:
介個系統的算法啊其實很簡單很好理解,就是當時自己實踐的時候整了好久,各種調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、附系統運行截圖
附圖:當時為研究地址變換畫了個小漫畫,雖然……最后這個代碼里沒具體實現地址變換