操作系统课程设计报告 内存管理算法模拟Word文件下载.docx
- 文档编号:18217260
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:27
- 大小:198.89KB
操作系统课程设计报告 内存管理算法模拟Word文件下载.docx
《操作系统课程设计报告 内存管理算法模拟Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告 内存管理算法模拟Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
(6)按期提交完整的程序代码、可执行程序和课程设计报告。
工
作
量
课程设计任务要求不少于10页的报告,要赋有模块图或流程图。
划
第一周:
查找相关资料,并绘制草图!
第二周:
确定选用VC为编程语言。
第三周:
写需求分析报告。
第四周:
着手进行编程,实现算法,并调试程序。
第五周:
测试程序并优化功能,最终完成设计报告。
考
资
料
[1]汤小丹梁红兵哲凤屏汤子瀛计算机操作系统(第三版)西安电子科技大学出版社,2007
[2]杨克昌王岳斌计算机导论(第二版)[M]中国水电出版社,2005
[3]徐孝凯C++语言基础教程(第二版)[M]清华大学出版社,2007
[4]何钦铭颜晖C语言程序设计[M]浙江大学出版社,2004
指导教师签字
教研室主任签字
年月日
指导教师评语:
成绩:
年月日
课程设计(论文)成绩评定表
摘要
动态分区分配是根据进程的实际需要,动态的为之分配内存空间。
在实现可变分区时,将涉及到分区分配中所用的数据结构、分区分配算法与回收操作等问题。
为了实现分区分配,系统中必须配置相应的数据结构。
数据结构包括空闲分区表和空闲分区链。
为把一个新作业装入内存,必须按照一定的分配方法,从空闲分区表或空闲分区链中选出一分区分配给作业。
常用的分配算法有五种,首次适应算法(FIRSTFIT)、循环首次适应算法(NEXTFIT)、最佳适应算法(BESTFIT)、快速适应算法(QUICKFIT)和最坏适应算法(WORSTFIT)。
关键词:
动态分区分配内存分配算法
1系统分析
1.1问题描述
用高级语言编写一个模拟内存分配算法的程序,设计过程中应选择适当的数据结构。
功能有以下几个,利用分区分配算法为作业分配内存空间,可以对已分配的内存空间进行回收,并可以查看分配的情况。
1.2算法描述
本程序采用的是首次适应算法,我们以空闲分区链为例来说明采用首次适应算法的分配情况。
算法要求空闲分区链以地址递增的次序链接。
在分配内存过程中,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止;
然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个满足要求的分区,则此次分区失败,返回。
该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲分区。
1.3设计目的
设计目的比较明确,主要有以下几个:
1.了解动态分区分配;
2.了解分区分配中的数据结构;
3.掌握分区分配算法;
4.掌握分区分配算法实现过程;
5.会用高级语音模拟内存分配。
2系统设计
2.1设计要求
1.对内存管理算法用高级语言进行模拟。
2.对程序的一些部分要有较详细的分析说明。
3.源代码格式要规范。
4.设计合适的测试用例对程序进行测试。
5.总结要深刻,能说明问题。
6.对程序中个功能模块进行说明。
7.按期提交完整的程序代码、可执行程序和课程设计报告。
2.2设计原理
1.首次适应算法思路:
先我们以空闲分区链为例来说明采用首次适应算法的分配情况。
程序中定义了两个数据结构,typedefstructkxjied和typedefstructyyjied用来产生空闲分区链freetable和作业分区链usedtable。
在分配空间给作业时首先判断是否有空闲区,有的话用首次适应算法分配找到所需大小分区。
请求分区大小为jobsize,它与空闲分区大小p->
length比较,若p->
length<
=jobsize说明多余部分太小,不可分割将整个分区分配给请求者。
否则,从该分区中按请求划出一块内存空间分配出去,余下的部分仍然留在空闲分区表中。
然后,将分配区的首地址返回给调用者。
2.首次适应算法中用到的主要数据结构:
空闲节点结构typedefstructkxjied
作业节点结构typedefstructyyjied
作业分区表usedtable
空闲分区表freetable
空闲分区表首地址freetable->
address=0;
空闲分区表长度freetable->
length=1024;
3.首次适应算法:
(1)作业发出请求申请空间:
作业名jobname,作业大小jobsize。
(2)每个空闲分区大小为p->
length,并且要求空闲分区链以地址递增次序链接。
从头开始检索表,若从链首直至链尾都不能找到一个满足要求的分区,则此次分区失败,返回。
(3)若p->
剩余部分p->
length-=jobsize,此时分区表首地址p->
address+=jobsize。
(4)如果找不到有足够空间的分区可以做扩展,utablex=newuarea。
4.:
回收作业空间
(1)如果没有作业则返回。
(2)将回收后的空间加入到空闲区。
(3)对分区进行合并。
(4)对作业删除的操作。
当程序运行完毕释放内存时,系统根据回收区的首地址,从空闲区表中找到相应的插入点,此时可能出现以下几种情况:
(1)回收区与插入点的前一个分区相邻接。
此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需修改前一分区的大小。
(2)回收区与插入点的后一个分区相邻接。
此时也可以将两分区合并,形成新的空闲分区,但用回收区的首地址作为新空闲区的首地址,大小为两者之和。
(3)回收区与插入点的前、后两个分区相邻接。
此时将三个分区合并,使用前的表项和首地址,取消后面的,大小为三者之和。
(4)回收区与前后都不邻接。
这时应为回收区单建一个新表项,填写回收区的首地址和大小,并根据其首地址适当的插入空闲分区中。
2.3设计流程图
根据程序结构分析本程序整体流程图如图2-1所示:
图2-1程序整体流程图
内存分配流程图如图2-2所示:
3系统实现
3.1数据结构
程序使用的变量:
intchoice;
//选项,用于实现主函数对不同函数的调用
intt=1;
//循环条件与退出标识
longaddress;
//作业区链表地址
doublelength;
//作业区链表长度
intflag;
//标识作业名
ftablep=freetable;
//为p申请空闲分区表
utablex=newuarea;
//为x新建分区
3.2函数声明与定义
本程序中用到的函数:
voidjobrequest();
//作业请求函数
函数代码如下:
voidjobrequest()
{
intjobname;
intjobsize;
cout<
<
"
请输入进程名:
"
;
cin>
>
jobname;
请输入进程长度:
jobsize;
if(allot(jobname,jobsize)==4)
printf("
该进程已成功获得所要求内存空间\n"
);
else
该进程没有成功获得所要求空间\n"
}
intallot(jobname,jobsize)//分配空间给作业
intallot(intjobname,doublejobsize)
//判断是否有空闲区
if(freetable==NULL)
return1;
ftablep=freetable;
ftableq=p;
//找首次适应算法分配空闲区
while(p!
=NULL&
&
p->
length<
jobsize)
{
q=p;
p=p->
next;
}
//如果找不到有足够空间的分区
if(p==NULL)
return2;
utablex=newuarea;
x->
address=p->
address;
length=jobsize;
flag=jobname;
next=NULL;
//如果该分区大于作业需求,空间大小减去作业大小
if(p->
length>
p->
length-=jobsize;
address+=(long)jobsize;
//如果该分区等于作业大小,删除该分区
if(p==freetable)
freetable=NULL;
else
q->
next=p->
deletep;
//作业加入“作业表”中
utabler=usedtable;
utablet=r;
while(r!
r->
address<
address)
t=r;
r=r->
if(usedtable==NULL)
usedtable=x;
x->
next=r;
t->
next=x;
return4;
Init();
//空闲分区表初始化函数
代码如下:
intInit()
freetable=newfarea;
freetable->
return1;
voidstatePrint()//显示内存状态函数
voidstatePrint()
utableq=usedtable;
intx,y;
while(p||q)
if(p)
x=p->
x=0x7fffffff;
if(q)
y=q->
y=0x7fffffff;
if(x<
y)
{
cout<
p->
address<
endl<
已分配(上)"
endl;
空闲(下)"
p=p->
}
if(x>
q=q->
voidjobcallback();
//作业回收函数
voidjobcallback()
请输入要回收的进程名:
jobname;
intresult=callback(jobname);
if(result==4)
该进程已回收成功\n"
elseif(result==2||result==1)
系统没有进程或该进程不存在\n"
intcallback(intjobname)//通过作业名回收作业函数
intcallback(intjobname)
utablep=usedtable;
utableq=p;
flag!
=jobname)
p=p->
//如果没有该作业
//回收后的空间加入到空闲区
ftabler=freetable;
ftablet=r;
ftablex;
x=newfarea;
length=p->
length;
if(r==freetable)
freetable=x;
t=freetable;
t->
//对分区进行合并
while(t->
next!
address+t->
length==t->
next->
length+=t->
r=t->
next=t->
deleter;
//对作业删除的操作
if(p==usedtable)
usedtable=usedtable->
q->
deletep;
3.3运行结果
运行结果如下所示:
如图3-1所示为程序的主界面
图3-1程序主界面
如图3-2所示为模拟内存的分配
图3-2模拟内存的分配
如图3-3所示为内存分配成功
图3-3内存分配成功
如图3-4所示为内存分配状况
图3-4内存分配状况
如图3-5为创建第二个进程
图3-5创建第二个进程
如图3-6为此时内存分配状况
图3-6此时内存分配情况
如图3-7所示为模拟内存的回收
图3-7模拟内存的回收
如图3-8为回收后内存的状况
图3-8回收后内存的状况
4总结
本次课程设计我做的是内存管理算法模拟,我才用的分区分配算法是首次适应算法,因为这种算法实现起来相对简单一些。
好的数据结构可以降低算法的时间与空间复杂度。
我以前对数据结构的了解不是太深入,因此遇到了很大的障碍。
此次课程设计我体会到深刻理解数据结构的重要性。
只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。
了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
本次试验遇到的最大的困难是内存的问题。
刚开始实现的程序不能进行内存回收,当调用内存回收程序时系统会报错,相当令人头疼。
后来没有办法了只有请求高手帮忙,经过一番奋斗之后才知有几处指针出现了问题。
其实,我最不喜欢指针了,它指来指去很难把握。
今后会对指针问题特别关注的,以为有时候它使用起来确实很方面。
参考文献
[1]徐孝凯.C++语言基础教程(第二版).北京:
清华大学出版社,2007
[2]徐孝凯.数据结构应用教程(第二版).北京:
[3]何钦铭颜晖.C语言程序设计[M].浙江:
浙江大学出版社,2004
[4]汤小丹梁红兵哲凤屏汤子瀛编.计算机操作系统(第三版).西安:
西安电子科技大学出版社,2007
[5]黄干平陈洛资编.计算机操作系统.北京:
科学出版社,1989
[6]李勇刘恩林.计算机体系结构.长沙:
国防科技大学出版社,1987
[7]黄祥喜.计算机操作系统实验教程.广州:
清中山大学出版社,1994
[8]尤晋元.UNIX操作系统教程.西安:
西安电子科技大学出版社,1995
[9]孟庆昌.操作系统教程.北京:
电子工业出版社,2004
[10]陈向群杨芙清.操作系统教程(第二版).北京:
北京大学出版社,2006
全部代码:
#include<
iostream.h>
stdio.h>
typedefstructkxjied
longaddress;
doublelength;
structkxjied*next;
}farea,*ftable;
typedefstructyyjied
intflag;
structyyjied*next;
}uarea,*utable;
//作业区链表
utableusedtable=NULL;
//空闲区链表
ftablefreetable=NULL;
//分配空间给作业
//如果没有空闲区
if(freetable==NULL)
//回收作业空间
//jobname:
作业名
t-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统课程设计报告 内存管理算法模拟 操作系统 课程设计 报告 内存 管理 算法 模拟