操作系统课程设计报告.doc_第1页
操作系统课程设计报告.doc_第2页
操作系统课程设计报告.doc_第3页
操作系统课程设计报告.doc_第4页
操作系统课程设计报告.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统程序设计操作系统程序设计 院 系: 计算机科学技术学院软件工程系 班 级: 软件 08 1 班 姓 名: x x x 学 号: x 号 指导教师: x x x 2010 年 6 月 26 日 操作系操作系统统模模拟实现拟实现 操作系统程序设计任务书操作系统程序设计任务书 一、题目:一、题目:操作系统模拟实现 二、设计要求二、设计要求 (1)独立完成 (2)良好的交流、沟通能力 (3)充分运用前序课所学的软件工程、程序设计等相关知识 (4)充分运用调试和排错技术 (5)简单测试驱动模块和桩模块的编写 (6)查阅相关资料,自学具体课题中涉及到的新知识。 (7)按要求写出课程设计报告,并于设计结束后 1 周内提交。其主要内容 包括:封皮、课程设计任务书,指导教师评语与成绩、目录、概述、软件需求 分析、总体设计、详细设计、程序的调试与测试、总结与体会、结束语、程序 清单(带中文注释) 、参考文献等。 三、三、设计内容及步骤设计内容及步骤 1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。 具体要求至少实现进程管理模拟、存储器管理模拟、文件管理模拟,并将几个 模块较好地集成一个整体,给出一个较好的用户界面。 2.根据实现的功能,划分出合理的模块,明确模块间的关系。 3.编程实现所设计的模块。 4.程序调试与测试。 5.结果分析。程序运行结果包括正确的输入及其输出结果和含有错误的输 入及其输出结果。 6.编写课程设计报告; 四、课程设计工作计划四、课程设计工作计划 2010 年 6 月 12 日前,指导教师讲课,学生根据题目准备资料,需求分析; 2010 年 6 月 13 日,提交软件总体模块结构图和分工方案; 2010 年 6 月 13 日2009 年 6 月 16 日,完成程序模块并通过独立编译; 2010 年 6 月 17 日2010 年 6 月 20 日,将各模块集成为一个完整的系统, 并录入足够的数据进行调试运行,数据必须存储到磁盘文件中,已备验收; 2010 年 6 月 22 日,验收、开始撰写课程设计报告; 2010 年 6 月 24 日前,提交课程设计报告,并将软件的源文件及报告的 word 文档打印交到老师办公室里。 指导教师签章: 教研室主任签章 操作系统导教师评语与成绩 指导教师评语: 课程设计表现成绩: 课程设计验收成绩: 课程设计报告成绩: 课程设计 总成绩: 指导教师签章 2010 年 7 月 日 i 目目 录录 目目 录录i 一、需求分析一、需求分析 1 1.1 功能需求1 1.2 背景描述1 1.3 具体设计内容分析1 二、总体概要设计二、总体概要设计 3 2.1 系统的特点3 2.2 抽象数据整合3 2.3 系统模块图5 三、详细设计三、详细设计 6 3.1 基本操作6 3.2 进程调度之时间片轮转详细设计7 3.3 模拟文件-改变目录流程10 四、程序的调试与测试四、程序的调试与测试 13 4.1 调试分析13 4.2 测试结果14 五、用户使用说明五、用户使用说明 19 六、总结与体会六、总结与体会 20 参考文献参考文献 21 附录附录:程序清单程序清单22 1 一、一、需求分析需求分析 1.1 功能需求 操作系统原理课程设计是软件工程专业实践性环节之一,是学习完 操作系统原理课程后进行的一次较全面的综合练习。其目的在于加深对操 作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种 典型算法,进程调度、内存管理、文件管理、等各种调度管理算法模拟,系统 地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系 统的发展动向和趋势。 1.2 背景描述 经过一个学期的操作系统原理 、 操作系统实验教程课程的学习,我 们学到了很多理论上的知识,对操作系统及其各方面的功能有了深刻的认识, 但这是远远不够的,我们要讲理论编程实践,虽然我们学习期间做过很多的实 验,但是都是针对操作系统的某一块具体的功能的,我们对了解了每块具体的 功能的实现,但是,整体说来还是模糊,所以,很有必要将各个模块整合起来, 也就是模拟一个操作系统,这样,不仅跟深入学习了各个模块,更认识了一个 完整的 os,对我们来说受益匪。 1.3 具体设计内容分析 本次课程设计所用环境:vc+6.0,采用控制台界面至少实现进程管理模 拟、存储器管理模拟、文件管理模拟,并将几个模块较好地集成一个整体,实 现各个管理调度算法的功能,并给出一个较好的用户界面。 进程管理模拟:在多道程序运行环境下,进程数目一般多于处理机数目,是 的进程要通过竞争来使用处理机。这就要求系统能按某种属案发,动态的把处 理机分配给就绪队列中的一个进程,使之运行。进程调度包括常用的:先来先 服务、时间片轮转、优先权等因为以前已经实现,所以这次 模拟整合到一起不 算很难。 存储器管理模拟:主存是中央处理器直接存取指令和数据的存储器,能否 合理的利用主存,在很大程度上将影响到整个计算机系统的性能。在多道作业 和多进程环境下,共享主存空间。当作业执行完毕或进程运行结束后将主存空 2 间归还系统。这次模拟包括:贮存分配与回收、基于分页的内存调度算法。有 于模拟的比较简单,仅实现了最先适应算法、和先来先服务、最近你最久未使 用的调度算法,实现比较简单。 文件管理模拟:用于用户界面和操作命令在操作系统中的作用,实现操作 系统中对文件的管理。文件中建立一个双向链表,每个聊表节点又是单链表的 头结点,对目录、文件操作比较简单。 3 二、总体概要设计二、总体概要设计 2.1 系统的特点 本次可设主要是简单的模拟一个操作系统,包括一个主界面,实现了银行 家算法、模拟文件管理、主存空间的分配与回收、进程调度等功能。模拟了操 作系统的进程管理、文件管理、存储器管理。银行家算法,包括了新加作业、 申请资源、撤销作业、查看资源情况四个模块。如果申请资源后系统进入不安 全状态,则申请失败。进程调度实现了调度进程的三个主要算法优先数、 先来先服务、时间片轮转法。其中,优先数算法中优先数的确定为(50-进程的 服务时间) ,每轮一次优先数-3。时间片轮转法的时间片由用户自己输入。存储 器管理实现了申请空间、撤销作业、显示空闲表等功能。如果空闲空间不足则 申请失败。模拟文件管理很全面,包含了创建目录、删除目录、改变目录、创 建文件、删除文件、显示目录的功能。另外,我还加了回到根目录的功能。 2.2 抽象数据整合 银行家算法: const int max_p=20; / 进程的最大容量 const int maxa=10; / a 类资源的最大数量 const int maxb=5; /b 类资源的最大数量 const int maxc=7; /c 类资源的最大数量 typedef struct anode int a,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/; bank; typedef struct node1 char name20; int a,b,c,need_a,need_b,need_c; process; / 进程的结构体结点 模拟文件管: 4 typedef struct bnode char name50; int type;/*0 代表目录,1 代表普通文件*/ struct bnode *next,/* 兄弟节点*/*sub,/*第一个子节点*/*father/*父节点*/; int size; /*文件的大小*/ dirnode; dirnode *workdir;/当前工作目录 dirnode root;/根目录 char path100;/定义路径信息 const int maxjob = 100;/定义最大记录数 存储器管理: 首先需要建立空闲区数据文件,空闲区数据文件包括若干行,每行有两个 字段:起始地址,内存块大小(均为整数) ,各自段一逗号隔开。空闲区数据文 件: 0,10 10,08 18,10 28,06 34,10 44,09 空闲表的结构: typedef struct cnode int start; int length; char tag20; job; job freesmaxjob;/定义空闲区表 int free_quantity; job occupysmaxjob; int occupy_quantity; 进程调度: 进程存在的标识是进程控制块(pcb) ,进程控制块结构如下: typedef struct dnode char name10; 5 int prio; int round; int cputime; int needtime; int count; char state; struct dnode *next; pcb; / 进程的 pcb pcb *finish,*ready,*run,*r; 2.3 系统模块图 图 1 系统模块图 进程调度 存储器管理 模拟文件管理 主界面 新加作业 银行家算法 申请资源 撤销资源 申请资源 优先数调度 时间片轮转 先来先服务 申请空间 撤销作业 显示空闲表 改变目录 创建目录 创建文件 删除文件 显示目录 申请资源申请资源申请资源 6 三、详细设计三、详细设计 3.1 基本操作 1)银行家算法:银行家算法主要由 5 个函数实现了四大功能,即新加作业、 为作业申请资源、撤销作业、查看资源情况。 void yinitial() /初始化函数 void add() / 新加作业函数 void bid() /为作业申请资源 void yfinished()/撤销作业 void yview()/查看资源情况 2)模拟文件管理:模拟文件管理实现了很多功能,当然也有很多函数,每 一个文件和目录都是用一个节点来描述的,用 type 来控制,有两个值,0 和 1,0 代表目录,1 代表普通文件 void minitial() /初始化目录函数 dirnode * init() /初始化新节点的函数 void cd(char dirname) /改变目录 void create(char filename,int filesize) /创建文件 void del(char filename)/删除文件 void dir(dirnode *p) /现实所有目录,本目录下所有兄弟目录和文件 void dirs(dirnode *p,char str)/显示由目录下子目录中的文件和目录 void lsall()/显示所有目录 void md(char dirname)/创建目录 void rd(char dirname)/删除目录 3)存储器管理: void initial()/初始化函数 int readdata()/读数据函数 void sort()/将空闲块按照从小到大的顺序排序 void zview()/显示函数 void earlist()/最先适应分配算法 void zfinished()/撤销作业 4)进程调度: void firstin()/调度进程使之运行 void prt1(char a)/* void prt2(char a ,pcb *q) 7 void prt(char algo)*/ 上面的三本分主要是显示出来进程的调度情况 void insert1(pcb *q)/插入新的进程 void creat1(char alg)/* void creat2(char alg)*/ 以上两个实现进程的创建 void priority(char alg)/优先数算法的实现 void roundrun(char alg)/时间片轮转法的实现 void fcfsrun(char alg)/先来先服务算法的实现 void xianshi()/显示主界面的函数 void yinhangjia()/主函数掉该函数实现银行家算法 void wenjianguanli()/主函数调度该函数实现文件管理 void zhucunkongjian()/主函数调度该函数实现存储器管理 void jinchengdiaodu()/主函数调度该函数实现进程调度 3.2 进程调度之时间片轮转详细设计 进程调度中对于先来先服务调度原理简单、实现也很简单、对于优先数调 度来讲,每次调度的就是优先权最高的,所以每次只要找到优先权最高的就能 实现,用到 2 个单链表:一个等待服务、一个连接完成。在这里就不多说了。 对于时间片轮转,可以设定时间片大小、中途不能改变,我就建立一个循 环链表来存放等待进程,一个单链表来连接完成的进程。这个实现的时候,费 了不少劲儿,但最终能没有 bug 的显示出来。这个调度有一个缺陷:要求进程 必须是同时到达,由于时间仓促,我就没设计这个内容。如果涉及的话,我感 觉能整出来无非是多加个标记,标签来判断进程的到达及服务。 忘了说了,对于时间片算法,进程我是按顺序进行插入的。 主要核心代码: void creat2(char alg) pcb *p; int i,time,round; char na10; ready = null; finish = null; run = null; printf(“请输入时间片:“); scanf(“%d“, printf(“输入进程号和运行时间:n“); 8 for(i = 1; i name,na); p-cputime = 0; p-needtime = time; p-state = w; p-count = 0; p-round = round; p-next = null; if(i = 1)/*按顺序插入到 ready 链表中*/ r = ready = p; else r-next = p; r = p; /clrscr(); printf(“ 时间片轮转算法输出信息:n“); printf(“*n“); prt(alg); void roundrun(char alg) bool flag;/当 ready 列里只有一个时做标记 while(n) flag = 1;/初始化为 1 run = ready;/run 每次运行 ready 的队头 run-count+;/没运行一次计数器加 1 if(run-needtime round)/当剩余时间小于时间片轮转时间时的情 况 run-cputime += run-needtime; run-needtime = 0; else run-cputime += run-round; 9 run-needtime -= run-round; run-state = w;/变为等待 if(ready-next != null) ready = ready-next; else flag = 0;/当 ready 剩一个时做标记 if(run-needtime = 0)/当 run 结束时放入 finish 队列里 run-next = finish; finish = run; run-state = f; n-;/进程数少 1 else if(flag)/执行完如果不是剩一个的话,就把 run 放到队尾 r-next = run; r = run; r-next = null; if(n)ready-state = r;/结束时不应该有r“ else ready = null;/结束时应该为空 prt(alg);/输出 截图显示:图 a、b、c。 图 a 时间片轮转算法界面 10 图 b 时间片轮转算法开始 图 c 时间片轮转运行结束 3.3 模拟文件-改变目录流程 由于模拟文件管理采用双向链表,可以来回搜索。进入子目录后还可以回 到根目录,所以就在程序加了返回到上一级目录的功能,就是在 cd()函数里加 个条件,控制回到子目录还是上级目录。 主要代码: void cd(char dirname) dirnode *p; int flag=0; if(strcmp(dirname,“) p=workdir-sub; if(p=null) coutname ,dirname) flag=1; break; p=p-next; if(flag=1) workdir=p; strcat(path,“); strcat(path,p-name); coutfather; for(int i = strlen(path)-1; i = 0; i-) if(pathi =) pathi = 0;break; coutnext 进入子目录子目录不存在 已是根目录 结束 n y y nn y 图 2 改变目录流程 13 四、程序的调试与测试四、程序的调试与测试 4.1 调试分析 (1)在试验过程中遇到了很多错误,最开始的时候,在将各个模块连接起来的 时候几个函数的名字一样,出现了错误,如图: 图 3 错误显示 后来将函数的名字都改变了一下。 (2)在主函数中将各个模块的主函数连起来的时候,退出来的时候整个程序就 结束了,而我是想推出来的时候是退回到主界面,后来又给改了一下,加了一 个 while 循环,还有变量 flag,有 flag 来控制,当 flag=0 的时候就跳出 while 循 环,然后清屏,掉一个编好的显示函数,显示主界面,这样就退回了主界面, 后来又发现主函数有很多东西,很乱,我又将每个模块的主函数部分又分出去 一个函数,这样主函数掉每个模块的原来的主函数部分就好了。 (3)在内存调度算法中由于 windows 里面没有 getpid()函数不了解 rand()就用 结果造成却也计算率也来小。如图: 图 4 内存调度算法 fifo 中无 getpid()错误 14 4.2 测试结果 可设主界面:如图 图 5 设计主界面 银行家算法: 图 6 银行界算法主界面 新加作业: 图 7 添加作业 查看资源情况: 15 图 8 资源使用情况 为作业申请资源: 图 9 申请资源 撤销作业: 图 10 撤销作业 模拟文件管理:如图 创建目录: 图 11 模拟文件管理界面 改变目录: 16 图 12 改变目录 回到上一级目录: 图 13 返回上一级目录 显示目录: 图 14 显示所有目录 存储器管理模拟:如图 显示空闲表: 17 图 15 显示空闲区分配表 申请空间: 图 16 申请空间 进程调度模拟: 优先数算法: 图 17 优先数算法 时间片轮转法: 18 图 18 时间片轮转法 先来先服务算法: 图 19 先来先服务算法 19 五、用户使用说明五、用户使用说明 这次的课程设计实验主要是模拟一个操作系统的各个功能算法,重点在于 算法的描述,应用。当运行的时候会出现一个主界面,上面列出了该系统主要 实现的功能,可以根据提示选择 1.、进程调度 2、贮存空间分配与回收 3、模拟 文件管理 4、内存调度算法 5、银行家算法 6、 退出系统。选择完后就进入该 模块,如果选择的是 1 即银行家算法,进去后界面也会有提示,1、新加作业, 2,、为作业申请资源 3、撤销作业 4、查看资源情况、0 退出系统,选择你想要 操作的。会提示你相应的操作。如果选择的是 2 即模拟文件管理,进入后也有 界面给予提示,但是这个模块有先后顺序,即应该先创建目录,之后在进行其 他操作,我还加入了一个额外的功能,如果输入 cd 就会回到上一级目录里。 如果选择的是 3,即存储器管理,这个模块首先要在改程序在同一目录下建立 一个空闲表,进入该模块后首先要输入改空闲表,例如,input.txt,如果该空闲 表存在的话就会继续往下进行,根据提示做想要实现的操作。如果选择的是 4,即进程调度,进入后可以选择 p、优先数算法,r、时间片轮转法 f、先来 先服务算法、e 退出时间片轮转法的时间片由用户来定。这些模块中的退出都 是退到主界面的,要想退出本系统,在主界面里有一个退出。 20 六、总结与体会六、总结与体会 这次课程设计对我来说获益很大、体会很深,通过这次课程设计将所学的 操作系统课程的知识用于实践,对所学的知识有了系统的了解、更深刻。在将 各个模块连起来过正中首先要对各个模块都深入了解,不仅复习了所学的,以 前不明白的现在明白了好多,而且对“操作系统”不再陌生,但是“操作系统 “所要做的绝不是这么少的,所学的这些是远远不够的,希望还能有更深的了 解。 这次课程设计让我我熟练的练习了 vc+6.0 环境,更让那个我了解和运用 了 linux 操作系统,了解了 os 内核结构,核心操作,以及最基本的 os 管理。 对以后学习有很大帮助。 这次课程设计给我了很大的启示:无论学什么都要一步一个脚印,不能前 面开始学很有劲头,后面就松懈了,要持之以恒。感谢老师耐心的教导,您认 真的态度对我们很有帮助、很亲切,但对我来说是提升自身,我想我的 it 之路 还没走完,会有更深入的学习。再次感谢老师! 21 22 参考文献参考文献 1 李登实,徐宏云,计算机操作系统实验,北京,清华大学出版社, 2000 年 9 月。 2汤小丹,梁红兵,计算机操作系统,西安,西安电子科技大学出版社, 2007 年 5 月。 23 附录附录:程序清单程序清单 源码附录: #include #include #include using namespace std; #include #include #include const int max_p=20; const int maxa=10; const int maxb=5; const int maxc=7; typedef struct anode int a,b,c,/*三种资源总数*/remain_a,remain_b,remain_c/*三种资源剩余数*/; bank; typedef struct node1 char name20; int a,b,c,need_a,need_b,need_c; process; bank banker; process processesmax_p; int quantity;/作业的数量 typedef struct bnode char name50; int type;/*0 代表目录,1 代表普通文件*/ struct bnode *next,/* 兄弟节点*/*sub,/*第一个子节点*/*father/*父节点*/; int size; /*文件的大小*/ dirnode; dirnode *workdir;/当前工作目录 dirnode root;/根目录 char path100;/定义路径信息 24 const int maxjob = 100;/定义最大记录数 typedef struct cnode int start; int length; char tag20; job; job freesmaxjob;/定义空闲区表 int free_quantity; job occupysmaxjob; int occupy_quantity; typedef struct dnode char name10; int prio; int round; int cputime; int needtime; int count; char state; struct dnode *next; pcb; pcb *finish,*ready,*run,*r; int n; /银行家算法 /初始化函数 void yinitial() int i; banker.a=maxa; banker.b=maxb; banker.c=maxc; banker.remain_a=maxa; banker.remain_b=maxb; banker.remain_c=maxc; for(i=0;iname; for(i=0;ineed_a; coutneed_c; t=1; if(need_abanker.remain_a ) 26 coutname;/输入 27 p=-1; for(i=0;ia; coutc; flag=1; if(abanker.remain_a)|(aprocessesp.need_a-processesp.a) coutprocessesp.need_b-processesp.b) coutprocessesp.need_c-processesp.c) coutname; p=-1; for(i=0;iname ,dirname) flag=1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论