最新c++动态分区分配算法模拟操作系统课程设计汇总Word格式.docx
《最新c++动态分区分配算法模拟操作系统课程设计汇总Word格式.docx》由会员分享,可在线阅读,更多相关《最新c++动态分区分配算法模拟操作系统课程设计汇总Word格式.docx(15页珍藏版)》请在冰豆网上搜索。
自拟课题
指导教师
同组姓名
主要内容
1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。
2)假设初始状态如下,可用的内存空间为640KB,并有下列的请求序列;
作业1申请130KB;
作业2申请60KB;
作业3申请100KB;
作业2释放60KB;
作业4申请200KB;
作业3释放100KB;
作业1释放130KB;
作业5申请140KB;
作业6申请60KB;
作业7申请50KB;
作业6释放60KB
请采用首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。
任务要求
了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
参考文献
任满杰等《操作系统原理实用教程》电子工业出版社2006
汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001
张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
罗宇等《操作系统课程设计》机械工业出版社2005
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1:
需求分析
(1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。
(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
作业6释放60KB。
采用首次适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。
2:
概要设计
(1)数据结构:
作业队列数据结构,用于存储待处理作业;
阻塞作业队列数据结构,用于存储阻塞的作业。
已分配内存块的双向链表,记录当前系统已分配的各个内存块;
未分配内存块的双向链表,记录系统中剩余的各个内存块;
系统内存分配总情况的结点对象,记录系统中阻塞的作业总数,已分配的内存块数,剩余的内存块数。
(2)主函数:
对作业队列、阻塞队列、已分配内存块链表、未分配内存块链表、系统总内存分配情况结点对象进行初始化,调用分配函数或回收函数,循环处理11个作业步。
(3)分配函数alloc():
首次适应算法检索未分配的内存块链表,若找到合适的内存块,则加以判断,空闲内存块大小减去作业去请求内存块大小小于系统额定的最小碎片值,把空闲块全部分配,否则进行分割分配,最后显示分配的内存信息。
(4)回收函数free():
首次适应算法检索已分配的内存块链表,找到要释放的内存块后,在已分配链表中删除该结点,并把该结点挂到未分配内存块链表的结尾处,然后进行两次调整,把未分配的内存块链表调整为首地址从小到大的排列顺序,并且物理上相邻的空闲内存块要进行合并,以方便下次进行分配。
调度分配函数,循环处理阻塞作业队列,最后显示回收后的内存情况。
(5)调度图如下:
3:
运行环境
硬件:
计算机
软件:
windowsXPvc++6.0
4:
开发工具和编程语言
开发工具:
vc++6.0
编程语言:
C语言
5:
详细设计
(1):
数据结构模块
structjob//作业结点
{
intnum;
//作业编号
intstate;
//0表示释放,1表示申请
intlength;
//作业要求处理大小
};
structyifenpei//已分配内存块结点
//占有内存区域的作业编号
intfirstadd;
//内存区域的首地址
//内存区域的大小
structyifenpei*forward;
structyifenpei*next;
structweifenpei//未分配内存块结点
//空闲区域的首地址
//空闲区域的大小
structweifenpei*forward;
structweifenpei*next;
structtotal//内存分配状况记录结点
inttotalyifen;
//已分配的总内存块数
inttotalweifen;
//未分配的总内存块数
inttotalzuse;
//阻塞的作业个数
structjobjobarray[11];
//作业处理队列
structyifenpei*headyifen=(structyifenpei*)malloc(len2);
//已分配的内存块所构成的双向链表的头指针
structweifenpei*headweifen=(structweifenpei*)malloc(len3);
//未分配的内存块所构成的双向链表的头指针
structjobzuse[11];
//阻塞作业队列
structtotaltotalnow;
主函数模块
voidmain()
jobarray[0].num=1;
jobarray[0].state=1;
jobarray[0].length=130;
/*初始化请求序列,共11个作业步*/
jobarray[1].num=2;
jobarray[1].state=1;
jobarray[1].length=60;
jobarray[2].num=3;
jobarray[2].state=1;
jobarray[2].length=100;
jobarray[3].num=2;
jobarray[3].state=0;
jobarray[3].length=60;
jobarray[4].num=4;
jobarray[4].state=1;
jobarray[4].length=200;
jobarray[5].num=3;
jobarray[5].state=0;
jobarray[5].length=100;
jobarray[6].num=1;
jobarray[6].state=0;
jobarray[6].length=130;
jobarray[7].num=5;
jobarray[7].state=1;
jobarray[7].length=140;
jobarray[8].num=6;
jobarray[8].state=1;
jobarray[8].length=60;
jobarray[9].num=7;
jobarray[9].state=1;
jobarray[9].length=50;
jobarray[10].num=6;
jobarray[10].state=0;
jobarray[10].length=60;
totalnow.totalyifen=0;
totalnow.totalweifen=1;
totalnow.totalzuse=0;
//初始化系统内存分配状况
structweifenpei*weifen=(structweifenpei*)malloc(len3);
weifen->
firstadd=1;
weifen->
forward=headweifen;
length=640;
next=NULL;
headweifen->
forward=NULL;
headweifen->
next=weifen;
//初始化未分配的内存块双向链表
headyifen->
headyifen->
//初始化已分配的内存块双向链表
for(intm=0;
m<
11;
m++)//初始化阻塞作业队列
{
zuse[m].num=0;
zuse[m].state=0;
zuse[m].length=0;
}
for(inti=0;
i<
i++)//循环处理11个作业步
if(jobarray[i].state==1)
alloc(jobarray[i],jobarray[i].num);
//调用分配函数
else
free(jobarray[i],jobarray[i].num);
//调用释放函数
printf("
全部作业已处理完成!
"
);
}
分配函数模块
voidalloc(structjobjobnow,inti)
intj=1;
structweifenpei*weifennow1=NULL;
structweifenpei*weifennow2=NULL;
structyifenpei*yifennow2=NULL;
structyifenpei*yifennow1=NULL;
weifennow1=headweifen;
weifennow2=headweifen->
next;
yifennow1=headyifen;
yifennow2=headyifen->
while(yifennow2!
=NULL)
yifennow1=yifennow2;
yifennow2=yifennow2->
yifennow2=(structyifenpei*)malloc(len2);
while(weifennow2!
=NULL)//首次适应算法检索合适的内存块
if(weifennow2->
length>
=jobnow.length)
{
if((weifennow2->
length-jobnow.length)<
=erding)//内存碎片小于额定值全部分配
{
weifennow1->
next=weifennow2->
yifennow2->
num=i;
yifennow2->
firstadd=weifennow2->
firstadd;
length=weifennow2->
length;
forward=yifennow1;
yifennow1->
next=yifennow2;
totalnow.totalyifen++;
totalnow.totalweifen--;
}
else//否则进行分割分配诶
yifennow2->
length=jobnow.length;
next=NU