




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内存的动态存储管理一、实验内容编写程序实现动态分区存储管理方式的主存分配与回收。具体内容包括:首先确定主存空间分配表;然后采用最先适应算法完成主存空间的分配与回收;最后编写主函数对所做工作进行测试二、实验原理模拟存储管理中内存空间的管理和分配内存空间的管理分为固定分区管理方式,可变分区管理方式,页式存储管理,段式存储管理。题目:模拟内存分配与回收三、实验步骤(或过程)在Microsoft
Visual
C++
6.0环境下运行设计一个空闲分区表,空闲分区表通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲分区低端的空间。设计一个内存分区表,可用链表管理,用以表示当前以内存使用情况。设计一个进程申请队列以及进程完成后的释放顺序,实现主存的分配和回收。要求每次分配和回收后把空闲分区的变化情况以及各进程的申请、释放情况以及各进程的申请、释放情况以图形方式显示、打印出来。最佳适应算法:该算法总是把满足要求、又是最小的空闲区分配给作业。检查空闲区说明表是否有满足作业要求的空闲区,也分为三种情况:大于,等于,小于。若检查到有“等于”的情况,就可以直接分配,若没有,则继续检查是否有“大于”的情况代码实现如下:#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指向内容不做修改if(head2==NULL)//表示当前没有进程{printf("已没有进程!\n");}else{//已分配内存队列如果不为空printf("输入要回收的进程id:");//输入要回收进程的idscanf("%c",&id);fflush(stdin);for(inti=0;i<count;i++)//双重循环把要回收的进程找出来,并把记录的id去掉if(name[i]==id){//判断当前的进程是否满足要求for(intj=i;j<count;j++)name[j]=name[j+1];//向前覆盖name[j+1]=NULL;//置空count--;//减一}//判断是否总共只有一个进程且是够刚好也满足条件 if(q->pid==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;}elseq=q->right;}while(q!=head2);}//如果找到或是遍历一遍结束if(flag==0)printf("没有此进程号!!!\n");//没有找到满足的进程if(flag==1){//表示找到了for(inti=q->start;i<q->start+q->length;i++)//释放占有的内存a[i]=0;//接下来修改可用内存的队列,while(q->start>p->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);}}} }//打印输出voidprint(){de_node*q=head2,*p=head1;if(count==0)printf("没有进程占有内存。\n");else{printf("输出进程id号:\n");for(inti=0;i<count;i++)printf("%c\t",name[i]);}printf("\n");printf("输出内存当前使用情况:\n");for(intj=0;j<n;j++)printf("%d%d\t",j,a[j]);printf("\n");printf("内存初始名称为i,回收后可能会变,可以查看回收来自那个进程\n");do//输出可用内存序列{if(p!=NULL){printf("进程id:%c开始地址:%d长度%d\n",p->pid,p->start,p->length);p=p->right;}}while(p!=head1);printf("\n");printf("已分配进程队列:\n");do//已分配进程队列{if(q!=NULL){printf("进程id:%c开始地址:%d长度%d\n",q->pid,q->start,q->length);q=q->right;}}while(q!=head2);}//主函数voidmain(){intx;de_node*point,*p1;//创建内存的初始状态point=(structlinknode*)malloc(sizeof(structlinknode));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){case1:{p1=creat();if(p1==NULL)printf("创建进程失败。\n");elsedistribute(p1);x=0;break; }case2:{reclaim();x=0;break;}case3:{print();x=0;break;}case4: {printf("Thanks;Bye-bye!");exit(0);x=0;break;}default:{printf("输入有误,请重新输入。\n");}}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 45199-2025家禽遗传资源濒危等级评定
- 包车旅游有合同范本
- 出售店铺合同范本
- 农村护栏转让合同范本
- 买卖协议车子合同范本
- 冰品购销合同范本
- 区块链认证合同范本
- 修建电站合同范本
- 企业合同范本清单
- 单位保密合同范本
- 桥梁钢筋制作安装施工方案
- 2025年语言文字工作计划
- 金融类竞聘主管
- 2024年3月天津第一次高考英语试卷真题答案解析(精校打印)
- 《国防动员准备》课件
- 2024年688个高考英语高频词汇
- 商标合资经营合同
- 第六讲当前就业形势与实施就业优先战略-2024年形势与政策
- 2024-2030年中国家政服务行业经营策略及投资规划分析报告
- 2025年护士资格证考核题库及答案
- 湖北省黄冈市2023-2024学年五年级上学期数学期中试卷(含答案)
评论
0/150
提交评论