c语言最佳适应算法实验报告,操作系统实验报告---主存分配与回收(最佳适应算法)...
1 #include
2 #include
3 #define MAX 600 //設(shè)置總內(nèi)存大小為512k
4
5 structpartition {6 char pn[10];//分區(qū)名字
7 int begin;//起始地址
8 int size;//分區(qū)大小
9 int end;//結(jié)束地址
10 char status;//分區(qū)狀態(tài)
11 };12 structpartition part[MAX];13 int p = 0; //標(biāo)記上次掃描結(jié)束處
14
15 void Init()//初始化分區(qū)地址、大小以及狀態(tài)
16 {17 inti;18 for ( i = 0; i < MAX; i++)19 part[i].status = '-';20 strcpy( part[0].pn, "SYSTEM");21 part[0].begin = 0;22 part[0].size = 100;23 part[0].status = 'u';24
25 strcpy( part[1].pn, "-----");26 part[1].begin = 100;27 part[1].size = 100;28 part[1].status = 'f';29 strcpy( part[2].pn, "A");30 part[2].begin = 200;31 part[2].size = 50;32 part[2].status = 'u';33 strcpy( part[3].pn, "-----");34 part[3].begin = 250;35 part[3].size = 50;36 part[3].status = 'f';37 strcpy( part[4].pn, "B");38 part[4].begin = 300;39 part[4].size = 100;40 part[4].status = 'u';41 strcpy( part[5].pn, "-----");42 part[5].begin = 400;43 part[5].size = 200;44 part[5].status = 'f';45 for ( i = 0; i < MAX; i++)46 part[i].end = part[i].begin + part[i].size-1;47 }48
49
50 void Output( int i ) //以行的形式輸出結(jié)構(gòu)體的數(shù)據(jù)
51 {52 printf( "t%s", part[i].pn );53 printf( "t%d", part[i].begin );54 printf( "t%d", part[i].size );55 printf( "t%d", part[i].end );56 printf( "t%c", part[i].status );57 }58
59
60 void display() //顯示分區(qū)
61 {62 inti;63 int n; //用n來記錄分區(qū)的個數(shù)
64 printf("n");65 printf( "n 已分配分區(qū)表Used:");66 printf( "ntNo.tpronametbegintsizetendtstatus");67 printf("n");68 n = 1;69 for ( i = 0; i < MAX; i++)70 {71 if ( part[i].status == '-')72 break;73 if ( part[i].status == 'u')74 {75 printf( "ntNo.%d", n );76 Output( i );77 n++;//記錄已分配使用的分區(qū)個數(shù)
78 }79 }80 printf("n");81 printf( "n 空閑分區(qū)表Free:");82 printf( "ntNo.tpronametbegintsizetendtstatus");83 printf("n");84 n = 1;85 for ( i = 0; i < MAX; i++)86 {87 if ( part[i].status == '-')88 break;89 if ( part[i].status == 'f')90 {91 printf( "ntNo.%d", n );92 Output( i );93 n++; //記錄空閑分區(qū)的個數(shù)
94 }95 }96 //printf( "n" );
97 printf("n");98 printf( "n 內(nèi)存使用情況,按起始址增長的排:");99 //printf( "n printf sorted by address:" );
100 printf( "ntNo.tpronametbegintsizetendtstatus");101 printf("n");102 n = 1;103 for ( i = 0; i < MAX; i++)104 {105 if ( part[i].status == '-')106 break;107 printf( "ntNo.%d", n );108 Output( i );109 n++;//記錄已分配分區(qū)以及空閑分區(qū)之和的總個數(shù)
110 }111 getch();112 }113
114 void Fit( int a, char workName[], int workSize ) //新作業(yè)把一個分區(qū)分配成兩個分區(qū):已使用分區(qū)和空閑分區(qū)
115 {116 inti;117 for ( i = MAX; i > a + 1; i--)118 {119 //通過逆向遍歷,把在a地址后的所有分區(qū)往后退一個分區(qū),目的在于增加一個分區(qū)
120 if ( part[i - 1].status == '-')121 continue;122 part[i]=part[i-1];123 }124 strcpy( part[a + 1].pn, "-----");125 part[a + 1].begin = part[a].begin +workSize;126 part[a + 1].size = part[a].size -workSize;127 part[a + 1].end = part[a].end-1;128 part[a + 1].status = 'f';129 strcpy( part[a].pn, workName );130 part[a].size =workSize;131 part[a].end = part[a].begin + part[a].size-1;132 part[a].status = 'u';133 }134 void fenpei() //分配
135 {136 inti;137 inta;138 intworkSize;139 char workName[10];140 intpFree;141 printf( "n請輸入作業(yè)名稱:");142 scanf( "%s", &workName );143 for(i=0;i
146 {147 printf("n作業(yè)已經(jīng)存在,不必再次分配!n");148 return;149 }150 }151 printf( "請輸入作業(yè)大小(k):");152 scanf( "%d", &workSize );153 for ( i = 0; i < MAX; i++ )//通過循環(huán)在空閑區(qū)找是否有適合區(qū)間存儲作業(yè)
154 {155 if ( part[i].status == 'f' && part[i].size >=workSize )156 {157 pFree =i;158 break;159 }160 }161 if ( i ==MAX )162 {163 printf( "n該作業(yè)大小超出最大可分配空間");164 getch();165 return;166 }167
168 for ( i = 0; i < MAX; i++ )//最佳適應(yīng)算法
169 if ( part[i].status == 'f' && part[i].size >=workSize )170 if ( part[pFree].size >part[i].size )171 pFree = i;//通過遍歷所有區(qū)間,每次都找到最小空閑分區(qū)進行分配
172 Fit( pFree, workName, workSize );173 printf( "n分配成功!");174 getch();175 }176 void hebing() //合并連續(xù)的空閑分區(qū)
177 {178 int i = 0;179 while ( i != MAX - 1)180 {181 for ( i = 0; i < MAX - 1; i++)182 {183 if ( part[i].status == 'f')184 if ( part[i + 1].status == 'f')185 {186 part[i].size = part[i].size + part[i + 1].size;187 part[i].end = part[i].begin + part[i].size-1;188 i++;189 for ( i; i < MAX - 1; i++)190 {191 if ( part[i + 1].status == '-')192 {193 part[i].status = '-';194 break;195
196 }197
198 part[i]=part[i+1];199 }200 part[MAX - 1].status = '-';201 break;202 }203 }204 }205 }206
207
208 void huishou() //回收分區(qū)
209 {210 inti;211 intnumber;212 int n=0;213 printf( "n請輸入回收的分區(qū)號:");214 scanf( "%d", &number );215 if ( number == 1)216 {217 printf( "n系統(tǒng)分區(qū)無法回收");218 return;219 }220 for ( i = 0; i < MAX; i++ )//通過循環(huán)查找要回收的已使用分區(qū)區(qū)號
221 {222 if ( part[i].status == 'u')223 {224 n++;225 if ( n ==number )226 {227 strcpy( part[i].pn, "-----");228 part[i].status = 'f';229 }230 }231 }232 if ( i == MAX - 1)233 {234 printf( "n找不到分區(qū)");235 return;236 }237 hebing();//合并連續(xù)的空閑分區(qū)
238 printf( "n回收成功!");239 getch();240 }241
242
243 voidmain()244 {245 intselection;246 Init();247 printf( "初始化完成,設(shè)內(nèi)存容量%dk", MAX );248 printf( "n系統(tǒng)文件從低址存儲,占%dk", part[0].size );249 while ( 1)250 {251 printf( "n----------選擇----------");252 printf( "n| 0、退出系統(tǒng) |");253 printf( "n| 1、顯示分區(qū) |");254 printf( "n| 2、分配分區(qū) |");255 printf( "n| 3、回收分區(qū) |");256 printf( "n------------------------");257 printf( "n請選擇 >");258 while ( 1)259 {260 scanf( "%d", &selection );261 if ( selection == 0 ||selection == 1 || selection == 2 || selection == 3)262 break;263 printf( "輸入錯誤,請重新輸入:");264 }265 switch( selection )266 {267 case 0:268 exit(0); //退出系統(tǒng)
269 break;270 case 1:271 display(); //顯示分區(qū)
272 break;273 case 2:274 fenpei(); //分配作業(yè)
275 break;276 case 3:277 huishou(); //回收分區(qū)
278 break;279 default:280 break;281 }282 }283 }
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的c语言最佳适应算法实验报告,操作系统实验报告---主存分配与回收(最佳适应算法)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中数组大小10000,C语言,怎么
- 下一篇: 鸿蒙系统是安卓还是苹果,小雷问答丨鸿蒙系