欢迎来到天天文库
浏览记录
ID:12706438
大小:230.00 KB
页数:16页
时间:2018-07-18
《内存的分配与回收实验报告(最先适应法)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、《操作系统》实验说明内存的分配与回收实验报告实验环境:WindowsXPVisualC++任务分配:实验目的:1.加深了解有关内存的分配与回收2.掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存 3.强化编程能力和水平实验内容:用C语言模拟出内存的分配与回收。算法思想:为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够的空闲区域给申请者(本模拟实验使用的是最先适应算法)。当作业撤离归还主存资源时,则存储管理要收回占用的主存空间。主存的分配和回收的实现是与主存储器的
2、管理方式有关的,通过本实验帮助我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。最先实验算法,是将空闲区按其在存储空间中的起始地址递增的顺序排列。为作业分配存储空间时,从空闲区链的始端开始查找,选择第一个满足要求的空闲区,而不管它究竟有多大。内存分为两种状态,使用和未使用的,分别链接成双向链表,每次分配或回收后,修改相应的链表。内存的分配与回收算法流程图:开始初始化大小是否合适switch输入选项常量1内存分配输入id和大小id是否存在常量2内存回收输入idid是否存在分配回收修改位图显示输出常量3是否是结束常量4否是否代码实现如下:#include3、o.h>#include#include#definen64//定义内存的大小inta[n],count=0;//数组a用来保存内存使用状况1为已分配0为未分配,count用来记name数组中元素个数charname[n];//已分配内存的名称(字符类型)typedefstructlinknode{charpid;intstart;intlength;structlinknode*left,*right;}de_node;//进程节点结构体定义//head1表示未分配内存队列头指针,head2便是已分配进程队列头指针de_node*4、head1,*head2=NULL;structlinknode*creat()//创建一个进程节点{intlen,flag1=1;//用于表示进程是否可以创建charid;structlinknode*p;p=(de_node*)malloc(sizeof(de_node));//试图在系统内存中开辟空间创建一个进程if(p==NULL)//p为空,说明系统没有可用内存用于创建此模拟进程{printf("系统没有足够的内存可供使用!");//输出return(NULL);//返回空指针}printf("请输入进程id(字符类型)和长度:");//为进程输入id和分配5、的长度scanf("%c%d",&id,&len);fflush(stdin);//清除输入缓存if((id>='a'&&id<='z'6、7、id>='A'&&id<='Z')&&(len>0)){for(inti=0;i8、");free(p);return(NULL);}if(flag1){//标志位1,可以对p指向内容进行修改p->pid=id;//idp->start=0;//初始开始内存位置,在以后会修改p->length=len;//长度p->left=NULL;//左指针p->right=NULL;//右指针name[count++]=id;//将id存入数组,count自加return(p);}//返回创建的进程的地址}else{printf("输入进程格式有误");free(p);return(NULL);}}//分配内存空间voiddistribute(de_nod9、e*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;//可用地址起始改变q->length-=p->length;//可用内存长度修改for(inti=p->start;istart+p->length;i++)//将已分配的内存空
3、o.h>#include#include#definen64//定义内存的大小inta[n],count=0;//数组a用来保存内存使用状况1为已分配0为未分配,count用来记name数组中元素个数charname[n];//已分配内存的名称(字符类型)typedefstructlinknode{charpid;intstart;intlength;structlinknode*left,*right;}de_node;//进程节点结构体定义//head1表示未分配内存队列头指针,head2便是已分配进程队列头指针de_node*
4、head1,*head2=NULL;structlinknode*creat()//创建一个进程节点{intlen,flag1=1;//用于表示进程是否可以创建charid;structlinknode*p;p=(de_node*)malloc(sizeof(de_node));//试图在系统内存中开辟空间创建一个进程if(p==NULL)//p为空,说明系统没有可用内存用于创建此模拟进程{printf("系统没有足够的内存可供使用!");//输出return(NULL);//返回空指针}printf("请输入进程id(字符类型)和长度:");//为进程输入id和分配
5、的长度scanf("%c%d",&id,&len);fflush(stdin);//清除输入缓存if((id>='a'&&id<='z'
6、
7、id>='A'&&id<='Z')&&(len>0)){for(inti=0;i8、");free(p);return(NULL);}if(flag1){//标志位1,可以对p指向内容进行修改p->pid=id;//idp->start=0;//初始开始内存位置,在以后会修改p->length=len;//长度p->left=NULL;//左指针p->right=NULL;//右指针name[count++]=id;//将id存入数组,count自加return(p);}//返回创建的进程的地址}else{printf("输入进程格式有误");free(p);return(NULL);}}//分配内存空间voiddistribute(de_nod9、e*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;//可用地址起始改变q->length-=p->length;//可用内存长度修改for(inti=p->start;istart+p->length;i++)//将已分配的内存空
8、");free(p);return(NULL);}if(flag1){//标志位1,可以对p指向内容进行修改p->pid=id;//idp->start=0;//初始开始内存位置,在以后会修改p->length=len;//长度p->left=NULL;//左指针p->right=NULL;//右指针name[count++]=id;//将id存入数组,count自加return(p);}//返回创建的进程的地址}else{printf("输入进程格式有误");free(p);return(NULL);}}//分配内存空间voiddistribute(de_nod
9、e*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;//可用地址起始改变q->length-=p->length;//可用内存长度修改for(inti=p->start;istart+p->length;i++)//将已分配的内存空
此文档下载收益归作者所有