收藏 分销(赏)

实验二:存储器的分配与回收算法实现.doc

上传人:a199****6536 文档编号:2223014 上传时间:2024-05-23 格式:DOC 页数:14 大小:288.04KB 下载积分:8 金币
下载 相关 举报
实验二:存储器的分配与回收算法实现.doc_第1页
第1页 / 共14页
实验二:存储器的分配与回收算法实现.doc_第2页
第2页 / 共14页


点击查看更多>>
资源描述
实验二:存储器的分配与回收算法实现 ———————————————————————————————— 作者: ———————————————————————————————— 日期: 2 个人收集整理 勿做商业用途 实验报告 学院(系)名称:计算机与通信工程学院 姓名 刘俊杰 学号 20115542 专业 信息与计算科学 班级 2011级1班 实验项目 实验二:存储器的分配与回收算法实现 课程名称 操作系统 课程代码 0668036 实验时间 2013—11-27 3-4节 2013-11—29 7-8节 2013-12-4 3-4节 2013-12-6 7—8节 实验地点 主校区7—215 批改意见 成绩 教师签字: 实验内容: 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业. 2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。 3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。 4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。 5. 设计的模拟系统中,进程数不小于5,进程调度方式可以采用实验一中的任何一种。 6. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。 实验要求: 1. 详细描述实验设计思想、程序结构及各模块设计思路; 2. 详细描述程序所用数据结构及算法; 3. 明确给出测试用例和实验结果; 4. 为增加程序可读性,在程序中进行适当注释说明; 5. 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等; 6. 实验报告撰写要求结构清晰、描述准确逻辑性强; 7. 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。 代码实现: #include〈stdio.h> #include〈malloc.h> #define NULL 0 #define LEN1 sizeof(struct job)//作业大小 #define LEN2 sizeof(struct idle)//空闲区单元大小 #define LEN3 sizeof(struct allocate)//已分配区单元大小 int SPACE=100;//定义内存空间大小 int ORIGI=1;//定义内存起始地址 struct job//定义作业 { int name; int size; int address; }; struct idle//定义空闲区 { int size; int address; struct idle *next; }; struct allocate//定义已分配区 { int name; int size; int address; struct allocate *next; }; struct idle *creatidle(void)//建立空闲表 { struct idle *head; struct idle *p1; p1=(struct idle*)malloc(LEN2); p1-〉size=SPACE; p1—>address=ORIGI; p1-〉next=NULL; head=p1; return(head); } struct allocate *creatallocate(void)//建立已分配表 { struct allocate *head; head=NULL; return(head); } struct job *creatjob(void)//建立作业 { struct job *p; p=(struct job*)malloc(LEN1); printf(”请输入要运行的作业的名称与大小:\n”); scanf(”%d%d”,&p—〉name,&p—>size); return(p); } struct idle *init1(struct idle *head,struct job *p)//首次适应算法分配内存 { struct idle *p0,*p1; struct job *a; a=p; p0=head; p1=p0; while(p0->next!=NULL&&p0->size<a-〉size) { p0=p0->next; } if(p0—〉size>a->size) { p0—〉size=p0—>size—a—>size; a—>address=p0->address; p0—>address=p0—>address+a-〉size; } else { printf(”无法分配\n”); } return(head); } struct idle *init2(struct idle *head,struct job *p)//最优 { struct idle *p0,*p1; struct job *a; a=p; p0=head; if(p0==NULL) { printf(”无法进行分配!\n"); } while(p0—>next!=NULL&&p0-〉size<a—〉size) { p0=p0—>next; } if(p0-〉size>a-〉size) { p1=p0; p0=p0—>next; } else { printf("无法分配!\n”); } while(p0!=NULL) { if(p0-〉size〉p1->size) { p0=p0->next; } else if((p0—〉size〈p1—〉size)&&(p0->size〉a-〉size)) { p1=p0; p0=p0—〉next; } } p1—>size=(p1—〉size)-(a-〉size); a—〉address=p1-〉address; p1-〉address=(p1—〉address)+(a—〉size); return(head); } struct idle *init3(struct idle *head,struct job *p)//最差 { struct idle *p0,*p1; struct job *a; a=p; p0=head; if(p0==NULL) { printf(”无法进行分配!"); } while(p0-〉next!=NULL&&p0—〉size<a—>size) { p0=p0-〉next; } if(p0—>size〉a->size) { p1=p0; p0=p0->next; } else { printf("无法分配!\n”); } while(p0!=NULL) { if(p0-〉size<p1—〉size) { p0=p0—>next; } else if(p0-〉size〉p1->size) { p1=p0; p0=p0—>next; } } p1->size=(p1->size)-(a—〉size); a->address=p1-〉address; p1—>address=(p1—〉address)+(a->size); return(head); } struct allocate *reallocate(struct allocate *head,struct job *p)//重置已分配表 { struct allocate *p0,*p1,*p2;//*p3,*p4; struct job *a; //struct idle *b; a=p; p0=(struct allocate*)malloc(LEN3); p1=(struct allocate*)malloc(LEN3); if(head==NULL) { p0->name=a—>name; p0->size=a—〉size; p0-〉address=ORIGI; p0—>next=NULL; head=p0; } Else { p1->name=a->name; p1-〉size=a->size; p1->address=a—>address; p2=head; while(p2—>next!=NULL) { p2=p2-〉next; } p2—〉next=p1; p1-〉next=NULL; } return(head); } struct allocate *del(struct allocate *head,struct job *p)//删除指定的作业 { struct job *p1; struct allocate *p2,*p3; p2=head; p1=p; while((p1—〉name!=p2—>name)&&(p2—>next!=NULL)) { p3=p2; p2=p2->next; } if(p1—>name==p2—〉name) { if(p2==head) head=p2—〉next; else p3—〉next=p2—>next; } return(head); } struct job *delejob(struct allocate *head) { struct job *p1; struct allocate *p2; int num; p1=(struct job*)malloc(LEN1); printf("请输入要删除的作业的名称\n”); scanf(”%d",&num); p2=head; while((num!=p2->name)&&(p2—>next!=NULL)) { p2=p2—>next; } if(num==p2—〉name) { p1—〉name=p2—〉name; p1->size=p2-〉size; p1-〉address=p2—〉address; } return(p1); } struct idle *unite(struct job *p,struct idle *head)//合并相邻内存空间 { struct idle *p1,*p2,*p3; struct job *m; m=p; p1=head; p3=(struct idle*)malloc(LEN2); while((p1—>address〈m-〉address)&&(p1—>next!=NULL)) { p2=p1; p1=p1->next; } if(m—〉address〈p1—〉address) { if(head==p1) { p3->size=m->size; p3—〉address=m—>address; if((p1—〉address—p3->address)==(p3-〉size)) { p1-〉address=p3-〉address; p1->size=p3—〉size+p1-〉size; } else { head=p3; p3—〉next=p1; } } else { p3—>size=m—>size; p3—>address=m—〉address; if((p1-〉address—p3—>address)==(p3-〉size)) { p1-〉address=p3->address; p1—>size=p3—>size+p1—>size; if((p3—〉address—p2-〉address)==(p2->size)) { p2-〉size=p1—〉size+p2—〉size; p2—>next=p1-〉next; } else { p2—〉next=p1; } } else { if((p3->address—p2—>address)==(p2—>size)) { p2->size=p2—>size+p3-〉size; } else { p3—〉next=p1; p2—〉next=p3; } } } } else { p3-〉size=m—>size; p3—〉address=m—>address; if((p3->address-p1—>address)==(p1—〉size)) { p1-〉size=p1->size+p3->size; } else { p1-〉next=p3; p3->next=NULL; } } return(head); } void print(struct idle *h1,struct allocate *h2) { struct idle *m1; struct allocate *n1; m1=h1; n1=h2; if(m1==NULL) { printf("空闲表为空!\n”); } else { while(m1!=NULL) { printf(”空闲单元地址为%d,其大小为%d\n",m1—〉address,m1—>size); m1=m1—>next; } } if(n1==NULL) { printf("已分配表为空!\n"); } else { while(n1!=NULL) { printf("已分配单元地址为%d,其大小为%d,其名称为%d\n”,n1-〉address,n1—>size,n1-〉name); n1=n1—>next; } } } void FF(void) { struct idle *p1; struct allocate *p2; struct job *p,*q; int y=1; int n=0; int a=1; int c; p1=creatidle(); p2=creatallocate(); printf(”初始情况为:\n"); print(p1,p2); while(a==y) { printf("请输入要进行的操作:1.建立作业 2。删除作业 3.结束操作\n"); scanf("%d”,&c); switch(c) { case 1: p=creatjob(); p1=init1(p1,p); p2=reallocate(p2,p); print(p1,p2);break; case 2: q=delejob(p2); p2=del(p2,q); //p2=reallocate(p2,q); p1=unite(q,p1); print(p1,p2);break; case 3: y=0;break; } } } void BF(void) { struct idle *p1; struct allocate *p2; struct job *p,*q; int y=1; int n=0; int a=1; int c; p1=creatidle(); p2=creatallocate(); printf(”初始情况为:\n"); print(p1,p2); while(a==y) { printf(”请输入要进行的操作:1。建立作业 2.删除作业 3。结束操作\n"); scanf(”%d",&c); switch(c) { case 1: p=creatjob(); p1=init2(p1,p); p2=reallocate(p2,p); print(p1,p2);break; case 2: q=delejob(p2); p2=del(p2,q); //p2=reallocate(p2,q); p1=unite(q,p1); print(p1,p2);break; case 3: y=0;break; } } } void WF(void) { struct idle *p1; struct allocate *p2; struct job *p,*q; int y=1; int n=0; int a=1; int c; p1=creatidle(); p2=creatallocate(); printf("初始情况为:\n”); print(p1,p2); while(a==y) { printf("请输入要进行的操作:1。建立作业 2.删除作业 3.结束操作\n"); scanf("%d",&c); switch(c) { case 1: p=creatjob(); p1=init3(p1,p); p2=reallocate(p2,p); print(p1,p2);break; case 2: q=delejob(p2); p2=del(p2,q); //p2=reallocate(p2,q); p1=unite(q,p1); print(p1,p2);break; case 3: y=0;break; } } } 第14页 共14页
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 考试专区 > 中考

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服