




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
_内存的动态存储管理一、实验内容编写程序实现动态分区存储管理方式的主存分配与回收。具体内容包括:首先确定主存空间分配表;然后采用最先适应算法完成主存空间的分配与回收;最后编写主函数对所做工作进行测试二、实验原理模拟存储管理中内存空间的管理和分配内存空间的管理分为固定分区管理方式,可变分区管理方式,页式存储管理,段式存储管理。题目:模拟内存分配与回收三、实验步骤(或过程)在MicrosoftVisualC+6.0环境下运行1 设计一个空闲分区表,空闲分区表通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲分区低端的空间。 2 设计一个内存分区表,可用链表管理,用以表示当前以内存使用情况。 3 设计一个进程申请队列以及进程完成后的释放顺序,实现主存的分配和回收。 4 要求每次分配和回收后把空闲分区的变化情况以及各进程的申请、释放情况以及各进程的申请、释放情况以图形方式显示、打印出来。最佳适应算法:该算法总是把满足要求、又是最小的空闲区分配给作业。检查空闲区说明表是否有满足作业要求的空闲区,也分为三种情况:大于,等于,小于。若检查到有“等于”的情况,就可以直接分配,若没有,则继续检查是否有“大于”的情况代码实现如下:#include #include #include #define n 64 /定义内存的大小int an,count=0;/数组a用来保存内存使用状况1为已分配0为未分配,count用来记name数组中元素个数char namen;/已分配内存的名称(字符类型)typedef struct linknode char pid; int start; int length; struct linknode *left,*right;de_node; /进程节点结构体定义/head1表示未分配内存队列头指针,head2便是已分配进程队列头指针de_node *head1,*head2=NULL;struct linknode* creat()/创建一个进程节点 int len,flag1=1;/用于表示进程是否可以创建 char id; struct linknode* 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=A&id0) for(int i=0;ipid=id; /id p-start=0; /初始开始内存位置,在以后会修改 p-length=len;/长度 p-left=NULL;/左指针 p-right=NULL;/右指针 namecount+=id;/将id存入数组,count自加 return(p); /返回创建的进程的地址 else printf(输入进程格式有误n); free(p); return (NULL); /分配内存空间void distribute(de_node *p) de_node *q=head1,*temp; int flag=0; do/do_while循法/判断当前指向的内存空间的长度是否满足p所申请的长度,大于就分配 if(q-length=p-length) p-start=q-start;/把进程的内存开始地址指向内存的可用开始地址处 q-start+=p-length;/可用地址起始改变 q-length-=p-length;/可用内存长度修改 for(int i=p-start;istart+p-length;i+)/将已分配的内存空间全部置1 ai=1; flag=1;/表示内存可分配 /队列不止一个进程,第一个满足条件,并且刚好分配完,修改指针指向 if(q-length=0&q-right!=q) if(q=head1)/如果第一个满足,修改头指针指向 head1=q-right; q-left-right=q-right; q-right-left=q-left; free(q);/把这个已分配完的空间指针释放 if(flag=1)/已做完处理直接跳出循环 break; if(flag=0)/当前指向的内存不满足,指向下一个,继续判断是否满足 q=q-right; while(q!=head1);/搜索一遍可用内存序列 if(flag=0)/没有可用的内存 printf(没有满足的内存!n); count-;/由于创建时加1,但在分配内存时失败,把1又减掉 free(p);/把这个未分配到内存的进程释放 if(flag=1)/表示上面已分配好内存,并已修改内存链表,下面修改已分配内存的进程队列 temp=head2;/把已分配内存的进程队列赋值给临时指针 if(temp=NULL)/如果还还没有存在的任何的进程,说明当前是第一个 head2=p;/让头指针指向第一个进程 p-left=p;/双向队列第一个左右指针都指向自己 p-right=p;/双向队列第一个左右指针都指向自己 else if(temp!=NULL)/已存在队列,把当前直接链到第一个,与上面的区别是指针指向 head2=p;/让头指针指向p指向的进程 p-left=temp-left;/p进程左边为原来第一个的左边 p-right=temp;/p进程右边指向第一个 temp-left-right=p;/原来第一个的左边为p temp-left=p;/原来第一个的左边的进程为p /对进程的回收void reclaim() char id; int flag=0; de_node *q=head2,*p=head1; if(head2=NULL)/表示当前没有进程 printf(已没有进程!n); else /已分配内存队列如果不为空printf(输入要回收的进程id:);/输入要回收进程的idscanf(%c,&id);fflush(stdin);for(int i=0;icount;i+)/双重循环把要回收的进程找出来,并把记录的id去掉 if(namei=id)/判断当前的进程是否满足要求for(int j=i;jpid=id&q-right=q&head2=q) head2=NULL;/把已分配队列直接置空flag=1;/表示找到满足条件的进程 if(flag=0)/上面的都没找到 do if(q-pid=id)/如果找到 if(q=head2) head2=q-right; q-left-right=q-right;/修改指针指向 q-right-left=q-left;flag=1;break;else q=q-right;while(q!=head2); /如果找到或是遍历一遍结束 if(flag=0) printf(没有此进程号!n);/没有找到满足的进程if(flag=1)/表示找到了for(int i=q-start;istart+q-length;i+)/释放占有的内存ai=0;/接下来修改可用内存的队列,while(q-startp-start&p-right!=head1)/从第一个开始找到回收回来的内存开始地址大的那个队列 p=p-right; if(p=head1)/表示比第一个的开始还小,那么就要修改头地址head1=q;/其他情况不用修改头地址,只需找到应该的位置,把此进程插进去 q-left=p-left;/修改指针的指向 q-right=p; p-left-right=q; p-left=q; if(q-start+q-length=p-start)/可以与后面合并的情况 q-length+=p-length;/修改指针的指向 p-right-left=q; q-right=p-right;free(p); if(q-left-start+q-left-length=q-start)/可以与前面合并的情况 q-left-length+=q-length;/修改指针的指向 q-left-right=q-right; q-right-left=q-left;free(q); /打印输出 void print() de_node *q=head2,*p=head1;if(count=0)printf(没有进程占有内存。n);else printf(输出进程id号:n);for(int i=0;icount;i+) printf(%ct,namei);printf(n);printf(输出内存当前使用情况:n);for(int j=0;jpid,p-start,p-length);p=p-right; while(p!=head1);printf(n);printf(已分配进程队列:n);do /已分配进程队列 if(q!=NULL) printf(进程id:%c 开始地址:%d 长度%dn,q-pid,q-start,q-length); q=q-right;while(q!=head2); /主函数void main() int x;de_node *point,*p1;/创建内存的初始状态 point=(struct linknode*)malloc(sizeof(struct linknode); head1=point; point-pid=i; point-start=0; point-length=n; head1-left=point; head1-right=point; print(); while(1) printf( -MENU-n); printf(1-distribute(分配)n); printf(2-reclaim(回收)n); printf(3-view (浏览)n); printf(4-exit(退出)n); printf(请输入上面的选项(1-4):n); scanf(%d,&x); fflush(stdin); switch(x)case 1: p1=creat(); if(p1=NULL) printf(创建进程失败。n);else distribute(p1); x=0; break;case 2: reclaim(); x=0;break; case 3: print(); x=0;break; case 4: printf(Thanks;Bye-bye!);exit(0); x=0;break;default: printf(输入有误,请重新输入。n); 四、实验结论1、实验结果2、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025橙子购销合同
- 买无手续房屋合同样本
- 儿童演员签约合同样本
- 二零二五版合同变更申请流程
- 二零二五宠物医院兽医聘用合同全文
- 借款反担保合同样本
- 国际贸易实务复习重点
- 二零二五版个人贷款服务合同书
- 2025年纤维纺制线、绳、索、缆项目建议书
- 销售业务员兼职合同二零二五年
- 无人机工艺技术方案
- 从赵紫宸的神学思想看基督教与中国社会之关系
- 专车接送服务租赁合同
- 华为QSA审核报告
- 钢筋笼(螺旋箍筋)工程量自动计算表
- 标准入库授权委托书
- 雅骏新能源汽车废旧动力蓄电池梯次应用项目环境影响报告
- 克雅氏病课件
- 马原第四章资本主义的本质及规律
- 新音乐初放 学堂乐歌说课课件
- 对外汉语教学法智慧树知到答案章节测试2023年西北师范大学
评论
0/150
提交评论