实验四 主存储器空间的分配和回收
更新时间:2023-09-05 02:04:01 阅读量: 教育文库 文档下载
- 实验四小推荐度:
- 相关推荐
漳 州 师 范 学 院
实 验 报 告
班 级 11网络2班 学号 姓名 座号 15 同组人
实 验 内 容 与 具 体 步 骤
源代码 如下:#include <stdio.h> #include <stdlib.h> #include <iostream.h> #define n 10 //模拟实验中,允许的最大作业数目 #define m 10 //模拟实验中,允许的最大空间分区数目 #define minisize 100 /*该空闲区低于该值,可视为碎片。分配分区时,若寻找到的最小适合空间相对 作业请求的 空间来说仍大于该数值,则要分割该分区 ,但是分割后,空闲为很小,变成碎片,则不分 割。*/ struct { float address; //已分配分区起始地址 float length; //已分配分区长度,单位为字符 int flag; //0 表明为空闲的。否则为已分配,记录作业的名称。 }used_table[n];//已分配分区表 struct { float address; float length; int flag;//0 表示是空表目,否则 1 表示空闲分区为"未分配" }free_table[m]; void allocate(char job,float xk) { //该内存分配算法,采用是最优适应算法, int i,k; float ad; k=-1; for(i=0;i<=m;i++) if(free_table[i].length>=xk&&free_table[i].flag==1) //通过该循环,先找到最小分区 if(k==-1||free_table[i].length<free_table[k].length) k=i;//用变量 k 来存放最小的分区的下标 if(k==-1) { printf("Allocation failure!\n"); return; } if(free_table[k].length-xk<=minisize) {//不需分割的情况,用 变量 ad 和 xk 存放将分配出去空闲区的地址和长度 free_table[k].flag=0; ad=free_table[k].address; xk=free_table[k].length; } else {//若寻找到的最小适合空间相对作业请求的空间来说仍过大,则进行分割分 区。将原来的空闲分区变成两部分: //一部分分给作业占用;另一部分又称为一个较小的空闲区 free_table[k].length=free_table[k].length-xk; ad=free_table[k].address+free_table[k].length; } i=0; while(used_table[i].flag!=0&&i<n) i++; if(i>=n ) {//若已分配分区表已经满,则不给予分配,若有进行分割,则取消分割操作 printf("the used_table is full!\n"); if(free_table[k].flag==0) free_table[k].flag=1; else{
实 验 内 容 与 具 体 步 骤
free_table[k].length=free_table[k].length+xk; return; } } else{//若已分配分区表还不满,则将已选择的最小分区空间分配给该作业 used_table[i].address=ad; used_table[i].length=xk; used_table[i].flag=job; } return; } //主存回收函数,回收作业 job 所占用的分区空间 void reclaim(char job) {//根据所给流程图补充该函数。。。 int i,k,j,s,t; float S,L;//S 将要被回收的起始地址,L 将要被回收的长度 //寻找已分配分区表中对应的登记项 s=0; while((used_table[s].flag!=job||used_table[s].flag==0)&&s<n) s++; if(s>=n)//
在已分配分区表中,未找到作业 job 登记占用的分区空间 { printf("Can not find the job!\n"); return; } used_table[s].flag=0; //取得回收分区的起始地址 S 和长度 L S=used_table[s].address; L=used_table[s].length; j=-1; k=-1; i=0; for(;i<m;i++) { if(free_table[i].address+free_table[i].length==S) k=i; if(S+L==free_table[i].address) j=i; } if(k!=-1&&j==-1) { free_table[k].length=free_table[k].length+L; used_table[s-1].flag=0; } if(j!=-1&&k==-1) { free_table[j].length=free_table[j].length+L; used_table[s+1].flag=0; } if(j!=-1&&k!=-1) { free_table[k].length=free_table[j].length+L+free_table[k].length; used_table[s+1].flag=0; used_table[s-1].flag=0; } if(j==-1&&k==-1) { free_table[i].length=L; } //寻找回收空间的上、下相邻分区,上邻分区表目 k,下邻分区表目 j //有上邻还有下邻
//只有上邻 free_table[i].address+length==S // 是:free_table[i].length=free_table[i].length+L // Use_table[s-1].flag=0; //只有下邻 S+L==free_Table[i].address //是:free_table[i].length=free_table[i].length+L // free_table[i].address=S //没有上邻也没有下邻 } //主函数 void main() { int i,a; float xk; char job; free_table[0].address=10240; free_table[0].length=102400; free_table[0].flag=1; for(i=1;i<m;i++)//空闲分区表初始化 free_table[i].flag=0; for(i=0;i<n;i++)//已分配分区表初始化 used_table[i].flag=0; while(1) { printf("Menu:0-exit;1-allocation;2-reclaim;3-list\n"); printf("Please choose(0-3):"); scanf("%d",&a); getchar(); switch(a) { //a=0 程序结束 case 0: exit(0); //a=1,分配主存空间 case 1: printf("Please enter the job and the memory length you want:"); scanf("%c%f",&job,&xk); allocate(job,xk); // printf("test xk=%f\n",xk); break; //a=2,回收主存空间 case 2: printf("please enter the job you want to reclaim memory:"); //scanf("%c",&job); cin>>job; //job=getchar(); reclaim(job); break; //a=3,输出空间分区表和已分配分区表 case 3:printf("The free_table:\naddress length flag\n"); for(i=0;i<m;i++) printf("%6.0f%9.0f%6d\n\n",free_table[i].address,free_table[i].length, free_table[i].flag); printf("The used_table:\n address length flag\n"); for(i=0;i<n;i++) if(used_table[i].flag!=0) printf("%6.0f%9.0f%6c\n",used_table[i].address,used_table[i].length, used_table[i].flag); else printf("%6.0f%9.0f%6d\n",used_table[i].address,used_table[i].length, used_table[i].flag); break; default:printf("No this choose!\n"); } } }
1)初始状态10240 空闲区 102400
2)分配给作业 c 的一个空间,长度为 20k
10240 空闲区 102380
112620
作业 C
3)回收作业 C,并与其上邻空间合并
10240 空闲区 102400
漳 州 师 院 实 验 报 告
实验中存在的问题及解决办法: 这次实验比较复杂,用了很多时间,但同时也收获了很多,理解了在不同的存储 管理方式下应怎样进行存储空间的分配和回收,对主存空间分配认识加深了很多,同 时在程序编写方面有了进一步提
高,做到理论与实践相结合。
实 验 心 得
注:如果填写内容超出表格,自行添加附页。
正在阅读:
实验四 主存储器空间的分配和回收09-05
《麻精药品管理制度》05-07
中小学班主任的工作计划范本01-13
化工企业应急预案 - 图文11-07
金属陶瓷复合材料10-31
江苏省省管湖泊保护规划10-26
残疾人专职委员知识竞赛题库03-24
巴拉贡幼儿园室内外环境卫生清扫和检查制度04-27
35KV变电站现场运行规程05-14
高三文科综合模拟试题 - 图文06-19
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 主存储器
- 回收
- 分配
- 实验
- 空间
- 基于文化产业发展的旅游地产开发研究
- 湖南省国有土地使用权出让收支管理办法的通知(湘政办发〔2015〕1号)
- 人教版高中英语Unit1-Friendship-优秀教案.
- 电加热计算
- 初中物理新课程标准2011新版压缩版
- 历史与社会七上第四单元综合探究四:如何认识城市——以莫斯科为例
- 小学语文第五册一至四单元教材分析
- 民事诉讼法学形考任务二答案
- 广东省2017年税务师考《税法二》:应纳税所考试试卷
- 全国30个省市自治区经济发展基本情况的八项指标因子分析
- 求职打假黑名单(转载)3
- 2011房地产市场调查报告(河南)
- 崩坏学园2拆解屋怎么玩 拆解屋玩法详解
- 扬州市2013-2014学年高二学业水平测试模拟试卷(一) 化学(必修)
- 2015-2020年中国婴儿钙行业分析及前景趋势报告
- 法国民主共和制的确立
- 电网信息化建设论文
- 第五讲 心理咨询的基本技术之精神分析治疗
- 新形势下思想政治工作存在的问题及对策
- “十三五”规划重点-羊毛线项目建议书(立项报告)