存储器管理实验Word文档格式.docx
- 文档编号:22198747
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:18
- 大小:17.95KB
存储器管理实验Word文档格式.docx
《存储器管理实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《存储器管理实验Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
structAllocatedBlock*NewAllocatedBlock=newAllocatedBlock;
NewAllocatedBlock->
BlockAddress=PrtBlock->
Address;
BlockSize=PrtBlock->
BlockSize;
ProcessID=processid;
Next=NULL;
if(AllocatedBlockHead==NULL)
AllocatedBlockHead=NewAllocatedBlock;
else
structAllocatedBlock*CurrentAllocatedBlock,*PreviousAllocatedBlock;
PreviousAllocatedBlock=AllocatedBlockHead;
CurrentAllocatedBlock=AllocatedBlockHead;
while(CurrentAllocatedBlock->
Next)
{
PreviousAllocatedBlock=CurrentAllocatedBlock;
CurrentAllocatedBlock=CurrentAllocatedBlock->
Next;
}
if(CurrentAllocatedBlock==AllocatedBlockHead)
AllocatedBlockHead->
Next=NewAllocatedBlock;
else
CurrentAllocatedBlock->
//kjk
}
boolAddToEmptyBlock(intAddress,intsize)
EmptyBlockQueueUpBlock,DownBlock,PreBlock;
if(EmptyBlockHead==NULL)
returnfalse;
UpBlock=EmptyBlockHead;
PreBlock=EmptyBlockHead;
DownBlock=EmptyBlockHead->
while(UpBlock)
if(UpBlock->
Address>
Address)
EmptyBlockQueueNewEmptyBlock=newEmptyBlock;
NewEmptyBlock->
Address=Address;
BlockSize=size;
if(Address+size==UpBlock->
Address)//b情况
BlockSize+=UpBlock->
//大小改变
Next=UpBlock->
if(PreBlock==EmptyBlockHead)
//NewEmptyBlock->
Next=UpBlock;
EmptyBlockHead=NewEmptyBlock;
PreBlock->
Next=NewEmptyBlock;
//youwenti
returntrue;
//deleteUpBlock;
else//UpBlock->
Address<
Address
Address+UpBlock->
BlockSize==Address)//a情况
UpBlock->
BlockSize+=size;
BlockSize==DownBlock->
Address)//c情况
{
BlockSize+=DownBlock->
Next=DownBlock->
}//if
PreBlock=UpBlock;
UpBlock=DownBlock;
DownBlock=DownBlock->
}//while
voidAgglutinate()
Flag=1;
AllocatedBlockQueuePreAllocatedBlock,CurrentAllocatedBlock;
PreAllocatedBlock=CurrentAllocatedBlock=AllocatedBlockHead;
intsize=0;
if(AllocatedBlockHead)
while(CurrentAllocatedBlock)
if(CurrentAllocatedBlock==AllocatedBlockHead)
BlockAddress=0;
BlockAddress=PreAllocatedBlock->
BlockSize+
PreAllocatedBlock->
BlockAddress;
size+=CurrentAllocatedBlock->
PreAllocatedBlock=CurrentAllocatedBlock;
CurrentAllocatedBlock=CurrentAllocatedBlock->
EmptyBlockHead->
Address=PreAllocatedBlock->
BlockAddress+
PreAllocatedBlock->
BlockSize=MemorySize-size;
Next=NULL;
boolAllocate(intprocessid,intblocksize)//首次适应算法
if(blocksize>
MemorySize)
cout<
<
"
内存空间总大小小于您的申请请求!
endl;
returnfalse;
EmptyBlockQueuePtrCurrent,PtrPrevious;
PtrPrevious=PtrCurrent=EmptyBlockHead;
while(PtrCurrent)
if(PtrCurrent->
BlockSize>
=blocksize)//找到分区
BlockSize-blocksize<
=Size)//找到的分区不用划分
if(PtrCurrent==EmptyBlockHead)
EmptyBlockHead=EmptyBlockHead->
//修改头指针
PtrCurrent->
AddToAllocatedBlock(PtrCurrent,processid);
//加到已分配的队列中
PtrPrevious=PtrCurrent->
else//划分分区
EmptyBlockQueueNewBlock=newEmptyBlock;
NewBlock->
Address=PtrCurrent->
Address;
BlockSize=blocksize;
AddToAllocatedBlock(NewBlock,processid);
//w
Address+blocksize;
//修改地址
BlockSize=PtrCurrent->
BlockSize-blocksize;
//修改大小
returntrue;
else//未找到分区
PtrPrevious=PtrCurrent;
PtrCurrent=PtrCurrent->
if(Flag)//说明内存已经紧凑过了
内存容量不够,请等待其他进程释放一些内存空间!
cout<
endl<
内存不够用!
是否是否紧凑技术?
(y/n)"
charflag='
n'
;
cin>
>
flag;
if(flag=='
y'
)
Agglutinate();
returnfalse;
boolfree(intprocessid,intaddress,intblocksize)//回收内存
if(AllocatedBlockHead==NULL)
AllocatedBlockQueueCurrent,Previous;
Previous=AllocatedBlockHead;
Current=AllocatedBlockHead;
while(Current)
if(Current->
ProcessID==processid)
BlockAddress==address)
BlockSize==blocksize)
break;
Previous=Current;
Current=Current->
}//while
if(Current==NULL)
不存在您要释放的内存块"
if(Current==AllocatedBlockHead)
AllocatedBlockHead=AllocatedBlockHead->
//对Current处理,讲内存块加入到空闲表中
AddToEmptyBlock(Current->
BlockAddress,Current->
BlockSize);
Previous->
Next=Current->
Flag=0;
//释放内存
//deleteCurrent;
voidPrintEmptyBlock()
EmptyBlockQueuePtr=EmptyBlockHead;
空闲块信息:
"
首地址"
大小"
while(Ptr)
Ptr->
setw(8)<
BlockSize<
Ptr=Ptr->
voidPrintAllocatedBlock()
AllocatedBlockQueuePtr=AllocatedBlockHead;
已用分区信息:
进程标识"
首地址"
ProcessID<
setw(14)<
BlockAddress<
voidmain()
AllocatedBlockHead=NULL;
EmptyBlockHead=newEmptyBlock;
Address=0;
BlockSize=MemorySize;
//EmptyBlockHead->
Address=20;
BlockSize=492;
EmptyBlockHead->
存储器管理实验"
intinstruction=0;
intsize;
while(true)
请选择:
1-申请内存"
2-释放内存"
<
3-打印空闲块信息"
4-打印已分配内存区"
cin>
instruction;
switch(instruction)
case1:
请输入进程ID:
ProcessID;
请输入请求分区大小:
size;
Allocate(ProcessID,size);
case2:
请输入要释放分区的大小:
请输入释放分区的地址:
free(ProcessID,Address,size);
case3:
PrintEmptyBlock();
case4:
PrintAllocatedBlock();
是否继续?
charresponse;
response;
if(response=='
第二种
#include<
stdlib.h>
typedefstructLNode
{
intsize;
//内存大小
intstate;
//0表示空闲,1表示已经装入作业
chartask_name;
//装入的作业名称
structLNode*next;
}LNode,*memoryspace;
voidInit(memoryspace&
L,intsize);
//初始化空间段
voidchoice(memoryspace&
L);
//选择操作类型
voidAdd(memoryspace&
//添加作业
voidDisplay(constmemoryspaceL);
//显示作业
voiddeltask(constmemoryspaceL);
//删除作业
voidsetfree(memoryspace&
//回收空闲空间
intmain()
memoryspaceL=newLNode;
//memoryspace
intN;
初始多大空间,请输入一个整数:
N;
Init(L,N);
//初始化大小为1000的内存空间
choice(L);
//进入操作
L,intsize)//初始化空间段
memoryspacep=newLNode;
p->
size=size;
state=0;
task_name='
next=NULL;
L->
next=p;
L)//找出连续的空闲资源,回收空闲空间
memoryspacep=L->
next,q=p->
next;
while(p&
&
q)
if(p->
state==0&
q->
state==0)//如果空间连续,则回收
size+=q->
next=p->
next->
deleteq;
q=p->
p=q;
q=q->
回收成功"
voiddeltask(constmemoryspaceL)//删除作业
intflag=0;
Display(L);
请输入需要回收的作业名称:
task_name;
memoryspacep=L,q=L->
while(q)
if(q->
task_name==task_name)
state=0;
task_name='
?
'
flag=1;
//找到要删除作业的下一个结点
if(flag==0)
删除作业不成功"
删除作业成功"
voidDisplay(constmemoryspaceL)//显示作业
intcount=1;
memoryspacep=L->
结点号作业状态大小"
while(p)
结点"
count<
p->
task_name<
state<
size<
p=p->
count++;
L)//添加作业
intnew_size;
charnew_name,ch;
memoryspaceq=L,p=L->
请输入新任务的名称:
new_name;
ch=getchar();
请输入新任务的大小:
new_size;
while(p)//查找空闲资源进行分配
if(new_s
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储器 管理 实验