代码:
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 return;107 }108 for( i = MAX; i > a + 1; i-- )109 {110 if ( part[i - 1].status == '-' )111 continue;112 strcpy( part[i].pn, part[i - 1].pn );113 part[i].begin = part[i - 1].begin;114 part[i].size = part[i - 1].size;115 part[i].end = part[i - 1].end;116 part[i].status = part[i - 1].status;117 }118 strcpy( part[a + 1].pn, "-----" );119 part[a + 1].begin = part[a].begin + workSize;120 part[a + 1].size = part[a].size - workSize;121 part[a + 1].end = part[a].end;122 part[a + 1].status = 'f';123 strcpy( part[a].pn, workName );124 part[a].size = workSize;125 part[a].end = part[a].begin + part[a].size;126 part[a].status = 'u';127 }128 129 void Allocation( )130 {131 int i;132 int a;133 int workSize;134 char workName[10];135 int pFree;136 printf( "\n请输入作业名称:" );137 while(1)138 {139 scanf( "%s", &workName );140 for( i = 0; i < MAX; i++ )141 {142 if ( part[i].status == 'u' && strcmp( workName, part[i].pn ) == 0 )143 {144 printf( "该作业名称已经存在,请重新输入:" );145 break;146 }147 }148 if ( i == MAX )149 break;150 }151 printf( "请输入作业大小(k):" );152 while(1)153 {154 scanf( "%d", &workSize );155 for( i = 0; i < MAX; i++ )156 {157 if ( part[i].status == 'f' && part[i].size >= workSize )158 {159 pFree = i;160 break;161 }162 }163 if ( i == MAX )164 printf( "该作业大小超出最大可分配空间,请重新输入:" );165 else break;166 }167 printf( "\n请选择分配算法:" );168 printf( "\n1、最先适应(first fit)" );169 printf( "\n2、下次适应(next fit)" );170 printf( "\n3、最优适应(best fit)" );171 printf( "\n4、最坏适应(worst fit)" );172 printf( "\n请输入选项:" );173 while ( 1 )174 {175 scanf( "%d", &a );176 if ( a == 1 || a == 2 || a == 3 || a == 4 )177 break;178 printf( "输入错误,请重新输入:" );179 }180 switch ( a )181 {182 case 1:183 for( i = 0; i < MAX; i++ )184 if ( part[i].status == 'f' && part[i].size >= workSize )185 break;186 Fit( i, workName, workSize );187 break;188 case 2:189 for( p; p < MAX; p++ )190 {191 if ( p == MAX )192 p = 0;193 if ( part[p].status == 'f' && part[p].size >= workSize )194 break;195 }196 Fit( p, workName, workSize );197 break;198 case 3:199 for( i = 0; i < MAX; i++ )200 if ( part[i].status == 'f' && part[i].size >= workSize )201 if ( part[pFree].size > part[i].size )202 pFree = i;203 Fit( pFree, workName, workSize );204 break;205 case 4:206 for( i = 0; i < MAX; i++ )207 if ( part[i].status == 'f' && part[i].size >= workSize )208 if ( part[pFree].size < part[i].size )209 pFree = i;210 Fit( pFree, workName, workSize );211 break;212 default:213 break;214 }215 printf( "\n分配成功!" );216 getch( );217 }218 219 void Merge( )220 {221 int i = 0;222 while ( i != MAX - 1 )223 {224 for( i = 0; i < MAX - 1; i++ )225 {226 if ( part[i].status == 'f' )227 if ( part[i + 1].status == 'f' )228 {229 part[i].size = part[i].size + part[i + 1].size;230 part[i].end = part[i].begin + part[i].size;231 i++;232 for( i; i < MAX - 1; i++ )233 {234 if ( part[i + 1].status == '-' )235 {236 part[i].status = '-';237 break;238 }239 strcpy( part[i].pn, part[i + 1].pn );240 part[i].begin = part[i + 1].begin;241 part[i].size = part[i + 1].size;242 part[i].end = part[i + 1].end;243 part[i].status = part[i + 1].status;244 }245 part[MAX - 1].status = '-';246 break;247 }248 }249 }250 }251 252 void Recovery( )253 {254 int i;255 char workName[10];256 printf( "\n请输入回收的分区名称:" );257 scanf( "%s", &workName );258 if ( strcmp( workName, "SYSTEM" ) == 0 )259 {260 printf( "\n系统分区无法回收" );261 return;262 }263 for( i = 0; i < MAX; i++ )264 {265 if ( strcmp( workName, part[i].pn ) == 0 )266 {267 strcpy( part[i].pn, "-----" );268 part[i].status = 'f';269 Merge( );270 printf( "\n回收成功!" );271 getch( );272 return;273 }274 }275 if ( i == MAX )276 {277 printf( "\n找不到分区!" );278 return;279 }280 }281 282 void main( )283 {284 int a;285 Init( );286 printf( "201406114131 商软一班 彭一健 实验4" );287 printf( "\n初始化,设内存容量%dk", MAX );288 printf( "\n系统从低地址部分开始使用,占用%dk", part[0].size );289 printf( "\n" );290 while ( 1 )291 {292 printf( "\n" );293 printf( "\n1、显示分区" );294 printf( "\n2、分配作业" );295 printf( "\n3、回收分区" );296 printf( "\n请输入选项:" );297 while ( 1 )298 {299 scanf( "%d", &a );300 if ( a == 1 || a == 2 || a == 3 )301 break;302 printf( "输入错误,请重新输入:" );303 }304 switch ( a )305 {306 case 1:307 ShowData( );308 break;309 case 2:310 Allocation( );311 break;312 case 3:313 Recovery( );314 break;315 default:316 break;317 }318 }319 }
运行截图:
实验四主存空间的分配和回收
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;
第一步:(第13周完成)
完成程序数据结构的创建,初始化内存分配情况,创建空闲分区表和已分配分区表。