- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统之内存分配与回收
操作系统实验
内存的分配与回收
实验报告
实验题目:内存的分配与回收
实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。
实验目的:掌握可变分区首次适应算法的原理以及其编程实现。
实验过程:
1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。首次适应算法要求空闲空间链以地址递增的次序链接。进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。内存的回收需要考虑四种情况:⑴回收分区前后两个分区都空闲,则需要和前后两个分区合并;(2)回收分区只有前一分区空闲,则与前一分区合并;(3)回收分区只有后一分区空闲,则和后一分区合并;(4)回收分区独立,不考虑合并
。
2、主要数据结构:
struct FreeArea{ 链结点包含的数据:分区号、大小、起址、标记
int ID;
int size;
long address;
int sign;
};
struct Node { 双链表结点结构体:数据区、前向指针、后继指针
FreeArea data;
struct Node *prior;
struct Node *next;
}*DLinkList;
3、输入、输出:
输入: I.内存分配时由键盘输入分区ID和大小;
II.内存回收时由键盘输入需要回收的分区ID;
输出: 输出内存的分配情况(按照地址从低到高)
程序流程图:
实验结果截屏:
源程序代码:
#includeiostream
using namespace std;
#define Free 0 //空闲状态
#define Busy 1 //已用状态
#define PBusy 2 //碎片已用状态
#define FINISH 1 //完成
#define FINISH2 1 //完成
#define ERROR 0 //出错
#define memory 512 //最大内存空间为(单位:KB)
#define min 10 //碎片最小值(单位:KB)
typedef struct FreeArea//空闲链数据
{
int ID;
int size;
long address;
int sign;
};
typedef struct Node //空闲连结构
{
FreeArea data;
struct Node *prior;
struct Node *next;
}*DLinkList;
DLinkList head; //头结点
DLinkList tail; //尾结点
int Create()//初始化
{
head=(DLinkList)malloc(sizeof(Node));//分配内存
tail=(DLinkList)malloc(sizeof(Node));
head-prior=NULL;
head-next=tail;
tail-prior=head;
tail-next=NULL;
tail-data.address=0;
tail-data.size=memory;
tail-data.ID=0;
tail-data.sign=Free;
return FINISH;
}
int FirstFit(int ID,int request)//首次适应算法
{
DLinkList temp=(DLinkList)malloc(sizeof(Node));//新建作业的结点
temp-data.ID=ID;
temp-data.size=request;
temp-data.sign=Busy;
Node *p=head;//插入指针P
while(p)
{
if(p-data.sign==Free p-data.size==request)//剩余大小恰好满足{
p-data.sign=Busy;
p-data.ID=ID;
return FINISH;
break;
}
else if(p-data.sign==Free p-data.sizerequest (p-data.size-requestmin))//满足需求且有剩余且不产生碎片
{
temp-prior=p-prior;
temp-next=p;
temp-data.address=p-data.address;
p-prior-next=temp;
p-prior=temp;
p-data.addr
文档评论(0)