操作系统--实验四
实验四主存空间的分配和回收
1. 目的和要求
1.1. 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
1.2. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。
把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
2. 实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
3. 实验环境
可以选用Visual C++作为开发环境。也可以选用Windows下的VB,CB或其他可视化环境,利用各种控件较为方便。自主选择实验环境。
4. 代码:
1 #include<stdio.h> 2 #include<conio.h> 3 #include<string.h> 4 #include<stdlib.h> /*含ma l l o c ( ) 的头文件*/ 5 #define MAX 24 6 #define MEMORY 512 7 #define OSSIZE 100 8 struct partition{ 9 10 char pn[10]; 11 int begin; 12 int size; 13 int end; //////// 14 char status; ////////// 15 struct partition *next; 16 }; 17 typedef struct partition PART; 18 int MemorySize(PART *mem,PART *head); 19 void init(PART *mem,PART *head); 20 void input(PART *mem,PART *head); 21 void output(PART *mem,PART *head); 22 void recycle(PART *mem,PART *head); 23 void ComMemory(PART *mem,PART *head); 24 void main(){ 25 26 PART *mem,*head; 27 int sel; 28 head=mem=(struct partition*)malloc(sizeof(struct partition));/*新节点*/ 29 init(mem,head); 30 while(1){ 31 printf("\n\n1.输出信息\n2.输入信息\n3.回收作业\n4.退出"); 32 printf("\n\n请选择:"); 33 scanf("%d",&sel); 34 switch(sel){ 35 case 1: 36 output(mem,head); 37 break; 38 case 2: 39 //创建新作业 40 input(mem,head); 41 break; 42 case 3: 43 recycle(mem,head); 44 break; 45 case 4: 46 exit(0); 47 break; 48 default: 49 printf(" 请正确选择!"); 50 } 51 } 52 } 53 //初始化 54 void init(PART *mem,PART *head){ 55 PART *q=(struct partition*)malloc(sizeof(struct partition)); 56 printf("初始化:设内存总容量%dk\n",MEMORY); 57 printf("系统从低地址部分开始使用,占用%dk\n",OSSIZE); 58 head=mem;//链表的头 59 mem->begin=0; 60 mem->size=OSSIZE; 61 mem->end=mem->size-mem->begin; 62 strcpy(mem->pn,"SYSTEM"); 63 mem->status='u'; 64 //mem->next=NULL; 65 66 q->begin=OSSIZE; 67 q->size=MEMORY-OSSIZE; 68 q->end=MEMORY; 69 strcpy(q->pn,"-----"); 70 q->status='f'; 71 q->next=NULL; 72 mem->next=q; 73 mem=q; 74 } 75 //回收作业 76 void recycle(PART *mem,PART *head) 77 { 78 char tempName[10]; 79 output(mem,head); 80 printf("\n\n输入需要回收的作业名"); 81 scanf("%s",&tempName); 82 mem=head; 83 while(mem!=NULL) 84 { 85 86 if(strcmp(mem->pn, tempName)==0){ 87 break; 88 } 89 else{ 90 mem=mem->next; 91 } 92 } 93 if(mem==NULL){ 94 printf("\n回收失败!作业名不存在!\n"); 95 }else{ 96 strcpy(mem->pn,"-----"); 97 mem->status='f'; 98 ComMemory(mem,head); 99 printf("\n回收成功!\n"); 100 } 101 while(mem!=NULL) 102 mem=mem->next; 103 104 } 105 //计算分配后剩余的内存 106 int MemorySize(PART *mem,PART *head) 107 { 108 int memSize=0; 109 mem=head; 110 while(mem!=NULL) 111 { 112 if(mem->status=='u') 113 { 114 memSize+=mem->size; 115 } 116 mem=mem->next; 117 } 118 memSize=MEMORY-memSize; 119 return memSize; 120 } 121 //合并空内存块 122 void ComMemory(PART *mem,PART *head){ 123 mem=head; 124 while(mem!=NULL) 125 { 126 if(mem->next!=NULL){ 127 128 if(mem->status==(mem->next)->status){ 129 mem->end+=mem->next->end; 130 mem->size+=mem->next->size; 131 mem->next=mem->next->next; 132 } 133 } 134 mem=mem->next; 135 } 136 } 137 138 139 void input(PART *mem,PART *head){ 140 //创建新作业 141 PART *p; 142 PART *q=(struct partition*)malloc(sizeof(struct partition)); 143 int num; 144 /* printf("\n\n需要插入的作业个数:"); 145 scanf("%d",&num); 146 for(int i=0;i<num;i++){*/ 147 148 p=(struct partition*)malloc(sizeof(struct partition));/*新节点*/ 149 150 while(1){ 151 printf("\n输入作业名:"); 152 scanf("%s",&p->pn); 153 q=head; 154 while(q!=NULL) 155 { 156 157 if(strcmp(q->pn, p->pn)==0){ 158 printf("\n作业名已存在!\n请重新输入 :"); 159 scanf("%s",&p->pn); 160 q=head; 161 } 162 else{ 163 q=q->next; 164 } 165 } 166 if(q==NULL) 167 break; 168 } 169 170 171 while(1){ 172 printf("输入作业需要的内存大小:"); 173 scanf("%d",&p->size); 174 q=head; 175 while(q!=NULL) 176 { 177 if(q->status=='f'&&(q->size >= p->size)){ 178 p->begin=mem->end; 179 p->end=mem->end+p->size; 180 p->status='u'; 181 p->next=NULL; 182 mem=p; 183 break; 184 } 185 else{ 186 q=q->next; 187 } 188 } 189 if(q!=NULL){ 190 break; 191 }else{ 192 printf("\n内存大小不足!\n"); 193 printf("\n重新"); 194 } 195 } 196 197 198 /* }*/ 199 200 q=(struct partition*)malloc(sizeof(struct partition));/*新节点*/ 201 strcpy(p->pn,"------"); 202 /*q->size=MemorySize(mem,head);*/ 203 q->size=mem->size-p->size; 204 q->begin=mem->end; 205 q->end=q->size+q->begin; 206 q->status='f'; 207 q->next=NULL; 208 209 p->next=q; 210 mem->next=p; 211 mem=p; 212 } 213 214 215 void output(PART *mem,PART *head){ 216 //空闲区打印 217 printf("\n\n空闲区\n"); 218 printf("进程名\t开始\t大小\t状态\n"); 219 mem=head; 220 while(mem!=NULL) 221 { 222 223 224 if(mem->status=='f') 225 { 226 printf("%s\t",mem->pn); 227 printf("%d\t",mem->begin); 228 printf("%d\t",mem->size); 229 printf("%c\t",mem->status); 230 printf("\n"); 231 } 232 mem=mem->next; 233 } 234 235 //已经分配区打印 236 printf("\n已分配\n"); 237 printf("进程名\t开始\t大小\t状态\n"); 238 mem=head; 239 while(mem!=NULL) 240 { 241 242 243 if(mem->status=='u') 244 { 245 printf("%s\t",mem->pn); 246 printf("%d\t",mem->begin); 247 printf("%d\t",mem->size); 248 printf("%c\t",mem->status); 249 printf("\n"); 250 }mem=mem->next; 251 } 252 253 //打印全部 254 printf("\n全部\n"); 255 printf("进程名\t开始\t大小\t状态\n"); 256 mem=head; 257 while(mem!=NULL) 258 { 259 printf("%s\t",mem->pn); 260 printf("%d\t",mem->begin); 261 printf("%d\t",mem->size); 262 printf("%c\t",mem->status); 263 printf("\n"); 264 mem=mem->next; 265 } 266 267 268 }
5. 运行结果: