实验2存储器的分配与回收Word格式.docx

上传人:b****8 文档编号:22911782 上传时间:2023-02-06 格式:DOCX 页数:36 大小:137.82KB
下载 相关 举报
实验2存储器的分配与回收Word格式.docx_第1页
第1页 / 共36页
实验2存储器的分配与回收Word格式.docx_第2页
第2页 / 共36页
实验2存储器的分配与回收Word格式.docx_第3页
第3页 / 共36页
实验2存储器的分配与回收Word格式.docx_第4页
第4页 / 共36页
实验2存储器的分配与回收Word格式.docx_第5页
第5页 / 共36页
点击查看更多>>
下载资源
资源描述

实验2存储器的分配与回收Word格式.docx

《实验2存储器的分配与回收Word格式.docx》由会员分享,可在线阅读,更多相关《实验2存储器的分配与回收Word格式.docx(36页珍藏版)》请在冰豆网上搜索。

实验2存储器的分配与回收Word格式.docx

2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。

若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。

实验要求:

1.详细描述实验设计思想、程序结构及各模块设计思路;

2.详细描述程序所用数据结构及算法;

3.明确给出测试用例和实验结果;

4.为增加程序可读性,在程序中进行适当注释说明;

5.认真进行实验总结,包括:

设计中遇到的问题、解决方法与收获等;

6.实验报告撰写要求结构清晰、描述准确逻辑性强;

7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

#include<

iostream>

usingnamespacestd;

typedefstructRamtable//内存表结构体

{

intuse;

//是否被占用,=0未被占用,=1被占用

}Ramtable;

typedefstructFreeRamtable//空闲地址登记表结构体

intFreeRamSize;

//空闲占用内存大小

intFreeStartAdd;

//空闲起始地址

intFreeEndAdd;

//空闲结束地址

intFreeNumber;

//按照顺序的空闲分区编号(由地址的从前到后)

}FreeRamtable;

typedefstructUsedRamtable//已分配区地址登记表结构体

intUsedRamSize;

//已分配区地址占用大小

intUsedStartAdd;

//已分配区起始地址

intUsedEndAdd;

//已分配区结束地址

intUsedNumber;

//按照作业占用的内存起始地址顺序的排序编号

stringWorkName;

//作业名称

}UsedRamtable;

RamtableRam[100]={0};

//内存表

FreeRamtableFreeRam[51];

//空闲地址登记表

UsedRamtableUsedRam[100];

//已分配区地址登记表

intWorkNumber=0;

//当前作业数注意:

全局变量只能计算一次,再次计算需先置零

intFreeWorkNumber=0;

//当前空闲区数注意:

全局变量只能计算一次,再次计算需先置零

intChoose;

//选择三种算法的一种

stringname;

//作业的名字

intWorkSize;

//作业所占内存大小

voidCountWorkNumber()//计算当前作业数

for(inti=0;

i<

100;

i++)

{

if(UsedRam[i].WorkName=="

"

break;

else

WorkNumber++;

}

}

voidCountFreeWorkNumber()

51;

if(FreeRam[i].FreeStartAdd!

=-1)

FreeWorkNumber++;

voidInitWorkName()//初始化已分配内存登记表的第一个记录,使其名字为空,方便计算

UsedRam[0].WorkName="

;

FreeRam[0].FreeRamSize=100;

FreeRam[0].FreeStartAdd=0;

FreeRam[0].FreeEndAdd=99;

FreeRam[1].FreeStartAdd=-1;

voidGetWork()

cout<

<

PleaseEnterWork`snameandramsize:

cin>

>

name>

WorkSize;

Enter1usingQuickarithmetic"

endl;

Enter2usingBestarithmetic"

Enter3usingWorstarithmetic:

"

Choose;

intQuick()//最先适应算法

inti;

for(i=0;

if(FreeRam[i].FreeRamSize>

=WorkSize)

if(i==51)

cout<

ERROR!

NoEnoughFreeRamLefe!

return-1;

//找不到合适的空间时返回-1,方便进行下一步操作

returni;

//返回值是指示第几个空闲区的下标

intBest()//最佳适应算法

inttemp=-1;

{

if(temp<

0)

temp=i;

else

{

if(FreeRam[temp].FreeRamSize>

FreeRam[i].FreeRamSize)

temp=i;

}

}

if(temp<

returntemp;

intWorst()//最坏适应算法

if(FreeRam[temp].FreeRamSize<

voidMoldification()

WorkNumber=0;

CountWorkNumber();

WorkNumber;

for(intj=UsedRam[i].UsedStartAdd;

j<

=UsedRam[i].UsedEndAdd;

j++)

Ram[j].use=1;

voidInsert()

intk;

//找到要插入的作业的所在已分配表中的位置

FreeWorkNumber=0;

//计算此时的作业数

CountFreeWorkNumber();

//计算此时的空闲区数

if(Choose==1)

i=Quick();

for(intj=0;

if(WorkNumber!

=0)

{//这种情况可能会使k=0,在第一个作业的开始地址比较靠后,且前面是空闲分区

if(UsedRam[j].WorkName=="

{//这个没有登记作业

k=j;

break;

}

elseif(FreeRam[i].FreeEndAdd<

UsedRam[j].UsedStartAdd)

{//已经登记作业,但是需要在此处插入

k=0;

break;

if(k!

if(UsedRam[k].WorkName!

="

)//这个格子已经登记过其他作业

{//即不是数组最后的空的格子

for(intj=WorkNumber;

j>

k;

j--)

{

UsedRam[j].UsedRamSize=UsedRam[j-1].UsedRamSize;

UsedRam[j].UsedStartAdd=UsedRam[j-1].UsedStartAdd;

UsedRam[j].UsedEndAdd=UsedRam[j-1].UsedEndAdd;

UsedRam[j].WorkName=UsedRam[j-1].WorkName;

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

UsedRam[WorkNumber+1].WorkName="

if(FreeRam[i].FreeRamSize>

WorkSize)

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

else

for(intj=i;

FreeWorkNumber-1;

{

FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;

FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;

FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;

}

FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;

else//这个格子还没有登记

{//即是数组中最后空白中的第一个格子

UsedRam[k+1].WorkName="

else//k=0时有两种情况,一种是没有作业,另一种是:

{//第一个作业的开始地址之前是空闲分区,且大小比插入作业大小大

if(WorkNumber==0)

0;

}

intx;

x=1;

elseif(Choose==2)

i=Best();

if(UsedRam[j].UsedStartAdd==0&

&

UsedRam[j].UsedEndAdd==0)

if(UsedRam[k].UsedStartAdd!

UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;

UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;

UsedRam[k].UsedRamSize=WorkSize;

UsedRam[k].WorkName=name;

if(FreeRam[i].FreeRamSize>

FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;

FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;

for(intj=i;

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

当前位置:首页 > 人文社科 > 法律资料

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

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