内存分区实验报告.docx
《内存分区实验报告.docx》由会员分享,可在线阅读,更多相关《内存分区实验报告.docx(7页珍藏版)》请在冰豆网上搜索。
内存分区实验报告
操作系统与Linux
实验报告
实验名称动态分区算法实验报告
姓 名
学 号
班 级
教 师
日 期
一、实验目的
1.加深对可变分区的存储管理的理解;
2.掌握用指针实现链表和在链表上的基本操作。
二、实验内容
用循环首次适应和最佳适应算法法模拟UNIX可变分区内存管理,实现对该内存区的分配和释放管理的功能。
三、实验原理
(1)循环首次适应算法
模拟UNIX的进程管理程序采用的是循环首次适应算法,具体算法如下:
系统每次为进程分配资源时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
(2)循环最佳适应算法
模拟UNIX的进程管理程序采用的是最佳适应算法,具体算法如下:
系统每次为进程分配资源时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求且最小的的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
2.物理设计
(1)structWORK
{
stringNAME; //作业名称
intAfter_SPACE; //该作业跟上一个作业之间的空闲内存空间
intSPACE; //需要的内存空间
intStartPoint; //作业在内存里开始的位置
intEndPoint; //作业在内存里结束的位置
WORK*next;
};
WORK*FWork;//从内存开始0位置向下数第一个作业
#defineFULL_MEM640 //定义内存空间大小为640KB
四、开发环境
Vs2010
五、程序流程图,具体步骤截图与代码注释
1.程序流程图
2.代码段:
#include
#include
#include
#include
usingnamespacestd;
/*****************/
/* 定义作业类 */
/*****************/
structWORK
{
stringNAME; //作业名称
intAfter_SPACE; //该作业跟上一个作业之间的空闲内存空间
intSPACE; //需要的内存空间
intStartPoint; //作业在内存里开始的位置
intEndPoint; //作业在内存里结束的位置
WORK*next;
};
/*****************/
/* 定义基础信息*/
/*****************/
#defineFULL_MEM640 //总内存为640K
intstate=1; //提示作业申请状态(1--->申请成果;0---->申请失败)
intFirst_FreeSpace=640; //内存0到第一个作业间的空闲内存(初始化状态下,为640K即为整个内存)
WORK*FWork=NULL; //第一个作业
voidFCFS(stringFile);
voidBest_Adaptation(stringFile);
/*****************/
/* 界面设计 */
/*****************/
voiddisplay_main()
{
cout<<"请输入写有你内存申请的文件:
";
stringFile;
getline(cin,File);
system("cls");
cout<<"请输入你选择的算法:
"<cout<<"1.首次适应算法"<cout<<"2.最佳适应算法"<cout<<"3.退出"<intn;
cin>>n;
system("cls");
switch(n)
{
case1:
cout<<"首次适应服务"<case2:
cout<<"最佳适应算法"<case3:
exit(0);break;
}
}
voiddisplay() //输出每次作业活动的结果
{
WORK*temp=FWork;
cout<<"作业 起始位置 终止位置占用内存大小"<cout<while(temp!
=NULL)
{
if(temp->StartPoint==0)
{
cout<NAME<<" 00"<StartPoint<<" "<EndPoint<<" "<SPACE<}
else
{
cout<NAME<<" "<StartPoint<<" "<EndPoint<<" "<SPACE<}
temp=temp->next;
}
cout<Sleep(1000);
}
/*****************/
/* 首次适应算法*/
/*****************/
voidFCFS(stringFile)
{
ifstreamifile(File,ios:
:
in); //打开txt文件
WORK*fWork=newWORK();
WORK*CurrentWork=newWORK();
stringAction; //作业行为(释放OR申请)
stringName;
for(;iFile>>CurrentWork->NAME;)
{
ifile>>Action;
if(Action=="申请")
{
ifile>>CurrentWork->SPACE;
cout<NAME<SPACE<<"kb"<if(FWork!
=NULL)
{
if(First_FreeSpace>CurrentWork->SPACE) //查看内存O到第一作业间是否有足够空间存放申请的作业
{
fWork->NAME=CurrentWork->NAME;
fWork->SPACE=CurrentWork->SPACE;
fWork->StartPoint=0;
First_FreeSpace=0;
fWork->EndPoint=fWork->StartPoint+fWork->SPACE;
fWork->After_SPACE=FWork->StartPoint-fWork->EndPoint; //计算作业之间的空闲内存空间
fWork->next=FWork;
FWork=fWork;
}
else
{
for(fWork=FWork;fWork!
=NULL;fWork=fWork->next)
{
if(fWork->After_SPACE>CurrentWork->SPACE)
{
CurrentWork->After_SPACE=fWork->After_SPACE-CurrentWork->SPACE;
CurrentWork->StartPoint=fWork->EndPoint;
CurrentWork->EndPoint=CurrentWork->StartPoint+CurrentWork->SPACE;
fWork->After_SPACE=0; //新作业进入,fWork与新作业之间的空闲内存空间变为0
CurrentWork->next=fWork->next;
fWork->next=CurrentWork;
CurrentWork=newWORK();
break;
}
}
}
}
else //第一次有作业申请或内存完全空闲时有作业申请
{
fWork->NAME= CurrentWork->NAME;
fWork->SPACE=CurrentWork->SPACE;
fWork->After_SPACE=First_FreeSpace-fWork->SPACE;
fWork->StartPoint=0;
fWork->EndPoint=fWork->StartPoint+CurrentWork->SPACE;
fWork->next=NULL;
FWork=fWork;
First_FreeSpace=0;
}
}
else
{
iFile>>CurrentWork->SPACE;
cout<NAME<SPACE<<"kb"<if(FWork->NAME==CurrentWork->NAME)
{
if(FWork->SPACE==CurrentWork->SPACE)
{
First_FreeSpace=CurrentWork->SPACE+First_FreeSpace+FWork->After_SPACE;
FWork=FWork->next;
}
else
{
FWork->SPACE=FWork->SPACE-CurrentWork->SPACE;
FWork->After_SPACE=FWork->After_SPACE+CurrentWork->SPACE;