logo资料库

设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。最佳适应法.doc

第1页 / 共6页
第2页 / 共6页
第3页 / 共6页
第4页 / 共6页
第5页 / 共6页
第6页 / 共6页
资料共6页,全文预览结束
实验三、存储管理 1.实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器, 而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根 据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请 者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分 主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验理解在不 同的存储管理方式下应怎样实现主存空间的分配和回收。 在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的 扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。用这种办 法扩充的主存储器称为虚拟存储器。通过本实验理解在分页式存储管理中怎样实现虚拟存储 器。 在本实验中,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉 虚存管理的各种页面淘汰算法通过编写和调试地址转换过程的模拟程序以加强对地址转换 过程的了解。 2.试验内容 设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 1.分析 1、可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并 且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有 足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能 装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有 的分区被作业占用,而有的分区是空闲的。 2、当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲 区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一 部分分给作业占用;另一部分又成为一个较小的空闲区,留在空闲区表中。为了尽量 减少由于分割造成的空闲区,尽可能分配低地址部分的空闲区,而尽量保存高地址部 分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每 个空闲区按其地址顺序从低到高登记,即每个后继的空闲区其起始地址总是比前者大。 为了方便查找还可使表格“紧缩”,总是让“空表目”项留在表格的后部。 3、采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求 的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记 在空闲区说明表中。 由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程 序装入作业,而用输出“分配情况”来代替。 4、当一个作业执行完成撤离时,作业所占的分区应该归还给系统,归还的分区如果与其 它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
内存分配流程: 主存回收算法: 2.算法实现: #include #include #include #include #include #define n 10 /*假定系统允许的最大作业数为 n, 假定模拟实验中 n 值为 10*/ #define m 10 /*假定系统允许的空闲区表最大为 m,假定模拟实验中 m 值为 10*/ #define minisize 100 /*空闲分区被分配时,如 果分配后剩余的空间小于 minisize,则将该空闲分 区全部分配,若大于 minisize,则切割分配*/ 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 J,float xk){ /*给 J 作业, 采用最佳分配算法分配 xk 大小的空间*/ int i,k; float ad; k=-1; for(i=0;i=xk&&free_table[i]. flag==1) if(k==-1||free_table[i].length
/*修改已分配区表*/ i=0; while(used_table[i].flag!=0&&i=n) { /*无表目可填写已分配分区*/ printf("无表目填写已分分区,错误\n"); /*修正空闲区表*/ if(free_table[k].flag==0) /*前面找到的是整个空闲分区*/ free_table[k].flag=1; else {/*前面找到的是某个空闲分区的一部分*/ free_table[k].length=free_table[k].length+x k; return; } } else {/*修改已分配表*/ used_table[i].address=ad; used_table[i].length=xk; used_table[i].flag=J; } return; }/*主存分配函数结束*/ void reclaim(char J){/*回收作业名为 J 的作业 所占主存空间*/ int i,k,j,s,t; float S,L; /*寻找已分配表中对应登记项*/ s=0; while((used_table[s].flag!=J||used_table[s]. flag==0)&&s=n){/*在已分配表中找不到名字为 J 的作业 */ printf("找不到该作业\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; /*寻找回收分区的空闲上下邻,上邻表目 k,下邻 表目 j*/ while(i=m){ /*空闲区表满,回收空间失败,将已 分配表复原*/ printf("主存空闲表没有空间,回收空间失败 \n"); used_table[s].flag=J; return; } free_table[t].address=S; free_table[t].length=L; free_table[t].flag=1; } return; }/*主存回收函数结束*/ int main( ) { 可变式分区分配 (最佳 printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf(" 适应算法) printf(" \n"); printf(" 网 络 工 程 4 班 3104007319 \n"); 罗 志 恒 \n"); printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); int i,a; float xk; char J;
/*空闲分区表初始化:*/ free_table[0].address=10240; /*起始地址假定 为 10240*/ free_table[0].length=10240; 10240,即 10k*/ free_table[0].flag=1; 整体空闲区*/ for(i=1;i
图 2:显示主存 图 4:选择回收主存 图 3:输出分配区表 图 5:再次查看空闲区表 图 6:第二次地分配区表
3.心得体会 内存管理对我来说是一个很不容易的问题,内存操作命令觉得很难。最后还是要通过参考一下别人 的优秀程序才得以实现。
分享到:
收藏