操作系统原理内存分配与回收Word文件下载.docx

上传人:b****4 文档编号:8065208 上传时间:2023-05-10 格式:DOCX 页数:17 大小:226.76KB
下载 相关 举报
操作系统原理内存分配与回收Word文件下载.docx_第1页
第1页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第2页
第2页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第3页
第3页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第4页
第4页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第5页
第5页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第6页
第6页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第7页
第7页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第8页
第8页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第9页
第9页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第10页
第10页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第11页
第11页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第12页
第12页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第13页
第13页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第14页
第14页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第15页
第15页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第16页
第16页 / 共17页
操作系统原理内存分配与回收Word文件下载.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统原理内存分配与回收Word文件下载.docx

《操作系统原理内存分配与回收Word文件下载.docx》由会员分享,可在线阅读,更多相关《操作系统原理内存分配与回收Word文件下载.docx(17页珍藏版)》请在冰点文库上搜索。

操作系统原理内存分配与回收Word文件下载.docx

#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程序的设计灵活的结合到一起。

虽然在设计过程中也遇到了不少问题,但最后都能得到解决而在这种过程中也使我加深了内存分配概念的理解和掌握基本内存分配的方法。

相信在今后我会把我学到的各种知识运用的更好。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2