实验4主存储器空间分配实验Word格式.docx

上传人:b****5 文档编号:17287780 上传时间:2022-11-30 格式:DOCX 页数:18 大小:186.87KB
下载 相关 举报
实验4主存储器空间分配实验Word格式.docx_第1页
第1页 / 共18页
实验4主存储器空间分配实验Word格式.docx_第2页
第2页 / 共18页
实验4主存储器空间分配实验Word格式.docx_第3页
第3页 / 共18页
实验4主存储器空间分配实验Word格式.docx_第4页
第4页 / 共18页
实验4主存储器空间分配实验Word格式.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

实验4主存储器空间分配实验Word格式.docx

《实验4主存储器空间分配实验Word格式.docx》由会员分享,可在线阅读,更多相关《实验4主存储器空间分配实验Word格式.docx(18页珍藏版)》请在冰豆网上搜索。

实验4主存储器空间分配实验Word格式.docx

//长度

chartag[20];

//标志

}job;

可变分区的三种算法就是为作业分配主存空间的方法。

●首次适应算法:

在空闲区间中查询满足作业需要的空间,并将作业装入第一个满足条件的空间中去。

●最佳适应算法:

在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最小的一个空间中去。

●最坏适应算法:

在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最大的一个空间中去。

从三种算法的说明可以看出,分配空间的过程主要可以分两步:

●查询所有满足作业需求的空间块。

●按照指定的算法将作业装入空间块中。

在操作的最初主存空间实际就是一个大的空闲区,不涉及到如何分配的问题。

为直接模拟运行一段时间后主存中出现了多个空闲块的状态,题目要求从一个文件读入空闲区表。

在这里我们可以设计一个空闲区表文件的结构为如表2所示:

表2空闲区表

这样也可以方便地将空闲表一次读入程序中,而不必再一个个的输入。

主要变量及函数说明如表3所示。

表3变量与函数说明表

typedefstructnode

内存块结构

jobfrees

空闲区表

joboccupys

已分配区表

free_quantity

空闲区数量

occupy_quantity

已分配区数量

voidinitial()

初始化函数

intreadData()

从文件读入空闲表函数

voidsort()

排序空闲表

voidview()

显示分区信息

voidearliest()

最先适应分配算法

voidexcellent()

最优适应分配算法

voidworst()

最坏适应算法

mem.txt

空闲表文件

四、实验内容(代码清单)

实验代码如下:

#include<

stdio.h>

stdlib.h>

string.h>

iostream.h>

windows.h>

#defineFree0//空闲状态

#defineBusy1//已用状态

#defineOK1//完成

#defineERROR0//出错

#defineStatusint;

intn=0;

//判断是否要开创空间表

longMAX_length;

//最大内存空间

typedefstructFreeArea//定义一个空闲区说明表结构

intnumber;

//分区号

longsize;

//分区大小

longaddress;

//分区地址

intstate;

//状态

}ElemType;

//线性表的双向链表存储结构

typedefstructDuLNode

ElemTypedata;

structDuLNode*prior;

//前趋指针

structDuLNode*next;

//后继指针

}DuLNode,*DuLinkList;

DuLinkListfirst;

//头结点

DuLinkListlast;

//尾结点

Statusallocation(int);

//内存分配

Statusfree(int);

//内存回收

StatusFirstFit(int,int);

//首次适应算法

StatusBestFit(int,int);

//最佳适应算法

voidshow();

//查看分配

StatusInitList();

//开创空间表

StatusInitList()//开创带头结点的内存空间链表

first=(DuLinkList)malloc(sizeof(DuLNode));

last=(DuLinkList)malloc(sizeof(DuLNode));

first->

prior=NULL;

next=last;

last->

prior=first;

next=NULL;

data.address=0;

data.size=MAX_length;

data.number=0;

data.state=Free;

returnOK;

}

//分配主存

Statusallocation(intch)

intnumber,request;

printf("

请输入作业(分区号):

"

);

scanf("

%d"

&

number);

请输入需要分配的主存大小(单位:

KB):

request);

if(request<

0||request==0)

