实验四主存空间的分配和回收
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验四主存空间的分配和回收相关的知识,希望对你有一定的参考价值。
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 18 void init() 19 { 20 p[0].begin = 0; 21 p[0].end = 200; 22 strcpy(p[0].pn, "SYSTEM"); 23 p[0].size = 200; 24 p[0].status = ‘u‘; 25 26 p[1].begin = 200; 27 p[1].end = 1024; 28 strcpy(p[1].pn, "-----"); 29 p[1].size = p[1].end - p[1].begin; 30 p[1].status = ‘f‘; 31 32 n = 2; 33 } 34 35 void show() 36 { 37 int x = 1; 38 39 printf("空闲区表Free:\n"); 40 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 41 for(int i = 0; i < n; i++) 42 { 43 if(p[i].status == ‘f‘) 44 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); 45 } 46 printf("\n\n=========================================================\n"); 47 48 printf("已分配分区表Used:\n"); 49 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 50 for(i = 0, x = 1; i < n; i++) 51 { 52 if(p[i].status == ‘u‘) 53 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); 54 } 55 56 printf("\n\n=========================================================\n"); 57 58 printf("内存使用情况:\nprintf sorted by address:\n"); 59 printf("\tNo.\tproname\tbegin\tsize\tstatus\n"); 60 printf("\t--------------------------------------\n"); 61 for(i = 0, x = 1; i < n; i++) 62 { 63 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); 64 } 65 } 66 67 void input(char name[], int * size) 68 { 69 int x = 1; 70 71 while(x) 72 { 73 printf("\n\n请输入进程名称:"); 74 scanf("%s", name); 75 76 for(int i = 0; i < n; i++) 77 { 78 x = 0; 79 if(strcmp(name, p[i].pn) == 0) 80 { 81 x = 1; 82 printf("进程名称已存在,请重新输入!"); 83 break; 84 } 85 } 86 87 } 88 89 x = 1; 90 scanf("!!!\n"); 91 while(x) 92 { 93 printf("\n请输入进程需要的空间大小:"); 94 scanf("%d", size); 95 96 for(int i = 0; i < n; i++) 97 { 98 99 if(p[i].size >= *size) 100 { 101 x = 0; 102 break; 103 } 104 } 105 if(x) 106 printf("找不到适合的空间,请重新输入!"); 107 } 108 109 } 110 111 int show_menu() 112 { 113 int x; 114 115 printf("\n(1)首次适应算法"); 116 printf("\n(2)循环首次适应算法"); 117 printf("\n(3)最佳适应算法"); 118 printf("\n(4)最坏适应算法"); 119 printf("\n请选择一种分配方式:"); 120 scanf("%d", &x); 121 while(x < 1 || x > 4) 122 { 123 printf("\n输入错误!"); 124 printf("\n请选择一种分配方式:"); 125 scanf("%d", &x); 126 } 127 128 return x; 129 } 130 131 void first_fit(char name[], int size) 132 { 133 for(int i = 0; i < n; i++) 134 { 135 if(p[i].status == ‘f‘) 136 { 137 if(p[i].size - size < msize) 138 { 139 strcpy(p[i].pn, name); 140 p[i].status = ‘u‘; 141 break; 142 } 143 else 144 { 145 strcpy(p[n].pn, p[i].pn); 146 p[n].begin = p[i].begin + size; 147 p[n].end = p[i].end; 148 p[n].size = p[n].end - p[n].begin; 149 p[n].status = ‘f‘; 150 strcpy(p[i].pn, name); 151 p[i].end = p[i].begin + size; 152 p[i].size = size; 153 p[i].status = ‘u‘; 154 n++; 155 break; 156 } 157 } 158 } 159 160 } 161 162 void next_fit() 163 { 164 165 } 166 167 void best_fit() 168 { 169 170 } 171 172 void worst_fit() 173 { 174 175 } 176 177 void allocation() 178 { 179 char name[10]; 180 int size; 181 182 input(name, &size); 183 int x = show_menu(); 184 185 switch(x) 186 { 187 case 1: 188 first_fit(name, size); 189 break; 190 case 2: 191 next_fit(); 192 break; 193 case 3: 194 best_fit(); 195 break; 196 case 4: 197 worst_fit(); 198 break; 199 } 200 201 show(); 202 } 203 204 void move(int i, int o) 205 { 206 while(i != 0 && i < n) 207 { 208 strcpy(p[i-1].pn, p[i].pn); 209 p[i-1].begin = p[i].begin; 210 p[i-1].end = p[i].end; 211 p[i-1].size = p[i].size; 212 p[i-1].status = p[i].status; 213 } 214 n--; 215 } 216 217 void recycle() 218 { 219 char name[10]; 220 int x = 0; 221 222 printf("\n\n请输入进程名称:"); 223 scanf("%s", name); 224 225 for(int i = 0; i < n; i++) 226 { 227 if(strcmp(name, p[i].pn) == 0) 228 { 229 x = 1; 230 break; 231 } 232 } 233 if(x == 0) 234 printf("\n\n进程不存在。\n"); 235 else if(x == 1) 236 { 237 if(p[i-1].status == ‘u‘ && p[i+1].status == ‘u‘) 238 { 239 strcpy(p[i].pn, "-----"); 240 p[i].status = ‘f‘; 241 } 242 else if(p[i+1].status == ‘f‘) 243 { 244 printf("\n!!!\n"); 245 strcpy(p[i].pn, "-----"); 246 p[i].status = ‘f‘; 247 p[i].end = p[i+1].end; 248 p[i].size += p[i+1].size; 249 move(i+2, 1); 250 } 251 else if(p[i-1].status == ‘f‘) 252 { 253 p[i-1].end = p[i].end; 254 p[i-1].size += p[i].size; 255 move(i+1, 1); 256 } 257 else if(p[i-1].status == ‘f‘ && p[i+1].status == ‘f‘) 258 { 259 p[i-1].end = p[i+1].end; 260 p[i-1].size = p[i-1].size + p[i].size + p[i+1].size; 261 move(i+1, 2); 262 } 263 } 264 265 show(); 266 } 267 268 int main(void) 269 { 270 int x = 0; 271 272 printf("初始化:设置内存总容量为 1024k\n系统从低地址部分开始占用 200k\n\n"); 273 274 init(); 275 show(); 276 277 printf("\n1. 输入进程 2. 回收进程\n"); 278 scanf("%d", &x); 279 while(1) 280 { 281 if(x == 1) 282 allocation(); 283 else if(x == 2) 284 recycle(); 285 286 printf("\n1. 输入进程 2. 回收进程\n"); 287 scanf("%d", &x); 288 } 289 290 291 292 return 0; 293 }
以上是关于实验四主存空间的分配和回收的主要内容,如果未能解决你的问题,请参考以下文章