1、基本分页存储管理系统的设计操作系统课程设计课程设计任务书及成绩评定课题名称 基本分页存储管理系统的设计 I、题目的目的和要求:巩固和加深对操作系统(OS)原理的理解,初步掌握操作系统组成模块和 应用接口的使用方法,提高进行工程设计和系统分析的能力;通过选做上面 的课题,实现OS最基本模块的管理功能,重点放在数据结构设计、文档规范 化和程序设计风格。II、设计进度及完成情况日期内 容6.16-7.18选取参考书,查阅有关文献资料,完成课程设计说明书内容 1部分。完成课程设计说明书内容2-4部分6.196.23创建相关数据结构,录入源程序6.246.25调试程序并记录调试中的问题,完成课程设计说明
2、书第5部分。6.26系统测试,演示设计成果,考核成绩。6.27整理课程设计说明书,上午 11时,由学习委员交课程设计说 明书(计算机科学系9#213或直接交给指导教师)m、主要参考文献及资料1汤子赢等计算机操作系统(第二版)西安电子科技大学出版社,2006.82冯耀霖等.操作系统,西安电子科技大学出版社 .19923谭耀铭. 操作系统.中国人民大学出版社,2003.44任爱华 操作系统实用教程 清华大学出版社,2001张尧学史美林计算机操作系统教程(第 2版)清华大学出版社2000IV、成绩评定:设计成绩: (教师填写)指导老师: (签字)二OOA 年 六月二十七日第一章概述 1第二章系统分析
3、 2第三章系统设计 3第四章 程序设计流程图或 N-S图 5第五章源程序清单 8第六章 调试过程中的问题及系统测试情况 14第七章结束语 16第一章概述课程设计是实践性教学中的一个重要环节,它以某一课程为基础,可以涉及和课程 相关的各个方面,是一门独立于课程之外的特殊课程。课程设计是让同学们对所学的课 程更全面的学习和应用,理解和掌握课程的相关知识。计算机操作系统一门重要的 专业课,是开发操作系统和软件系统的理论和应用基础。存储器是计算机系统的重要组成部分。近几年,虽然存储器的容量一直在不断的扩 大,价格也越来越便宜,但是仍然不能满足现代软件发展的需要。因此存储器仍是一种 宝贵的资源。因此尽可
4、能的方便用户和提高主存储器的使用效率,使主存储器在成本、 速度和规模之间获得较好的权衡是存储器管理的主要任务。 存储器管理应具有内存分配、内存保护、地址映射和内存扩充等功能。本设计的目的是熟悉存贮器管理系统的设计方法;加深对所学基本分页存储管理方 案的了解;设计地址变换机构,并将变换后的结果显示出来。模拟环境应尽量接近真实。此次设计利用了大量数据结构中关于链表的相关知识,对以前所学的数据结构相关 内容进行了回顾,从而掌握的更加深刻。另外,对存储器的结构和工作过程也有了直观 而深刻的理解。语言方面,本次课程设计运用了 C+语言。原因是通过分析认为只有 C+ 和C语言比较合适,而C+在结构上更加清
5、晰,也比较容易表达,并且代码较少。通过代 码编写和结构表达,对C+的内容有了更进一步的掌握。总之,对所学的数据结构和 C+知识进行了很好的回顾和掌握,收获很大。第二章系统分析本设计的目的是熟悉存贮器管理系统的设计方法;加深对所学各种存贮器管理方案 的了解;要求采用一些常用的存贮器分配算法,设计一个存贮器管理系统模拟系统并调 试运行。模拟环境应尽量接近真实。因此根据设计要求,本存储器管理系统利用最佳适 应算法和首次适应算法实现了一定大小的分区分配和分区回收,并以次来模拟存储器管 理。本系统模拟实现可变分区管理,存储管理主要是对存储空间的分配和回收, 当有用户申请空间时,进行分配,空间不用了,及时
6、回收,以免造成游离空间,使得该空间再也 无法使用,可变分区管理的分配和回收功能类似于 visual c+的reclaim。和free()的功能,分区收回算法,才用首次使用算法和最佳适应算法。在多道程序环境下,要使程序运行,必须先为之创建进程。而创建进程的第一步是 将程序和数据装入内存。存储器实现的功能主要是内存分配等功能,本模拟系统所要实现的就是将进程的程 序和数据装入内存(物理块)。具体需要实现的功能如下:1退出,输入0然后按任意键退出;2、 分配主存,输入作业名和作业所需长度,回到主菜单;3、 回收主存,选择后输入要回收的作业名,有则显示回收,无则显示无该作业;4、 显示主存,能够显示分配
7、的页面的状态信息,包括地址范围和读入的内存物理 块号(未读入与读入的区别显示),页面是否在主存中。第三章系统设计3.1数据结构的设计#define n 10 /*假定系统允许的最大作业数为 n,假定模拟实验中n值为10*/ #define m 10 /*假定系统允许的空闲区表最大为 m,假定模拟实验中m值为10*/3.1.1已分配区表的设计structfloat address; /*已分配分区起始地址*/float length; /*已分配分区长度,单位为字节*/int flag; /*已分配区表登记栏标志,用0表示空栏目*/used_tablen; /* 已分配区表 */3.1.2空闲区
8、表的设计structfloat address; /*空闲区起始地址*/float length; /*空闲区长度,单位为字节*/int flag; /*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/free_tablem; /* 空闲区表 */3.2存储器分配算法设计本次设计采用最佳适应分配算法:allocate(char J,float xk) 分配分区给用户,在这个过程中,每当分配一个分区给用户时,可能造成空闲区表和已分配区表。分配时从空闲区表中找到一块可以容纳要分 配的空间的最小空闲区。然后分配,空闲分区被分配时,如果分配后剩余的空间小于 minisize,则将该空闲分区全部分
9、配,若大于 minisize,则切割分配。分配时修改相应的空闲区表和已分配区表。如果没有找到可以容纳要分配的空间的空闲区就返回“无可 用空闲区”信息。3.4存储器回收算法设计最佳适应策略的结点是按照空闲区大小从小到大排列的,可分 4种情况:(1) 上邻空闲区,下邻空闲区,三项合并;上邻空闲区,下邻非空闲区,与上邻合并;(3)上邻非空闲区,下邻为空闲区,与下邻合并;(4)上下邻均为非空闲区,回收区域直接填入。3.4主函数模块的设计首先提供一个功能菜单,接受用户的输入;然后根据用户的输入,分别提供相应的 功能,功能有以下几个:0-退出1-分配主存2-回收主存3-显示主存。 用户输入数字后执行相应模
10、块。第四章 程序设计流程图或 N-S图4.1主程序流程图:开始空闲分区表格初始化已分配表初始化用户输入功能判断用户输入0-退出1-分配空间2-回收空间3-显示空间结束4.2分配函数流程图:4.3回收函数流程图:第五章源程序清单#in clude#in elude #i nclude#in clude#in clude#define n 10 /*假定系统允许的最大作业数为 n,假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为 m,假定模拟实验中m值为10*/#defi ne mi nisize 100 /*空闲分区被分配时,如果分配后剩余的空间小于 mi
11、nisize,贝U将该空闲分区全部分配,若大于 mini size,贝U切割分配*/structfloat address; /*已分配分区起始地址*/float length; /*已分配分区长度,单位为字节*/int flag; /*已分配区表登记栏标志,用0表示空栏目*/used_tablen; /* 已分配区表 */structfloat address; /*空闲区起始地址*/float length; /*空闲区长度,单位为字节*/int flag; /*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/free_tablem; /* 空闲区表 */void allocate(
12、char J,float xk) /*给J作业,采用最佳分配算法分配 xk大小的空间*/int i,k;float ad;k=-1;for(i=0;i=xk&free_tablei.flag=1)if(k=-1|free_tablei.le ngthfree_tablek.le ngth)k=i;if(k=-1)/*未找到可用空闲区,返回*/printf(无可用空闲区n);return;/*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于 minisize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于 minisize大小,则从空闲区划出一部分分配*/if(free_t
13、ablek .len gth-xk=mi nisize)free_tablek.flag=O;ad=free_tablek.address; xk=free_tablek .len gth;elsefree_tablek .len gth=free_tablek.le ngth-xk; ad=free_tablek.address+free_tablek.le ngth;/*修改已分配区表*/i=0; while(used_tablei.flag!=O&i=n) /*无表目可填写已分配分区*/printf(无表目填写已分分区,错误n);/*修正空闲区表*/if(free_tablek.flag
14、=0)/*前面找到的是整个空闲分区*/free_tablek.flag=1;else/*前面找到的是某个空闲分区的一部分*/free_tablek.le ngth=free_tablek .len gth+xk;return;else/*修改已分配表*/used_tablei.address=ad;used_tablei.le ngth=xk;used_tablei.flag=J;return;/*主存分配函数结束*/void reclaim(char J)/*回收作业名为J的作业所占主存空间*/int i,k,j,s,t;float S,L;/*寻找已分配表中对应登记项*/s=0;while
15、(used_tables.flag!=J|used_tables.flag=O)&s=n)/*在已分配表中找不到名字为J的作业*/printf(找不到该作业n);return;/*修改已分配表*/used_tables.flag=0;/*取得归还分区的起始地址S和长度L*/S=used_tables.address;L=used_tables.le ngth;j=-1;k=-1;i=0;/*寻找回收分区的空闲上下邻,上邻表目 k,下邻表目j*/while(im&(j=-1|k=-1)if(free_tablei.flag=1)if(free_tablei.address+free_tablei
16、.length=S)k=i;/* 找到上邻 */ if(free_tablei.address=S+L)j=i;/* 找到下邻 */i+;if(k!=-1)if(j!=-1)/*上邻空闲区,下邻空闲区,三项合并*/free_tablek.le ngth=free_tablej.le ngth+free_tablek .len gth+L; free_tablej.flag=O;else/*上邻空闲区,下邻非空闲区,与上邻合并 */free_tablek.le ngth=free_tablek.le ngth+L;elseif(j!=-1)/*上邻非空闲区,下邻为空闲区,与下邻合并 */free
17、_tablej.address=S;free_tablej.le ngth=free_tablej.le ngth+L;else/*上下邻均为非空闲区,回收区域直接填入 */*在空闲区表中寻找空栏目*/t=0;while(free_tablet.flag=1 &t=m)/*空闲区表满,回收空间失败,将已分配表复原*/printf(主存空闲表没有空间,回收空间失败n);used_tables.flag=J;return;free_tablet.address=S;free_tablet .len gth=L;free_tablet.flag=1;return;/*主存回收函数结束*/int ma
18、in()int i,a;float xk;char J;/*空闲分区表初始化:*/free_table0.address=10240; /起始地址假定为 10240*/ free_table0.length=10240; /*长度假定为 10240,即 10k*/ free_table0.flag=1; /*初始空闲区为一个整体空闲区*/for(i=1;im;i+)free_tablei.flag=0; /*其余空闲分区表项未被使用*/*已分配表初始化:*/for(i=0;i n ;i+)used_tablei.flag=0; /*初始时均未分配 */while(1)printf(选择功能项:
19、n0-退出n1-分配主存n2-回收主存n3-显示主存)n);printf(选择功项(0-3):n);scan f(%d,&a);switch(a)case 0: exit(0); /*a=0 程序结束 */case 1: /*a=1分配主存空间*/printf(输入作业名J和作业所需长度xk:);scan f(%*c%c%f,&J, &xk);allocate(J,xk); /*分配主存空间 */break;case 2: /*a=2回收主存空间*/printf(输入要回收分区的作业名);scan f(%*c%c,&J);reclaim(J); /*回收主存空间*/break;case 3:
20、/*a=3显示主存情况*/*输出空闲区表和已分配表的内容*/printf(输出空闲区表:n起始地址 分区长度 标志n);for(i=0;im;i+)prin tf(%6.0f%9.0f%6dn,free_tablei.address,free_tablei.le ngth, free_tablei.flag); printf(”按任意键,输出已分配区表n);getch();printf(输出已分配区表:n起始地址分区长度标志n);for(i=0;i n ;i+)if(used_tablei.flag!=0)prin tf(%6.0f%9.0f%6cn,used_tablei.address,u
21、sed_tablei.le ngth, used_tablei.flag);elseprin tf(%6.0f%9.0f%6dn,used_tablei.address,used_tablei.le ngth, used_tablei.flag);break;default:printf(没有该选项 n);/*case*/*while*/return 1;/*主函数结束*/第六章 调试过程中的问题及系统测试情况 系统测试情况:6. 1功能主菜单:6. 2选择功能1,输入作业名和长度:110 131进程5小的页袤-i6. 3选择功能3,显示系统主存空间表,按任意键显示已分配区表:雪 匚东吉OSo
22、sDebueos. axe -口 X!7-进程Z的贝表-I I【贡号 t块号 1I III |:0 :s ::1 :10 1!12KKXXiM料科耳KK 其 XiM料科耳KKKKX 料科科WKKXXiW继续(tf/h:sr选挂要进行的摆作:丄-申请内存2-回收内存皐查看逬程力 页卜.巧証程:进程名祈贡藪EVSTEM 11dd 2ss 3纟崔续6. 4选择功能2,回收以输入的作业:51 H: 王东吉OSVosDebugos. exe - X1:12:2t Q J4:4u ub 6:9?;118:139:2410 .131 1KEJCHmMSNKlCMrifMESMKXlCltWrUHfXaCKl
23、KlOffltSMatit 隧斜继续3n”y ggf进行壺懐島去申请内存6回收内存女查看进程2 i貝爲1八要回嘶勺浙王心: H第七章结束语通过实践,我也发现我的好多不足之处,首先在源程序的录入上就遇到了很大的麻 烦,由于英文录入的速度比较慢,在源程序代码的录入上就花费了很多的功夫,还有就 是C语言的基本功还不够扎实,出现了很多不该出现的毛病,还好在设计过程,让我深 深体会到老师在课堂上讲的内容和要注意的地方的重要性,也正是老师在课堂上提前给 我们做了提醒和学习,我在设计时才没花费太多的时间去更正这些问题。在以后的学习 中,我一定要注意基本功的学习。谢谢老师对我的指导与教诲,在今后的学习中一定会 用心再用心,不辜负老师对学生的教诲!参考文献:1汤子赢等计算机操作系统(第二版)西安电子科技大学出版社,2006.82冯耀霖等.操作系统,西安电子科技大学出版社.19923谭耀铭. 操作系统中国人民大学出版社,2003.44任爱华 操作系统实用教程 清华大学出版社,2001张尧学史美林计算机操作系统教程(第2版)清华大学出版社2000
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1