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;
1 #include < stdio.h > 2 #include < conio.h > 3 #include < string.h > 4 #define MAX 512 5 #define MIN 5 6 7 struct partition { 8 char pn[10]; 9 int begin; 10 int size; 11 int end; 12 char status; 13 }; 14 struct partition part[MAX]; 15 int p = 0; 16 17 void Init( ) 18 { 19 int i; 20 for( i = 0; i < MAX; i++ ) 21 part[i].status = '-'; 22 strcpy( part[0].pn, "SYSTEM" ); 23 part[0].begin = 0; 24 part[0].size = 100; 25 part[0].status = 'u'; 26 strcpy(part[1].pn,"-----"); 27 part[1].begin=100; 28 part[1].size=412; 29 part[1].status='f'; 30 for( i = 0; i < MAX; i++ ) 31 part[i].end = part[i].begin + part[i].size; 32 } 33 34 void Output( int i ) 35 { 36 printf( "\t%s", part[i].pn ); 37 printf( "\t%d", part[i].begin ); 38 printf( "\t%d", part[i].size ); 39 printf( "\t%d", part[i].end ); 40 printf( "\t%c", part[i].status ); 41 } 42 43 void ShowData( ) 44 { 45 int i; 46 int n; 47 printf( "\n================================================================" ); 48 printf( "\n已分配分区表Used:" ); 49 printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" ); 50 printf( "\n\t------------------------------------------------" ); 51 n = 1; 52 for( i = 0; i < MAX; i++ ) 53 { 54 if ( part[i].status == '-' )//遇到-就退出循环 55 break; 56 if ( part[i].status == 'u' ) 57 { 58 printf( "\n\tNo.%d", n ); 59 Output( i ); 60 n++; 61 } 62 } 63 printf( "\n" ); 64 printf( "\n================================================================" ); 65 printf( "\n空闲分区表Free:" ); 66 printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" ); 67 printf( "\n\t------------------------------------------------" ); 68 n = 1; 69 for( i = 0; i < MAX; i++ ) 70 { 71 if ( part[i].status == '-' ) 72 break; 73 if ( part[i].status == 'f' ) 74 { 75 printf( "\n\tNo.%d", n ); 76 Output( i ); 77 n++; 78 } 79 } 80 printf( "\n" ); 81 printf( "\n" ); 82 printf( "\n================================================================" ); 83 printf( "\n内存使用情况,按起始址增长的排:" ); 84 printf( "\nprintf sorted by address:" ); 85 printf( "\n\tNo.\tproname\tbegin\tsize\tend\tstatus" ); 86 printf( "\n\t------------------------------------------------" ); 87 n = 1; 88 for( i = 0; i < MAX; i++ ) 89 { 90 if ( part[i].status == '-' ) 91 break; 92 printf( "\n\tNo.%d", n ); 93 Output( i ); 94 n++; 95 } 96 getch( ); 97 } 98 99 void Fit( int a, char workName[], int workSize )100 {101 int i;102 if ( part[a].size - workSize < MIN )103 {104 strcpy( part[a].pn, workName );105 part[a].status = 'u';106 }107 for( i = MAX; i > a + 1; i-- )108 {109 if ( part[i - 1].status == '-' )110 continue;111 strcpy( part[i].pn, part[i - 1].pn );112 part[i].begin = part[i - 1].begin;113 part[i].size = part[i - 1].size;114 part[i].end = part[i - 1].end;115 part[i].status = part[i - 1].status;116 }117 strcpy( part[a + 1].pn, "-----" );118 part[a + 1].begin = part[a].begin + workSize;119 part[a + 1].size = part[a].size - workSize;120 part[a + 1].end = part[a].end;121 part[a + 1].status = 'f';122 strcpy( part[a].pn, workName );123 part[a].size = workSize;124 part[a].end = part[a].begin + part[a].size;125 part[a].status = 'u';126 }127 128 void Allocation( )129 {130 int i;131 int a;132 int workSize;133 char workName[10];134 int pFree;135 printf( "\n请输入作业名称:" );136 while(1)137 {138 scanf( "%s", &workName );139 for( i = 0; i < MAX; i++ )140 {141 if ( strcmp( workName, part[i].pn ) == 0 )142 {143 printf( "该作业名称已经存在,请重新输入:" );144 break;145 }146 }147 if ( i == MAX )148 break;149 }150 printf( "请输入作业大小(k):" );151 while(1)152 {153 scanf( "%d", &workSize );154 for( i = 0; i < MAX; i++ )155 {156 if ( part[i].status == 'f' && part[i].size >= workSize )157 {158 pFree = i;159 break;160 }161 }162 if ( i == MAX )163 printf( "该作业大小超出最大可分配空间,请重新输入:" );164 else 165 break;166 }167 printf( "\n请选择分配算法:" );168 printf( "\n1、最先适应" );169 printf( "\n2、最优适应" );170 printf( "\n3、最坏适应" );171 printf( "\n请输入选项:" );172 while ( 1 )173 {174 scanf( "%d", &a );175 if ( a == 1 || a == 2 || a == 3 || a == 4 )176 break;177 printf( "输入错误,请重新输入:" );178 }179 switch ( a )180 {181 case 1:182 for( i = 0; i < MAX; i++ )183 if ( part[i].status == 'f' && part[i].size >= workSize )184 break;185 Fit( i, workName, workSize );186 break;187 case 2:188 for( i = 0; i < MAX; i++ )189 if ( part[i].status == 'f' && part[i].size >= workSize )190 if ( part[pFree].size > part[i].size )191 pFree = i;192 Fit( pFree, workName, workSize );193 break;194 case 3:195 for( i = 0; i < MAX; i++ )196 if ( part[i].status == 'f' && part[i].size >= workSize )197 if ( part[pFree].size < part[i].size )198 pFree = i;199 Fit( pFree, workName, workSize );200 break;201 default:202 break;203 }204 printf( "\n分配成功!" );205 getch( );206 }207 208 void Merge( )209 {210 int i = 0;211 while ( i != MAX - 1 )212 {213 for( i = 0; i < MAX - 1; i++ )214 {215 if ( part[i].status == 'f' )216 if ( part[i + 1].status == 'f' )217 {218 part[i].size = part[i].size + part[i + 1].size;219 part[i].end = part[i].begin + part[i].size;220 i++;221 for( i; i < MAX - 1; i++ )222 {223 if ( part[i + 1].status == '-' )224 {225 part[i].status = '-';226 break;227 }228 strcpy( part[i].pn, part[i + 1].pn );229 part[i].begin = part[i + 1].begin;230 part[i].size = part[i + 1].size;231 part[i].end = part[i + 1].end;232 part[i].status = part[i + 1].status;233 }234 part[MAX - 1].status = '-';235 break;236 }237 }238 }239 }240 241 void Recovery( )242 {243 int i;244 char workName[10];245 printf( "\n请输入回收的分区名称:" );246 scanf( "%s", &workName );247 if ( strcmp( workName, "SYSTEM" ) == 0 )248 {249 printf( "\n系统分区无法回收" );250 return;251 }252 for( i = 0; i < MAX; i++ )253 {254 if ( strcmp( workName, part[i].pn ) == 0 )255 {256 strcpy( part[i].pn, "-----" );257 part[i].status = 'f';258 Merge( );259 printf( "\n回收成功!" );260 getch( );261 return;262 }263 }264 if ( i == MAX )265 {266 printf( "\n找不到分区!" );267 return;268 }269 }270 271 void main( )272 {273 int a;274 Init( );275 printf( "初始化,设内存容量%dk", MAX );276 printf( "\n系统从低地址部分开始使用,占用%dk", part[0].size );277 printf( "\n" );278 while ( 1 )279 {280 printf( "\n" );281 printf( "\n1、显示分区" );282 printf( "\n2、分配作业" );283 printf( "\n3、回收分区" );284 printf( "\n请输入选项:" );285 while ( 1 )286 {287 scanf( "%d", &a );288 if ( a == 1 || a == 2 || a == 3 )289 break;290 printf( "输入错误,请重新输入:" );291 }292 switch ( a )293 {294 case 1:295 ShowData( );296 break;297 case 2:298 Allocation( );299 break;300 case 3:301 Recovery( );302 break;303 default:304 break;305 }306 }307 }
结果:
初始化
输入作业
回收空间
总结:
经过这次的实验,我懂得了操作系统分配内存的一些基础知识,操作系统主要是寻找空闲区,然后有作业进来就自动寻找合适的空闲区,然后就插入此区域,释放内存后要观察此作业两边的情况,根据不同的情况,对回收的空间进行不一样的处理