操作系统 课程设计.docx
《操作系统 课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统 课程设计.docx(15页珍藏版)》请在冰豆网上搜索。
![操作系统 课程设计.docx](https://file1.bdocx.com/fileroot1/2023-1/2/6bb4dac6-be43-4515-8329-95d3c870071f/6bb4dac6-be43-4515-8329-95d3c870071f1.gif)
操作系统课程设计
课程设计
课程设计名称:
操作系统课程设计
专业班级:
计科0905
学生姓名:
刘品训
学号:
20094814507
指导教师:
马宏琳
课程设计时间:
2011.6.13-2011.6.17
计算机科学专业课程设计任务书
学生姓名
刘品训
专业班级
计科0905
学号
200948140507
题目
动态分区分配方式的模拟3
课题性质
其它
课题来源
自拟课题
指导教师
马宏琳
同组姓名
主要内容
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需求分析
用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
#include
#include
2.定义内存大小
#defineMAX_SIZE640
3.定义分区存储器的结构
typedefstructnode//定义分区描述器的结构
{
intid;//编号
intadr;//分区首地址
intsize;//分区大小
structnode*next;//指向下一个分区的指针
}Node;
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(((addadr)&&(add+siz>p->adr))||((add>=p->adr)&&(addadr+p->size)))
check=0;
else
p=p->next;
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;
q->adr=0;
q->next=NULL;
q->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->next;
ass->id=num;
ass->size=req;
while(after->size{
before=before->next;
after=after->next;
}
if(after==NULL)
{
ass->adr=-1;//分配失败
}
else
{
if(after->size==req)
{//空闲分区恰好等于所申请的内存大小
before->next=after->next;
ass->adr=after->adr;
}
else
{//空闲分区大于所申请的内存大小
q=after;
before->next=after->next;
ass->adr=q->adr;
q->size-=req;
q->adr+=req;
before=head2;
after=head2->next;
if(after==NULL)
{
before->next=q;
q->next=NULL;
after=q;
}
else
{
while(after&&((after->size)<(q->size)))
{
before=before->next;
after=after->next;
}
before->next=q;
q->next=after;
after=q;
}
}
}
return(ass);
}
7.最佳适应算法的回收模块
voidacceptment2(intaddress,intsiz,intrd)
{
Node*before,*after;
intinsert=0;//是否被回收的标志
back2=(Node*)malloc(sizeof(Node));
before=head2;
after=head2->next;
back2->adr=address;
back2->size=siz;
back2->id=rd;
back2->next=NULL;
if(head2->next==NULL)
{//空闲队列为空
head2->next=back2;
//head2->size=back2->size;
}
else
{//空闲队列不为空
while(after)
{
if(back2->adr==after->adr+after->size)
{//和前边空闲分区合并
before->next=after->next;
after->size+=back2->size;
back2=after;
after=before->next;
}
else
{
before=before->next;
after=after->next;
}
}
before=head2;
after=head2->next;
while(after)
{
if(after->adr==back2->adr+back2->size)
{//和后边空闲区合并
before->next=after->next;
back2->size+=after->size;
after=before->next;
}
else
{
before=before->next;
after=after->next;
}
}
before=head2;
after=head2->next;
while(!
insert)
{//将被回收的块插入到恰当的位置(按分区大小从小到大)
if(after==NULL||((after->size>back2->size)&&(before->sizesize)))
{
before->next=back2;
back2->next=after;
insert=1;
break;
}
else
{
before=before->next;
after=after->next;
}
}
}
if(insert)
printf("\t最佳适应算法回收内存成功!
!
!
\n");
else
printf("\t最佳适应算法回收内存失败!
!
!
\n");
}
8.空闲区队列信息输出模块
voidprint(charchoice)//输出空闲区队列信息
{
Node*p;
p=head2->next;
if(p)
{
printf("\n空闲区队列的情况为:
\n");
printf("\t编号\t首址\t终址\t大小\n");
while(p)
{
printf("\t%d\t%d\t%d\t%d\n",p->id,p->adr,p->adr+p->size-1,p->size);
p=p->next;
}
}
}
9.菜单模块
voidmenu()//菜单及主要过程
{
charchose;
intch,num,r,add,rd;
system("cls");
while
(1){
printf("\t\t最佳适应算法(Best-Fit)模拟\n\n");
printf("\t1.创建作业\t\t2.回收内存\n\n");
printf("\t3.查看内存\t\t4.退出\n\n");
printf("\t你选择(1/2/3/4):
");
scanf("%d",&ch);
fflush(stdin);
switch(ch)
{
case1:
printf("输入作业号:
");scanf("%d",&num);
printf("输入申请的内存大小:
");scanf("%d",&r);
assign=assignment2(num,r);
if(assign->adr==-1)
{
printf("分配内存失败!
\n");
}
else
printf("分配成功!
分配的内存的首址为:
%d\n",assign->adr);
break;
case2:
printf("输入释放的内存的首址:
");scanf("%d",&add);
printf("输入释放的内存的大小:
");scanf("%d",&r);
printf("输入释放的内存的编号:
");scanf("%d",&rd);
acceptment2(add,r,rd);
break;
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++的编程,然后是数据结构,这些都是软件的算法,而操作系统讲述的是计算机的内部的算法,比如内存的分配以及回收等。
经过一步步的深入学习,我们对计算机也有了更进一步的了解,使我们不再对计算机陌生,了解了计算机的本身的算法后,我们才有可能更进一步的使用计算机,才能更好的发展计算机。