内存的分配

实验四主存空间的分配和回收

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 ");
printf("系统从低地址部分开始使用,占用50k 已初始化");



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 ");
printf(" No. proname begin size status ");
for(i=0;i<=nFree;i++)
printf(" No.%d %s %d %d %c ",i,Free[i].pn,Free[i].begin,Free[i].size,Free[i].status);

printf("已分配分区表Used ");
printf(" No. proname begin size status ");
for(i=0;i<=nUsed+1;i++)
printf(" No.%d %s %d %d %c ",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("插入几个进程 ");
scanf("%d",&num);
for(i=1;i<num+1;i++){

printf("名字为 ");
scanf("%s",&User[i].pn);
printf("大小 ");
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 ",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( " 请输入回收的分区号:" );
scanf( "%d", &number );
if ( number == 0)
{
printf( " 系统分区无法回收" );
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( " 找不到分区" );
return;
}

printf( " 回收成功!" ); PT();
getch();
}

void firstfit()
{int i=1;int j=0;int a=i;int num;
printf("插入几个进程 ");
scanf("%d",&num);
for(i=1;i<num+1;i++){

printf("名字为 ");
scanf("%s",&User[i].pn);
printf("大小 ");
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("---------------------请选择算法---------------- ");
printf("-----------------1.最先适应算法------------------------ ");
printf("-----------------2.最优适应算法------------------------ ");
printf("-----------------3.回收分区------------------------ ");
scanf("%d",&choice);

switch(choice)
{

case 1: firstfit();goto end1;
case 2: nicefit();break;
case 3: Huishou();break;
default:return;
}
}

5.遇到的 问题及思考

遇到的循环首次适应算法只是在最先适应算法加以改进,记录标志。

而最优适应算法无法实现是因为排序问题,当排冒泡完序后会使内存空间变量的地址改变,因为无法实现对其回收等操作,一旦排序改变了他的地址,那么他就不再是内存,这和问题条件相违背了。因而在最优适应的方法是遇到了障碍。。

原文地址:https://www.cnblogs.com/bestmoment/p/5595112.html