操作系统实验报告 | |
设计题目 | 在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收 |
一、设计内容 主存储器空间的分配和回收。 | |
二、设计目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实习帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。 | |
三、设计过程 1、数据结构设计 #define m 10 #define n 10 #define Q 1024 struct free { int ad; int len; char state; }fr[m];
struct use { int ad; int len; char state; }us[10]; struct free0 { int ad; int len; char state; }f0[1]; 2、算法设计 void creatf()//空闲分区表初始化 {int i; for(i=0;i fr[i].ad=0; fr[i].len=0; fr[i].state='M'; } } void insertu(int i) { int j,p; p=0; printf("\\n请输入第%d个作业的长度:\\n",i); scanf("%d",&us[i].len); us[i].ad=0; us[i].state='U'; j=0; p=0; if(fr[0].ad==0) printf("\\n 所有空闲区已经全部分配完毕!\\n"); while(fr[j].state!='M'&&p==0) { if( us[i].len us[i].ad=fr[j].ad; fr[j].ad=us[i].len+fr[j].ad; fr[j].len=fr[j].len-us[i].len; p=1; break; } if(us[i].len==fr[j].len) { fr[j].ad=0; fr[j].len=0; fr[j].state='M'; sort1(); p=1; break; } j++; } if(p==0) { us[i].state='N'; printf("\\n没有适当的空间可以插入!\\n"); } if(p!=0) { printf("\\n第%d个作业分配空间后,空闲表为:\\n",i); disp(); } } void sort() { int i,q,j; i=0; q=0; if(fr[0].ad!=0) { do { if(f0[0].ad>fr[i].ad) i=i+1; else q=1; }while(fr[i].state!='M'&&q==0); for(j=m-1;j>i;j--) { fr[j].ad=fr[j-1].ad; fr[j].len=fr[j-1].len; fr[j].state=fr[j-1].state; } fr[i].ad=f0[0].ad; fr[i].len=f0[0].len; fr[i].state=f0[0].state; } if(fr[0].ad==0) { fr[0].ad=f0[0].ad; fr[0].len=f0[0].len; fr[0].state=f0[0].state; } } void sort1() { int i; i=0; while(fr[i].state!='M') {i++;} if(fr[i+1].state!='M') { do { fr[i].ad=fr[i+1].ad; fr[i].len=fr[i+1].len; fr[i].state=fr[i+1].state; i++; }while(fr[i+1].state!='M'); fr[i].ad=0; fr[i].len=0; fr[i].state='M'; } } void disp() { int i; printf("\\n\address\\length\\state\\n"); for(i=0;i } void over() { int d,i,j,p,k; p=0; i=0; printf("\\n 输入要结束第几个作业:\\n"); scanf("%d",&d); printf("\\n 要结束作业的信息为:\\n"); printf("\\n\address\\length\\state\\n"); printf("\\n\%d\\%d\\ %c\\n",us[d].ad,us[d].len,us[d].state); if(us[d].state=='N')//如果要结束作业的状态为'N',说明此作业没有被分配空间 printf("\\n 此作业没有分配内存!\\n"); if(us[d].state=='Y')//如果要结束作业的状态为'Y',说明此作业已经被结束 printf("\\n 此作业已经结束 !\\n"); if(us[d].state=='U')//如果要结束作业的状态为'U',说明此作业没有被结束 { while(fr[i].state!='M') { if(us[d].ad==fr[i].ad+fr[i].len) //如果被结束作业的起始地址和一个空闲分区的结束地址相邻,则合并两者 { fr[i].len=fr[i].len+us[d].len; if(fr[i].ad+fr[i].len==fr[i+1].ad) //合并完之后的空闲分区的结束地址和相邻的空闲分区的起始地址也相连,则继续合并 { fr[i].len=fr[i].len+fr[i+1].len; for(k=i+1;k fr[k].ad=fr[k+1].ad; fr[k].len=fr[k+1].len; fr[k].state=fr[k+1].state; } fr[m-1].ad=-1; fr[m-1].len=-1; fr[m-1].state='M'; } us[d].state='Y';//修改已经结束作业的信息 p=1; break; } if(us[d].ad+us[d].len==fr[i].ad) //如果被结束作业的结束地址和一个空闲分区的起始地址相邻,则合并两者 { fr[i].len=us[d].len+fr[i].len; fr[i].ad=us[d].ad; fr[i].state='F'; p=1; us[d].state='Y'; break; } if(us[d].ad { for(j=m-1;j>i;j--) { fr[j].ad=fr[j-1].ad; fr[j].len=fr[j-1].len; fr[j].state=fr[j-1].state; } fr[i].ad=us[d].ad; fr[i].len=us[d].len; fr[i].state='F'; us[d].state='Y'; break; } i++; } if(p==0)//如果结束作业不是以上三种情况,且其址最大,则插入到空闲分区表的末尾 { fr[i].ad=us[d].ad; fr[i].len=us[d].len; fr[i].state='F'; us[d].state='Y'; } disp(); } } #include "stdio.h" #include "stdlib.h" #include "dy.h" #include "disp.h" #include "creatf.h" #include "sort.h" #include "insertu.h" #include "over.h" int main() { int i,j,k,p; i=1; k=0; p=1; printf("\\n*----------------------------------------------------------*\\n"); printf("|*****************主存储存空间的分配和回收模拟***************|\\n"); printf("*----------------------------------------------------------*\\n\\n"); creatf(); printf("\\n 请输入目前空闲分区表的信息:\n"); while(p!=0) { printf("\\n 请输入空闲分区表某一行的起址和长度\n"); scanf("%d%d",&f0[0].ad,&f0[0].len); f0[0].state='F'; sort(); // k++; printf("\\n 如果不在进行输入,则输入0\n"); scanf("%d",&p); } printf("\\n 插入作业之前空闲分区表的信息如下:\n"); disp(); for(;;) { printf("=================菜单===================\\n"); printf("~~~~~~1:为作业分配空间;\n"); printf("~~~~~~2:结束作业;\n"); printf("~~~~~~3:退出程序;\n"); printf("========================================\\n"); printf("输入你的选择:\n"); scanf("%d",&j); switch(j) { case 1:insertu(i);//为作业分配空间 i++; break; case 2:over();//作业的回收 break; case 3:exit(0); } } return 0; } | |
四、程序实现及运行结果
| |
五、设计总结 这次实验使用的主要是数组,通过这次实验是我对数组的一些用法和使用加深了印象。在刚开始做时,由于没有把题意给理解清初就开始做题,导致到快要让老师验收时才发现,不过还好,经过修整终于把实验给完成了。在实验过程中,也遇到了一些问题,比如:对于一些作业已经结束了,再一次回收还能插入到空闲表中,经过一番思考,对作业设置了一个标志位,每一次作业结束都对其进行检验和修改。同时通过这次实验我也对内存空间的分配和回收有了进一步的认识,熟悉了其工作过程和工作原理。 |