动态分区分配存储管理系统方案.docx
- 文档编号:24316496
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:31
- 大小:309.30KB
动态分区分配存储管理系统方案.docx
《动态分区分配存储管理系统方案.docx》由会员分享,可在线阅读,更多相关《动态分区分配存储管理系统方案.docx(31页珍藏版)》请在冰豆网上搜索。
动态分区分配存储管理系统方案
动态分区分配存储管理系统
学院
专业
学号
学生姓名
指导老师
2014年3月19日
一、设计目的与容3
1、设计目的3
2、设计容3
3、设计要求3
二、算法的基本思想3
1、首次适应算法3
2、循环首次适应算法3
三、主要功能模块流程图4
1、主函数流程图.4
2、首次适应算法流程图.5
3、循环首次适应算法流程图.6
四、系统测试.7
输入界面,按要求输入:
7
五、结论8
六、源程序9
1、设计目的与容
设计的目的
操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。
●进一步巩固和复习操作系统的基础知识。
●培养学生结构化程序、模块化程序设计的方法和能力。
●提高学生调试程序的技巧和软件设计的能力。
●提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能力。
设计容:
用高级语言编写和调试一个动态分区存分配程序,演示实现下列两种动态分区分配算法
1.首次适应算法
2.循环首次适应算法
设计要求:
1.存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的
2.作业数量、作业大小、进入存时间、运行时间需要通过界面进行输入
3.可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入存时间、运行时间的初始化
4.根据作业进入存的时间,采用简单的先进先出原则进行从外存到存的调度,作业具有等待(从外存进入存执行)、装入(在存可执行)、结束(运行结束,退出存)三种状态。
(为了简化,不考虑CPU的调度与切换,运行时间为作业在存中驻留的时间)
5.能够自动进行存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示
6.采用可视化界面,可随时暂停显示当前存分配和使用情况图。
二、算法的思想
1、首次适应算法
空闲分区链以地址递增的次序,分配存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块存空间分配给请求者,取消的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次存分配失败,返回。
2、循环首次适应算法
在为进程分配存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的存空间分配给作业
三、主要功能模块流程图
主函数
否
是
否
是否
是
首次适应算法:
开始
T&&num
Intt=1
否
Dulinklistpll=block...
Intx=0
X multiplex X++ multiplex multiplex 是 否 是 循环首次适应算法 T&&num Dulinklistpll=block... Intm=0 m multiplex m++ multiplex multiplex 结束 Intt=1 否 是 否 是 四、系统测试 程序运行实例如下: 输入界面,按要求输入: 五、结论 作业采用数组形式进行存储,起初想用数组模拟分区,但划分记录比较不易,时间空间复杂度较大,容易混乱,遂决定用链表形式模拟分区情况。 基本能运行符合要求,能模拟出动态分区过程及最终结果 六.源程序 #include #include #include #include #defineFree0 #defineUse1 #defineMAX_length100//最大存空间为100MB #defineMaxNumber100 intFreePartition[MaxNumber]={16,16,8,32,64,32,8,16,64};//空闲分区 intProcessNeed[MaxNumber]={7,18,9,20,35,8};//每个进程需求 intFirstPartition[MaxNumber];//首次 intCycleFirstPartition[MaxNumber];//循环 intPartitionNumber=9,ProcessNum=6;//空闲分区数及进程数 boolv(); boolv() { intj; cout<<"首次适应算法"< //FirstPartitionMethod(); for(inti=0;i for(j=0;j { if(FreePartition[j]>=ProcessNeed[i]) {FirstPartition[i]=j; FreePartition[j]-=ProcessNeed[i]; break; } } //c_out(FirstPartition); for(i=0;i cout< cout< //Beginning(); FreePartition[0]=16; FreePartition[1]=16; FreePartition[2]=8; FreePartition[3]=32; FreePartition[4]=64; FreePartition[5]=32; FreePartition[6]=8; FreePartition[7]=16; FreePartition[8]=64; cout<<"循环首次适应算法"< //CycleFirstPartitionMethod(); j=0; for(i=0;i for(;;)//分区 { if(FreePartition[j]>=ProcessNeed[i]) {CycleFirstPartition[i]=j; FreePartition[j]-=ProcessNeed[i]; break; } j++; j=j%PartitionNumber; } //c_out(CycleFirstPartition); for(i=0;i cout< cout< return1; } //--------------作业结构体数组---------------------------- typedefstructJOB { intnum;//作业号 intsize;//作业大小 intctime;//作业进入时间 intrtime;//作业运行时间 intstate;//作业状态 }Job; typedefstructDuLNode { intID;//分区号 intstart;//开始地址 intsize;//大小 intstate;//0=尚未使用1=使用2=释放 structDuLNode*prior;//前驱指针 structDuLNode*next;//后即指针 }DuLNode,*DuLinkList; //------------------------------------------------------------------------------- intFirstfit(int);//首次适应算法 intNext_fit(int);//循环首次适应算法 voidshowJob(int);//显示作业表 voidshowPartiton(DuLinkList);//显示分区表 //----------------------------------------------------------------------------- //---------------------------全局变量------------------------------------------- intf; Job*A;//排序前 Job*a;//排序后 Job*temp; //-----------------------------功能函数------------------------------------------- voiddelay() { for(intx=10000;x>0;x--) for(inty=1000;y>0;y--); } //-------------------------------------------------------------------------------- //------------------------初始化--------------------------------------------------- DuLinkListInitpartitionList(DuLinkList&p) { p=(DuLinkList)malloc(sizeof(DuLNode));//申请空间 if(! p) exit(0); p->size=100;//初始化大小 printf("输入分区首地址: "); scanf("%d",&p->start); p->state=0;//状态置空闲 p->ID=0;//分区号 p->next=NULL; p->prior=NULL; returnp; } //------------------------------------------------------------------------------ //-----------------------------输入函数--------------------------------------------- intPutin(int&n) { inti; Jobtemp; printf("请输入任务数目: "); scanf("%d",&n); a=(Job*)malloc(n*sizeof(Job)); A=(Job*)malloc(n*sizeof(Job)); for(i=0;i { printf("\n"); printf("信息输入: \n\n"); printf("作业号: "); scanf("%d",&a[i].num); printf("作业大小: "); scanf("%d",&a[i].size); printf("作业进入时间: "); scanf("%d",&a[i].ctime); printf("作业运行时间: "); scanf("%d",&a[i].rtime); a[i].state=0;//默认状态为Free A[i]=a[i]; } for(intj=0;j for(i=j;i if(a[j].ctime>a[i].ctime) { temp=a[j]; a[j]=a[i]; a[i]=temp; } //冒泡排序 freopen("data.txt","w",stdout); for(i=0;i { printf("%d%d%d%d\n",a[i].num,a[i].size,a[i].ctime,a[i].rtime); } fclose(stdout); freopen("CON","w",stdout); printf("保存成功\n\n"); return1; } //---------------------------------------------------------------------------------------- //-----------------------------读文件----------------------------------------------------- intorder(int&n) { Jobtemp; printf("Inputthenumberofthetask: \n"); scanf("%d",&n); a=(Job*)malloc(n*sizeof(Job)); freopen("data.txt","r",stdin); for(inti=0;i { scanf("%d",&a[i].num); scanf("%d",&a[i].size); scanf("%d",&a[i].ctime); scanf("%d",&a[i].rtime); } fclose(stdin); freopen("CON","r",stdin); for(intj=0;j for(i=j;i if(a[j].ctime>a[i].ctime) { temp=a[j]; a[j]=a[i]; a[i]=temp; } return1; } //------------------------------------------------------------------------ //-------------------------显示分区------------------------------- voidshowPartition(DuLinkListpl) { printf("\n\t\t\t分区表\n"); printf("\t---------------------------------------\n"); printf("\t开始地址\t分区号\t大小状态\n"); printf("\t---------------------------------------\n"); while(pl) { printf("\t%d\t\t%d\t%d\t",pl->start,pl->ID,pl->size); if(pl->state==0) printf("空闲\n"); if(pl->state==1) printf("已分配\n"); pl=pl->next; } printf("\t---------------------------------------\n"); } //------------------------------------------------------------------------- //---------------------------------回收函数--------------------------------- voidhuishou(DuLinkListpl3,DuLinkList&pl)//pl3是分区链表指针pl头 { while(pl3) { if(pl3->state==0) { if(pl3->next&&pl3->prior&&pl3->prior->state==0&&pl3->next->state==1)// { pl3->size+=pl3->prior->size; pl3->start=pl3->prior->start; pl3->state=0; pl3->ID=0; if(pl3->prior->prior) { pl3->prior->prior->next=pl3;//pl3与最前一个 pl3->prior=pl3->prior->prior;// } else { pl3->prior=pl3->prior->prior;//pl3指向空 pl=pl3; pl3=pl;//pl3与头 } } elseif(pl3->prior&&pl3->next&&pl3->next->state==0&&pl3->prior->state==1) { pl3->size+=pl3->next->size; pl3->state=0; pl3->ID=0; if(pl3->next->next) { pl3->next->next->prior=pl3;//建立新链表pl3与最后一个结点 pl3->next=pl3->next->next;// } else { pl3->next=pl3->next->next;//指向空 } } elseif(! pl3->prior) { if(pl3->next->state==0) { pl3->size+=pl3->next->size; pl3->state=0; pl3->ID=0; if(pl3->next->next) pl3->next->next->prior=pl3;//pl3与最后 pl3->next=pl3->next->next;// } else { pl3->state=0; } } elseif(! pl3->next) { if(pl3->prior->state==0) { pl3->size+=pl3->prior->size; pl3->state=0; pl3->ID=0; pl3->start=pl->start; if(pl3->prior->prior) { pl3->prior->prior->next=pl3;//pl3与最前 pl3->prior=pl3->prior->prior;// } else {pl3->prior=NULL;//pl3指向空 pl=pl3;//pl3与头 pl3=pl;// } } else { pl3->state=0; } } elseif(pl3->next&&pl3->prior&&pl3->next->state==0&&pl3->prior->state==0) { pl3->size=pl3->size+pl3->next->size+pl3->prior->size; pl3->state=0; pl3->ID=0; pl3->start=pl3->prior->start; if(pl3->next->next) pl3->next->next->prior=pl3; if(pl3->prior->prior) { pl3->prior->prior->next=pl3; pl3->next=pl3->next->next;//指向空 pl3->prior=pl3->prior->prior; } else { pl3->next=pl3->next->next;//指向空 pl3->prior=pl3->prior->prior;//指向头 pl=pl3; pl3=pl; } } } pl3=pl3->next; } } //-------------------------------------------------------------------------------------- //----------------------------------首次适应算法--------------------------------------- voidFirstfit(DuLinkListblock_first,intn) { intt=1; intnum=n; while(t&&num) { DuLinkListpl1=block_first,pl2,pl3=block_first; printf("时钟: %d\n",t); DuLNode*p=block_first; DuLNode*q=block_first; for(intx=0;x {if(t==a[x].ctime+a[x].rtime) a[x].state=2; } for(intm=0;m { if(t==a[m].ctime+a[m].rtime) { num-=1; a[m].state=2;//0等待1装入2结束 while(q) { if(q->ID==a[m].num)//分区号等于作业号时 { q->state=Free;//在作业完成时,作业号等于分区号时空闲 } q=q->next; } showJob(n); showPartition(block_first); } } for(m=0;m { if(a[m].ctime==t) { a[m].state=1;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 分配 存储 管理 系统 方案