存储管理动态分区分配算法的模拟

上传人:鲁** 文档编号:456891211 上传时间:2023-06-21 格式:DOCX 页数:32 大小:108.34KB
返回 下载 相关 举报
存储管理动态分区分配算法的模拟_第1页
第1页 / 共32页
存储管理动态分区分配算法的模拟_第2页
第2页 / 共32页
存储管理动态分区分配算法的模拟_第3页
第3页 / 共32页
存储管理动态分区分配算法的模拟_第4页
第4页 / 共32页
存储管理动态分区分配算法的模拟_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《存储管理动态分区分配算法的模拟》由会员分享,可在线阅读,更多相关《存储管理动态分区分配算法的模拟(32页珍藏版)》请在金锄头文库上搜索。

1、百度文库-让每个人平等地提升自我、设计任务完成存储器动态分区分配算法的模拟实现。二、设计思想在对数据结构有一定掌握程度的情况下设计合理的数据结构来描述存 储空间,实现分区存储管理的内存分配功能,应该选择最合适的适应算法(首 次适应算法,最佳适应算法,最后适应算法,最坏适应算法)实现分区存储 管理的内存回收算法,在这些存储管理中间必然会有碎片的产生,当碎片产 生时,进行碎片的拼接,等等相关的内容。三、预期目的让我们了解操作系统的基本概念,理解计算机系统的资源如何组织, 操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机 系统打交道。通过课程设计,我们可以进一步理解在计算机系统上运行

2、的 其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。操 作系统课程设计,对于训练学生掌握程序设计、熟悉上机操作和程序调试 技术都有重要作用。重点培养学生的思维能力、设计能力、创新能力和排 错能力。四、设计方案首先是对相关知识的掌握,例如数据结构,计算方法,组成原理以及操作 系统等。在这些基本知识的基础上进行扩展,用语言的形式从函数,数据 结构原代码,原程序等方面来达到自己想要的目的。该设计就是要达到对 各个细节的问题的解决将各个数据块连接起来,最终达到存储器动态分区 分配算法的模拟实现。五、数据结构1. 设计合理的数据结构来描述存储空间:1)对于未分配出去的部分,用空闲分区链表来

3、描述。struct freeList(int startAddress;/* 分区起始地址 */int size;/* 分区大小 */struct freeList *next;/* 分区链表指针 */2)对于已经分配出去的部分,由装入内存的作业占据。struct usedList(/*分区起始地址*/*分区中存放作业ID */*分区链表指针*/int startAddress;int joblD;struct usedList *next;3 )将作业组织成链表。struct jobList(int id;/* 作业 ID */int size;/*作业大小(需要的存储空间大小)*/int

4、status; /* 作业状态 0 :new job ,1 : in the memory , 2 : finished . */struct jobList *next; /* 作业链表指针 */以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而 不设size,可以在不增加空间复杂度(与freelist相比)的同时更方便 的实现可变分区存储管理(从后面的一些函数的实现上可以得出这个结 论)。尽管设置joblist增加了空间复杂度,但它的存在,使得该程序可 以方便的直接利用D盘中的JOB文件。该文件可以认为是一个和其他进 程共享的资源。通过这个文件,其他进程写入数据供读取。

5、这中思想在 操作系统设计中体现的很多。2. 实现分区存储管理的内存分配功能,选择适应算法(首次适应算法,最佳适应算法,最后适应算法,最坏适应算法)。基本原理分析:1)Best fit :将空闲分区按大小从小到大排序,从头找到大小合适的分区。2)Worst fit :将空闲分区按大小从大到小排序,从头找到大小合适的分 区。3)First fit :将空闲分区按起始地址大小从小到大排序,4)Last fit :将空闲分区按起始地址大小从大到小排序,由此,可将空闲分区先做合适的排序后用对应的适应算法给作业分配存 储空间。排序函数order(bySize为零则按分区大小排序,否则按分区起 始地址;in

6、c为零从小到大排序,否则从大到小排序;通过empty指针返回 结果)。void order(struct freeList *empty,int bySize,int inc)(struct freeList *p,*q,*temp;百度文库-让每个人平等地提升自我 int startAddress,size; for(p = (*empty) - next;p;p = p - next)/*按bySize和inc两个参数寻找合适的节点,用temp指向它*/ for(temp = q = p;q;q = q - next) (switch(bySize)(case 0 : switch(inc

7、)(case 0:if(q-size size) temp = q;break;default:if(q-size temp-size) temp = q;break; break; default: switch(inc) (case 0:if(q-startAddress startAddress) temp = q;break;default:if(q-startAddresstemp-startAddress) temp = q;break; break;/*交换节点的成员值*/if(temp != p) ( startAddress = p-startAddress; size =

8、p-size; p-startAddress = temp-startAddress; p-size = temp-size; temp-startAddress = startAddress; temp-size = size; 3. 实现分区存储管理的内存回收算法。void insertFreeNode(struct freeList *empty,int startAddress,int size) 插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。(struct freeList *p,*q,*r;百度文库-让每个人平等地提升自我 for(p = *empty;p - nex

9、t;p = p - next) ; /*处理链表尾部的邻接情况*/ if(p = *empty | p - startAddress + p - size next = p - next;/*插入独立的空闲节点*/p - next = r; return ;if(p - startAddress + p - size = startAddress) /* 与尾部上邻 */ (p - size += size;/*合并尾部节点*/return ;q = (*empty) - next;/*处理链表首节点的邻接情况*/if(startAddress + size = q - startAddres

10、s) /* 与首节点下邻 */ (q - startAddress = startAddress;/* 合并首节点 */q - size += size;else if(startAddress + size startAddress)/* 与首节点不相邻 */ (makeFreeNode(&r,startAddress,size); r - next = (*empty) - next; (*empty) - next = r; else (/*处理链表中间的邻接情况*/while(q - next & q - startAddress next; if(p - startAddress +

11、 p - size = startAddress &q - startAddress = startAddress + size)/*上下邻,合并节点*/ (p - size += size + q - size; p - next = q - next;free(q);/*删除多余节点*/else if(p - startAddress + p - size = startAddress & q - startAddress != startAddress + size)/*上邻,增加节点的大小*/(p - size += size;else if(p - startAddress + p

12、- 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. 当碎片产生时,进行碎片的拼接。void moveFragment(struct jobList *jobs,struct f

13、reeList *empty,struct usedList *used)(int size,status;struct usedList *p;int address = memoryStartAddress;/*全局变量,初始化时分配存储空间始址*/ if(*empty)-next = NULL) /*空闲分区链表为空,提示并返回*/ ( printf(nThe memory was used out at all.nMay be you should finish some jobs first or press any key to try again !”);getch();retu

14、rn;for(p = (*used) - next;p;p = p- next)/*循环的修改占用分区的始址*/ (p - startAddress = address;百度文库-让每个人平等地提升自我getJobInfo(jobs,p - jobID,&size,&status);/*由作业ID获得作业大小*/ address += size;(*empty)-next-startAddress = address;/*修改空闲分区的首节点始址、大小*/(*empty) - next - size = memorySize - (address - memoryStartAddress);(*empty) - next -next = NULL; /*删除首节点后的所有节点*/5.空闲分区队列显示:int showFreeList(struct freeList *empty)6. 作业占用链表显示:int showUsedList(struct jobList*jobs,struct usedList *used)从头到尾显示used链,同时通过其中的作业ID在jobs中查对应的大小。7. 从键盘输入作业到D盘的JOB

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号