操作系统 课程设计.docx

上传人:b****5 文档编号:5902736 上传时间:2023-01-02 格式:DOCX 页数:15 大小:170.85KB
下载 相关 举报
操作系统 课程设计.docx_第1页
第1页 / 共15页
操作系统 课程设计.docx_第2页
第2页 / 共15页
操作系统 课程设计.docx_第3页
第3页 / 共15页
操作系统 课程设计.docx_第4页
第4页 / 共15页
操作系统 课程设计.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统 课程设计.docx

《操作系统 课程设计.docx》由会员分享,可在线阅读,更多相关《操作系统 课程设计.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统 课程设计.docx

操作系统课程设计

课程设计

 

课程设计名称:

操作系统课程设计

专业班级:

计科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++的编程,然后是数据结构,这些都是软件的算法,而操作系统讲述的是计算机的内部的算法,比如内存的分配以及回收等。

经过一步步的深入学习,我们对计算机也有了更进一步的了解,使我们不再对计算机陌生,了解了计算机的本身的算法后,我们才有可能更进一步的使用计算机,才能更好的发展计算机。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1