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