内存管理的功能操作系统实验二.docx
- 文档编号:3748783
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:16
- 大小:110.59KB
内存管理的功能操作系统实验二.docx
《内存管理的功能操作系统实验二.docx》由会员分享,可在线阅读,更多相关《内存管理的功能操作系统实验二.docx(16页珍藏版)》请在冰豆网上搜索。
内存管理的功能操作系统实验二
一、试验目的
1.了解内存管理的功能
2.掌握进程可变内存管理的几种内存分配与回收算法
3.掌握可变分区算法中空闲分区的合并方法
二、试验内容
采用最佳分配算法、最坏分配算法、纯分页管理之一对提供的源码进行改造,或者重新设计一个体现进程管理的试验代码。
三、试验设计
采用的是最先分配算法,利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,可实现最先分配算法的分配内存和回收内存的操作。
四.实验代码
#include
#include
usingnamespacestd;
typedefstructQNode//定义节点结构
{
intnumber;//内存分区号
doubleaddress;//内存分区起始地址
doublesize;//内存分区大小
intflag;//内存分区状态(0为空闲,1为占有)
structQNode*next;//后向指针
}QNode,*QueuePtr;
typedefstructlinkqueue{//定义队列结构
QueuePtrfront;//队首指针
QueuePtrrear;//队尾指针
}LinkQueue;
//队列初始化
voidcreat(LinkQueue&Q)
{
Q.front=Q.rear=newQNode;
Q.front->next=NULL;
}
//入队列
voidin(LinkQueue&Q,intn,doublea,doubles,intf)
{
QueuePtrp;
p=newQNode;
p->number=n;//赋值
p->address=a;
p->size=s;
p->flag=f;
p->next=NULL;
Q.rear->next=p;//插入至队列尾
Q.rear=p;//修改队尾指针
}
//出队列
voidout(LinkQueue&Q,int&n,double&a,double&s,int&f)
{
QueuePtrp;
p=Q.front->next;//p指向队列中第一个元素
n=p->number;//取得该元素值
a=p->address;
s=p->size;
f=p->flag;
Q.front->next=p->next;//修改队首指针
if(Q.rear==p)Q.rear=Q.front;//若队列已空,把队尾指针指向头结点
}
//显示队列中所有元素
voidprint(LinkQueueQ)
{
QueuePtrp;
p=Q.front->next;
if(p==NULL)
cout<<"队列为空!
"< else{ cout<<"分区号"<<""<<"起始"<<""<<"大小"<<""<<"状态"< while(p! =NULL)//否则显示队列中所有元素 { cout<<""< p=p->next; } } } voidgive(LinkQueue&memory,LinkQueue&interim)//分配内存 { intnumber; doubleaddress; doublesize; intflag; while(interim.front->next! =NULL)//清空临时队列 { out(interim,number,address,size,flag); } while(memory.front->next! =NULL)//存入临时队列 { out(memory,number,address,size,flag); in(interim,number,address,size,flag); } QueuePtrq; q=interim.front->next; if(q==NULL) cout<<"无任何可变分区空间! "< else{ number=1; address=0; cout<<"请输入进程大小: "; cin>>size; while(q! =NULL)//遍历内存分区 { if(q->flag==0&&q->size>=size)//内存符合 { in(memory,number,address,size,1); number++; address+=size; if(q->size-size! =0) in(memory,number,address,q->size-size,0); cout<<"分配成功."< print(memory); break; } else{//内存不足 in(memory,number,address,q->size,q->flag); } number++; address+=q->size; q=q->next; if(q==NULL) cout<<"内存不足,分配失败."< } } } voidget(LinkQueue&memory,LinkQueue&interim) { intnumber; doubleaddress; doublesize; intflag; while(interim.front->next! =NULL)//清空临时队列 { out(interim,number,address,size,flag); } while(memory.front->next! =NULL)//存入临时队列 { out(memory,number,address,size,flag); in(interim,number,address,size,flag); } QueuePtrq; q=interim.front->next; if(q==NULL) cout<<"无任何可变分区空间! "< else{ inti,left,right; cout<<"请输入要释放的内存分区号: "; cin>>i; if(i==1)//要释放的内存区为第一个 { if(q->flag==0) { cout<<"该分区未被占用! "< } else{ q->flag=0; right=q->next->flag;//记录其下一个内存区的状态 } if(right==0)//下一个内存区空闲,合并两个区 { number=1; address=0; while(q! =NULL) { if(q->number==1) { address+=q->size; } elseif(q->number==2) { in(memory,number,0,address+q->size,flag); number++; address+=q->size; } else { in(memory,number,address,q->size,flag); number++; address+=q->size; } q=q->next; } } else { number=1; address=0; while(q! =NULL) { in(memory,number,address,q->size,q->flag); number++; address+=q->size; q=q->next; } } cout<<"回收成功."< print(memory); } elseif(i==number)//要释放的内存区为最后一个 { while(q! =NULL) { if(q->number==i-1) { left=q->flag;//记录其前一个内存区状态 if(q->next->flag==1) { q->next->flag=0; break; } else { cout<<"该分区未被占用! "< } } q=q->next; } if(left==0)//前一个内存区空闲,合并两个区 { number=1; address=0; while(q! =NULL) { if(q->number==i-1) { in(memory,number,address,q->size+q->next->size,flag); break; } else { in(memory,number,address,q->size,flag); number++; address+=q->size; } q=q->next; } } else { number=1; address=0; while(q! =NULL) { in(memory,number,address,q->size,q->flag); number++; address+=q->size; q=q->next; } } cout<<"回收成功."< print(memory); } else{//要释放的内存区为中间区 while(q! =NULL) { if(q->number==i-1) { left=q->flag;//记录其前一个内存区状态 } if(q->number==i) { if(q->flag==0) { cout<<"该分区未被占用! "< break; } q->flag=0; right=q->next->flag;//记录其后一个内存区状态 break; } else { q=q->next; } if(q==NULL) cout<<"无此分区! "< } if(right==0&&left==0)//前后都为空闲区 { number=1; address=0; while(q! =NULL) { if(q->number==i-1) { in(memory,number,address,q->size+q->next->size+q->next->next->size,flag); number++; address+=q->size; address+=q->next->size; address+=q->next->next->size; q=q->next; q=q->next; } else { in(memory,number,address,q->size,flag); number++; address+=q->size; } q=q->next; } } if(right==1&&left==0)//前为空闲,后为占有 { number=1; address=0; while(q! =NULL) { if(q->number==i-1) { in(memory,number,address,q->size+q->next->size,flag); number++; address+=q->size; address+=q->next->size; q=q->next; } else { in(memory,number,address,q->size,flag); number++; address+=q->size; } q=q->next; } } if(right==0&&left==1)//前为占有,后为空闲 { number=1; address=0; while(q! =NULL) { if(q->number==i) { in(memory,number,address,q->size+q->next->size,flag); number++; address+=q->size; address+=q->next->size; q=q->next; } else { in(memory,number,address,q->size,flag); number++; address+=q->size; } q=q->next; } } if(right==1&&left==1)//前后都为占有 { number=1; address=0; while(q! =NULL) { in(memory,number,address,q->size,q->flag); number++; address+=q->size; q=q->next; } } cout<<"回收成功."< print(memory); } } } voidmain() { LinkQueuememory;//定义队列 LinkQueueinterim;//临时队列 creat(memory);//初始化队列 creat(interim); doublesumsize;//内存总量 charmenu; cout<<"可变内存分区总量为: "; cin>>sumsize; in(memory,1,0,sumsize,0);//初始队列 print(memory); while (1){ Memu: cout<<"请选择要执行的操作: 《1.进程进入(分配内存)/2.进程执行(回收内存)/3.退出》"< cin>>menu; switch(menu) { case'1': give(memory,interim);break;//分配 case'2': get(memory,interim);break;//回收 case'3': exit(0);break;//退出 default: gotoMemu;//重新选择 } } } 运行过程: 分配内存: 回收内存: 实验思路: 利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,实现最先分配算法的分配内存和回收内存的操作。 实验心得: 通过利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,实现最先分配算法的分配内存和回收内存的操作,对其利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,可实现最先分配算法的分配内存和回收内存的操作。 实现了模拟进程调度,分配内存和回收内存。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 管理 功能 操作系统 实验