动态分区管理.docx
《动态分区管理.docx》由会员分享,可在线阅读,更多相关《动态分区管理.docx(36页珍藏版)》请在冰豆网上搜索。
动态分区管理
操作系统
实
验
报
告
实验名称:
动态分区管理
班级:
软件工程08-1
姓名:
学号:
实验目的:
用高级语言编写和调试一个内存的动态分配程序,实现内存的分配以及回收功能。
实验内容:
用户录入作业时,可以根据首次适应算法、最佳适应算法、最差适应算法对作业需要的内存空间进行分配、在回收内存的时候判断回收区的前部和后部是否有空闲的区域,进行空白内存区域的合并,实现内存的回收。
实验步骤:
(1)在内存空间中初始化一片连续内存空间,大小为127K;
(2)对内存空间作事先处理,将内存空间划分成几个空闲区域,20K,30K,40K,17K,它们之间用5K的作业占用空间进行隔离;
(3)分别调用三种分配算法,录入作业,以及作业所需的空间大小,并观察作业的起始位置。
(4)对作业进行回收,改变空闲空间的大小,对相连的空闲空间进行合并。
实验结果:
1、选择初始化内存空间函数;
2、输入分配的内存空间大小为127K;
3、事先对存储区进行分配处理,实验数据如下表
5K
20K
5K
30K
5K
40K
5K
17K
4、对部分作业进行回收,剩余所有5K的作业,使内存作业分布情况如下图
5、查看内存的空闲空间情况
6、使用首次适应算法对空闲空间进行分配;
7、新建作业,所需空间大小为10K,根据首次适应算法,空间从低地址开始查找第一个大小符合的空闲空间为作业分配内存空间,起始位置是5K,大小为10K。
8、再录入一个新的作业,大小同样为10K,查看作业在内存中的起始位置;内存的分配符合首次适应算法。
回收这两个作业。
9、调用最佳适应算法
10、录入作业,所需空间大小为15K,根据最佳适应算法,系统将所有大小符合的空闲内存空间组成一个链表,在里边找一个空间大小最小的空闲空间分配给作业,起始位置是110K,大小为15K;
11、再录入一个作业(大小为1K,起始位置为125K)进行验证;结束后回收作业。
12、调用最坏适应算法,录入作业,所需空间大小为15K,根据最坏适应算法,系统会将所有大小符合的空闲空间进行排列,将空间最大的分配给作业使用,起始位置是65K,大小为15K;
13、再录入一个作业,所需大小为16K,进行验证;
14、回收作业,查看内存现在的空闲空间情况和作业分配情况;
5K(占用)
5~25K
5K(占用)
30~60K
5K(占用)
65~105K
5K(占用)
110~127K
15、回收作业0,作业0的空间和后面的空闲空间进行合并,回收作业6,作业6的前边和后边的空闲空间与作业6空间进行合并内存空闲情况如下;
0~25K
5K(占用)
30~60K
5K(占用)
65~127K
16、回收作业4,内存空闲情况如下
0~25K
5K(占用)
30~127K
17、回收作业2,内存空间清空。
小结:
此次试验的重点集中在首次适应,最佳适应,和最差适应算法的编写,
而难点在内存的回收上,要分情况讨论内存中空闲区域的位置,位于回收区域的上部相连,下部相连,还是上下两端相连。
如果相连,则对这些空闲区域进行一起合并。
在设计试验数据的时候要仔细的考虑,比如,在试验中如果空闲区域大小是按照依次递增的顺序时,首次适应算法会和最佳适应算法的分配方案一样,会造成对试验的影响。
源码:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"time.h"
typedefstructavailable_space{
intnumber;
intstart_id;
intsize;
booljudge;//此条记录是否有效...
}available_space;
typedefstructjob{
intdawn_id;
intsize;
booljudge;//此条记录是否有效...
}job;
staticavailable_spacea_space[100];
staticints_number,s_account;//s_number:
空闲区的编号s_account:
空闲区的总数
staticjobworks[100];
staticintjob_number,job_account;//解释同上...
staticmemory_size;
boolwhether_resize_memory=true;
//-------------------------------------------------------
boolt_control()//进行时间控制
{
doublediff;
time_ttime1,nowTime;
time(&time1);
boolcheck1=true,check2=true,check3=true;
printf("剩余时间3秒...\n");
while(true)
{
time(&nowTime);
diff=difftime(nowTime,time1);
if(diff==1&&check1)
{
printf("剩余时间2秒...\n");
check1=false;
}
if(diff==2&&check2)
{
printf("剩余时间1秒...\n");
check2=false;
}
if(diff==3&&check3)
break;
}
returntrue;
}
//-------------------------------------------------------------
voidget_look()//查看当前内存的空闲区情况...
{
system("cls");
chara;
if(memory_size<=0)//如果内存空间还未进行分配则提示...
{
printf("对不起,当前内存空间大小还未进行合理设置,三秒后将自动返回主界面...\n");
if(t_control())
return;
}
elseif(s_account<=0)//用于检测当前是否还有空闲区...
{
printf("\n\n\n\n\n\t\t\t当前系统空闲区情况如下所示\t\t\t\t\n");
printf("\t\t\t当前系统内存已满,暂无空闲区可供使用...\n");
}
else//有空闲区...
{
printf("\n\n\n\n\n\t\t\t当前系统空闲区情况如下所示\t\t\t\t\n");
printf("\t\t********编号\t\t起始地址\t大小\n");
for(inti=0;i{
if(a_space[i].judge)
{
printf("\t\t********%d\t\t%d\t\t%d\n",a_space[i].number,a_space[i].start_id,a_space[i].size);
}
}
}
printf("\n\n\t\t请按q键返回主界面...\n");
while(true)
{
scanf("%c",&a);
fflush(stdin);
if(tolower(a)=='q')
break;
}
}
//---------------------------------------------------------------------
voidsee_job()//从主界面的位置查看当前内存中存放的作业的情况
{
system("cls");
chara;
if(job_account<=0)
{
printf("对不起,当前内存中没有任何作业在被执行,三秒后将自动返回主界面...\n");
if(t_control())
return;
}
else
{
printf("\n\n\n\n\n\t\t\t当前系统作业分配情况如下所示\t\t\t\t\n");
printf("\t\t********编号\t\t起始地址\t大小\n");
for(inti=0;i{
if(works[i].judge)
{
printf("\t\t********%d\t\t%d\t\t%d\n",i,works[i].dawn_id,works[i].size);
}
}
printf("\n\n\t\t请按q键返回主界面...\n");
while(true)
{
scanf("%c",&a);
fflush(stdin);
if(tolower(a)=='q')
break;
}
}
}
//---------------------------------------------------------------------
voidget_look_job()//在内存分配后显示当前作业在内存中的分配情况...
{
printf("\n\n\n\n\n\t\t\t当前系统作业分配情况如\t\t\t\t\n");
printf("\t\t********编号\t\t起始地址\t大小\n");
for(inti=0;i{
if(works[i].judge)
{
printf("\t\t********%d\t\t%d\t\t%d\n",i,works[i].dawn_id,works[i].size);
}
}
printf("\t\t****************************************************\n");
}
//----------------------------------------------------------------------
available_space*get_min_s_id(intneed_size)//此方法主要用于获取起始位置最靠前的空闲空间地址...
{
available_space*point=(available_space*)malloc(sizeof(available_space));
point->number=0;point->size=0;point->start_id=memory_size+10;//返回去后根据point->start_id的值可以判断是否找到了合适的内存区域
for(inti=0;i{
if((point->start_id>a_space[i].start_id)&&(need_size<=a_space[i].size)&&a_space[i].judge)
{
point=&a_space[i];
}
}
returnpoint;
}
//---------------------------------------------------------------
voidfirst()//首次适应算法
{
system("cls");
intjob_size;
chara;
available_space*point;
printf("请输入作业执行所需要的内存空间大小(大于0):
");
scanf("%d",&job_size);
fflush(stdin);
if(job_size<=0)//输入数值不符合规则...
return;
point=get_min_s_id(job_size);//获取首次适应算法所要求的内存地址...
if(point->start_id>memory_size)//判断是否找到了这样的一个地址...
{
printf("对不起,当前内存空间已用完了,请稍后执行...\n");
}
else//如果说找到了...
{
works[job_number].dawn_id=point->start_id;
works[job_number].size=job_size;
works[job_number].judge=true;
job_number++;
job_account++;
if(point->size>job_size)//如果空闲区的大小还有剩余,则只用修改其大小和起始地址...
{
point->size=point->size-job_size;
point->start_id=point->start_id+job_size;
}
else//刚好放得下则从空闲区中将其删除...
{
point->size=NULL;
point->number=NULL;
point->start_id=NULL;
point->judge=false;
s_account--;
}
get_look_job();//查看当前作业情况...
}
printf("\n");
printf("\n\n请按q键返回主界面...\n");
while(true)//仅用于控制界面停留...
{
scanf("%c",&a);
fflush(stdin);
if(tolower(a)=='q')
break;
}
}
//---------------------------------------------------------------
available_space*get_mini_space(intjob_size)//用于获取能够容纳当前输入的作业的最小空闲内存空间...
{
available_space*point=(available_space*)malloc(sizeof(available_space));
point->number=0;point->size=memory_size+10;point->start_id=0;//...
for(inti=0;i{
if((point->size>a_space[i].size)&&(job_size<=a_space[i].size)&&a_space[i].judge)//寻找比较小且可用的空闲内存块(此内存块必须保证未被占用)...
{
point=&a_space[i];
}
}
returnpoint;
}
voidbest()//最佳适应算法
{
system("cls");
intjob_size;
chara;
available_space*point;
printf("请输入作业执行所需要的内存空间大小(大于0):
");
scanf("%d",&job_size);
fflush(stdin);
if(job_size<=0)//如果用户输入的数值不合乎规则则自动退出...
return;
point=get_mini_space(job_size);
if(point->size>memory_size)
{
printf("对不起,当前内存空间已用完了,请稍后执行...\n");
}
else
{
works[job_number].dawn_id=point->start_id;
works[job_number].size=job_size;
works[job_number].judge=true;
job_number++;
job_account++;
if(point->size>job_size)//如果空闲区的大小还有剩余,则只用修改其大小和起始位置...
{
point->size=point->size-job_size;
point->start_id=point->start_id+job_size;
}
else
{
point->size=NULL;
point->number=NULL;
point->start_id=NULL;
point->judge=false;
s_account--;
}
get_look_job();
}
printf("\n");
printf("\n\n请按q键返回主界面...\n");
while(true)//仅用于控制界面停留...
{
scanf("%c",&a);
fflush(stdin);
if(tolower(a)=='q')
break;
}
}
//-------------------------------------------------------------
available_space*get_max_space(intjob_size)//用于获取能够容纳当前输入的作业的最小空闲内存空间...
{
available_space*point=(available_space*)malloc(sizeof(available_space));
point->number=0;point->size=-10;point->start_id=0;//...
for(inti=0;i{
if((point->size{
point=&a_space[i];
}
}
returnpoint;
}
voidworst()//最坏适应算法
{
system("cls");
intjob_size;
chara;
available_space*point;
printf("请输入作业执行所需要的内存空间大小(大于0):
");
scanf("%d",&job_size);
fflush(stdin);
if(job_size<=0)//如果用户输入的数值不合乎规则则自动退出...
return;
point=get_max_space(job_size);
if(point->size<0)
{
printf("对不起,当前内存空间已用完了,请稍后执行...\n");
}
else
{
works[job_number].dawn_id=point->start_id;
works[job_number].size=job_size;
works[job_number].judge=true;
job_number++;
job_account++;
if(point->size>job_size)//如果空闲区的大小还有剩余,则只用修改其大小和起始位置...
{
point->size=point->size-job_size;
point->start_id=point->start_id+job_size;
}
else
{
point->size=NULL;
point->number=NULL;
point->start_id=NULL;
point->judge=false;
s_account--;
}
get_look_job();
}
printf("\n");
printf("\n\n请按q键返回主界面...\n");
while(true)//仅用于控制界面停留...
{
scanf("%c",&a);
fflush(stdin);
if(tolower(a)=='q')
break;
}
}
//--------------------------------------------------------------
voidinitial()//分配内存空间
{
boolbo=true;
charcheck;
boolex=false;
system("cls");
if(job_account>0)//作业队列不为空则无法进行内存空间的重新设置...
{
printf("对不起,当前内存空间有其它进程正在使用,无法重新设置,三秒后自动退回主界面...\n");
if(t_control())//调用时间控制函数...
return;
}
do
{
printf("内存的默认起始位置为:
0号物理地址,请输入其大小(大于零):
\n");
scanf("%d",&memory_size);
fflush(stdin);
if(memory_size<=0)//用户输入的内存大小不符合规定...
{
printf("对不起,你输入的大小不符合规定(大于零),请根据提示重新输入...\n");
continue;
}
else//输入的值符合规则...
{
fflush(stdin);
printf("初始化成功,您设置的空间大小是[%d],起始地址[0]--[%d]\n",memory_size,memory_size);
}
while(true)//此处用于控制是否想重新设置内存空间大小...
{
printf("是否重新设置空间大小?
(Y/N)\n");
scanf("%c",&check);
fflush(stdin);
if(toupper(check)=='N')
{
ex=true;
break;
}
else
if(toupper(check)=='Y')
break;
else
printf("输入字符不合规则,请重新输入\n");
}
if(ex)//如果用户确定不进行修改