《可变分区存储管理设计说明.doc》由会员分享,可在线阅读,更多相关《可变分区存储管理设计说明.doc(12页珍藏版)》请在金锄头文库上搜索。
1、可变分区存储管理1目的和要求通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。2实验内容编写程序模拟实现内存的动态分区法存储管理。内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时要与相邻空闲区的合并。初始状态信息:假定系统的内存共640K,初始状态为操作系统本身占用64K。将要申请内存的作业信息(存储在document/job.txt文件中),当前时间是0。输入:用户打开document/job.txt文件,输入作业信息。处理:模拟时间逐歩增加,每次加1.采用先来先服务算法调度作业,模拟作业运行,用最坏适应算法进行内存的分配。且进行内存
2、的回收,注意与空闲分区的合并。直到所以作业运行完成程序结束。输出:把当前时间为0,为1,为2.的内存分配状况和作业信息写入文件document/information.txt。3实验环境Windows操作系统、VC+6.0C语言4设计思想4.1 结点定义 /空闲区结点描述typedef struct FreeNodeint length; / 分区长度 int address; / 分区起始地址FreeNode,*PFreeNode;/空闲区自由链表的描述typedef struct FreeLink FreeNode freeNode;struct FreeLink * next;FreeL
3、ink,*PFreeLink;/内存占用区链表描述typedef struct BusyNodechar name20;/标明此块内存被哪个进程所占用int length; / 分区长度 int address; / 分区起始地址BusyNode,*PBusyNode;/内存占用区忙碌链表的描述typedef struct BusyLink BusyNode busyNode;struct BusyLink * next;BusyLink,*PBusyLink;/作业控制块的结点描述typedef struct JCBNodechar name20; /作业名称int length; /作业申
4、请的内存大小int start_time; /作业申请内存的时间,即到达后备作业队列的时间 int use_time; /作业占用内存的时间,随着该作业的运行逐渐减小, int state; /作业内存分配描述: /0表示未申请内存,此时作业在后备队列 /1表示申请内存成功,作业进入就绪队列 /2表示申请内存失败,此时作业插入到后备队列队尾 /3表示该作业占用cpu,正在运行 /4表示作业运行完成,释放占用的内存JCBNode,*PJCBNode;/作业队列的描述,用带头结点的循环链表实现typedef struct JCBQueueJCBNode jcbNode;struct JCBQueu
5、e* next;JCBQueue,*PJCBQueue;4.2 全局变量定义 /全局变量#define ALL_MEMORY 640 /系统总内存#define OS_MEMORY 64 /操作系统占用的内存#define SIZE 2 /门限值PFreeLink freeLink; /空闲区自由链表PBusyLink busyLink; /内存占用区链表PJCBQueue jcbQueue; /外存中待分配内存的作业队列PJCBQueue readyQueue; /已分配内存的就绪队列PJCBQueue finishQueue; /已完成的作业队列PJCBNode currentJCB; /
6、当前正在执行的进程(作业)int current_time; /当前时间4.3 算法流程图 1.程序总算法流程图如下:此流程图描述了作业从外存进入内存,再到进程完毕的过程。以及此过程中系统对内存的分配和回收。步骤:作业申请内存 - 作业进入内存 - 作业执行 - 作业完成,释放内存涉及到的算法:(1)最坏适应算法 (2)内存回收算法 (3)先来先服务算法注:作业进入内存时,此程序并没有模拟创建PCB,而是以JCB代替2.内存分配最坏适应算法流程图:3.内存回收算法流程图:4.先来先服务算法流程图:4.4 代码设计采用多文件结构:1. 其中document文件夹下存放输入作业信息的文本文档job
7、.txt和输出信息information.txt2. BusyLink.c文件定义实现了关于忙碌链表busyLink的操作:/初始化忙碌链表void initBusyLink(PBusyLink* pBusyLink)/在指定的结点后面插入新的结点void insertBusyLink(PBusyLink prior,BusyNode busyNode)/在链表尾部插入结点void insertBusyLinkAtTail(PBusyLink head,BusyNode busyNode)/判断链表是否为空int BusyLinkIsEmpty(PBusyLink head)/根据作业名称删除
8、结点PBusyNode deleteBusyLinkByName(PBusyLink head,char *str)3. FreeLink.c文件定义实现了关于自由链表freeLink的操作:/初始化自由链表void initFreeLink(PFreeLink* pFreeLink)/在指定的结点后面插入新的结点void insertFreeLink(PFreeLink prior,FreeNode freeNode)/在链表尾部插入结点void insertFreeLinkAtTail(PFreeLink head,FreeNode freeNode)/判断链表是否为空int FreeLi
9、nkIsEmpty(PFreeLink head)/删除头结点int deleteFreeLink(PFreeLink head)/删除指定结点int deleteFreeLinkByIndex(PFreeLink head,PFreeLink index)/按空闲区由大到小排序,选择排序法void sortFreeLink(PFreeLink head)4. JobQueue定义实现了关于作业队列的操作:/初始化void initJCBQueue(PJCBQueue* tail)/队尾插入结点void inseartJCBQueue(PJCBQueue* tail,JCBNode jcbNo
10、de)/判断队列是否为空int JCBQueueIsEmpty(PJCBQueue* tail)/队头删除结点PJCBNode deleteJCBQueue(PJCBQueue* tail)/取队头元素PJCBNode getFrontJCBQueue(PJCBQueue tail)/按申请内存的时间先后排序(选择排序)void sortJCBQueue(PJCBQueue tail)5. Memory.c实现了各个算法:void init(); / 设置系统初始状态 int freeMemo(JCBNode); /模拟内存回收 int requireMemo(JCBNode); /模拟内存分配void timePast(); /模拟系统时间 void write(); /把当前时间的内存信息,作业信息写入文件information.txt/主函数void main()/1.初始化系统init();/2.时间逐步加1 timePast();/3.提示信息printf(各个时间的内存及作业信息已存入document/information.txt文件中nn);5源程序 已上传至:http:/touch-