1. 目的和要求
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;
第一步:(第13周完成)
完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。
源代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<string.h> 4 #include <conio.h> 5 #define getpart(type) (type*)malloc(sizeof(type)) 6 #define MAX 24 7 #define RAM 512 8 #define SYSTEM 100 9 struct partition { 10 char pn[10]; 11 char status; 12 int begin; 13 int size; 14 int end; 15 }; 16 17 typedef struct partition PART; 18 19 PART ram[MAX]; 20 menu2() 21 { 22 printf(" **************************"); 23 printf(" 1.首次适应算法"); 24 printf(" 2.最佳适应算法"); 25 printf(" 3.最坏适应算法"); 26 printf(" 4.循环首次适应算法 "); 27 printf(" ************************** "); 28 29 } 30 void InputPart() 31 { 32 int flag ; 33 char name[10]; 34 int size; 35 int j = MAX-1; 36 menu2(); 37 38 printf("请选择: "); 39 scanf("%d",&flag); 40 printf(" 请输入任务名:"); 41 scanf("%s",&name); 42 printf(" 请输入需要空间:"); 43 scanf("%d",&size); 44 if(flag == 1)//首次适应算法 45 { 46 int i=0; 47 while(i<MAX) 48 { 49 if(ram[i].status == 'f' && ram[i].size >= size) 50 { 51 52 while(j>=i) 53 { 54 ram[j] = ram[j-1]; 55 j--; 56 } 57 strcpy(ram[i].pn, name); 58 ram[i].begin = ram[i-1].end; 59 ram[i].size = size; 60 ram[i].end = ram[i].begin + ram[i].size; 61 ram[i].status = 'u'; 62 63 ram[i+1].begin = ram[i].end; 64 ram[i+1].size = ram[i+1].size - ram[i].size; 65 break; 66 67 } 68 i++; 69 } 70 } 71 72 else if(flag == 2)//最佳适应算法 73 { 74 j = MAX; 75 int best = 512; 76 int bi = 0; 77 int i=0; 78 while(i<MAX) 79 { 80 if(ram[i].status == 'f') 81 { 82 if(best > ram[i].size) 83 { 84 best = ram[i].size; 85 bi = i; 86 } 87 } 88 i++; 89 } 90 if(ram[bi].status == 'f' && ram[bi].size >= size) 91 { 92 93 while(j>=bi) 94 { 95 ram[j] = ram[j-1]; 96 j--; 97 } 98 strcpy(ram[bi].pn, name); 99 ram[bi].begin = ram[bi-1].end; 100 ram[bi].size = size; 101 ram[bi].end = ram[bi].begin + ram[bi].size; 102 ram[bi].status = 'u'; 103 104 ram[bi+1].begin = ram[bi].end; 105 ram[bi+1].size = ram[bi+1].size - ram[bi].size; 106 } 107 108 109 110 111 } 112 else if(flag==4)//循环首次适应算法 113 { 114 int bi; 115 int xh=0; 116 int p=xh; 117 int i=0; 118 printf("从第%d项开始查找",xh); 119 while(i<MAX) 120 { 121 if(ram[i].status == 'f' && ram[i].size >= size) 122 { 123 //剩下公式! 124 while(j>=i) 125 { 126 ram[j] = ram[j-1]; 127 j--; 128 } 129 strcpy(ram[i].pn, name); 130 ram[i].begin = ram[i-1].end; 131 ram[i].size = size; 132 ram[i].end = ram[i].begin + ram[i].size; 133 ram[i].status = 'u'; 134 135 ram[i+1].begin = ram[i].end; 136 ram[i+1].size = ram[i+1].size - ram[i].size; 137 break; 138 xh=i; 139 printf("下次循环首次适应从第%d开始查找",xh); 140 141 142 } 143 else 144 { 145 i++; 146 if(i>MAX) 147 { 148 i=0; 149 } 150 } 151 } 152 153 154 155 } 156 else if(flag == 3)//最坏适应算法 157 { 158 j = MAX; 159 int bad = 0; 160 int bi = 0; 161 int i=0; 162 while(i<MAX) 163 { 164 if(ram[i].status == 'f') 165 { 166 if(bad < ram[i].size) 167 { 168 bad = ram[i].size; 169 bi = i; 170 } 171 } 172 i++; 173 } 174 if(ram[bi].status == 'f' && ram[bi].size >= size) 175 { 176 //剩下公式! 177 while(j>=bi) 178 { 179 ram[j] = ram[j-1]; 180 j--; 181 } 182 strcpy(ram[bi].pn, name); 183 ram[bi].begin = ram[bi-1].end; 184 ram[bi].size = size; 185 ram[bi].end = ram[bi].begin + ram[bi].size; 186 ram[bi].status = 'u'; 187 188 ram[bi+1].begin = ram[bi].end; 189 ram[bi+1].size = ram[bi+1].size - ram[bi].size; 190 } 191 192 193 194 195 196 } 197 198 199 200 201 202 203 204 } 205 206 void OutputPart() 207 { 208 int i = 0; 209 printf("空闲区表FREE: "); 210 while(i<MAX) 211 { 212 if(ram[i].status == 'f') 213 { 214 printf("No.%d %s %d %d %d %c ",i+1,ram[i].pn,ram[i].begin,ram[i].size,ram[i].end,ram[i].status); 215 } 216 i++; 217 218 } 219 i = 0; 220 printf(" 已分配区表USED: "); 221 while(i<24) 222 { 223 if(ram[i].status == 'u') 224 { 225 printf("No.%d %s %d %d %d %c ",i+1,ram[i].pn,ram[i].begin,ram[i].size,ram[i].end,ram[i].status); 226 } 227 i++; 228 } 229 printf(" "); 230 } 231 232 233 234 void RecycleRAM() 235 { 236 //回收内存的时候要先判断在空间当中前后是否有空闲区间。 237 char name[10]; 238 int i = 0; 239 240 //当空闲表单中,作业前面有空闲区间时 241 printf(" 请输入要回收的作业的ID:"); 242 scanf("%s",&name); 243 while(i < MAX) 244 { 245 if(strcmp(name,ram[i].pn)==0) 246 { 247 printf("找到任务%d!!! ",i); 248 if(i != 0 && i<MAX) 249 { 250 if(ram[i-1].status == 'f' && ram[i+1].status == 'f') 251 { 252 printf(" 1!!! ",i); 253 254 //合并前后两个分区 255 ram[i-1].end = ram[i+1].end; 256 ram[i-1].size = ram[i-1].size + ram[i].size + ram[i+1].size; 257 ram[i-1].status = 'f'; 258 for(int j = i ; j<MAX ; j++) // 259 { 260 if(j+2 < MAX) 261 ram[j] = ram[j+2]; 262 } 263 } 264 265 } 266 if(ram[i-1].status == 'f' && ram[i+1].status != 'f') 267 { 268 printf(" 2!!! ",i); 269 ram[i-1].end = ram[i].end; 270 ram[i-1].size = ram[i-1].size + ram[i].size; 271 ram[i-1].status = 'f'; 272 for(int j = i ; j<MAX ; j++) 273 { 274 if(j+1 <MAX) 275 { 276 ram[j] = ram[j+1]; 277 } 278 } 279 } 280 else if(ram[i-1].status != 'f' && ram[i+1].status == 'f') 281 { 282 printf(" !!! ",i); 283 ram[i].end = ram[i+1].end; 284 ram[i].size = ram[i].size + ram[i+1].size; 285 ram[i].status = 'f'; 286 for(int j = i+1 ; j<MAX ; j++) 287 { 288 if(j+1 < MAX) 289 { 290 ram[j] = ram[j+1]; 291 } 292 } 293 } 294 else if(ram[i-1].status != 'f' && ram[i+1].status != 'f') 295 { 296 printf(" 4!!! ",i); 297 298 strcpy(ram[1].pn, "------"); 299 ram[i].status = 'f'; 300 301 } 302 } 303 i++; 304 } 305 } 306 menu() 307 { 308 printf(" ****************************"); 309 printf(" 1.添加任务"); 310 printf(" 2.收回内存"); 311 printf(" 3.显示任务 "); 312 printf(" **************************** "); 313 314 } 315 316 317 void main() 318 { 319 int flag; 320 321 strcpy(ram[0].pn, "SYSTEM"); 322 ram[0].begin = 0; 323 ram[0].size = SYSTEM; 324 ram[0].end = ram[0].begin + ram[0].size; 325 ram[0].status = 'u'; 326 327 strcpy(ram[1].pn, "-----"); 328 ram[1].begin = ram[0].end; 329 ram[1].size = RAM - ram[0].size; 330 ram[1].end = RAM; 331 ram[1].status = 'f'; 332 333 printf("初始化,设内存总量为512K "); 334 printf("系统从低地址部分开始使用,占用100K "); 335 336 OutputPart(); 337 while(1) 338 { 339 menu(); 340 scanf("%d",&flag); 341 if(flag == 1) 342 InputPart(); 343 else if(flag == 2) 344 RecycleRAM(); 345 else if(flag == 3) 346 OutputPart(); 347 } 348 349 350 351 352 353 }