春华南理工大学平时作业操作系统含课程设计.docx
- 文档编号:29146114
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:19
- 大小:253.59KB
春华南理工大学平时作业操作系统含课程设计.docx
《春华南理工大学平时作业操作系统含课程设计.docx》由会员分享,可在线阅读,更多相关《春华南理工大学平时作业操作系统含课程设计.docx(19页珍藏版)》请在冰豆网上搜索。
春华南理工大学平时作业操作系统含课程设计
设计思想
动态分区分配是一种动态划分内存的分区方法。
这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要。
因此系统中分区的大小和数目是可变的。
随着时间的推移,内存中会产生越来越多的碎片。
克服外部碎片可以通过操作系统不时地对进程进行移动和整理来实现。
一般有首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法等策略来实现内存分配。
虽然是4种算法,但是初始化,内存显示,回收内存,内存结构等内容是一致的,4种算法分别作为4种函数,所以可以放到同一个源程序中分别调用。
为了达到连续分配和回收操作,设定选择项菜单。
数据定义
分区结构
typedefstructfreestorage{
intnum;
intsize;
intaddress;
statusstate;
};
链表指针
typedefstructpnode
{
freestoragedata;
pnode*head;
pnode*next;
}*Linklist;
全局变量定义内存大小
#definemem640
循环首次适应法循环位置
Linklistlast_find;
分区枚举状态
enumstatus{FREE,BUSY};
初始化函数
voidinitial()
分配结果显示
voiddisplay()
首次法函数
intfirst_function()
循环首次
intrecycle_first_function()
最佳法函数
intbest_function()
最坏法函数
intbad_function()
算法思路及流程图
3.1首次适应算法
空闲分区以地址递增的次序链接。
分配内存时顺序查找,找到大小能满足要求的第一个空闲分区。
3.2循环首次适应算法
空闲分区以地址递增的次序链接。
分配内存时从上次查找结束的位置开始继续查找,找到大小能满足要求的第一个空闲分区。
3.3最佳适应算法
空闲分区按容量递增形成分区链,找到第一个能满足要求的空闲分区。
3.4最坏适应算法
空闲分区以容量递减的次序链接。
找到第一个能满足要求的空闲分区。
源程序
//test1.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include
#include
usingnamespacestd;
#definemem640//定义内存为640K
enumstatus{FREE,BUSY};
typedefstructfreestorage//定义分区结构体
{
intnum;//分区号
intsize;//大小
intaddress;//首地址
statusstate;//状态
};
typedefstructpnode
{
freestoragedata;
pnode*head;
pnode*next;
}*Linklist;
Linklistfirst,last;
Linklistlast_find;
voidinitial()//初始化
{
first=newpnode;
last=newpnode;
first->head=NULL;
first->next=last;
last->head=first;
last->next=NULL;
last->data.address=0;
last->data.size=mem;
last->data.num=0;
last->data.state=FREE;
}
voiddisplay()
{
cout<<"————————————分配结果—————————"< pnode*p=first->next; while(p) { cout<<"分区号: "; if(p->data.num==0) { cout<<"未分配"<<""<<"地址起: "< "< ""<<"大小: "<< p->data.size<<"KB"<<""<<"状态: 空闲"< } else { cout< cout<<""<<"地址起: "< "< "大小: "< <<"KB"<<""<<"状态: "; if(p->data.state==FREE) cout<<"空闲"< elseif(p->data.state==BUSY) cout<<"占用"< } p=p->next; } cout<<"—————————————————————————"< } intfirst_function()//首次法 { intnum,size; cout<<"请输入分区号和分配内存(KB): "< cin>>num>>size; Linklistlist=newpnode; list->data.num=num; list->data.size=size; list->data.state=BUSY; pnode*p=first->next; while(p) { if(p->data.state==FREE&&p->data.size==size)//有大小刚好合适的空闲块 { p->data.state=BUSY; p->data.num=num; display(); return1; } if(p->data.state==FREE&&p->data.size>size)//有大小比他大的空闲块 { list->head=p->head; list->next=p; list->data.address=p->data.address; p->head->next=list; p->head=list; p->data.address=list->data.address+list->data.size; p->data.size-=size; display(); return1; } p=p->next; } display(); return0; } intrecycle_first_function()//循环首次法 { intnum,size; cout<<"请输入分区号和分配内存(KB): "< cin>>num>>size; Linklistlist=newpnode; list->data.num=num; list->data.size=size; list->data.state=BUSY; if(! last_find) { last_find=first; } pnode*p=last_find->next; while(p) { if(p->data.state==FREE&&p->data.size==size)//有大小刚好合适的空闲块 { p->data.state=BUSY; p->data.num=num; display(); last_find=p->next; return1; } if(p->data.state==FREE&&p->data.size>size)//有大小比他大的空闲块 { list->head=p->head; list->next=p; list->data.address=p->data.address; p->head->next=list; p->head=list; p->data.address=list->data.address+list->data.size; p->data.size-=size; display(); last_find=p->next; return1; } p=p->next; } display(); return0; } intbest_function()//最佳法 { intnum,size; cout<<"请输入分区号和分配内存(KB): "< cin>>num>>size; intmin_space=mem; Linklistlist=newpnode; list->data.num=num; list->data.size=size; list->data.state=BUSY; pnode*p=first->next; pnode*q=NULL; while(p)//找到最佳位置 { if((p->data.size>size||p->data.size==size)&&p->data.state==FREE) { if(p->data.size-size { q=p; min_space=p->data.size-size; } } p=p->next; } if(q==NULL) { return0; } else { if(min_space==0) { q->data.num=num; q->data.state=BUSY; display(); return1; } else { list->head=q->head; list->next=q; list->data.address=q->data.address; q->head->next=list; q->head=list; q->data.address+=size; q->data.size-=size; display(); return1; } } } intbad_function()//最坏法 { intnum,size; cout<<"请输入分区号和分配内存(KB): "< cin>>num>>size; intmax_space=0; Linklistlist=newpnode; list->data.num=num; list->data.size=size; list->data.state=BUSY; pnode*p=first->next; pnode*q=NULL; while(p)//找到最坏位置 { if((p->data.size>size||p->data.size==size)&&p->data.state==FREE) { if(p->data.size-size>max_space) { q=p; max_space=p->data.size-size; } } p=p->next; } if(q==NULL) { return0; } else { if(max_space==0) { q->data.num=num; q->data.state=BUSY; display(); return1; } else { list->head=q->head; list->next=q; list->data.address=q->data.address; q->head->next=list; q->head=list; q->data.address+=size; q->data.size-=size; display(); return1; } } } intrecycle()//回收内存 { intnum; cout<<"请输入回收内存的分区号: "< cin>>num; pnode*p=first; while(p) { if(p->data.num==num) { p->data.state=FREE; p->data.num=0; if(p->head->data.state==FREE)//与前一块空闲区相邻,则合并 { p->head->data.size+=p->data.size; p->head->next=p->next; p->next->head=p->head; } if(p->next->data.state==FREE)//与后一块空闲区相邻,则合并 { p->data.size+=p->next->data.size; p->next->next->head=p; p->next=p->next->next; } break; } p=p->next; } display(); return1; } voidmenu() { cout<<"—————————菜单—————————"< cout<<"1.首次适应算法分配内存"< cout<<"2.循环首次适应算法分配内存"< cout<<"3.最佳适应算法分配内存"< cout<<"4.最坏适应算法分配内存"< cout<<"5.查看分配情况"< cout<<"6.回收主存"< cout<<"7.退出"< cout<<"————————————————————————"< cout<<"请选择: "< } voidmain() { initial(); intchoose; while (1) { menu(); cin>>choose; switch(choose) { case1: first_function(); break; case2: recycle_first_function(); break; case3: best_function(); break; case4: bad_function(); break; case5: display(); break; case6: recycle(); break; case7: exit (1); break; default: cout<<"请输入有效数字! "< break; } } } 运行结果截图 首次适应算法 循环首次适应算法 最佳适应算法 最坏适应算法 心得体会 忙碌了一个多星期自己独立完成很高兴,因为在设计的过程中,让我了解到要设计一个大型程序,查找资料是至关重要的,在他人的基础上,再根据自己所学进行修改与调试,最后设计出自己想要的程序,这过程艰辛,但只要你持之以恒,成功指日可待。 在设计这个程序时,我们刚开始是根据老师给我们提供的资料,用画图以及循环将框架设计出来,但是接下去便无从下手了,计算是个关键和难点,我们也查了相应的资料,但是它上面用得是坐标来做的,所以为了方便设计程序,我们也改为坐标来做的,这样计算问题解决了。 接下去就是按键问题,我们的资料是用鼠标做的,所以关于按键这个函数就只能我们自己设计,还好手头有类似的资料,经过自己的反复尝试以及与与同学的讨论,这也不难,最好还是被我们搞定了。 最后就是闪烁,这个设计的方法很死板,都一个类型,就是算坐标比较烦琐,要确定好它的位置,但是这些只要你自己愿意去尝试,问题都可以迎刃而解的。 从这一个多星期的设计过程中,我看到了大家的拼搏与努力,也让我知道团队精神得难能可贵,尽管一年下来大家不怎么有多大接触,但是彼此之间的友谊已经在我们心里扎根生底,在遇到问题时,我们会共同进退,每个人都很慷慨不会因为是通过自己艰辛劳动设计出来的东西而不准他人剽窃了。 总之,这次设计程序让我受益良多,我会好好珍惜像这种难得的机会。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华南理工大学 平时 作业 操作系统 课程设计