您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 存储管理---动态分区分配算法的模拟
课程设计书第1页一、设计任务完成存储器动态分区分配算法的模拟实现。二、设计思想在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法),实现分区存储管理的内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产生时,进行碎片的拼接,等等相关的内容。三、预期目的让我们了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。通过课程设计,我们可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。操作系统课程设计,对于训练学生掌握程序设计、熟悉上机操作和程序调试技术都有重要作用。重点培养学生的思维能力、设计能力、创新能力和排错能力。四、设计方案首先是对相关知识的掌握,例如数据结构,计算方法,组成原理以及操作系统等。在这些基本知识的基础上进行扩展,用语言的形式从函数,数据结构原代码,原程序等方面来达到自己想要的目的。该设计就是要达到对各个细节的问题的解决将各个数据块连接起来,最终达到存储器动态分区分配算法的模拟实现。五、数据结构1.设计合理的数据结构来描述存储空间:1)对于未分配出去的部分,用空闲分区链表来描述。structfreeList{intstartAddress;/*分区起始地址*/intsize;/*分区大小*/structfreeList*next;/*分区链表指针*/}2)对于已经分配出去的部分,由装入内存的作业占据。课程设计书第2页structusedList{intstartAddress;/*分区起始地址*/intjobID;/*分区中存放作业ID*/structusedList*next;/*分区链表指针*/}3)将作业组织成链表。structjobList{intid;/*作业ID*/intsize;/*作业大小(需要的存储空间大小)*/intstatus;/*作业状态0:newjob,1:inthememory,2:finished.*/structjobList*next;/*作业链表指针*/}以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而不设size,可以在不增加空间复杂度(与freelist相比)的同时更方便的实现可变分区存储管理(从后面的一些函数的实现上可以得出这个结论)。尽管设置joblist增加了空间复杂度,但它的存在,使得该程序可以方便的直接利用D盘中的JOB文件。该文件可以认为是一个和其他进程共享的资源。通过这个文件,其他进程写入数据供读取。这中思想在操作系统设计中体现的很多。2.实现分区存储管理的内存分配功能,选择适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法)。基本原理分析:1)Bestfit:将空闲分区按大小从小到大排序,从头找到大小合适的分区。2)Worstfit:将空闲分区按大小从大到小排序,从头找到大小合适的分区。3)Firstfit:将空闲分区按起始地址大小从小到大排序,……4)Lastfit:将空闲分区按起始地址大小从大到小排序,……由此,可将空闲分区先做合适的排序后用对应的适应算法给作业分配存储空间。排序函数order(bySize为零则按分区大小排序,否则按分区起始地址;inc为零从小到大排序,否则从大到小排序;通过empty指针返回结果)。voidorder(structfreeList**empty,intbySize,intinc){structfreeList*p,*q,*temp;课程设计书第3页intstartAddress,size;for(p=(*empty)-next;p;p=p-next){/*按bySize和inc两个参数寻找合适的节点,用temp指向它*/for(temp=q=p;q;q=q-next){switch(bySize){case0:switch(inc){case0:if(q-sizetemp-size)temp=q;break;default:if(q-sizetemp-size)temp=q;break;}break;default:switch(inc){case0:if(q-startAddresstemp-startAddress)temp=q;break;default:if(q-startAddresstemp-startAddress)temp=q;break;}break;}}/*交换节点的成员值*/if(temp!=p){startAddress=p-startAddress;size=p-size;p-startAddress=temp-startAddress;p-size=temp-size;temp-startAddress=startAddress;temp-size=size;}}}3.实现分区存储管理的内存回收算法。voidinsertFreeNode(structfreeList**empty,intstartAddress,intsize)插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。{structfreeList*p,*q,*r;课程设计书第4页for(p=*empty;p-next;p=p-next);/*处理链表尾部的邻接情况*/if(p==*empty||p-startAddress+p-sizestartAddress)/*与尾部不相邻*/{makeFreeNode(&r,startAddress,size);/*通过r指针返回创建的空闲节点*/r-next=p-next;/*插入独立的空闲节点*/p-next=r;return;}if(p-startAddress+p-size==startAddress)/*与尾部上邻*/{p-size+=size;/*合并尾部节点*/return;}q=(*empty)-next;/*处理链表首节点的邻接情况*/if(startAddress+size==q-startAddress)/*与首节点下邻*/{q-startAddress=startAddress;/*合并首节点*/q-size+=size;}elseif(startAddress+sizeq-startAddress)/*与首节点不相邻*/{makeFreeNode(&r,startAddress,size);r-next=(*empty)-next;(*empty)-next=r;}else{/*处理链表中间的邻接情况*/while(q-next&&q-startAddressstartAddress){p=q;q=q-next;}if(p-startAddress+p-size==startAddress&&\q-startAddress==startAddress+size)/*上下邻,合并节点*/{p-size+=size+q-size;p-next=q-next;课程设计书第5页free(q);/*删除多余节点*/}elseif(p-startAddress+p-size==startAddress&&\q-startAddress!=startAddress+size)/*上邻,增加节点的大小*/{p-size+=size;}elseif(p-startAddress+p-size!=startAddress&&\q-startAddress==startAddress+size)/*下邻*/{q-startAddress=startAddress;/*修改节点起始地址*/q-size+=size;/*修改节点的大小*/}else{/*上下不相邻*/makeFreeNode(&r,startAddress,size);r-next=p-next;p-next=r;}}}4.当碎片产生时,进行碎片的拼接。voidmoveFragment(structjobList*jobs,structfreeList**empty,structusedList**used){intsize,status;structusedList*p;intaddress=memoryStartAddress;/*全局变量,初始化时分配存储空间始址*/if((*empty)-next==NULL)/*空闲分区链表为空,提示并返回*/{printf(\nThememorywasusedoutatall.\nMaybeyoushouldfinishsomejobsfirstorpressanykeytotryagain!);getch();return;}for(p=(*used)-next;p;p=p-next)/*循环的修改占用分区的始址*/{p-startAddress=address;课程设计书第6页getJobInfo(jobs,p-jobID,&size,&status);/*由作业ID获得作业大小*/address+=size;}(*empty)-next-startAddress=address;/*修改空闲分区的首节点始址、大小*/(*empty)-next-size=memorySize-(address-memoryStartAddress);(*empty)-next-next=NULL;/*删除首节点后的所有节点*/}5.空闲分区队列显示:intshowFreeList(structfreeList*empty)6.作业占用链表显示:intshowUsedList(structjobList*jobs,structusedList*used)从头到尾显示used链,同时通过其中的作业ID在jobs中查对应的大小。7.从键盘输入作业到D盘的JOB文件:voidinputJob(void)8.从JOB文件中读出作业并创建作业链表:intmakeJobList(structjobList**jobs)9.显示作业链表:intshowJobList(structjobList*jobs)10.更新作业链表中作业的状态:intupdateJobFile(structjobList*jobs)11.根据作业链表更新JOB文件:intupdateJobFile(structjobList*jobs)12.为作业分配存储空间、状态必须为0:intallocate(structfreeList**empty,intsize)13.结束一个作业号为id的作业,释放存储空间(由*startAddress返回空间的起始地址):intfinishJob(structusedList**used,intid,int*startAddress)14.插入释放的空间到used链表中(作业号为id,startAddress由函数13返回):voidinsertUsedNode(structusedList**used,intid,intstartAddress)课程设计书第7页15.获取作业的信息:voidgetJobInfo(structjobList*jobs,intid,int*size,int*status)16.初始化存储空间起始地址、大小:voidiniMemory(void)17.选择适应算法:charselectFitMethod(void)18.根据参数startAddress、size创建空闲节点,由empty指针返回:voidmakeFreeNode(structfreeList**empty,intstartAddress,intsize)19.以要求的方式打开文件:voidopenFile(FILE**fp,char*fi
本文标题:存储管理---动态分区分配算法的模拟
链接地址:https://www.777doc.com/doc-4489496 .html