1.1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
1.2. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
2.实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
3.实验环境
可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。
4.参考数据结构:
#include<stdio.h>
#include<conio.h>
#include<string.h>
#define MAX 24
struct partition{
char pn[10];
int begin;
int size;
int end; ////////
char status; //////////
};
typedef struct partition PART;
1 #include <stdio.h> 2 #include<conio.h> 3 #include<string.h> 4 #define MAX 100 5 struct partition{ 6 char pn[10]; 7 int begin; 8 int size; 9 int end; //////// 10 char status; ////////// 11 }; 12 typedef struct partition PART; 13 PART p[MAX]; 14 int n; 15 16 int msize = 7; 17 int next = 0; 18 19 void init() 20 { 21 p[0].begin = 0; 22 p[0].end = 200; 23 strcpy(p[0].pn, "SYSTEM"); 24 p[0].size = 200; 25 p[0].status = 'u'; 26 27 p[1].begin = 200; 28 p[1].end = 1024; 29 strcpy(p[1].pn, "-----"); 30 p[1].size = p[1].end - p[1].begin; 31 p[1].status = 'f'; 32 33 n = 2; 34 } 35 36 void show() 37 { 38 int x = 1; 39 40 printf("空闲区表Free:\n"); 41 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 42 for(int i = 0; i < n; i++) 43 { 44 if(p[i].status == 'f') 45 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 46 } 47 printf("\n\n=========================================================\n"); 48 49 printf("已分配分区表Used:\n"); 50 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 51 for(i = 0, x = 1; i < n; i++) 52 { 53 if(p[i].status == 'u') 54 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 55 } 56 57 printf("\n\n=========================================================\n"); 58 59 printf("内存使用情况:\nprintf sorted by address:\n"); 60 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 61 printf("\t--------------------------------------\n"); 62 for(i = 0, x = 1; i < n; i++) 63 { 64 printf("\tNo.%d\t%s\t%4d\t%4d\t%4c\n", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 65 } 66 } 67 68 void input(char name[], int * size) 69 { 70 int x = 1; 71 72 while(x) 73 { 74 printf("\n\n请输入进程名称:"); 75 scanf("%s", name); 76 77 for(int i = 0; i < n; i++) 78 { 79 x = 0; 80 if(strcmp(name, p[i].pn) == 0) 81 { 82 x = 1; 83 printf("进程名称已存在,请重新输入!"); 84 break; 85 } 86 } 87 88 } 89 90 x = 1; 91 scanf("!!!\n"); 92 while(x) 93 { 94 printf("\n请输入进程需要的空间大小:"); 95 scanf("%d", size); 96 97 for(int i = 0; i < n; i++) 98 { 99 100 if(p[i].size >= *size) 101 { 102 x = 0; 103 break; 104 } 105 } 106 if(x) 107 printf("找不到适合的空间,请重新输入!"); 108 } 109 110 } 111 112 int show_menu() 113 { 114 int x; 115 116 printf("\n(1)首次适应算法"); 117 printf("\n(2)循环首次适应算法"); 118 printf("\n(3)最佳适应算法"); 119 printf("\n(4)最坏适应算法"); 120 printf("\n请选择一种分配方式:"); 121 scanf("%d", &x); 122 while(x < 1 || x > 4) 123 { 124 printf("\n输入错误!"); 125 printf("\n请选择一种分配方式:"); 126 scanf("%d", &x); 127 } 128 129 return x; 130 } 131 132 void first_fit(char name[], int size) 133 { 134 for(int i = 0; i < n; i++) 135 { 136 if(p[i].status == 'f') 137 { 138 if(p[i].size - size < msize) 139 { 140 strcpy(p[i].pn, name); 141 p[i].status = 'u'; 142 break; 143 } 144 else 145 { 146 strcpy(p[n].pn, p[i].pn); 147 p[n].begin = p[i].begin + size; 148 p[n].end = p[i].end; 149 p[n].size = p[n].end - p[n].begin; 150 p[n].status = 'f'; 151 strcpy(p[i].pn, name); 152 p[i].end = p[i].begin + size; 153 p[i].size = size; 154 p[i].status = 'u'; 155 n++; 156 break; 157 } 158 } 159 } 160 161 } 162 163 void next_fit(char name[], int size) 164 { 165 for(int i = next; i < n; i++) 166 { 167 if(p[i].status == 'f') 168 { 169 if(p[i].size - size < msize) 170 { 171 strcpy(p[i].pn, name); 172 p[i].status = 'u'; 173 break; 174 } 175 else 176 { 177 strcpy(p[n].pn, p[i].pn); 178 p[n].begin = p[i].begin + size; 179 p[n].end = p[i].end; 180 p[n].size = p[n].end - p[n].begin; 181 p[n].status = 'f'; 182 strcpy(p[i].pn, name); 183 p[i].end = p[i].begin + size; 184 p[i].size = size; 185 p[i].status = 'u'; 186 n++; 187 break; 188 } 189 } 190 } 191 } 192 193 void best_fit(char name[], int size) 194 { 195 int x = 0; 196 int min = 10000; 197 198 for(int i = 0; i < n; i++) 199 { 200 if(p[i].status == 'f') 201 { 202 if(p[i].size < min && p[i].size >= size) 203 { 204 min = p[i].size; 205 x = i; 206 } 207 } 208 } 209 210 if(p[x].size - size < msize) 211 { 212 strcpy(p[x].pn, name); 213 p[x].status = 'u'; 214 } 215 else 216 { 217 strcpy(p[n].pn, p[x].pn); 218 p[n].begin = p[x].begin + size; 219 p[n].end = p[x].end; 220 p[n].size = p[n].end - p[n].begin; 221 p[n].status = 'f'; 222 strcpy(p[x].pn, name); 223 p[x].end = p[i].begin + size; 224 p[x].size = size; 225 p[x].status = 'u'; 226 n++; 227 } 228 } 229 230 void worst_fit(char name[], int size) 231 { 232 int x = 0; 233 int max = 0; 234 235 for(int i = 0; i < n; i++) 236 { 237 if(p[i].status == 'f') 238 { 239 if(p[i].size > max) 240 { 241 max = p[i].size; 242 x = i; 243 } 244 } 245 } 246 247 if(p[x].size - size < msize) 248 { 249 strcpy(p[x].pn, name); 250 p[x].status = 'u'; 251 } 252 else 253 { 254 strcpy(p[n].pn, p[x].pn); 255 p[n].begin = p[x].begin + size; 256 p[n].end = p[x].end; 257 p[n].size = p[n].end - p[n].begin; 258 p[n].status = 'f'; 259 strcpy(p[x].pn, name); 260 p[x].end = p[i].begin + size; 261 p[x].size = size; 262 p[x].status = 'u'; 263 n++; 264 } 265 } 266 267 void allocation() 268 { 269 char name[10]; 270 int size; 271 272 input(name, &size); 273 int x = show_menu(); 274 275 switch(x) 276 { 277 case 1: 278 first_fit(name, size); 279 break; 280 case 2: 281 next_fit(name, size); 282 break; 283 case 3: 284 best_fit(name, size); 285 break; 286 case 4: 287 worst_fit(name, size); 288 break; 289 } 290 291 show(); 292 } 293 294 void move(int i) 295 { 296 while(i < n) 297 { 298 p[i-1] = p[i]; 299 i++; 300 } 301 n--; 302 } 303 304 void recycle() 305 { 306 char name[10]; 307 int x = 0; 308 309 printf("\n\n请输入进程名称:"); 310 scanf("%s", name); 311 312 for(int i = 0; i < n; i++) 313 { 314 if(strcmp(name, p[i].pn) == 0) 315 { 316 x = 1; 317 break; 318 } 319 } 320 if(x == 0) 321 printf("\n\n进程不存在。\n"); 322 else if(x == 1) 323 { 324 if(p[i-1].status == 'u' && p[i+1].status == 'u') 325 { 326 strcpy(p[i].pn, "-----"); 327 p[i].status = 'f'; 328 } 329 else if(p[i+1].status == 'f') 330 { 331 strcpy(p[i].pn, "-----"); 332 p[i].status = 'f'; 333 p[i].end = p[i+1].end; 334 p[i].size += p[i+1].size; 335 move(i+2); 336 if(p[i-1].status == 'f') 337 { 338 p[i-1].end = p[i].end; 339 p[i-1].size += p[i].size; 340 move(i+1); 341 } 342 } 343 344 } 345 346 show(); 347 } 348 349 int main(void) 350 { 351 int x = 0; 352 353 printf("初始化:设置内存总容量为 1024k\n系统从低地址部分开始占用 200k\n\n"); 354 355 init(); 356 show(); 357 358 printf("\n1. 输入进程 2. 回收进程\n"); 359 scanf("%d", &x); 360 while(1) 361 { 362 if(x == 1) 363 allocation(); 364 else if(x == 2) 365 recycle(); 366 367 printf("\n1. 输入进程 2. 回收进程\n"); 368 scanf("%d", &x); 369 } 370 371 372 373 return 0; 374 }