深圳大学实验报告
课程名称:连续式与分页式主存管理的模拟实现
实验项目名称:进程的控制
学院:信息工程学院(软件学院)
专业:软件工程
指导教师:白鉴聪
报告人:罗城龙学号:20XX151095班级:软件1班
实验时间:20XX/6/20
实验报告提交时间:20XX/6/20
教务处制
实验目的与要求:
模拟在连续分配与分页管理两种方式下,主存空间的分配与回收,帮助学生加深了解存储器管理的工作过程。
方法、步骤:
1、根据例程,尝试采用首次适应算法、循环首次适应算法、最佳适应算法其中的一种
或多种算法实现3.2.1的动态分区分配。
算法思想请参考课本P108-109的分区分配算法。
2、根据例程,尝试实现3.2.1的分区回收功能。
3、根据例程,尝试实现3.2.2的分页系统功能
4、至少完成上述三项实验内容中的一个。
5、自行设定内存总空间,大小单位为KB,分页管理需要设定每个页的大小。
6、随机设置当前内存分配状态。
7、自行设计作业队列,队列中至少要有5个作业,设定各个作业空间大小,大小要适
中。
8、输出结果要尽量详细清晰,如果输出内容比较多,可以考虑把输出结果保存到文件
中,通过文件来查看。
9、程序代码要尽量加入注释,提高程序的清晰度与可读性。
10、在实验报告中,一方面可以对实验结果进行分析,一方面可以对两种分配方式
进行比较,分析它们的优劣。
实验过程及内容:
循环首次适应算法:
关键源代码:
1.MEM * temp=NULL;//声明一个MEM的指针,用于保留循环的开始位置2.void init() //在初始化函数init()最后加一个语句,用于
{ //指针temp的初始化,因为它开始也要指向空
……… //链的起始
temp = empty;
}
3.实现关键函数
void mem_alloc_loop(MEM *pjob)
{ MEM * pr;
//循环首次适应算法
pr = temp;
while (pr != NULL)
{
if (pr->length > pjob->length)
{ pjob->head = pr->head; //直接把作业数据块插入已分配队列
alloc_insert(pjob);//插入作业数据块到已分配队列
//产生碎片,需要修改被分配空闲区的参数
//产生小碎片,pr指向它
pr->head = pr->head + pjob->length;
pr->length = pr->length - pjob->length;
temp=pr->link;//指向分配后的下一个指针
printf("!!!!!%s分配成功!!!!!\n", pjob->name);
break;
}
if (pr->length == pjob->length) //刚好满足
{ pjob->head = pr->head; //直接把作业数据块插入已分配队列
temp=pr->link;//指向分配后的下一个指针
alloc_insert(pjob);
empty_remove(pr); //从空闲队列中删除该空闲区
printf("!!!!!%s分配成功!!!!!\n", pjob->name);
break;
}
//空闲块太小,则指向下一个空闲块。
if (pr->length < pjob->length)
{
pr = pr->link;
}
}
if(pr==NULL)
{
pr=empty;
while(pr!=temp)
{
if (pr->length > pjob->length)
{ pjob->head = pr->head; //直接把作业数据块插入已分配队列
alloc_insert(pjob);//插入作业数据块到已分配队列
//产生碎片,需要修改被分配空闲区的参数
//产生小碎片,pr指向它
pr->head = pr->head + pjob->length;
pr->length = pr->length - pjob->length;
temp=pr->link;//指向分配后的下一个指针
printf("!!!!!%s分配成功!!!!!\n", pjob->name);
break;
}
if (pr->length == pjob->length) //刚好满足
{ pjob->head = pr->head; //直接把作业数据块插入已分配队列
temp=pr->link;//指向分配后的下一个指针
alloc_insert(pjob);
empty_remove(pr); //从空闲队列中删除该空闲区
printf("!!!!!%s分配成功!!!!!\n", pjob->name);
break;
}
//空闲块太小,则指向下一个空闲块。
if (pr->length < pjob->length)
{
pr = pr->link;
}
}
}
printf("!!!!!当前空闲区不能满足%s的大小%dK!\n", pjob->name, pjob->length); }
分页系统:
关键源码:
1.关键函数
bool mem_alloc(int jobno) //分配内存
{ int i=0, j=0, k=0;
jobtable[jobno][0]=jobs[jobno]/blksize;
if(jobs[jobno]%blksize!=0)jobtable[jobno][0]+=1;
// 检查当前剩余空间能否满足作业
if (jobtable[jobno][0] > freenum)
{ printf("!!!!!当前空闲区还剩%dK, 不能满足作业[%d]的大小%dK!\n", freenum*blksize,jobno,blksize*jobtable[jobno][0]);
return false;
}
else
{ //计算分配的空白块数.....
k=jobs[jobno]/blksize;
if(jobs[jobno]%blksize!=0) k+=1;
for(j=1;j<=k;j++)
{
for(i;i<blkcount;i++)
{
if(blkstate[i]==0)
{
jobtable[jobno][j]=i;
blkstate[i]=1;
freenum=freenum-1;
break;
}
}
}
//从内存状态表查找空闲块,分配出去,修改状态
//将分配的块号记录到作业分配中
//修改空闲块总数减少
printf("作业%d分配成功, 共分配%d块, 分配块号为:\n",jobno,jobtable[jobno][0]);
for (int a=1; a<=jobtable[jobno][0]; a++)
printf("%d--", jobtable[jobno][a]);
printf("END\n");
}
return true;
}
数据处理分析:
循环首次适应算法:
实验数据为5个进程,需要的大小都为1K
分析实验结果,正确!分页系统:
实验数据设计:五个进程,需要的空间都为8K 分析实验数据,正确。
实验结论:
1.虽然循环首次适应算法减少了小内存块的形成,但也会造成没有大的内存块的剩余,导致大进程无法得到资源。
2.分页式内存管理虽然避免了内存块的分割,但因为进程所需要的内存的不确定性,会使在页表的管理上花费更多的资源,页面的大小无法很精确最
合适的确定。
3.连续式主存管理比分页式主存管理要低效的多。