c语言最佳适应算法实验报告,操作系统实验报告---主存分配与回收(最佳适应算法)...
1 #include
2 #include
3 #define MAX 600 //設置總內存大小為512k
4
5 structpartition {6 char pn[10];//分區名字
7 int begin;//起始地址
8 int size;//分區大小
9 int end;//結束地址
10 char status;//分區狀態
11 };12 structpartition part[MAX];13 int p = 0; //標記上次掃描結束處
14
15 void Init()//初始化分區地址、大小以及狀態
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 ) //以行的形式輸出結構體的數據
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() //顯示分區
61 {62 inti;63 int n; //用n來記錄分區的個數
64 printf("n");65 printf( "n 已分配分區表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++;//記錄已分配使用的分區個數
78 }79 }80 printf("n");81 printf( "n 空閑分區表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++; //記錄空閑分區的個數
94 }95 }96 //printf( "n" );
97 printf("n");98 printf( "n 內存使用情況,按起始址增長的排:");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++;//記錄已分配分區以及空閑分區之和的總個數
110 }111 getch();112 }113
114 void Fit( int a, char workName[], int workSize ) //新作業把一個分區分配成兩個分區:已使用分區和空閑分區
115 {116 inti;117 for ( i = MAX; i > a + 1; i--)118 {119 //通過逆向遍歷,把在a地址后的所有分區往后退一個分區,目的在于增加一個分區
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請輸入作業名稱:");142 scanf( "%s", &workName );143 for(i=0;i
146 {147 printf("n作業已經存在,不必再次分配!n");148 return;149 }150 }151 printf( "請輸入作業大小(k):");152 scanf( "%d", &workSize );153 for ( i = 0; i < MAX; i++ )//通過循環在空閑區找是否有適合區間存儲作業
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該作業大小超出最大可分配空間");164 getch();165 return;166 }167
168 for ( i = 0; i < MAX; i++ )//最佳適應算法
169 if ( part[i].status == 'f' && part[i].size >=workSize )170 if ( part[pFree].size >part[i].size )171 pFree = i;//通過遍歷所有區間,每次都找到最小空閑分區進行分配
172 Fit( pFree, workName, workSize );173 printf( "n分配成功!");174 getch();175 }176 void hebing() //合并連續的空閑分區
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() //回收分區
209 {210 inti;211 intnumber;212 int n=0;213 printf( "n請輸入回收的分區號:");214 scanf( "%d", &number );215 if ( number == 1)216 {217 printf( "n系統分區無法回收");218 return;219 }220 for ( i = 0; i < MAX; i++ )//通過循環查找要回收的已使用分區區號
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找不到分區");235 return;236 }237 hebing();//合并連續的空閑分區
238 printf( "n回收成功!");239 getch();240 }241
242
243 voidmain()244 {245 intselection;246 Init();247 printf( "初始化完成,設內存容量%dk", MAX );248 printf( "n系統文件從低址存儲,占%dk", part[0].size );249 while ( 1)250 {251 printf( "n----------選擇----------");252 printf( "n| 0、退出系統 |");253 printf( "n| 1、顯示分區 |");254 printf( "n| 2、分配分區 |");255 printf( "n| 3、回收分區 |");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); //退出系統
269 break;270 case 1:271 display(); //顯示分區
272 break;273 case 2:274 fenpei(); //分配作業
275 break;276 case 3:277 huishou(); //回收分區
278 break;279 default:280 break;281 }282 }283 }
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c语言最佳适应算法实验报告,操作系统实验报告---主存分配与回收(最佳适应算法)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言中数组大小10000,C语言,怎么
- 下一篇: 最强蜗牛亨泽曼水晶钢琴怎么样 贵重品图鉴