1、操作系统课程设计动态分区分配存储管理操作系统课程设计动态分区分配存储管理$吕 霆计算机10-01班第一章 课程设计概述 设计任务:动态分区分配存储管理 设计要求建立描述内存分配状况的数据结构; 建立描述进程的数据结构; 使用两种方式产生进程:(a)自动产生,(b)手工输入; 在屏幕上显示内存的分配状况、每个进程的执行情况; 建立分区的分配与回收算法,支持紧凑算法; 时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位; (b) 响应WM_TIMER; 将一批进程的执行情况存入磁盘文件,以后可以读出并重放; 支持算法:首次适应算法、循环首次适应算法、最佳适应算法:最坏适应算
2、法。 设计目的 旨在让我们更好的了解动态分区管理方面的知识.第二章 原理及算法描述动态分区分配算法原理首次适应算法 * 算法概述:分配内存时,从链首开始顺序查找,找到满足的空闲分区则划出空间分配,余下的空闲空间仍保留在空闲链表中 * 实现方法:分配时从数组第一个元素开始比较,若符合条件则将该元素减去对应作业的值循环首次适应算法 * 算法概述:由首次适应算法演变,只是每次分配改为由上一次找到的空闲分区开始查找 * 实现方法:在首次适应算法的基础上增加一个值用于记录找到的空闲分区的位置最佳适应算法 * 算法概述:每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业 * 实现方法:我
3、们决定每次分配先把空闲分区按从小到大的顺序排列,然后将第一个匹配分区分配给作业最坏适应算法 * 算法概述:每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用 * 实现方法:算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释回收分区当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一; 1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小. 2)回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区
4、合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和. 3)回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和. 4)回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置.紧凑算法通过移动内存中的作业的位置,以把原来多个分散的小分区拼接成一个大分区的方法.第三章 开发环境此程序是本人利用c+语言在vs2012的开发环境中实现的 第四章 程序实现-数据结构#include #include #include using name
5、space std;ofstream stream;1)回收区上邻接着空闲盘块,下连接着已分配盘块(2)回收区下邻接着空闲盘块,上邻接着已分配盘块(3)回收区上下连接的都是空闲盘块(4)空闲区上下邻接的都是已分配盘块(5)要回收的盘块就是第一个盘块,并且向下邻接着空闲盘块(6)要回收的盘块就是第一个盘块,但是向下邻接着已分配盘块(7)要回收的盘块就是最后一个盘块,并且向上邻接的是空闲盘块(8)要回收的盘块就是最后一个盘块,但是向上邻接的是已分配盘块*/void apply_recycle() int i; int j; int k; if(m=1) ary103=0; n+; ary200=1
6、; ary201=ary101; ary202=ary102; vision(); else if(recycle=1) /coutary1 if(ary113!=2) cout要回收的盘块就是第一个盘块,并且向下邻接着空闲盘块endl; (, ios:app); stream要回收的盘块就是第一个盘块,并且向下邻接着空闲盘块endl; (); ary101=ary101+ary111; ary103=0; for(i=1;im;i+) ary1i0=ary1i+10-1; ary1i1=ary1i+11; ary1i2=ary1i+12; ary1i3=ary1i+13; /coutary1
7、i3ary1i3endl; m-; / cout k=0; vision(); /coutary103ary103endl; /coutary113ary113endl; /coutary123ary123endl; /coutary133ary133endl; for(j=0;jm;j+) coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); else cout要回收的盘块就是第一个盘块,但是向下邻接着已分配盘块endl; (, ios:app);
8、 stream要回收的盘块就是第一个盘块,但是向下邻接着已分配盘块endl; (); ary103=0; k=0; for(j=0;jm;j+) /coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); else if(recycle=m) if(ary1recycle-23!=2) cout要回收的盘块就是最后一个盘块,并且向上邻接的是空闲盘块endl; (, ios:app); stream要回收的盘块就是最后一个盘块,并且向上邻接的是空闲盘块en
9、dl; (); ary1recycle-23=0; ary1recycle-21=ary1recycle-21+ary1recycle-11; m-; k=0; for(j=0;jm;j+) /coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); else cout要回收的盘块就是最后一个盘块,但是向上邻接的是已分配盘块endl; (, ios:app); stream要回收的盘块就是最后一个盘块,但是向上邻接的是已分配盘块endl; (); ary
10、1recycle-13=0; k=0; for(j=0;jm;j+) /coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); else/剩下比较复杂的四种情况 if(ary1recycle-23!=2)&(ary1recycle3=2)/回收区上邻接着空闲盘块,下连接着已分配盘块 cout回收区上邻接着空闲盘块,下连接着已分配盘块endl; (, ios:app); stream回收区上邻接着空闲盘块,下连接着已分配盘块endl; (); ary1r
11、ecycle-21=ary1recycle-21+ary1recycle-11; for(i=recycle-1;im;i+) ary1i0=ary1i+10-1; ary1i1=ary1i+11; ary1i2=ary1i+12; ary1i3=ary1i+13; m-; k=0; for(j=0;jm;j+) /coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); if(ary1recycle3!=2)&(ary1recycle-23=2)/回收
12、区下邻接着空闲盘块,上邻接着已分配盘块 cout回收区下邻接着空闲盘块,上邻接着已分配盘块endl; (, ios:app); stream回收区下邻接着空闲盘块,上邻接着已分配盘块endl; (); ary1recycle-23=0; ary1recycle-21=ary1recycle-21+ary1recycle-11; for(i=recycle-1;im;i+) ary1i0=ary1i+10-1; ary1i1=ary1i+11; ary1i2=ary1i+12; ary1i3=ary1i+13; m-; k=0; for(j=0;jm;j+) /coutary1j3ary1j3e
13、ndl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); if(ary1recycle-23!=2)&(ary1recycle3!=2)/回收区上下连接的都是空闲盘块 cout回收区上下连接的都是空闲盘块endl; (, ios:app); stream回收区下邻接着空闲盘块,上邻接着已分配盘块endl; (); ary1recycle-21=ary1recycle-21+ary1recycle-11+ary1recycle1; cout回收区上下连接的都是空闲盘块endl; coutr
14、ecycle-2endl; for(i=recycle+1;im;i+) ary1recycle-10=ary1recycle+10-2; ary1recycle-11=ary1recycle+11; ary1recycle-12=ary1recycle+12; ary1recycle-13=ary1recycle+13; m=m-2; k=0; for(j=0;jm;j+) /coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); if(ary1re
15、cycle-23=2)&(ary1recycle3=2)/空闲区上下邻接的都是已分配盘块 ary1recycle-13=0; k=0; for(j=0;jm;j+) /coutary1j3ary1j3endl; if(ary1j3!=2) ary2k0=ary1j0; ary2k1=ary1j1; ary2k2=ary1j2; k+; n=k; vision(); /紧凑算法void compact() int id1=0;/记录已经分配的内存数量 int id2;/循环量 int num_avl;/记录空闲盘块数量 int sum_avl=0;/总共空闲区大小 int num_apl=0;
16、/统计总共空闲区有多大 vision(); for(id2=0;id2n;id2+) sum_avl=sum_avl+ary2id21; for(id2=0;id2m;id2+) if(ary1id23=2) ary1num_apl0=num_apl+1; ary1num_apl1=ary1id21; if(num_apl=0) ary1num_apl2=0; else ary1num_apl2=ary1num_apl-11+ary1num_apl-12; ary1num_apl3=2; num_apl+; /coutnum_aplnum_aplendl; /最后一块空闲块 ary1num_a
17、pl0=num_apl+1; ary1num_apl1=sum_avl; ary1num_apl2=ary1num_apl-11+ary1num_apl-12; ary1num_apl3=0; m=num_apl+1;/包括最后一个空闲区 num_avl=0; for(id2=0;id2m;id2+) if(ary1id23!=2) ary2num_avl0=ary1id20; ary2num_avl1=ary1id21; ary2num_avl2=ary1id22; num_avl+; n=num_avl; vision();/主函数入口void main() int i; int j; i
18、nt num; int choice1; /操作选择标记 int choice2; int flag=1; /标记是否再执行 while(flag=1) cout*endl; cout* 信息产生方式 *endl; cout* 1: 自动生成 2: 手动输入 *endl; cout*endl; coutchoice1; if(choice1=1) num=rand()&10; q=num; int id3=2+rand()%8; m=id3;/内存区数量 create_apply(); create_pro(); if(choice1=2) create_zuoye(); create_fen
19、qu(); vision(); cout*-请选择处理算法-*endl; cout*1首次适应算法-2循环首次适应算法-3最佳适应算法 *endl; cout*4最坏适应算法-5紧凑算法-6回收算法 *endl; cout*-*id1; if(id1=1) first_fit(); if(id1=2) next_fit(); if(id1=3) best_fit(); if(id1=4) worst_fit(); if(id1=5) compact(); if(id1=6) cout*生成内存状态*endl; int id3=rand()%10; m=5;/内存区数量 create_apply(); vision(); cout请您从空闲列表中选出需要回收的内存块(必须是已分配):recycle; if(recyclem)|(recycle1) cout错误:内存中不存在此块!endl; else int id2=-9999; for(i=0;in;i+) if(ary2i0=recycle) cout错误:输入的为空闲盘块!endl; id2=1; break; if(id2=-9999) apply_recycle(); cout* endl; cout 是否继续演示别的算法!endl; cout 1-是 0-否 endl; cout* o; flag=o; )
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1