操作系统原理内存分配与回收Word文件下载.docx
《操作系统原理内存分配与回收Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统原理内存分配与回收Word文件下载.docx(17页珍藏版)》请在冰点文库上搜索。
#include<
stdio.h>
malloc.h>
stdlib.h>
#definen64//定义内存的大小
inta[n],count=0;
//数组a用来保存内存使用状况
p->
right=NULL;
//右指针
name[count++]=id;
//将id存入数组,count自加
return(p);
}//返回创建的进程的地址
}
else{printf("
输入进程格式有误\n"
);
free(p);
return(NULL);
}
//分配内存空间
voiddistribute(de_node*p)
{de_node*q=head1,*temp;
intflag=0;
do{//do_while循法
//判断当前指向的内存空间的长度是否满足p所申请的长度,大于就分配
if(q->
length>
=p->
length){
p->
start=q->
start;
//把进程的内存开始地址指向内存的可用开始地址处
q->
start+=p->
length;
//可用地址起始改变
length-=p->
//可用内存长度修改
for(inti=p->
i<
p->
start+p->
i++)//将已分配的内存空间全部置1
a[i]=1;
flag=1;
//表示内存可分配
//队列不止一个进程,第一个满足条件,并且刚好分配完,修改指针指向
length==0&
&
q->
right!
=q)
{if(q==head1)//如果第一个满足,修改头指针指向
head1=q->
right;
left->
right=q->
right->
left=q->
left;
free(q);
//把这个已分配完的空间指针释放
if(flag==1)//已做完处理直接跳出循环
break;
if(flag==0)//当前指向的内存不满足,指向下一个,继续判断是否满足
q=q->
}while(q!
=head1);
//搜索一遍可用内存序列
if(flag==0){//没有可用的内存
printf("
没有满足的内存!
\n"
count--;
//由于创建时加1,但在分配内存时失败,把1又减掉
//把这个未分配到内存的进程释放
if(flag==1){//表示上面已分配好内存,并已修改内存链表,下面修改已分配内存的进程队列
temp=head2;
//把已分配内存的进程队列赋值给临时指针
if(temp==NULL)//如果还还没有存在的任何的进程,说明当前是第一个
{head2=p;
//让头指针指向第一个进程
left=p;
//双向队列第一个左右指针都指向自己
right=p;
elseif(temp!
=NULL){//已存在队列,把当前直接链到第一个,与上面的区别是指针指向
head2=p;
//让头指针指向p指向的进程
left=temp->
//p进程左边为原来第一个的左边
right=temp;
//p进程右边指向第一个
temp->
//原来第一个的左边为p
temp->
//原来第一个的左边的进程为p
//对进程的回收
voidreclaim()
{charid;
de_node*q=head2,*p=head1;
if(head2==NULL)//表示当前没有进程
{printf("
已没有进程!
else{//已分配内存队列如果不为空
printf("
输入要回收的进程id:
"
//输入要回收进程的id
scanf("
%c"
&
id);
fflush(stdin);
for(inti=0;
count;
i++)//双重循环把要回收的进程找出来,并把记录的id去掉
if(name[i]==id)
{//判断当前的进程是否满足要求
for(intj=i;
j<
j++)
name[j]=name[j+1];
//向前覆盖
name[j+1]=NULL;
//置空
count--;
//减一
//判断是否总共只有一个进程且是够刚好也满足条件if(q->
pid==id&
right==q&
head2==q)
{head2=NULL;
//把已分配队列直接置空
flag=1;
//表示找到满足条件的进程
if(flag==0){//上面的都没找到
do{if(q->
pid==id){//如果找到if(q==head2)head2=q->
q->
//修改指针指向q->
break;
elseq=q->
}while(q!
=head2);
}//如果找到或是遍历一遍结束
if(flag==0)printf("
没有此进程号!
!
//没有找到满足的进程
if(flag==1){//表示找到了
for(inti=q->
start+q->
i++)//释放占有的内存
a[i]=0;
//接下来修改可用内存的队列,
while(q->
start>
start&
=head1){
//从第一个开始找到回收回来的内存开始地址大的那个队列p=p->
if(p==head1)//表示比第一个的开始还小,那么就要修改头地址
head1=q;
//其他情况不用修改头地址,只需找到应该的位置,把此进程插进去
left=p->
//修改指针的指向
right=q;
left=q;
length==p->
start)//可以与后面合并的情况{q->
length+=p->
//修改指针的指向
right=p->
free(p);
}if(q->
length==q->
start)//可以与前面合并的情况{q->
length+=q->
//修改指针的指向q->
free(q);
}
}
//打印输出
voidprint()
{de_node*q=head2,*p=head1;
if(count==0)
没有进程占有内存。
else
{printf("
输出进程id号:
i++)
%c\t"
name[i]);
输出内存当前使用情况:
for(intj=0;
n;
%d%d\t"
j,a[j]);
内存初始名称为i,回收后可能会变,可以查看回收来自那个进程\n"
do//输出可用内存序列
{if(p!
=NULL)
进程id:
%c开始地址:
%d长度%d\n"
p->
pid,p->
start,p->
length);
p=p->
}while(p!
已分配进程队列:
do//已分配进程队列
{
if(q!
q->
pid,q->
start,q->
//主函数
voidmain()
{intx;
de_node*point,*p1;
//创建内存的初始状态
point=(structlinknode*)malloc(sizeof(structlinknode));
head1=point;
point->
pid='
i'
;
start=0;
length=n;
head1->
left=point;
right=point;
print();
while
(1)
{
------MENU-------\n"
1----distribute(分配)\n"
2----reclaim(回收)\n"
3----view(浏览)\n"
4----exit(退出)\n"
请输入上面的选项(1--4):
scanf("
%d"
x);
fflush(stdin);
switch(x)
case1:
{p1=creat();
if(p1==NULL)printf("
创建进程失败。
elsedistribute(p1);
x=0;
case2:
{reclaim();
case3:
{print();
case4:
{printf("
Thanks;
Bye-bye!
exit(0);
default:
输入有误,请重新输入。
四、实验结论
1、实验结果
2、分析讨论
在作业存储时,当前作业的起始地址=原空闲区起始地址+原空闲区偏移地址-当前作业的偏移地址;
由此可知当前作业在空闲区内是从空闲区的高地址开始分配。
通过这次课程设计,我把学到的操作系统的知识和VC程序的设计灵活的结合到一起。
虽然在设计过程中也遇到了不少问题,但最后都能得到解决而在这种过程中也使我加深了内存分配概念的理解和掌握基本内存分配的方法。
相信在今后我会把我学到的各种知识运用的更好。