{

printf("

分配大小不合适,请重试!

\n"

returnERROR;

}

if(ch==2)//选择最佳适应算法

if(BestFit(number,request)==OK)printf("

分配成功!

elseprintf("

内存不足,分配失败!

returnOK;

else//默认首次适应算法

if(FirstFit(number,request)==OK)printf("

//首次适应算法

StatusFirstFit(intnumber,intrequest)//传入作业名及申请量

DuLinkListDLL=(DuLinkList)malloc(sizeof(DuLNode));

//为申请作业开辟新空间且初始化

DLL->

data.number=number;

data.size=request;

data.state=Busy;

DuLNode*p=first->

next;

while(p)

if(p->

data.state==Free&

&

p->

data.size==request)//有大小恰好合适的空闲块

{

p->

break;

}

if(p->

data.size>

request)//有空闲块能满足需求且有剩余"

{

DLL->

prior=p->

prior;

next=p;

data.address=p->

data.address;

prior->

next=DLL;

p->

prior=DLL;

data.address=DLL->

data.address+DLL->

data.size;

data.size-=request;

p=p->

returnERROR;

//最佳适应算法

StatusBestFit(intnumber,intrequest)

intch;

//记录最小剩余空间

DuLNode*q=NULL;

//记录最佳插入位置

while(p)//初始化最小空间和最佳位置

(p->

request||p->

data.size==request))

q=p;

ch=p->

data.size-request;

break;

p=p->

data.size==request)//空闲块大小恰好合适

request)//空闲块大于分配需求

data.size-request<

ch)//剩余空间比初值还小

{

ch=p->

//更新剩余最小值

q=p;

//更新最佳位置指向

}

if(q==NULL)returnERROR;

//没有找到空闲块

else

{//找到了最佳位置并实现分配

prior=q->

DLL->

next=q;

data.address=q->

q->

data.address+=request;

data.size=ch;

//释放内存

Statusfree(intnumber)

DuLNode*p=first;

data.number==number)

data.number=Free;

data.state==Free)//与前面的空闲块相连

p->

data.size+=p->

next=p->

next->

if(p->

data.state==Free)//与后面的空闲块相连

p->

prior=p;

//显示内存存分配情况

voidshow()

********内存分配情况********\n"

分区号:

data.number==Free)printf("

Free\n"

elseprintf("

%d\n"

p->

data.number);

起始地址:

%ld\n"

data.address);

分区大小:

%ldKB\n"

data.size);

状态:

if(p->

data.state==Free)printf("

空闲\n"

已分配!

---------------------------------------\n"

p=p->

//主函数

voidmain()

//system("

color1D"

-----------动态内存分配管理-----------\n"

intch,d=0;

//算法选择标记

--1.首次适应算法--\n"

--2.最佳适应算法--\n"

--0.退出--\n"

-----------------------------------------------------------\n"

请选择分配算法:

ch);

请输入内存空间的大小(单位:

%ld"

MAX_length);

if(ch==0||ch==1||ch==2)d++;

while(d==0)

printf("

数字不正确,请选择0--2之间的数字\n"

scanf("

if(ch==0||ch==1||ch==2)d++;

if(ch==0)exit(0);

if(n==0)InitList();

//开创空间表

intselection;

//操作选择标记

while

(1)

-----------1:

分配内存2:

释放内存-----------\n"

-----------3:

查看分配0:

返回-----------\n"

请输入您的操作:

selection);

if(selection==1)

allocation(ch);

//分配内存

n++;

elseif(selection==2)//释放内存

intnumber;

请输入您要释放的分区号:

scanf("

free(number);

elseif(selection==3)

show();

//显示主存

elseif(selection==0)

main();

//退出

n++;

else//输入操作有误

printf("

输入有误,请重试!

continue;

5、实验结果及分析

实验结果如下:

1、首次适应算法

分配内存:

回收内存:

2、最佳适应算法

释放内存:

六、成绩评定

及格

不及格

出勤

内容

格式

创新

效果

总评

指导教师:

年月日

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

当前位置:首页 > 高中教育 > 高中教育

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

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