实验四主存空间的分配和回收
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;
5、源代码
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 void init() 17 { 18 p[0].begin = 0; 19 p[0].end = 150; 20 strcpy(p[0].pn, "SYSTEM"); 21 p[0].size = 100; 22 p[0].status = 'u'; 23 24 p[1].begin = 150; 25 p[1].end = 1024; 26 strcpy(p[1].pn, "-----"); 27 p[1].size = p[1].end - p[1].begin; 28 p[1].status = 'f'; 29 30 n = 2; 31 } 32 33 void print() 34 { 35 int x = 1; 36 37 printf("空闲区表Free: "); 38 printf(" No. proname begin size status "); 39 for(int i = 0; i < n; i++) 40 { 41 if(p[i].status=='f') 42 printf(" No.%d %s %4d %4d %4c ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 43 } 44 printf(" ========================================================= "); 45 46 printf("已分配分区表Used: "); 47 printf(" No. proname begin size status "); 48 for(i = 0, x = 1; i < n; i++) 49 { 50 if(p[i].status=='u') 51 printf(" No.%d %s %4d %4d %4c ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 52 } 53 54 printf(" ========================================================= "); 55 56 printf("内存使用情况: printf sorted by address: "); 57 printf(" No. proname begin size status "); 58 printf(" -------------------------------------- "); 59 for(i = 0, x = 1; i < n; i++) 60 { 61 printf(" No.%d %s %4d %4d %4c ", x++, p[i].pn, p[i].begin, p[i].size, p[i].status); 62 } 63 } 64 65 void input() 66 { 67 int x = 1; 68 while(x) 69 { 70 printf(" 请输入进程名称:"); 71 scanf("%s", &p[n].pn); 72 73 for(int i = 0; i < n; i++) 74 { 75 x = 0; 76 if(strcmp(p[n].pn, p[i].pn) == 0) 77 { 78 x = 1; 79 printf("进程名称已存在,请重新输入!"); 80 break; 81 } 82 } 83 } 84 x = 1; 85 while(x) 86 { 87 printf(" 请输入进程需要的空间大小:"); 88 scanf("%d", &p[n].size); 89 90 for(int i = 0; i < n; i++) 91 { 92 93 if(p[i].size >=p[n].size) 94 { 95 x = 0; 96 break; 97 } 98 } 99 if(x) 100 printf("找不到适合的空间,请重新输入!"); 101 } 102 } 103 104 void fenqu() 105 { 106 PART temp[MAX]; 107 for(int i = 0;i < n; i++) 108 { 109 if(p[i].status=='f') 110 { 111 if(p[i].size >= p[n].size) 112 { 113 temp[0]=p[i]; 114 p[i]=p[n]; 115 p[n]=temp[0]; 116 117 p[i].end=p[n].begin+p[i].size; 118 p[i].status='u'; 119 p[i].begin=p[n].begin; 120 p[n].begin=p[i].end; 121 p[n].end=temp[0].end; 122 p[n].status='f'; 123 p[n].size=p[n].size-p[i].size; 124 n++; 125 break; 126 } 127 128 } 129 } 130 } 131 132 133 void caculate(int i) 134 { 135 int x=0; 136 p[i].end = p[i].begin+p[i].size; 137 p[i-1].end=p[i-1].begin+p[i-1].size; 138 if(p[i+1].status=='f' && p[i].end==p[i+1].begin) 139 { x=1; 140 p[i+1].begin=p[i].begin; 141 p[i+1].size=p[i].size+p[i+1].size; 142 for(int j=i;j<n;j++) 143 { 144 p[j]=p[j+1]; 145 } 146 n=n-1; 147 } 148 if(p[i-1].status=='f' && p[i-1].end==p[i].begin) 149 { x=1; 150 p[i].begin=p[i-1].begin; 151 p[i].size=p[i-1].size+p[i].size; 152 strcpy(p[i].pn, "-----"); 153 p[i].status = 'f'; 154 for(int k=i;k<n;k++) 155 { 156 p[k-1]=p[k]; 157 } 158 n=n-1; 159 } 160 if(x==0) 161 { 162 strcpy(p[i].pn, "-----"); 163 p[i].status = 'f'; 164 } 165 } 166 167 void recycle() 168 { 169 char name[50]; 170 int x = 1; 171 while(x) 172 { 173 printf(" 请输入进程名称:"); 174 scanf("%s", &name); 175 for(int i = 0; i < n; i++) 176 { 177 if(strcmp(name, p[i].pn) == 0) 178 { 179 x = 0; 180 caculate(i); 181 break; 182 } 183 } 184 if(x==1) 185 { 186 printf("没找到请重新输入 "); 187 } 188 189 } 190 } 191 int main(void) 192 { 193 int choose1,choose2; 194 printf("初始化:设置内存总容量为 1024k 系统从低地址部分开始占用 150k "); 195 196 init(); 197 print(); 198 199 while(1) 200 { 201 printf("请选择:1.分配内存 2.回收内存 3.结束 "); 202 scanf("%d",&choose1); 203 if(choose1==1) 204 { 205 input(); 206 fenqu(); 207 print(); 208 } 209 if(choose1==2) 210 { 211 recycle(); 212 print(); 213 } 214 if(choose1==3) 215 break; 216 } 217 218 return 0; 219 }
运行结果:
6、实验总结:
今次实验让我学会了首次适应算法、循环首次适应算法、和最坏适应算法3种算法,让我明白了学习编程必须要思路清晰。