实验四主存空间的分配和回收
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
#include<conio.h>
#define Memory 1024
struct partition{
char pn[10];
int begin;
int size;
int end; ////////
char status; //////////内存状态
};
typedef struct partition PART;
void Freesize();
void nicefit();
void restart();
void firstfit();
PART Free[MAX],User[MAX],addresses[MAX],t;//t是用于排序最优算法的变量
int nFree;//空闲内存的数量
int nUsed;//使用的数量
int naddresses;//地址数量
void restart()//初始化
{int j=0;
nFree=0,nUsed=0,naddresses=0;
strcpy(User[0].pn,"SYSTEM");
User[0].begin=0;
User[0].size=50;
nUsed++;
printf("初始化,设内存总容量为1024k\n");
printf("系统从低地址部分开始使用,占用50k\n\n已初始化");
strcpy(Free[0].pn,"----");
Free[0].begin=0;//开始系统占用50K
Free[0].size=50;
Free[0].status='n';//n表示再用
nFree=4;
naddresses++;
Free[1].size=40;
Free[1].status='f';
Free[2].size=50;
Free[2].status='f';
Free[3].size=120;
Free[3].status='f';
Free[4].size=70;
Free[4].status='f';
Freesize();
}
void Freesize(){
for(int j=1;j<nFree+1;j++)
{
Free[j].begin=Free[j-1].begin+Free[j-1].size;
}
}
void PT()//打印
{
int i;
printf("空闲区表Free\n");
printf("\t\t\tNo.\tproname\tbegin\tsize\tstatus\n");
for(i=0;i<=nFree;i++)
printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);
printf("已分配分区表Used\n");
printf("\t\t\tNo.\tproname\tbegin\tsize\tstatus\n");
for(i=0;i<=nUsed+1;i++)
printf("\t\t\tNo.%d\t%s\t%d\t%d\t%c\n",i,User[i].pn,User[i].begin,User[i].size,User[i].status);
}
void nicefit()
{int i=1;int j=0;int a=i;int num;int flag=0;int p;
printf("插入几个进程\n");
scanf("%d",&num);
for(i=1;i<num+1;i++){
printf("名字为\n");
scanf("%s",&User[i].pn);
printf("大小\n");
getchar();
scanf("%d",&User[i].size);
}//输入进程
//排序
for(p=1;p<5;p++){
if(Free[p].size>Free[flag].size)
flag=p;
}
for(i=1;i<num+1;i++){
printf("%d\n",flag);
if(User[i].size<Free[flag].size && Free[flag].status=='f')
{
Free[flag].size=Free[flag].size-User[i].size;
User[i].begin=Free[flag].begin;
Free[flag].status='n';break;
}
}
PT();
}
void Huishou() // 回收分区
{
int i;
int number;
int n=0;
printf( "\n请输入回收的分区号:" );
scanf( "%d", &number );
if ( number == 0)
{
printf( "\n系统分区无法回收" );
return;
}
for ( i = 1; i <24; i++ )//通过循环查找要回收的已使用分区区号
{
if ( Free[i].status == 'n' )
{
n++;
if ( n == number )
{
Free[n].size=Free[n].size+User[n].size;
User[n].size=0;
User[n].begin=0;
User[n].status='f';
strcpy(User[n].pn,"be return");
Free[n].status = 'f';
}
}
}
if ( i == MAX - 1 )
{
printf( "\n找不到分区" );
return;
}
printf( "\n回收成功!" ); PT();
getch();
}
void firstfit()
{int i=1;int j=0;int a=i;int num;
printf("插入几个进程\n");
scanf("%d",&num);
for(i=1;i<num+1;i++){
printf("名字为\n");
scanf("%s",&User[i].pn);
printf("大小\n");
getchar();
scanf("%d",&User[i].size);
}//输入进程
for(i=1;i<num+1;i++){
for(j=1;j<24;j++)
{
if(User[i].size<Free[j].size&& Free[j].status=='f')
{
Free[j].size=Free[j].size-User[i].size;
User[i].begin=Free[j].begin;
Free[j].status='n';break;
}
}
}
PT();
}
main(){
int choice;
restart();
PT();
end1: printf("---------------------请选择算法----------------\n");
printf("-----------------1.最先适应算法------------------------\n");
printf("-----------------2.最优适应算法------------------------\n");
printf("-----------------3.回收分区------------------------\n");
scanf("%d",&choice);
switch(choice)
{
case 1: firstfit();goto end1;
case 2: nicefit();break;
case 3: Huishou();break;
default:return;
}
}
5.遇到的 问题及思考:
遇到的循环首次适应算法只是在最先适应算法加以改进,记录标志。
而最优适应算法无法实现是因为排序问题,当排冒泡完序后会使内存空间变量的地址改变,因为无法实现对其回收等操作,一旦排序改变了他的地址,那么他就不再是内存,这和问题条件相违背了。因而在最优适应的方法是遇到了障碍。。