还剩6页未读,继续阅读
文本内容:
存储器管理(固定分区、可变分区与分页式分配算法)
一、目的本课题实验的目的是,使学生实验存储器管理系统的设计方法;加深对所学各种存储器管理方案的了解;要求采用一些常用的存储器分配算法,设计一个存储器管理模拟系统并调试运行
二、实验内容模拟固定分区分内存的动态分配和回收,并编程实现
三、要求及提示
(1)建立相关的数据结构,作业控制块、已分配分区及未分配分区
(2)实现一个固定分区分配算法实现多个分区只设置一个后备作业队列而每个分区设置一个后备作业队列留给大家实现
(3)实现一个分区回收算法
(4)要求采用一种常用的存储器分配算法,设计一个存储器管理模拟系统允许进行多次的分配和释放,并可向用户反馈分配和释放情况及当前内存的情况;采用“命令菜单”选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统
(5)编程实现
(6)工具C语言或其它高级语言
四、实验报告
1、列出调试通过程序的清单,并附上文档说明
2、总结上机调试过程中所遇到的问题和解决方法及感想五参考代码://memdos.cpp:定义控制台应用程序的入口点//以下代码为4种分区8K分区四块16K分区3块32分区2块64分区1块共10块#includestdafx.h#includestring.h#includestdlib.h//#includeconio.h#defineTRUE1#defineFALSE0voidInitCSolid;voidExitSolid;intMallocAreaintnSizechar*sName;//申请一个分区函数intFreeAreachar*sName;//释放一个分区函数voidShowArea;//显示所有分区状态函数structSolid//每分区作业的数据结构{char*pmem;//每分区内存的起始地址intsize;//每分区的大小intuseSize;//已使用大小,若为0,表示此分区尚未使用charjobName
[20];//此分区的作业进程名};intnSizes
[4];//共4种分区,每种分区的大小为8k16k32k64k每K为1024字节char*pmems;//起始分区内存地址Solid*psolids;intsnum;//定义总的内存分区数intmain{intjobCount=1;//已申请的作业个数charstr
[100];charjobName
[14];intnSize;//申请的作业大小InitCSolid;//初始化数据while1{ShowArea;//显示内存的分配与使用情况printf固定分区内存管理\nx退出1申请内存2释放内存\n;scanf%sstr;ifstrlenstr!=1continue;ifstr
[0]==x||str
[0]==Xbreak;//退出ifstr
[0]==1//申请内存{while1{printf请输入申请内存的大小按x退出,按0返回上一级:;scanf%sstr;ifstrlenstr==1{ifstr
[0]==x||str
[0]==Xgotoexit;//退出ifstr
[0]==0break;//返回上一级}nSize=atoistr;//获取申请的内存大小atoi函数功能为字符串转换成数字类型ifnSize=0{printf输入错误!;continue;}sprintfjobName作业%03djobCount;//自动定义一个作业名if!MallocAreanSizejobName//分配内存,并判断是否成功{printf申请内存大小为%d但没有空间可分配请重新输入\nnSize;}jobCount++;//已申请的作业个数ShowArea;//显示内存的分配与使用情况}ifstr
[0]==0continue;//返回上一级}ifstr
[0]==2//释放内存{printf请输入释放内存的作业名按x退出,按0返回上一级:;while1{scanf%sstr;ifstrlenstr==1{ifstr
[0]==x||str
[0]==Xgotoexit;//退出ifstr
[0]==0break;//返回上一级}ifstrlenstr==3sprintfjobName作业%sstr;//获取作业名elsestrcpyjobNamestr;ifFreeAreajobName//根据作业名释放内存并判断是否释放成功{printf已释放%s所占用的内存\n\n\nstr;ShowArea;printf请输入释放内存的作业名按x退出,按0返回上一级:;}elseprintf无此作业,请重新输入释放内存的作业名按x退出,按0返回上一级:;}ifstr
[0]==0continue;}}exit:ExitSolid;//释放资源////getchar;return0;}voidInitCSolid//生成初始数据{//this-snum=sNum;intintotalSize=0;snum=10;//总共分成10分区psolids=Solid*mallocsizeofSolid*snum;//newSolid[snum];//申请堆内存nSizes
[0]=8192;nSizes
[1]=16384;nSizes
[2]=32768;nSizes
[3]=65536;//nSizes
[4]=165536;psolids
[0].size=nSizes
[0];psolids
[0].useSize=0;//其中8K分区4块,并设置其大小与使用标志为0表示未使用psolids
[1].size=nSizes
[0];psolids
[1].useSize=0;psolids
[2].size=nSizes
[0];psolids
[2].useSize=0;psolids
[3].size=nSizes
[0];psolids
[3].useSize=0;psolids
[4].size=nSizes
[1];psolids
[4].useSize=0;//其中16K分区3块psolids
[5].size=nSizes
[1];psolids
[5].useSize=0;psolids
[6].size=nSizes
[1];psolids
[6].useSize=0;psolids
[7].size=nSizes
[2];psolids
[7].useSize=0;//其中32K分区2块psolids
[8].size=nSizes
[2];psolids
[8].useSize=0;psolids
[9].size=nSizes
[3];psolids
[9].useSize=0;//其中64K分区1块fori=0;isnum;i++ntotalSize+=psolids[i].size;//获取总的内存大小pmems=char*mallocntotalSize;psolids
[0].pmem=pmems;//设置每分区的起始地址fori=1;isnum;i++{psolids[i].pmem=psolids[i-1].pmem+psolids[i-1].size;}}voidExitSolid//释放{//delete[]psolids;freepsolids;//释放内存freepmems;}//申请内存函数,参数nrSize为要申请的内存大小,参数sName为申请的作业名称申请成功返回TRUE否则返回FALSEintMallocAreaintnrSizechar*sName{inti;fori=0;i4;i++{ifnrSizenSizes[i]continue;//根据要申请的nrSize内存大小,判断落在哪个分区8k16k32k64k分区break;}ifi==4returnfalse;//申请的nrSize内存太大,没有大内存分配intn=i;//记住要分配的分区//循环查找可用分区fori=0;isnum;i++{ifpsolids[i].sizenSizes[n]//找出分区位置continue;ifpsolids[i].useSize!=0//此分区块已分配出去否?continue;//是,寻找下一分区块psolids[i].useSize=nrSize;//否,分配此块分区strcpypsolids[i].jobNamesName;//保存作业名break;}ifi==snumreturnFALSE;//申请不成功returnTRUE;//申请成功}//根据作业名释放内存找到作业名并成功释放返回TRUE,否则返回FALSEintFreeAreachar*sName{inti;fori=0;isnum;i++{ifstrcmpsNamepsolids[i].jobName==0//是否由此作业名ifpsolids[i].useSize!=0{psolids[i].useSize=0;//是释放内存,即设置此块分区为未使用returnTRUE;}}returnFALSE;}voidShowArea//显示{inti=0;printf\n;fori=0;isnum;i++//循环显示每一块分区的状态{ifpsolids[i].useSize==0//此分区块是否已使用{//否printf空闲区间起始地址%dK\t内存大小%dK\npsolids[i].pmem-psolids
[0].pmem/1024psolids[i].size/1024;}else{//是printf%s起始地址%dK\t内存大小%dK已使用%dK%d字节\npsolids[i].jobNamepsolids[i].pmem-psolids
[0].pmem/1024psolids[i].size/1024psolids[i].useSize/1024psolids[i].useSize%1024;}}printf\n;}。