操作系统课程设计动态分区分配存储管理 吕 霆 计算机10-01班 设计题目学 号专业班级学生姓名指导教师第一章课程设计概述1.1 设计任务:动态分区分配存储管理1.2 设计要求建立描述内存分配状况的数据结构;建立描述进程的数据结构;使用两种方式产生进程:(a)自动产生,(b)手工输入;在屏幕上显示内存的分配状况、每个进程的执行情况;建立分区的分配与回收算法,支持紧凑算法;时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位;(b) 响应WM_TIMER;将一批进程的执行情况存入磁盘文件,以后可以读出并重放;支持算法:首次适应算法、循环首次适应算法、最佳适应算法:最坏适应算法。
1.3 设计目的旨在让我们更好的了解动态分区管理方面的知识.第二章原理及算法描述2.1动态分区分配算法原理首次适应算法* 算法概述:分配内存时,从链首开始顺序查找,找到满足的空闲分区则划出空间分配,余下的空闲空间仍保留在空闲链表中* 实现方法:分配时从数组第一个元素开始比较,若符合条件则将该元素减去对应作业的值循环首次适应算法* 算法概述:由首次适应算法演变,只是每次分配改为由上一次找到的空闲分区开始查找* 实现方法:在首次适应算法的基础上增加一个值用于记录找到的空闲分区的位置最佳适应算法* 算法概述:每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业* 实现方法:我们决定每次分配先把空闲分区按从小到大的顺序排列,然后将第一个匹配分区分配给作业最坏适应算法* 算法概述:每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用* 实现方法:算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释回收分区当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一;1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小.2)回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和.3)回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,使用F1的表项和F1的首址,取消F2的表项,大小为三者之和.4)回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置.紧凑算法通过移动内存中的作业的位置,以把原来多个分散的小分区拼接成一个大分区的方法.第三章开发环境此程序是本人利用c++语言在vs2012的开发环境中实现的第四章程序实现--数据结构#include <iostream>#include <string>#include <fstream>using namespace std;ofstream stream;//输出流对象int ary1[20][4];//内存分配状态int ary2[20][3];//空闲分区状态int ary3[10];//进程分配状态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", ios::app);if(id1==3)stream.open("best_fit.txt",ios::app);if(id1==4)stream.open("worst_fit.txt", ios::app);if(id1==5)stream.open("compact.txt",ios::app);if(id1==6)stream.open("huishou.txt",ios::app);cout<<"-------------内存分配状态-------------"<<endl;cout<<"分区号大小/KB 始址/KB 状态"<<endl;stream<<"-------------内存分配状态-------------"<<endl;stream<<"分区号大小/KB 始址/KB 状态"<<endl;for(j=0;j<m;j++){cout <<ary1[j][0]<<" ";stream<<ary1[j][0]<<" ";cout <<ary1[j][1]<<" ";stream<<ary1[j][1]<<" ";cout <<ary1[j][2]<<" ";stream<<ary1[j][2]<<" ";if(ary1[j][3]==2){cout<<"已分配";stream<<"已分配";}else{cout<<"未分配";stream<<"未分配";}cout <<endl;stream<<endl;}cout <<endl;cout<<"--------空闲分区链--------"<<endl;cout<<"分区号大小/KB 起址/KB"<<endl;stream<<"--------空闲分区链--------"<<endl;stream<<"分区号大小/KB 起址/KB"<<endl;for(i=0;i<n;i++)cout<<ary2[i][0]<<" ";stream<<ary2[i][0]<<" ";cout<<ary2[i][1]<<" ";stream<<ary2[i][1]<<" ";cout<<ary2[i][2];stream<<ary2[i][2];cout<<endl;stream<<endl;}cout<<"--------------------------"<<endl;stream<<"--------------------------"<<endl;cout<<endl;stream.close();}//作业信息的自动产生void create_pro(){int i;for(i=0;i<q;i++){ary3[i]=rand()%100;if(ary3[i]==0){i--;}}ary3[0]=42;ary3[1]=86;cout<<"产生"<<q<<"个随机进程"<<endl;cout<<"大小分别是:";for(i=0;i<q;i++){cout<<"["<<ary3[i]<<"]"<<" ";}cout <<endl;}//作业的手动生成void create_zuoye(){int j;int choice2;int id3=rand()%10;m=id3;//内存区数量cin>>choice2;q=choice2;cout<<"输入想创建的作业请求大小"<<endl;for(int i=0;i<choice2;i++){cin>>j;ary3[i]=j;}cout<<"你创建了"<<choice2<<"个进程 ";for(int i=0;i<choice2;i++){cout<<ary3[i]<<" ";}cout<<endl;}//内存信息的自动产生void create_apply(){int i;for (i=0;i<m;i++){ary1[i][0]=i+1;ary1[i][1]=rand()%100;if(i==0)ary1[i][2]=0;else{ary1[i][2]=ary1[i-1][2]+ary1[i-1][1];}ary1[i][3]=rand()%3;//cout <<i<<endl;if(ary1[i][1]==0){i--;}}int k=0;//空闲区数量for (i=0;i<m;i++){if(ary1[i][3]!=2){ary2[k][0]=ary1[i][0];ary2[k][1]=ary1[i][1];ary2[k][2]=ary1[i][2];k++;}n=k;//空闲块数量}//内存信息的手动生成int create_fenqu(){int k,x,y,o=0;int a=0;cout<<"输入想创建的内存分区块数 : " ;cin>>k;cout<<"输入"<<k<<"个内存分区块大小"<<endl;for(int i=0;i<k;i++){ary1[i][0]=i; //序号cin>>x;ary1[i][1]=x;//大小}cout<<"输入内存块的分配状态"<<endl;for(int i=0;i<k;i++){cin>>y;if(y==2){n++;}ary1[i][3]=y;//状态}ary1[0][2]=0;ary1[1][2]=ary1[0][1];for(int i=2;i<k;i++){ary1[i][2]=ary1[i-1][2]+ary1[i-1][1];//起始地址}m=k;for (int i=0;i<k;i++){if(ary1[i][3]!=2){ary2[a][0]=ary1[i][0];ary2[a][1]=ary1[i][1];ary2[a][2]=ary1[i][2];a++;}}n=a;return m,n;}//首次适应算法void first_fit()vision();int i;int j;int k;int l;int d;//用来保存第k个的值int id2=0;for(i=0;i<q;i++)//为每个进程分配空间{for(j=0;j<n;j++)//查找空闲链表每项{if(ary2[j][1]>=ary3[i])//进程占用空间小于等于其中一个空闲区的大小{cout<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]相匹配"<<endl;stream.open("first_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]相匹配"<<endl;stream.close();if(ary2[j][1]==ary3[i])//进程占用空间等于其中一个空闲区块大小{ary1[ary2[j][0]-1][3]=2;for(k=j+1;k<n;k++){ary2[k-1][0]=ary2[k][0];ary2[k-1][1]=ary2[k][1];ary2[k-1][2]=ary2[k][2];}n--;}else//否则的话,空闲链对应的地方盘块大小小了进程占用的大小,并且内存分配从对应的那一项开始增加一项{l=ary2[j][0];d=ary1[l-1][1];//大小ary1[l-1][1]=ary3[i];ary1[l-1][3]=2;m++;for(k=m;k>ary2[j][0]+1;k--){ary1[k-1][0]=ary1[k-2][0]+1;ary1[k-1][1]=ary1[k-2][1];ary1[k-1][2]=ary1[k-2][2];ary1[k-1][3]=ary1[k-2][3];}l=ary2[j][0];ary1[l][1]=d-ary3[i];ary1[l][2]=ary1[l-1][1]+ary1[l-1][2];ary1[l][3]=0;k=0;for(id2=0;id2<m;id2++){if(ary1[id2][3]!=2){ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;}}n=k;}break;}else{cout<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]不匹配"<<endl;stream.open("first_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]不匹配"<<endl;stream.close();}}vision();}}//首次循环适应算法void next_fit(){vision();int i;int j;int k;int s;int d;int id2;for(i=0;i<q;i++)//对每一个进程队列中的进程分配资源for(j=r;j<n;j++){if(ary3[i]<=ary2[j][1]){cout<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]相匹配"<<endl;stream.open("nextfirst_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]相匹配"<<endl;stream.close();if(ary3[i]==ary2[j][1]){//---改变内存分配---k=ary2[j][0];//得到对应空闲块对应内存块的序号k--;ary1[k][3]=2;//把对应内存块标志位上改成已分配//------------------//--改变空闲块表:把从这块空闲块以下的所有空闲块向上移一格--n--;for(k=j;k<n;k++){ary2[k][0]=ary2[k+1][0];ary2[k][1]=ary2[k+1][1];ary2[k][2]=ary2[k+1][2];}vision();//------------------break;}else//对应的空闲块大小大于进程需要大小{//-----改变内存分配情况-----r=(r+1)%n;//改变第k块的内容k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;//从k+1之后所有向后移一格m++;//内存块数增加1for(s=m-1;s>k;s--){ary1[s][0]=ary1[s-1][0]+1;ary1[s][1]=ary1[s-1][1];ary1[s][2]=ary1[s-1][2];}//改变第k+1块内容:对应的数组是ary1[k]ary1[k][0]=ary1[k-1][0]+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];//--------------------------//----改变空闲表分配情况----k=0;for(id2=0;id2<m;id2++){if(ary1[id2][3]!=2){ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;}}n=k;//--------------------------vision();break;}}else{cout<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]不匹配"<<endl;stream.open("nextfirst_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]不匹配"<<endl;stream.close();}}}}//思路:先把空闲列表检索一遍,选出最佳答案,进行分配void best_fit()//最佳算法--按顺序检索,把与进程要求内存大小最接近的快分配给进程{int i;int s;int j=-9999;//用来保存最接近的答案int e;//用来存放进行比较时的中间结果int k;int l;int d;int id2;vision();for(i=0;i<q;i++){ e=9999;j=-9999;for(s=0;s<n;s++){if((ary2[s][1]>=ary3[i])&&(e>ary2[s][1]))//满足分配要求{e=ary2[s][1];j=s;}}if(j<0){cout<<"["<<ary3[i]<<"]与"<<"所有空闲盘块不匹配"<<endl;stream.open("best_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"所有空闲盘块不匹配"<<endl;stream.close();}else{cout<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]最佳相匹配"<<endl;stream.open("best_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]最佳相匹配"<<endl;stream.close();if(ary2[j][1]==ary3[i]){k=ary2[j][0];ary1[k-1][3]=2;for(l=k;l<n;l++){ary2[l-1][0]=ary2[l][0];ary2[l-1][1]=ary2[l][1];ary2[l-1][2]=ary2[l][2];}n--;}else{//把对应的内存分配进行更改k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;m++;for(l=m;l>ary2[j][0]+1;l--){ary1[l-1][0]=ary1[l-2][0]+1;ary1[l-1][1]=ary1[l-2][1];ary1[l-1][2]=ary1[l-2][2];ary1[l-1][3]=ary1[l-2][3];}k=ary2[j][0];ary1[k][0]=k+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];ary1[k][3]=0;k=0;for(id2=0;id2<m;id2++){if(ary1[id2][3]!=2){ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;}}n=k;for(k=j+1;k<n;k++){ary2[k][0]++;}}}vision();}}//最坏适应算法void worst_fit(){int i;int s;int j=-9999;//用来保存最接近的答案int e=-9999;//用来存放进行比较时的中间结果int k;int l;int d;int id2;vision();for(i=0;i<q;i++){j=-9999;e=-9999;for(s=0;s<n;s++){if((ary2[s][1]>=ary3[i])&&(e<ary2[s][1]))//满足分配要求{e=ary2[s][1];j=s;}}if(j<0){cout<<"["<<ary3[i]<<"]与"<<"所有空闲盘块不匹配"<<endl;stream.open("worst_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"所有空闲盘块不匹配"<<endl;stream.close();}else{cout<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]最差相匹配"<<endl;stream.open("worst_fit.txt", ios::app);stream<<"["<<ary3[i]<<"]与"<<"["<<ary2[j][1]<<"]最差相匹配"<<endl;stream.close();if(ary2[j][1]==ary3[i]){k=ary2[j][0];ary1[k-1][3]=2;for(l=k;l<n;l++){ary2[l-1][0]=ary2[l][0];ary2[l-1][1]=ary2[l][1];ary2[l-1][2]=ary2[l][2];}n--;}else{//把对应的内存分配进行更改k=ary2[j][0];d=ary1[k-1][1];ary1[k-1][1]=ary3[i];ary1[k-1][3]=2;m++;for(l=m;l>ary2[j][0]+1;l--){ary1[l-1][0]=ary1[l-2][0]+1;ary1[l-1][1]=ary1[l-2][1];ary1[l-1][2]=ary1[l-2][2];ary1[l-1][3]=ary1[l-2][3];}k=ary2[j][0];ary1[k][0]=k+1;ary1[k][1]=d-ary1[k-1][1];ary1[k][2]=ary1[k-1][1]+ary1[k-1][2];ary1[k][3]=0;k=0;for(id2=0;id2<m;id2++){if(ary1[id2][3]!=2){ary2[k][0]=ary1[id2][0];ary2[k][1]=ary1[id2][1];ary2[k][2]=ary1[id2][2];k++;}}n=k;for(k=j+1;k<n;k++){ary2[k][0]++;}}}vision();}}//回收内存算法:/*有共计八种情况,1.(1)回收区上邻接着空闲盘块,下连接着已分配盘块(2)回收区下邻接着空闲盘块,上邻接着已分配盘块(3)回收区上下连接的都是空闲盘块(4)空闲区上下邻接的都是已分配盘块(5)要回收的盘块就是第一个盘块,并且向下邻接着空闲盘块(6)要回收的盘块就是第一个盘块,但是向下邻接着已分配盘块(7)要回收的盘块就是最后一个盘块,并且向上邻接的是空闲盘块(8)要回收的盘块就是最后一个盘块,但是向上邻接的是已分配盘块*/void apply_recycle(){int i;int j;int k;if(m==1){ary1[0][3]=0;n++;ary2[0][0]=1;ary2[0][1]=ary1[0][1];ary2[0][2]=ary1[0][2];vision();}else{if(recycle==1){ //cout<<ary1if(ary1[1][3]!=2){cout<<"要回收的盘块就是第一个盘块,并且向下邻接着空闲盘块"<<endl;stream.open("huishou.txt", ios::app);stream<<"要回收的盘块就是第一个盘块,并且向下邻接着空闲盘块"<<endl;stream.close();ary1[0][1]=ary1[0][1]+ary1[1][1];ary1[0][3]=0;for(i=1;i<m;i++){ary1[i][1]=ary1[i+1][1];ary1[i][2]=ary1[i+1][2];ary1[i][3]=ary1[i+1][3];//cout<<"ary1[i][3]"<<ary1[i][3]<<endl;}m--;// cout<<""k=0;vision();//cout<<"ary1[0][3]"<<ary1[0][3]<<endl;//cout<<"ary1[1][3]"<<ary1[1][3]<<endl;//cout<<"ary1[2][3]"<<ary1[2][3]<<endl;//cout<<"ary1[3][3]"<<ary1[3][3]<<endl;for(j=0;j<m;j++){cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}else{cout<<"要回收的盘块就是第一个盘块,但是向下邻接着已分配盘块"<<endl; stream.open("huishou.txt", ios::app);stream<<"要回收的盘块就是第一个盘块,但是向下邻接着已分配盘块"<<endl; stream.close();ary1[0][3]=0;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];k++;}}n=k;vision();}}else if(recycle==m){if(ary1[recycle-2][3]!=2){cout<<"要回收的盘块就是最后一个盘块,并且向上邻接的是空闲盘块"<<endl;stream.open("huishou.txt", ios::app);stream<<"要回收的盘块就是最后一个盘块,并且向上邻接的是空闲盘块"<<endl;stream.close();ary1[recycle-2][3]=0;ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];m--;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}else{cout<<"要回收的盘块就是最后一个盘块,但是向上邻接的是已分配盘块"<<endl;stream.open("huishou.txt", ios::app);stream<<"要回收的盘块就是最后一个盘块,但是向上邻接的是已分配盘块"<<endl;stream.close();ary1[recycle-1][3]=0;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}}else{//剩下比较复杂的四种情况if((ary1[recycle-2][3]!=2)&&(ary1[recycle][3]==2))//回收区上邻接着空闲盘块,下连接着已分配盘块{cout<<"回收区上邻接着空闲盘块,下连接着已分配盘块"<<endl;stream.open("huishou.txt", ios::app);stream<<"回收区上邻接着空闲盘块,下连接着已分配盘块"<<endl;stream.close();ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];for(i=recycle-1;i<m;i++){ary1[i][0]=ary1[i+1][0]-1;ary1[i][1]=ary1[i+1][1];ary1[i][2]=ary1[i+1][2];ary1[i][3]=ary1[i+1][3];}m--;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}if((ary1[recycle][3]!=2)&&(ary1[recycle-2][3]==2))//回收区下邻接着空闲盘块,上邻接着已分配盘块{cout<<"回收区下邻接着空闲盘块,上邻接着已分配盘块"<<endl;stream.open("huishou.txt", ios::app);stream<<"回收区下邻接着空闲盘块,上邻接着已分配盘块"<<endl;stream.close();ary1[recycle-2][3]=0;ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1];for(i=recycle-1;i<m;i++){ary1[i][0]=ary1[i+1][0]-1;ary1[i][1]=ary1[i+1][1];ary1[i][2]=ary1[i+1][2];ary1[i][3]=ary1[i+1][3];}m--;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}if((ary1[recycle-2][3]!=2)&&(ary1[recycle][3]!=2))//回收区上下连接的都是空闲盘块{cout<<"回收区上下连接的都是空闲盘块"<<endl;stream.open("huishou.txt", ios::app);stream<<"回收区下邻接着空闲盘块,上邻接着已分配盘块"<<endl;stream.close();ary1[recycle-2][1]=ary1[recycle-2][1]+ary1[recycle-1][1]+ary1[recycle][1];cout<<"回收区上下连接的都是空闲盘块"<<endl;cout<<recycle-2<<endl;for(i=recycle+1;i<m;i++){ary1[recycle-1][0]=ary1[recycle+1][0]-2;ary1[recycle-1][1]=ary1[recycle+1][1];ary1[recycle-1][2]=ary1[recycle+1][2];ary1[recycle-1][3]=ary1[recycle+1][3];}m=m-2;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}if((ary1[recycle-2][3]==2)&&(ary1[recycle][3]==2))//空闲区上下邻接的都是已分配盘块{ary1[recycle-1][3]=0;k=0;for(j=0;j<m;j++){//cout<<"ary1[j][3]"<<ary1[j][3]<<endl;if(ary1[j][3]!=2){ary2[k][0]=ary1[j][0];ary2[k][1]=ary1[j][1];ary2[k][2]=ary1[j][2];k++;}}n=k;vision();}}}}//紧凑算法void compact(){int id1=0;//记录已经分配的内存数量int id2;//循环量int num_avl;//记录空闲盘块数量int sum_avl=0;//总共空闲区大小int num_apl=0;//统计总共空闲区有多大vision();for(id2=0;id2<n;id2++){sum_avl=sum_avl+ary2[id2][1];}for(id2=0;id2<m;id2++){if(ary1[id2][3]==2){ary1[num_apl][0]=num_apl+1;ary1[num_apl][1]=ary1[id2][1];if(num_apl==0){ary1[num_apl][2]=0;}else{ary1[num_apl][2]=ary1[num_apl-1][1]+ary1[num_apl-1][2];}ary1[num_apl][3]=2;num_apl++;//cout<<"num_apl"<<num_apl<<endl;}}//最后一块空闲块ary1[num_apl][0]=num_apl+1;ary1[num_apl][1]=sum_avl;ary1[num_apl][2]=ary1[num_apl-1][1]+ary1[num_apl-1][2];ary1[num_apl][3]=0;m=num_apl+1;//包括最后一个空闲区num_avl=0;for(id2=0;id2<m;id2++){if(ary1[id2][3]!=2){ary2[num_avl][0]=ary1[id2][0];ary2[num_avl][1]=ary1[id2][1];ary2[num_avl][2]=ary1[id2][2];num_avl++;}}n=num_avl;vision();}//主函数入口void main(){int i;int j;int num;int choice1; //操作选择标记int choice2;int flag=1; //标记是否再执行while(flag==1){cout<<"********************************************"<<endl;cout<<"****** 信息产生方式 ******"<<endl;cout<<"****** 1: 自动生成 2: 手动输入 ******"<<endl;cout<<"********************************************"<<endl;cout<<"请选择产生内存分区和作业信息的方式! ";cin>>choice1;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_fenqu();}vision();cout<<"**------------------请选择处理算法----------------------**"<<endl;cout<<"**1首次适应算法-----2循环首次适应算法-----3最佳适应算法 **"<<endl;cout<<"**4最坏适应算法----------5紧凑算法------------6回收算法 **"<<endl;cout<<"**------------------------------------------------------**"<<endl;cin>>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<<"请您从空闲列表中选出需要回收的内存块(必须是已分配):"<<endl;cin>>recycle;if((recycle>m)||(recycle<1)){cout<<"错误:内存中不存在此块!"<<endl;}else{int id2=-9999;for(i=0;i<n;i++){if(ary2[i][0]==recycle) {cout<<"错误:输入的为空闲盘块!"<<endl;id2=1;break;}}if(id2==-9999){apply_recycle();}}}cout<<"**************************** "<<endl;cout<<" 是否继续演示别的算法!"<<endl;cout<<" 1--是 0--否 "<<endl;cout<<"**************************** "<<endl;int o;cin>>o;flag=o;}}。