深圳大学实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告
课程名称:连续式与分页式主存管理的模拟实现
实验项目名称:进程的控制
学院:信息工程学院(软件学院)
专业:软件工程
指导教师:白鉴聪
报告人:罗城龙学号: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