操作系统大作业Word格式文档下载.docx
- 文档编号:16333502
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:21
- 大小:173.55KB
操作系统大作业Word格式文档下载.docx
《操作系统大作业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统大作业Word格式文档下载.docx(21页珍藏版)》请在冰豆网上搜索。
3.设计思想及流程图
首次适应算法:
将空闲区按其在存储空间中的起始地址递增的顺序排列。
为作业分配存储空间时,从空闲区链的始端开始查找,选择第一个满足要求的空闲区,而不管它究竟有多大。
最佳适应法:
为一作业选择分区时总是寻找其大小最接近于作业所要求的存储空间。
(1)在本程序处理进程状态过程中,我选用了c++语言来实现该程序,为了解决如何存储空间的问题,首先定义一个空闲区结构(structFreeArea)和一个双链表结构(structDuLNode),然后初始化最大的内存空间大小(MAX_LENGTH),定义了前趋指针(structDuLNode*prior)和后继指针(structDuLNode*next;
)。
(2)处理首次适应法,采用链表进行查找,为作业分配存储空间时,从空闲区链的始端开始查找,选择第一个满足要求的空闲区,只要大于或等于要申请的内存空间大小就分配成功,修改链表,修改空闲区大小。
(3)处理最佳适应法,采用链表进行查找对比,满足要求的空闲区,并且与需要申请的内存空间大小相差最小的那个空闲区进行分配。
利用一个变量记录最小剩余空间并且实现分配。
(4)当根据作业号找到相应的分区,此时释放空间,我在释放空间的时候,采用按照进程名进行释放MethodTypeFreeMemory(intID);
函数中的参数intID作为作业号(分区号),在使用空间中找到该进程所占用的空间,然后进行释放,释放后在空闲区中添加该空间,并合并与之相联的空闲区。
分配内存流程图大体如下:
释放内存流程图大体如下:
4.数据定义
定义了方法的一个标识符:
typedefintMethodType;
初始态最大内存空间为640KB:
#defineMAX_LENGTH640
空闲状态:
#defineFREESTATUS0
已用状态:
#defineUSEDSTATUS1
完成表示:
#defineENDFLAG1
出错标识:
#defineERROR0
定义一个空闲区说明表结构
typedefstructFreeArea
{
intID;
//分区号
longsize;
//分区大小
longaddress;
//分区地址
intstate;
//状态
}ElemType;
定义一个双链表结构
typedefstructDuLNode{
ElemTypedata;
structDuLNode*prior;
//前趋指针
structDuLNode*next;
//后继指针
}DuLNode,*DuLinkList;
5.源程序
#include<
iostream>
stdlib.h>
usingnamespacestd;
#defineMAX_LENGTH640//初始态最大内存空间为640KB
#defineFREESTATUS0//空闲状态
#defineUSEDSTATUS1//已用状态
#defineENDFLAG1//完成
#defineERROR0//出错
intn=0;
typedefstructFreeArea//定义一个空闲区说明表结构
//----------线性表的双向链表存储结构------------
typedefstructDuLNode//doublelinkedlist
DuLinkListblock_first;
//头结点
DuLinkListblock_last;
//尾结点
MethodTypeAllocMemory(int);
//内存分配
MethodTypeFreeMemory(int);
//内存回收
MethodTypeFirst_Fit(int,int);
//首次适应算法
MethodTypeBest_Fit(int,int);
//最佳适应算法
voidShowDistribution();
//查看分配情况
MethodTypeInitBlock();
//创建空间表
MethodTypeInitBlock()//创建带头结点的内存空间链表
block_first=(DuLinkList)malloc(sizeof(DuLNode));
block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->
prior=NULL;
next=block_last;
block_last->
prior=block_first;
next=NULL;
data.address=0;
data.size=MAX_LENGTH;
data.ID=0;
data.state=FREESTATUS;
returnENDFLAG;
}
//-----------------------分配内存-------------------------
MethodTypeAllocMemory(intch)
intID,request;
cout<
<
"
请输入作业号:
;
cin>
>
ID;
请输入需要申请分配的内存大小(单位:
KB):
request;
if(request<
0||request==0)
cout<
申请分配大小不合适,请重试!
endl;
returnERROR;
if(ch==2)//选择最佳适应算法
if(Best_Fit(ID,request)==ENDFLAG)cout<
申请分配成功!
elsecout<
内存不足,申请分配失败!
returnENDFLAG;
else//默认首次适应算法
if(First_Fit(ID,request)==ENDFLAG)cout<
//------------------首次适应算法-----------------------
MethodTypeFirst_Fit(intID,intrequest)//参数为作业号及申请大小
//向系统申请分配新的内存空间且初始化
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
temp->
data.ID=ID;
data.size=request;
data.state=USEDSTATUS;
DuLNode*p=block_first->
next;
while(p)
if(p->
data.state==FREESTATUS&
&
p->
data.size==request)
{//有大小恰好合适的空闲块
break;
}
data.size>
request)
{//有空闲块能满足需求且有剩余"
temp->
prior=p->
prior;
next=p;
data.address=p->
data.address;
prior->
next=temp;
prior=temp;
data.address=temp->
data.address+temp->
data.size;
data.size-=request;
p=p->
returnERROR;
//--------------------最佳适应算法------------------------
MethodTypeBest_Fit(intID,intrequest)
intch;
//记录最小剩余空间
DuLNode*q=NULL;
//记录最佳插入位置
while(p)//初始化最小空间和最佳位置
(p->
request||p->
data.size==request))
{
q=p;
ch=p->
data.size-request;
{//空闲块大小恰好合适
{//空闲块大于分配需求
data.size-request<
ch)//剩余空间比初值还小
//更新剩余最小值
//更新最佳位置指向
if(q==NULL)returnERROR;
//没有找到空闲块
else
{//找到了最佳位置并实现分配
prior=q->
next=q;
data.address=q->
q->
data.address+=request;
data.size=ch;
//-----------------------内存回收--------------------
MethodTypeFreeMemory(intID)
DuLNode*p=block_first;
data.ID==ID)
data.ID=FREESTATUS;
data.state==FREESTATUS)//与前面的空闲块相连
data.size+=p->
next=p->
next->
data.state==FREESTATUS)//与后面的空闲块相连
prior=p;
//---------------显示内存分配情况------------------
voidShowDistribution()
**************------------**************\n"
****内存分配情况****\n"
***********-----------------************\n"
作业号:
data.ID==FREESTATUS)cout<
Free"
p->
data.ID<
起始地址:
data.address<
分区大小:
data.size<
KB"
状态:
data.state==FREESTATUS)cout<
空闲"
已分配!
-----------------------"
//-----------------------主函数---------------------------
voidmain()
intch,d=0;
//算法选择标记
操作系统>
动态内存分区分配算法如下:
\n"
**1.首次适应算法2.最佳适应算法0.退出**\n"
请选择分配算法(然后按Enter键):
ch;
if(ch==0||ch==1||ch==2)d++;
while(d==0)
请选择正确的数字0,1或2"
cin>
if(ch==0||ch==1||ch==2)d++;
if(ch==0)exit(0);
if(n==0)InitBlock();
//申请整块空闲区
intchoice;
//操作选择标记
while
(1)
****************------------****************\n"
**1:
申请内存分配2:
释放内存**\n"
**3:
查看分配情况0:
返回**\n"
********************************************\n"
请输入您的操作项编号:
choice;
if(choice==1)
AllocMemory(ch);
//分配内存
n++;
elseif(choice==2)//内存回收/释放
intID;
请输入您要释放的作业号:
FreeMemory(ID);
elseif(choice==3)
ShowDistribution();
//显示主存分配情况
elseif(choice==0)
main();
//退出
else//输入操作有误
输入有误,请重试!
continue;
6.运行结果(以及截屏)
6.1首次适应法
(1)首先是选择首次适应分配算法的选择如下图所示:
(2)采用首次适应法申请作业1,作业2,作业3后,选择查看分配情况,结果如下图所示:
(3)接着操作:
作业2释放60K;
运行结果如下图所示:
(4)继续作业4申请200K,作业3释放100K,会发现相连的空闲区会连接在一起了,运行结果如下图所示:
(5)然后按照作业的要求继续操作:
作业1释放130K;
(6)从上图可以看出目前有两个空闲区,一个空闲区290K,另一个空闲区150K,接着采用首次适应法进行作业5申请140K;
从上图可以看出,采用首次适应法,是从开始进行查找,只要找到比申请的大小大的空闲区就进行了分配,而最佳是适应法是找到比申请内存空间大小大的,而且与申请大小最接近的空闲才分配。
(7)继续操作:
作业6申请60K;
作业7申请50K;
作业6释放60K;
进行申请和释放操作完后查看分配情况,得到结果如下图所示:
6.2最佳适应法运行结果及截图
而采用最佳适应法按照要求操作完之后,最后的内存分配情况如下图所示:
从运行结果很明显可以看到通过两种分配算法分配和回收内存,得到的结果是不同。
7.设计心得体会
在设计的过程中也加深对内存分配算法的理解,特别是首次适应法和最佳适应法,在设计内存分配过程中要注意内存不足的问题,所以一定在分配之前进行对内存大小的检测,以防由于内存不足引起的错误,
我觉得通过理论和实践结合,首先提高了自己的编程能力,同时也通过实际操作对操作系统的一些理论理解更加深刻了。
对于这门课程,我以后会不断采用同样方式,通过实践操作加强了自己的动手能力,加强自己的分析问题以及解决问题的能力,进一步深入理解书本的理论。
8.参考文献
1.《C++程序设计语言(特别版)》出版社:
机械工业出版社作者:
(美)斯特朗斯特鲁普著,裘宗燕译
2.计算机操作系统第三版(新世纪计算机类本科规划教材)出版社:
西安电子科技大学出版社作者:
汤小丹
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 作业