操作系统与Linux
实 验 报 告
实验名称 动态分区算法实验报告
姓 名
学 号
班 级
教 师
日 期
一、 实验目的
1.加深对可变分区的存储管理的理解;
2.掌握用指针实现链表和在链表上的基本操作。
二、 实验
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
用循环首次适应和最佳适应算法法模拟UNIX 可变分区内存管理,实现对该内存区的分配和释放管理的功能。
三、 实验原理
(1)循环首次适应算法
模拟UNIX 的进程管理程序采用的是循环首次适应算法,具体算法如下:
系统每次为进程分配资源时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
(2)循环最佳适应算法
模拟UNIX 的进程管理程序采用的是最佳适应算法,具体算法如下:
系统每次为进程分配资源时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到一个能满足要求且最小的的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。
2.物理设计
(1)struct WORK
{
string NAME; //作业名称
int After_SPACE; //该作业跟上一个作业之间的空闲内存空间
int SPACE; //需要的内存空间
int StartPoint; //作业在内存里开始的位置
int EndPoint; //作业在内存里结束的位置
WORK *next;
};
WORK* FWork ; // 从内存开始0位置向下数第一个作业
#define FULL_ MEM 640 //定义内存空间大小为640KB
四、 开发环境
Vs2010
五、 程序流程图,具体步骤截图与代码注释
1.程序流程图
2.代码段:
#include
#include
#include
#include
using namespace std;
/*****************/
/* 定义作业类 */
/*****************/
struct WORK
{
string NAME; //作业名称
int After_SPACE; //该作业跟上一个作业之间的空闲内存空间
int SPACE; //需要的内存空间
int StartPoint; //作业在内存里开始的位置
int EndPoint; //作业在内存里结束的位置
WORK *next;
};
/*****************/
/* 定义基础信息 */
/*****************/
#define FULL_MEM 640 // 总内存为640K
int state = 1; //提示作业申请状态(1--->申请成果;0---->申请失败)
int First_FreeSpace = 640; //内存0到第一个作业间的空闲内存(初始化状态下,为640K即为整个内存)
WORK* FWork = NULL; //第一个作业
void FCFS(string File);
void Best_Adaptation(string File);
/*****************/
/* 界面设计 */
/*****************/
void display_main()
{
cout<<"请输入写有你内存申请的文件:";
string File;
getline(cin,File);
system("cls");
cout<<"请输入你选择的算法:"<>n;
system("cls");
switch(n)
{
case 1:cout<<"首次适应服务"<StartPoint == 0)
{
cout<NAME<<" 00"<StartPoint<<" "<EndPoint<<" "<SPACE<NAME<<" "<StartPoint<<" "<EndPoint<<" "<SPACE<next;
}
cout<>CurrentWork->NAME ;)
{
ifile>>Action;
if(Action == "申请")
{
ifile>>CurrentWork->SPACE;
cout<NAME<SPACE<<"kb"< 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 = new WORK();
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"<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;