内存的分配与回收实验报告(最先适应法).doc
上传人:sy****28 上传时间:2024-09-11 格式:DOC 页数:15 大小:230KB 金币:16 举报 版权申诉
预览加载中,请您耐心等待几秒...

内存的分配与回收实验报告(最先适应法).doc

内存的分配与回收实验报告(最先适应法).doc

预览

免费试读已结束,剩余 5 页请下载文档后查看

16 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

《计算机操作系统》电子实验报告内存的分配与回收实验报告日期2013-6-2姓名实验环境:WindowsXPVisualC++任务分配:实验目的:加深了解有关内存的分配与回收掌握为实现多道程序并发执行,操作系统是如何通过作业调度选择作业进入内存强化编程能力和水平实验内容:用C语言模拟出内存的分配与回收。算法思想:为了合理地分配和使用这些存储空间,当用户提出申请主存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间和使用情况,找出足够的空闲区域给申请者(本模拟实验使用的是最先适应算法)。当作业撤离归还主存资源时,则存储管理要收回占用的主存空间。主存的分配和回收的实现是与主存储器的管理方式有关的,通过本实验帮助我们理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。最先实验算法,是将空闲区按其在存储空间中的起始地址递增的顺序排列。为作业分配存储空间时,从空闲区链的始端开始查找,选择第一个满足要求的空闲区,而不管它究竟有多大。内存分为两种状态,使用和未使用的,分别链接成双向链表,每次分配或回收后,修改相应的链表。内存的分配与回收算法流程图:开始初始化大小是否合适switch输入选项常量1内存分配输入id和大小id是否存在常量2内存回收输入idid是否存在分配回收修改位图显示输出常量3是否是结束常量4否是否代码实现如下:#include<stdio.h>#include<malloc.h>#include<stdlib.h>#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*head1,*head2=NULL;structlinknode*creat()//创建一个进程节点{intlen,flag1=1;//用于表示进程是否可以创建charid;structlinknode*p;p=(de_node*)malloc(sizeof(de_node));//试图在系统内存中开辟空间创建一个进程if(p==NULL)//p为空,说明系统没有可用内存用于创建此模拟进程{printf("系统没有足够的内存可供使用!\n");//输出return(NULL);//返回空指针}printf("请输入进程id(字符类型)和长度:");//为进程输入id和分配的长度scanf("%c%d",&id,&len);fflush(stdin);//清除输入缓存if((id>='a'&&id<='z'||id>='A'&&id<='Z')&&(len>0)){for(inti=0;i<count;i++)//判断输入的进程名,如果已使用,返回空指针,并释放p指针if(name[i]==id){printf("此名称进程已存在!!");flag1=0;//标志位为0,表示下面对p指向内容不做修改free(p);returnNULL;}if(len==0){//如果输入要分配的进程长度为0,释放p,返回空指针printf("输入长度为0!\n");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("输入进程格式有误\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;//把进程的内存开始