内存管理的功能操作系统实验二Word文件下载.docx
《内存管理的功能操作系统实验二Word文件下载.docx》由会员分享,可在线阅读,更多相关《内存管理的功能操作系统实验二Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。

}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;
//赋值
address=a;
size=s;
flag=f;
Q.rear->
next=p;
//插入至队列尾
Q.rear=p;
//修改队尾指针
//出队列
voidout(LinkQueue&
Q,int&
n,double&
a,double&
s,int&
f)
p=Q.front->
next;
//p指向队列中第一个元素
n=p->
number;
//取得该元素值
a=p->
address;
s=p->
size;
f=p->
flag;
next=p->
//修改队首指针
if(Q.rear==p)Q.rear=Q.front;
//若队列已空,把队尾指针指向头结点
//显示队列中所有元素
voidprint(LinkQueueQ)
if(p==NULL)
cout<
<
"
队列为空!
endl;
//队列为空
else{
cout<
分区号"
"
起始"
大小"
状态"
while(p!
=NULL)//否则显示队列中所有元素
{
p->
number<
address<
size<
flag<
p=p->
}
}
voidgive(LinkQueue&
memory,LinkQueue&
interim)//分配内存
while(interim.front->
next!
=NULL)//清空临时队列
{
out(interim,number,address,size,flag);
while(memory.front->
=NULL)//存入临时队列
out(memory,number,address,size,flag);
in(interim,number,address,size,flag);
QueuePtrq;
q=interim.front->
if(q==NULL)
无任何可变分区空间!
number=1;
address=0;
请输入进程大小:
;
cin>
>
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->
q=q->
if(q==NULL)
内存不足,分配失败."
}
voidget(LinkQueue&
interim)
inti,left,right;
请输入要释放的内存分区号:
i;
if(i==1)//要释放的内存区为第一个
flag==0)
该分区未被占用!
else{
q->
flag=0;
right=q->
next->
//记录其下一个内存区的状态
if(right==0)//下一个内存区空闲,合并两个区
number=1;
address=0;
while(q!
=NULL)
{
if(q->
number==1)
{
address+=q->
}
elseif(q->
number==2)
in(memory,number,0,address+q->
size,flag);
number++;
else
in(memory,number,address,q->
q=q->
}
else
number++;
address+=q->
}
回收成功."
print(memory);
elseif(i==number)//要释放的内存区为最后一个
while(q!
number==i-1)
left=q->
//记录其前一个内存区状态
flag==1)
q->
break;
cout<
q=q->
if(left==0)//前一个内存区空闲,合并两个区
size+q->
else{//要释放的内存区为中间区
number==i)
q->
right=q->
//记录其后一个内存区状态
break;
else
if(q==NULL)
cout<
无此分区!
if(right==0&
left==0)//前后都为空闲区
=NULL)
q=q->
if(right==1&
left==0)//前为空闲,后为占有
left==1)//前为占有,后为空闲
left==1)//前后都为占有
voidmain()
LinkQueuememory;
//定义队列
LinkQueueinterim;
//临时队列
creat(memory);
//初始化队列
creat(interim);
doublesumsize;
//内存总量
charmenu;
cout<
可变内存分区总量为:
cin>
sumsize;
in(memory,1,0,sumsize,0);
//初始队列
print(memory);
while
(1){
Memu:
请选择要执行的操作:
《1.进程进入(分配内存)/2.进程执行(回收内存)/3.退出》"
menu;
switch(menu)
case'
1'
:
give(memory,interim);
break;
//分配
2'
get(memory,interim);
//回收
3'
exit(0);
//退出
default:
gotoMemu;
//重新选择
运行过程:
分配内存:
回收内存:
实验思路:
利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,实现最先分配算法的分配内存和回收内存的操作。
实验心得:
通过利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,实现最先分配算法的分配内存和回收内存的操作,对其利用了两个队列,一个存分区情况,一个作为临时队列用于分区操作,可实现最先分配算法的分配内存和回收内存的操作。
实现了模拟进程调度,分配内存和回收内存。