基本分页存储管理系统的设计-操作系统课程设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程设计任务书及成绩评定课题名称基本分页存储管理系统的设计Ⅰ、题目的目的和要求:巩固和加深对操作系统(OS)原理的理解,初步掌握操作系统组成模块和应用接口的使用方法,提高进行工程设计和系统分析的能力;通过选做上面的课题,实现OS最基本模块的管理功能,重点放在数据结构设计、文档规范化和程序设计风格。Ⅱ、设计进度及完成情况日期内容6.16-7.18选取参考书,查阅有关文献资料,完成课程设计说明书内容1部分。完成课程设计说明书内容2-4部分6.19~6.23创建相关数据结构,录入源程序6.24~6.25调试程序并记录调试中的问题,完成课程设计说明书第5部分。6.26系统测试,演示设计成果,考核成绩。6.27整理课程设计说明书,上午11时,由学习委员交课程设计说明书(计算机科学系9#213或直接交给指导教师)Ⅲ、主要参考文献及资料[1]汤子赢等.计算机操作系统(第二版).西安电子科技大学出版社,2006.8[2]冯耀霖等.操作系统,西安电子科技大学出版社.1992[3]谭耀铭.操作系统.中国人民大学出版社,2003.4[4]任爱华操作系统实用教程清华大学出版社,2001[5]张尧学史美林计算机操作系统教程(第2版)清华大学出版社2000Ⅳ、成绩评定:设计成绩:(教师填写)指导老师:(签字)二○○八年六月二十七日目录第一章概述……………………………………………………………1第二章系统分析………………………………………………………2第三章系统设计………………………………………………………3第四章程序设计流程图或N-S图……………………………………5第五章源程序清单……………………………………………………8第六章调试过程中的问题及系统测试情况…………………………14第七章结束语…………………………………………………………161第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课程更全面的学习和应用,理解和掌握课程的相关知识。《计算机操作系统》一门重要的专业课,是开发操作系统和软件系统的理论和应用基础。存储器是计算机系统的重要组成部分。近几年,虽然存储器的容量一直在不断的扩大,价格也越来越便宜,但是仍然不能满足现代软件发展的需要。因此存储器仍是一种宝贵的资源。因此尽可能的方便用户和提高主存储器的使用效率,使主存储器在成本、速度和规模之间获得较好的权衡是存储器管理的主要任务。存储器管理应具有内存分配、内存保护、地址映射和内存扩充等功能。本设计的目的是熟悉存贮器管理系统的设计方法;加深对所学基本分页存储管理方案的了解;设计地址变换机构,并将变换后的结果显示出来。模拟环境应尽量接近真实。此次设计利用了大量数据结构中关于链表的相关知识,对以前所学的数据结构相关内容进行了回顾,从而掌握的更加深刻。另外,对存储器的结构和工作过程也有了直观而深刻的理解。语言方面,本次课程设计运用了C++语言。原因是通过分析认为只有C++和C语言比较合适,而C++在结构上更加清晰,也比较容易表达,并且代码较少。通过代码编写和结构表达,对C++的内容有了更进一步的掌握。总之,对所学的数据结构和C++知识进行了很好的回顾和掌握,收获很大。2第二章系统分析本设计的目的是熟悉存贮器管理系统的设计方法;加深对所学各种存贮器管理方案的了解;要求采用一些常用的存贮器分配算法,设计一个存贮器管理系统模拟系统并调试运行。模拟环境应尽量接近真实。因此根据设计要求,本存储器管理系统利用最佳适应算法和首次适应算法实现了一定大小的分区分配和分区回收,并以次来模拟存储器管理。本系统模拟实现可变分区管理,存储管理主要是对存储空间的分配和回收,当有用户申请空间时,进行分配,空间不用了,及时回收,以免造成游离空间,使得该空间再也无法使用,可变分区管理的分配和回收功能类似于visualc++的reclaim()和free()的功能,分区收回算法,才用首次使用算法和最佳适应算法。在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一步是将程序和数据装入内存。存储器实现的功能主要是内存分配等功能,本模拟系统所要实现的就是将进程的程序和数据装入内存(物理块)。具体需要实现的功能如下:1、退出,输入0然后按任意键退出;2、分配主存,输入作业名和作业所需长度,回到主菜单;3、回收主存,选择后输入要回收的作业名,有则显示回收,无则显示无该作业;4、显示主存,能够显示分配的页面的状态信息,包括地址范围和读入的内存物理块号(未读入与读入的区别显示),页面是否在主存中。3第三章系统设计3.1数据结构的设计#definen10/*假定系统允许的最大作业数为n,假定模拟实验中n值为10*/#definem10/*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/3.1.1已分配区表的设计struct{floataddress;/*已分配分区起始地址*/floatlength;/*已分配分区长度,单位为字节*/intflag;/*已分配区表登记栏标志,用0表示空栏目*/}used_table[n];/*已分配区表*/3.1.2空闲区表的设计struct{floataddress;/*空闲区起始地址*/floatlength;/*空闲区长度,单位为字节*/intflag;/*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/}free_table[m];/*空闲区表*/3.2存储器分配算法设计本次设计采用最佳适应分配算法:allocate(charJ,floatxk)分配分区给用户,在这个过程中,每当分配一个分区给用户时,可能造成空闲区表和已分配区表。分配时从空闲区表中找到一块可以容纳要分配的空间的最小空闲区。然后分配,空闲分区被分配时,如果分配后剩余的空间小于minisize,则将该空闲分区全部分配,若大于minisize,则切割分配。分配时修改相应的空闲区表和已分配区表。如果没有找到可以容纳要分配的空间的空闲区就返回“无可用空闲区”信息。3.4存储器回收算法设计最佳适应策略的结点是按照空闲区大小从小到大排列的,可分4种情况:(1)上邻空闲区,下邻空闲区,三项合并;4(2)上邻空闲区,下邻非空闲区,与上邻合并;(3)上邻非空闲区,下邻为空闲区,与下邻合并;(4)上下邻均为非空闲区,回收区域直接填入。3.4主函数模块的设计首先提供一个功能菜单,接受用户的输入;然后根据用户的输入,分别提供相应的功能,功能有以下几个:0-退出1-分配主存2-回收主存3-显示主存。用户输入数字后执行相应模块。5第四章程序设计流程图或N-S图4.1主程序流程图:开始空闲分区表格初始化已分配表初始化用户输入功能判断用户输入0-退出1-分配空间2-回收空间3-显示空间退出分配空间回收空间显示空间结束120364.2分配函数流程图:开始寻找空间大于xk的最小空闲区登记项k找到可用空闲区k?空闲区k的大小-xk=minisize空闲区全部分配空闲区划出一部分分配修改已分配区返回NY74.3回收函数流程图:开始寻找已分配表中对应登记项未找到?修改已分配表取得归还分区的起始地址S和长度L寻找回收分区的空闲上下邻,上邻表目k,下邻表目j上邻空闲区?下邻空闲区?下邻空闲区?与上邻合并三项合并与下邻合并回收区域直接填入返回NYNYNYNprintf(找不到该作业\n)Y8第五章源程序清单#includestdio.h#includedos.h#includestdlib.h#includeconio.h#includeiostream.h#definen10/*假定系统允许的最大作业数为n,假定模拟实验中n值为10*/#definem10/*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/#defineminisize100/*空闲分区被分配时,如果分配后剩余的空间小于minisize,则将该空闲分区全部分配,若大于minisize,则切割分配*/struct{floataddress;/*已分配分区起始地址*/floatlength;/*已分配分区长度,单位为字节*/intflag;/*已分配区表登记栏标志,用0表示空栏目*/}used_table[n];/*已分配区表*/struct{floataddress;/*空闲区起始地址*/floatlength;/*空闲区长度,单位为字节*/intflag;/*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/}free_table[m];/*空闲区表*/voidallocate(charJ,floatxk)/*给J作业,采用最佳分配算法分配xk大小的空间*/{inti,k;floatad;k=-1;for(i=0;im;i++)/*寻找空间大于xk的最小空闲区登记项k*/if(free_table[i].length=xk&&free_table[i].flag==1)if(k==-1||free_table[i].lengthfree_table[k].length)k=i;if(k==-1)/*未找到可用空闲区,返回*/{printf(无可用空闲区\n);return;9}/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于minisize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/if(free_table[k].length-xk=minisize){free_table[k].flag=0;ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}/*修改已分配区表*/i=0;while(used_table[i].flag!=0&&in)/*寻找空表目*/i++;if(i=n)/*无表目可填写已分配分区*/{printf(无表目填写已分分区,错误\n);/*修正空闲区表*/if(free_table[k].flag==0)/*前面找到的是整个空闲分区*/free_table[k].flag=1;else{/*前面找到的是某个空闲分区的一部分*/free_table[k].length=free_table[k].length+xk;return;}}else{/*修改已分配表*/used_table[i].address=ad;used_table[i].length=xk;10used_table[i].flag=J;}return;}/*主存分配函数结束*/voidreclaim(charJ)/*回收作业名为J的作业所占主存空间*/{inti,k,j,s,t;floatS,L;/*寻找已分配表中对应登记项*/s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&sn)s++;if(s=n)/*在已分配表中找不到名字为J的作业*/{printf(找不到该作业\n);return;}/*修改已分配表*/used_table[s].flag=0;/*取得归还分区的起始地址S和长度L*/S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;/*寻找回收分区的空闲上下邻,上邻表目k,下邻表目j*/while(im&&(j==-1||k==-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==S)k=i;/*找到上邻*/if(free_table[i].address==S+L)j=i

1 / 20
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功