1、最坏适应算法每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释回收分区 当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一; 1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小. 2)回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和. 3)回收区同时与插入点的前,后
2、两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和. 4)回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置.紧凑算法 通过移动内存中的作业的位置,以把原来多个分散的小分区拼接成一个大分区的方法. 第三章 开发环境 此程序是本人利用c+语言在vs2012的开发环境中实现的 第四章 程序实现-数据结构#include stringfstreamusing namespace std;ofstream stream;/输出流对象int ary1204;/内存分配状态int a
3、ry2203;/空闲分区状态int ary310;/进程分配状态int recycle;/需要回收的盘块序号 int id1;/算法选择号int m;/内存区数int n;/空闲区数int q;/进程数int r=0;/循环首次适应算法:对应的这次查找到的空闲分区序号/打印输出函数void vision() int i; int j; if(id1=1)stream.open(first_fit.txt, ios:app); if(id1=2)stream.open(nextfirst_fit.txt if(id1=3)stream.open(best_fit.txt,ios: if(id1=
4、4)stream.open(worst_fit.txt if(id1=5)stream.open(compact.txt if(id1=6)stream.open(huishou.txt cout-内存分配状态-endl;分区号 大小/KB 始址/KB 状态 stream for(j=0;jm;j+) cout ary1j0 ; streamary1j1ary1j2 if(ary1j3=2) cout已分配 stream else未分配 cout -空闲分区链-分区号 大小/KB 起址/KB for(i=0;in;i+) coutary2i0ary2i1ary2i2;- stream.clos
5、e();/作业信息的自动产生void create_pro()q; ary3i=rand()%100; if(ary3i=0) i-; ary30=42; ary31=86;产生q个随机进程大小分别是:i+)ary3ichoice2; q=choice2;输入想创建的作业请求大小 for(int i=0; cinj; ary3i=j;你创建了choice2个进程 /内存信息的自动产生void create_apply() for (i=0; ary1i0=i+1; ary1i1=rand()%100; if(i=0) ary1i2=0; else ary1i2=ary1i-12+ary1i-1
6、1; ary1i3=rand()%3; /cout if(ary1i1=0) int k=0;/空闲区数量 if(ary1i3!=2) ary2k0=ary1i0; ary2k1=ary1i1; ary2k2=ary1i2; k+; n=k;/空闲块数量/内存信息的手动生成int create_fenqu() int k,x,y,o=0; int a=0;输入想创建的内存分区块数 :k;输入k=ary3i)/进程占用空间小于等于其中一个空闲区的大小 cout与ary2j1相匹配 stream.open( streamary2j0+1;k-) ary1k-10=ary1k-20+1; ary1k
7、-11=ary1k-21; ary1k-12=ary1k-22; ary1k-13=ary1k-23; ary1l0=l+1; ary1l1=d-ary3i; ary1l2=ary1l-11+ary1l-12; ary1l3=0; k=0; for(id2=0;id2id2+) if(ary1id23! ary2k0=ary1id20; ary2k1=ary1id21; ary2k2=ary1id22; k+; n=k; break; else不匹配 vision();/首次循环适应算法void next_fit()int i;int j;int k;int s;int d;int id2;f
8、or(i=0;i+)/对每一个进程队列中的进程分配资源 for(j=r; if(ary3is-) ary1s0=ary1s-10+1; ary1s1=ary1s-11; ary1s2=ary1s-12; ary1s3=ary1s-13; /改变第k+1块内容:对应的数组是ary1k ary1k0=ary1k-10+1; ary1k1=d-ary1k-11; ary1k2=ary1k-11+ary1k-12; /- /-改变空闲表分配情况-/思路:先把空闲列表检索一遍,选出最佳答案,进行分配void best_fit()/最佳算法-按顺序检索,把与进程要求内存大小最接近的快分配给进程 int s
9、; int j=-9999;/用来保存最接近的答案 int e;/用来存放进行比较时的中间结果 int id2; e=9999; j=-9999; for(s=0;s=ary3i)&(eary2s1)/满足分配要求 e=ary2s1; j=s; if(j0)所有空闲盘块不匹配 stream.close(); else最佳相匹配 if(ary2j1=ary3i) for(l=k;ll-) ary1l-10=ary1l-20+1; ary1l-11=ary1l-21; ary1l-12=ary1l-22; ary1l-13=ary1l-23; ary1k0=k+1; ary1k3=0; k=0; ary2k0+;/最坏适应算法void worst_fit() int j=-99
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1