内存分配首次适应算法Word文件下载.docx
- 文档编号:15024267
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:12
- 大小:173.51KB
内存分配首次适应算法Word文件下载.docx
《内存分配首次适应算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《内存分配首次适应算法Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
boolflag;
structFreeLink*next;
}*ptr,*head;
headtop;
ptrp;
c)内存分配算法
当有进程要求分配主存时,依据首次适应算法从链头开始,延链查找一个足以容纳该进程的空闲区。
若这个分区比较大,则一分为二,一部分分配给进程,另一部分作为空闲区仍留在链中的当前位置,修改它的上一个空闲区的前向指针值为再加上分配给进程的分区大小,下一个空闲区的后向指针值为再加上分配给进程的分区大小,使链保持完整。
若这个分区的大小正好等于进程的大小,该分区全部分配给进程,并将该空闲区从链中摘除(即修改下一个空闲区的后向指针=该空闲区后向指针,上一个空闲区的前向指针=该空闲区的前向指针)。
再在已分配区表中找一个空表目,登记刚刚分配的内存始址、长度和进程号。
d)内存的回收
当进程运行完成,释放内存时,通过输入进程号,来回收进程占用的分区。
在回收时,释放区与空闲区相邻接的情况要考虑4种情况:
⊙释放区下邻空闲区
⊙释放区上邻空闲区
⊙释放区与上下空闲区均相邻
⊙释放区与上下空闲区均不相邻
e)程序流程图
※空闲链的首次适应算法分配流程图
※空闲链的首次适应算法回收流程图
f)截屏
五、源代码
#include<
iostream.>
malloc.h>
stdlib.h>
usingnamespacestd;
typedefstructFreeLink{//定义空闲链
voidprint(){//将内存分配情况打印到屏幕上
p=top;
cout<
<
"
************************内存分配情况表************************"
endl;
区号\t\t"
起始位置\t"
区间长度\t"
区间状态\t"
do{
cout<
p->
name<
\t\t"
start<
size<
;
if(p->
flag==false)//flag为false,表明该分区空闲
{
cout<
空闲"
}
else
已占用"
p=p->
next;
}
while(p!
=NULL);
}
voidclear(){//结束操作时清空“内存”以备其他操作
p=top;
top=top->
free(p);
while(top!
内存已清空!
voidhebing(ptr&
p){//若被操作的内存有相邻空闲区则将空闲区拼接合并
intx;
if(p->
prior->
flag==false&
&
next->
flag==false)x=1;
//释放区与上下空闲区均相邻
if((p->
flag==true)||(p->
next==NULL))x=2;
//释放区下邻空闲区
flag==true&
flag==false)||(p->
prior==NULL&
flag==false))x=3;
//释放区上邻空闲区
next==NULL))x=4;
//释放区与上下空闲区均不相邻
switch(x){
case1:
prior=p->
prior;
p->
next=p->
size=p->
size+p->
size;
next!
=NULL)
p->
free(p->
next);
//释放
break;
case2:
if(p->
next==NULL)//p为最后一个分区
else{
case3:
prior==NULL)//p为第一个分区
top=p->
prior=NULL;
start=p->
start;
p->
case4:
name='
*'
//将释放区移至链首并标记为未被占用
flag=false;
voidallocate(ptr&
p){//最先适应法的内存分配函数
FreeLink*fl=(FreeLink*)malloc(sizeof(FreeLink));
请输入要分配内存的进程号:
cin>
>
fl->
name;
请输入要分配内存的大小:
fl->
flag=true;
size>
size){
fl->
start=fl->
start+fl->
size-fl->
next=p;
next=fl;
p->
prior=fl;
gotoa;
size==fl->
flag=fl->
flag;
name=fl->
free(fl);
}while(p!
内存过小,分配失败!
gotob;
a:
分配成功!
b:
;
//啥也不做
voidhuishou(ptr&
p){//内存回收函数
charn='
'
请输入要回收的内存对应的进程号:
n;
name==n)
hebing(p);
gotoc;
p=p->
内存未能分配给该进程,回收失败!
gotod;
c:
内存回收成功!
d:
intfirstfit(){//最先适应法
charchoice='
print();
ptrpcb=(FreeLink*)malloc(sizeof(FreeLink));
pcb->
next=top;
prior=top->
top->
prior=pcb;
start=top->
请输入要为系统分配的内存块号:
pcb->
gotof;
e:
超过内存最大容量,请重新输入要分配内存的大小:
f:
if(pcb->
256)
gotoe;
size=top->
size-pcb->
top=pcb;
start+=top->
while(true){
p=top->
请从下列选项中进行选择:
1.分配内存"
2.回收内存"
3.结束操作"
请输入你的选择:
cin>
choice;
}while(choice!
='
1'
choice!
2'
3'
);
switch(choice){
case'
:
allocate(p);
print();
break;
huishou(p);
clear();
return0;
intmain(){//主函数
ptr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 分配 首次 适应 算法