操作系统 课程设计Word下载.docx
《操作系统 课程设计Word下载.docx》由会员分享,可在线阅读,更多相关《操作系统 课程设计Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
作业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需求分析
用C语言实现采用采用最佳适应算法的动态分区分配过程alloc()和回收过程free()。
用户可直接通过提示,进行创建作业,以及申请的内存的大小,也可以通过选择进行释放内存的操作,通过输入查看空闲分区链表的状态。
2概要设计
1.定义分区存储器的结构:
typedefstructnode{
intid;
//编号
intadr;
//分区首地址
intsize;
//分区大小
structnode*next;
//指向下一个分区的指针
}Node;
2.本程序包含7个模块:
(1)主函数模块:
调用菜单函数voidmenu();
(2)voidmenu():
菜单函数模块
{
1.输入命令;
2.执行操作;
3.输出。
}
(3)intcheck():
用于检查指定的释放块(由用户键入)的合法性
(4)voidinit():
初始化,生成一个带头节点的空闲队列指针
(5)Node*assignment2():
实现最佳适应算法的分配
(6)voidacceptment2(intaddress,intsiz,intrd):
实现最佳适应算法的回收
(7)voidprint():
输出空闲区队列信息
3运行环境
软件环境:
VC6.0WindowsXP
硬件环境:
计算机
4开发工具和编程语言
开发工具:
VC6.0
编程语言:
C语言
5详细设计
1定义头文件
#include<
stdio.h>
stdlib.h>
string.h>
2.定义内存大小
#defineMAX_SIZE640
3.定义分区存储器的结构
typedefstructnode//定义分区描述器的结构
4.检查指定的释放块(由用户键入)的合法性模块:
intcheck(intadd,intsiz,charc)
{
Node*p,*head;
intcheck=1;
if(add<
0||siz<
0)
check=0;
/*地址和大小不能为负*/
head=head2;
p=head->
next;
while((p!
=NULL)&
&
check)/*地址不能和空闲区表中结点出现重叠*/
if(((add<
p->
adr)&
(add+siz>
adr))||((add>
=p->
(add<
adr+p->
size)))
else
p=p->
if(check==0)
printf("
\t输入释放区地址或大小有错误!
!
\n"
);
returncheck;
/*返回检查结果*/
5.生成一个带头节点的空闲队列指针模块
voidinit()
{Node*q;
head2=(Node*)malloc(sizeof(Node));
q=(Node*)malloc(sizeof(Node));
head2->
next=q;
q->
size=MAX_SIZE;
adr=0;
next=NULL;
id=0;
6.最佳适应算法的分配模块
Node*assignment2(intnum,intreq)//实现最佳适应算法的分配
Node*before,*after,*ass,*q;
ass=(Node*)malloc(sizeof(Node));
q=(Node*)malloc(sizeof(Node));
before=head2;
after=head2->
ass->
id=num;
size=req;
while(after->
size<
req)
before=before->
after=after->
}
if(after==NULL)
ass->
adr=-1;
//分配失败
if(after->
size==req)
{//空闲分区恰好等于所申请的内存大小
before->
next=after->
ass->
adr=after->
adr;
}
else
{//空闲分区大于所申请的内存大小
q=after;
before->
ass->
adr=q->
q->
size-=req;
q->
adr+=req;
before=head2;
after=head2->
before->
after=q;
while(after&
((after->
size)<
(q->
next=after;
return(ass);
7.最佳适应算法的回收模块
voidacceptment2(intaddress,intsiz,intrd)
Node*before,*after;
intinsert=0;
//是否被回收的标志
back2=(Node*)malloc(sizeof(Node));
back2->
adr=address;
size=siz;
id=rd;
if(head2->
next==NULL)
{//空闲队列为空
next=back2;
//head2->
size=back2->
size;
{//空闲队列不为空
while(after)
{
if(back2->
adr==after->
adr+after->
size)
{//和前边空闲分区合并
after->
size+=back2->
back2=after;
after=before->
before=head2;
after=head2->
adr==back2->
adr+back2->
{//和后边空闲区合并
back2->
size+=after->
after=before->
while(!
insert)
{//将被回收的块插入到恰当的位置(按分区大小从小到大)
if(after==NULL||((after->
size>
back2->
size)&
(before->
before->
insert=1;
break;
before=before->
after=after->
if(insert)
printf("
\t最佳适应算法回收内存成功!
\t最佳适应算法回收内存失败!
8.空闲区队列信息输出模块
voidprint(charchoice)//输出空闲区队列信息
Node*p;
p=head2->
if(p)
\n空闲区队列的情况为:
\t编号\t首址\t终址\t大小\n"
while(p)
\t%d\t%d\t%d\t%d\n"
p->
id,p->
adr,p->
size-1,p->
size);
p=p->
9.菜单模块
voidmenu()//菜单及主要过程
charchose;
intch,num,r,add,rd;
system("
cls"
while
(1){
\t\t最佳适应算法(Best-Fit)模拟\n\n"
\t1.创建作业\t\t2.回收内存\n\n"
\t3.查看内存\t\t4.退出\n\n"
\t你选择(1/2/3/4):
"
scanf("
%d"
&
ch);
fflush(stdin);
switch(ch)
case1:
输入作业号:
scanf("
num);
输入申请的内存大小:
r);
assign=assignment2(num,r);
if(assign->
adr==-1)
printf("
分配内存失败!
分配成功!
分配的内存的首址为:
%d\n"
assign->
adr);
case2:
输入释放的内存的首址:
add);
输入释放的内存的大小:
输入释放的内存的编号:
rd);
acceptment2(add,r,rd);
case3:
print(chose);
break;
case4:
exit(0);
6调试分析
(1)如何定义分配器是第一个要克服的难题,经过自己查资料以及问同学才弄懂分配器的结构。
(2)刚开始没有写检查指定的释放块(由用户键入)的合法性的模块,在输入时经常出现错误,为克服这个缺点补充了这个模块。
(3)经过多次的尝试与分析才弄清楚最佳分配算法的思路,才写出最佳分配算法的分配与回收。
7测试结果
进行作业操作
图1作业1与作业2的创建
图2作业3的创建与作业2的释放
图3作业4的创建与作业3的释放
图4作业1的释放与作业5的创建
图5作业6的创建
图6作业7的创建与作业6的释放
图7输出空闲分区链表的情况
[1]任满杰等《操作系统原理实用教程》电子工业出版社2006
[2]汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001
[3]张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
[4]罗宇等《操作系统课程设计》机械工业出版社2005
[5]黄干平,陈洛资,等《计算机操作系统》。
北京:
科学出版社,1989.
心得体会
经过一学期的操作系统的学习,感觉我们离计算机越来越近,我们是由计算机的硬件及软件的使用开始接触计算机的。
刚开始是C++的编程,然后是数据结构,这些都是软件的算法,而操作系统讲述的是计算机的内部的算法,比如内存的分配以及回收等。
经过一步步的深入学习,我们对计算机也有了更进一步的了解,使我们不再对计算机陌生,了解了计算机的本身的算法后,我们才有可能更进一步的使用计算机,才能更好的发展计算机。