实验四、主存空间的分配和回收
专业:商软2班 姓名:柯晓君 学号:201406114210
一、 实验目的
用高级语言完成一个主存空间的分配和回收程序,以加深对动态分区分配方式及其算法的理解。
二、 实验内容和要求
1. 实验要求
采用连续分配方式之动态分区分配存储管理,使用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法4种算法完成设计。
(1)**设计一个作业申请队列以及作业完成后的释放顺序,实现主存的分配和回收。采用分区说明表进行。
(2)或在程序运行过程,由用户指定申请与释放。
(3)设计一个空闲区说明表,以保存某时刻主存空间占用情况。
把空闲区说明表的变化情况以及各作业的申请、释放情况显示。
2. 实验内容
根据指定的实验课题,完成设计、编码和调试工作,完成实验报告。
三、 实验方法、步骤及结果测试
1. 原理分析及流程图
2.主要程序段及其解释
1 #include<stdio.h> 2 #include<conio.h> 3 #include<string.h> 4 #define MAX 24 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 pcb[MAX]; 14 int C=512; 15 int k=0; 16 void Init() 17 { 18 pcb[0].begin = 0; 19 pcb[0].size = C; 20 pcb[0].end = C; 21 pcb[0].status = 'f'; 22 } 23 24 void next(int i) 25 { 26 pcb[i+1].begin = pcb[i].end; 27 pcb[i+1].size = C-pcb[i].size; 28 C=C-pcb[i].size; 29 pcb[i+1].end=512; 30 pcb[i+1].status='f'; 31 } 32 void Output() 33 { 34 int i; 35 printf("空闲区表Free: "); 36 printf("No. proname begin end size status "); 37 for(i=0;i<=k;i++) 38 { 39 if(pcb[i].status=='f') 40 printf("No.%d %s %d %d %d %c ",i+1,pcb[i].pn,pcb[i].begin,pcb[i].end,pcb[i].size,pcb[i].status); 41 } 42 43 printf(" ================================================== "); 44 printf("已分配分区表Used: "); 45 printf("No. proname begin end size status "); 46 for(i = 0;i<=k;i++) 47 { 48 if(pcb[i].status=='u') 49 printf("No.%d %s %d %d %d %c ",i+1,pcb[i].pn,pcb[i].begin,pcb[i].end,pcb[i].size,pcb[i].status); 50 } 51 printf(" 内存使用情况,按起始址增长的排:: "); 52 printf("printf sorted by address:: "); 53 printf("No. proname begin size status "); 54 printf(" ================================================ "); 55 for(i=0;i<=k;i++) 56 { 57 printf("No.%d %s %d %d %c ",i,pcb[i].pn,pcb[i].begin,pcb[i].size,pcb[i].status); 58 } 59 } 60 void First(int i) 61 { 62 strcpy(pcb[i].pn,""); 63 if(pcb[i-1].status=='f' && pcb[i+1].status=='f') 64 { 65 pcb[i-1].size = pcb[i-1].size+pcb[i].size+pcb[i+1].size; 66 pcb[i-1].end = pcb[i+1].end; 67 for(i=i;i<k;i++) 68 { 69 strcpy(pcb[i].pn,pcb[i+1].pn); 70 pcb[i].begin = pcb[i+1].begin; 71 pcb[i].end = pcb[i+1].end; 72 pcb[i].size = pcb[i+1].size; 73 pcb[i].status = pcb[i+1].status; 74 } 75 } 76 else if(pcb[i+1].status == 'f') 77 { 78 pcb[i].size = pcb[i].size+pcb[i+1].size; 79 pcb[i].end = pcb[i+1].end; 80 for(i=i+1;i<k;i++) 81 { 82 strcpy(pcb[i].pn,pcb[i+1].pn); 83 pcb[i].begin = pcb[i+1].begin; 84 pcb[i].end = pcb[i+1].end; 85 pcb[i].size = pcb[i+1].size; 86 pcb[i].status = pcb[i+1].status; 87 } 88 } 89 else if(pcb[i-1].status=='f') 90 { 91 pcb[i-1].size = pcb[i-1].size+pcb[i].size; 92 pcb[i-1].end = pcb[i].end; 93 for(i=i;i<k;i++) 94 { 95 strcpy(pcb[i].pn,pcb[i+1].pn); 96 pcb[i].begin = pcb[i+1].begin; 97 pcb[i].end = pcb[i+1].end; 98 pcb[i].size = pcb[i+1].size; 99 pcb[i].status = pcb[i+1].status; 100 } 101 } 102 103 if(pcb[i+1].status == 'f' && pcb[i-1].status=='f') 104 { 105 k=k-2; 106 } 107 else if(pcb[i+1].status != 'f' && pcb[i-1].status!='f') 108 { 109 } 110 else 111 { 112 k--; 113 } 114 } 115 void Retreat() 116 { 117 int i=0; 118 char pname[10]; 119 printf(" "); 120 printf("请输入要回收的作业名称:"); 121 scanf("%s",&pname); 122 for(i=0;i<k;i++) 123 { 124 if(strcmp(pcb[i].pn, pname) == 0) 125 { 126 pcb[i].status = 'f'; 127 First(i); 128 Output(); 129 break; 130 } 131 } 132 133 } 134 135 void Inputname() 136 { 137 int i; 138 printf("请输入要分配的作业名称: "); 139 scanf("%s",&pcb[k].pn); 140 for(i=0;i<k;i++) 141 { 142 if(strcmp(pcb[i].pn, pcb[k].pn) == 0) 143 { 144 printf("该作业名已存在!请重新输入: "); 145 Inputname(); 146 } 147 } 148 } 149 void Inputsize() 150 { 151 printf(" 输入作业所占空间大小: "); 152 scanf("%d",&pcb[k].size); 153 pcb[k].status = 'u'; 154 pcb[k].end = pcb[k].begin + pcb[k].size; 155 if(pcb[k].end>=C) 156 { 157 printf("内存空间不足! "); 158 Inputsize(); 159 } 160 else{ 161 next(k); 162 k++; 163 } 164 } 165 166 void choice() 167 { 168 int c; 169 printf(" "); 170 printf(" ======================= "); 171 printf(" | 1.分配内存空间 | "); 172 printf(" | 2.回收内存空间 | "); 173 printf(" ======================= "); 174 printf("请输入您的选择(1或2):"); 175 scanf("%d",&c); 176 switch(c) 177 { 178 case 1: 179 Inputname(); 180 Inputsize(); 181 Output(); 182 break; 183 case 2: 184 Retreat(); 185 break; 186 default: 187 printf(" 输入有误,请重新输入 "); 188 choice(); 189 break; 190 } 191 } 192 193 void main() 194 { 195 Init(); 196 printf(" 请输入操作系统占用的分区大小: "); 197 scanf("%d",&pcb[k].size); 198 printf(" 请输入操作系统的名称: "); 199 scanf("%s",&pcb[k].pn); 200 pcb[k].begin=0; 201 pcb[k].end=pcb[k].begin+pcb[k].size; 202 pcb[k].status='u'; 203 next(k); 204 k++; 205 printf("初始化,设内存总容量%d k ",C); 206 printf("系统从低地址部分开始使用,占用%d k ",pcb[0].size); 207 Output(); 208 while(pcb[k].end>=C) 209 { 210 choice(); 211 } 212 }
3.运行结果及分析
四、实验总结
加深了对操作系统主存空间的分配和回收程序以及动态分区分配方式的理解。