《操作系统课程设计处理机管理.pdf》由会员分享,可在线阅读,更多相关《操作系统课程设计处理机管理.pdf(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 操作系统课程设计 题 目:处 理 机 管 理 学 生 姓 名:XXX 学 院:信 息 工 程 学 院 系 别:计 算 机 系 专 业:软 件 工 程 班 级:软 件 09-1 指 导 教 师:XXX 教 授 XXX 教 授 2011 年 12 月 30 日 XXX 大学课程设计任务书 学院(系):课程名称:操作系统课程设计 指导教师(签名):专业班级:软件工程 091 学生姓名:XXX 学号:XXXXXXXXX 一、课程设计题目 处理机管理 二、课程设计的目的 学生通过设计一个模拟单处理机调度的算法,以巩固和加深处理机调度的概念。使学生初步具有研究、设计、编制和调试操作系统模块的能力。三、课
2、程设计的主要内容和要求(包括原始数据、技术参数、设计要求、工作量要求等)原始数据:进程控制块PCB结构体。技术参数:Windows XP系统,VC+6.0开发工具。设计要求:1设计基于时间片轮转法的处理机调度算法;2或设计基于先来先服务或基于优先权的处理机调度算法;3画出以上算法流程图;4编程实现算法功能;5编写课程设计说明书。工作量要求:完成以上设计要求中的所有算法功能。四、工作进度安排 周一:布置、讲解题目,收集资料;周二:系统分析,算法设计;周三:编制、调试程序;周四:测试系统,形成设计结论,编写课设报告;周五:系统及材料验收,课设答辩。五、主要参考文献 1 张尧学编计算机操作系统教程(
3、第三版)习题解答与实验指导北京:清华大学出版社,2006 2 汤子瀛主编计算机操作系统(第三版)西安:西安电子科技大学出版社,2001 3 张坤等编操作系统实验教程北京:清华大学出版社,2008 审核批准意见 系(教研室)主任(签字)目录 第一章 系统概述.1 1.1 功能简介.1 1.2 设计思路.1 第二章 系统功能分析和设计.2 2.1 系统主要结构模块.2 2.2 创建进程队列功能.2 2.3 对进程排序.3 2.4 输出所创建的信息.5 第三章 调试及运行结果.6 3.1 输入界面.6 3.2 输出界面.6 3.3 运行结果.6 3.4 各种情况的运行结果.7 第四章 总结.9 4.
4、1 遇到的问题以及解决方法.9 4.2 收获和体会.9 参考文献:.1 0 附录 程序源代码.1 1 XXX 大学操作系统课程设计 第 页 1 第一章 系统概述 1.1 功能简介 处理机调度是操作系统中非常重要的部分。在多道程序设计系统中,内存中有多道程序运行,他们相互争夺处理机这一重要的资源。处理机调度就是从就绪队列中,按照一定的算法选择一个进程并将处理机分配给它运行,以实现进程并发地执行。本系统就是设计了一个模拟单处理机调度的算法,以模拟实现处理机调度的基本功能。本系统是采用时间片轮转算法模拟单处理机调度。1.2 设计思路 系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把
5、CPU分配给队首进程,并令其执行一个时间片。时间片的大小由输入确定。当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中的队首进程,同时也让它执行一个时间片。这样就可以保证就绪队列中的所有进程在一给定的时间内获得一时间片的处理机执行时间。换言之,系统能在给定的时间内响应所有用户的请求。每个进程用一个进程控制块 PCB来代表。PCB的格式如图 1-1所示。进程名 链接指针 到达时间 估计运行时间 进程状态 图 1-1 进程控制块 其中,进程名即进程标识。XXX 大学操作系统课程设计 第 页 2 第二章
6、 系统功能分析和设计 在本章中,主要是介绍各个功能函数的设计思路和实现方法。2.1 系统主要结构模块 本系统主要分为:主函数,创建进程队列函数,对进程队列按到达时间进行排序,输出所创建的进程信息,执行时间片调度算法。在程序执行过程中通过主函数调用各个子函数来一次实现系统的各个功能。系统主要结构模块如图 2-1:程序主函数创建进程队列输出创建的进程信息所对进程排序执行调度算法 图 2-1 程序结构模块 2.2 创建进程队列功能 在此函数中输入所要创建进程的总个数n,然后再通过 for循环语句来控制,依次输入各个进程的属性值,再把刚创建的进程加入进程就绪队列的队尾,循环上述操作 n 次。其中,在创
7、建进程的过程中,进程的状态默认为就绪状态 s,指向下一进程的指针默认为空 NULL。程序流程图如图 2-2所示:XXX 大学操作系统课程设计 第 页 3 开始输入所要建进程数 nInt i=1ifront,max=head-front创建头结点hh-next=head-front1flag=0Flag=0?结束head-front=minhead-rear=max返回 head真 break真P=hp-next-next!=NULLr1=p-next;r2=p-next-next;p=p-nextr1-arrivetime r2-arrivetimer2-arrivetime arriveti
8、memin=r2r1-arrivetime max-arrivetimemax=r1flag=1;p-next=r2;r1-next=r2-next;r2-next=r1;真真假假真真假假 XXX 大学操作系统课程设计 第 页 5 2.4 输出所创建的信息 此函数所实现的主要功能就是:按照进程的到达时间依次输出各个进程的详细信息。再此函数中,首先定义一个进程控制块指针,指向进程队列中的第一个节点,通过 while语句(当 p!=NULL时)来控制 p=p-next循环,依次输出进程就绪队列中的各进程的详细信息。流程图如图 2-4所示:开始结束p=head-frontP=0?p=p-next输出
9、进程p的信息假输出“时间片轮转调度队列为空!”p!=NULL假真真 图 2-4 输出所创建的进程信息 XXX 大学操作系统课程设计 第 页 6 第三章 调试及运行结果 3.1 输入界面 在此,先输入要创捷的进程总数,然后依次输入各进程的进程名、到达时间、估计运行时间,如图 3-1所示:图 3-1 输入界面 3.2 输出界面 此界面是,输出经过排序后的进程队列,如图3-2所示:图 3-2 输出界面 3.3 运行结果 输出经过时间片轮转算法后的运行结果,如图3-3所示:XXX 大学操作系统课程设计 第 页 7 图 3-3运行结果 3.4 各种情况的运行结果 下图是各种不同情况的运行结果,如图3-4
10、,图 3-5,图 3-6:图 3-4 运行结果 XXX 大学操作系统课程设计 第 页 8 图 3-5 运行结果 图 3-6 运行结果 XXX 大学操作系统课程设计 第 页 9 第四章 总结 4.1 遇到的问题以及解决方法 首先,是对时间片算法以及处理机的具体调度过程不够熟练,通过看书和搜集一些资料解决了这个问题;其次,是在对单链表按到达时间进行排序时遇到了一些麻烦,后来经过认真思考与分析,成功地对单链表进行了排序;最后,是在编写程序的过程中出现了一些语法错误,后通过调试逐一解决。4.2 收获和体会 此次操作系统课程设计,在指导教师的精心教导下,以及同学们的积极讨论中,对处理机的调度问题有了深刻
11、的理解和认识,同时对其它的几个题目也有了一定的了解。首先要对程序的设计要求有一个比较明确的认识,然后系统分析与系统设计,最后是代码设计与调试。根据操作系统课程所学的概念、理论和方法,按照程序设计的基本步骤,设计出一个适当规模的程序;进一步加深了对处理机调度问题的理解和掌握。理论联系实际,加深和巩固所学的理论知识,提高实践能力和计算机的综合运用能力。我们编写程序的过程是辛苦与快乐的,程序的编写原则很重要,只要我们在编程,就必须不断改进,才能更好提高实践编程能力。XXX 大学操作系统课程设计 第 页 10 参考文献:1 张尧学主编计算机操作系统教程(第三版)北京:清华大学出版社,2006 2 张尧
12、学编计算机操作系统教程(第三版)习题解答与实验指导北京:清华大学出版社,2006 3 汤子瀛主编计算机操作系统(第三版)西安:西安电子科技大学出版社,2001 4 张坤等编操作系统实验教程北京:清华大学出版社,2008 5 张丽芬等编操作系统实验教程北京:清华大学出版社,2006 6 屠祁等编.操作系统基础(第三版)北京:清华大学出版社,2000 7 冯耀霖等编.操作系统.西安:西安电子科技大学出版社,2001 8 左万历计算机操作系统教程(第二版)北京:高等教育出版社,2004 XXX 大学操作系统课程设计 第 页 11 附录 程序源代码#include#include#include /定
13、义进程控制块/typedef struct pcb char pname20;/进程名 int arrivetime;/到达时间 int runtime;/运行时间 char state;/运行后的状态 struct pcb*next;PCB;/封装头结点,指针分别指向队头和队尾/typedef struct PCB*front,*rear;queue;/进程队列置空/queue*init()queue*head;head=(queue*)malloc(sizeof(queue);head-front=NULL;head-rear=NULL;return head;/检验进程队列是否为空/in
14、t empty(queue*head)return(head-front?0:1);/进程队列入队,往后插入/queue*append(queue*head,char c20,int a,int r,char s)XXX 大学操作系统课程设计 第 页 12 PCB*p;p=(PCB*)malloc(sizeof(PCB);strcpy(p-pname,c);p-arrivetime=a;p-runtime=r;p-state=s;p-next=NULL;if(empty(head)head-front=head-rear=p;else head-rear-next=p;head-rear=p;
15、return head;/创建进程队列/queue*creat(queue*head)char c20;char s=R;int a,r,i,n;printf(请输入共有几个进程:n);scanf(%d,&n);for(i=1;ifront,*max=head-front;int flag;h=(PCB*)malloc(sizeof(PCB);h-next=head-front;while(1)XXX 大学操作系统课程设计 第 页 13 flag=0;for(p=h;p-next-next!=NULL;p=p-next)r1=p-next;r2=p-next-next;if(r1-arrive
16、time r2-arrivetime)if(r2-arrivetime arrivetime)min=r2;if(r1-arrivetime max-arrivetime)max=r1;flag=1;p-next=r2;r1-next=r2-next;r2-next=r1;if(flag=0)break;head-front=min;head-rear=max;h-next=head-front;return head;/输出创建的进程队列/void print(queue*head)PCB*p;p=head-front;if(!p)printf(时间片轮转调度队列为空!n);while(p)
17、printf(pname=%s arrivetime=%d runtime=%d state=%c,p-pname,p-arrivetime,p-runtime,p-state);printf(n);p=p-next;/时间片轮转调度算法的实现/void RR(queue*head,int q)XXX 大学操作系统课程设计 第 页 14 int t=head-front-arrivetime,lt=head-rear-arrivetime;if(head-front-runtimefront-runtime;else t=t+q;/进程队列不为空才可调度/while(!empty(head)P
18、CB*p1,*p2;/*第一种情况:当前运行的时间小于最后一个进程到达的时间做以下操作*/while(tfront;printf(运行的时刻为%dt 运行的进程为%st,t,p1-pname);p1-runtime=p1-runtime-q;/1.运行时间小于 0,删除队首/if(p1-runtimestate=C;printf(运行后的状态为%cn,p1-state);head-front=p1-next;free(p1);/2.运行时间大于 0,向后找位置插入/else printf(运行后的状态为%cn,p1-state);p2=p1-next;while(p2-next&p2-arri
19、vetime!=t)p2=p2-next;/*此时无新进入队列的进程时,有两种情况:1.不用找位置往后插入,队首不变,XXX 大学操作系统课程设计 第 页 15 不做操作 2.找位置往后插入*/if(p2-arrivetime!=t)PCB*p3=p1,*p4;while(p3-next&p3-arrivetimenext;if(p3-arrivetimet)if(p4!=p1)/p1 插在 p4 后,头为 p1-next head-front=p1-next;p1-next=p4-next;p4-next=p1;else/不做操作/p4=p3=p2=NULL;else p4=p3=p2=NU
20、LL;/此时有新进入队列的进程时:p1 插在新进入队列的进程 p2 后,队首为 p1-next/else head-front=p1-next;p1-next=p2-next;p2-next=p1;/*时刻变化*/if(head-front-runtimefront-runtime;else t=t+q;/第一种情况结束/*第二种情况:当前运行的时间大于最后一个进程到达的时间做以下操作*/while(t=lt)XXX 大学操作系统课程设计 第 页 16 p1=head-front;printf(运行的时刻为%dt 运行的进程为%st,t,p1-pname);p1-runtime=p1-runt
21、ime-q;/1.运行时间小于 0,删除队首/if(p1-runtimestate=C;printf(运行后的状态为%cn,p1-state);head-front=p1-next;free(p1);/2.运行时间大于 0,直接插在队尾/else printf(运行后的状态为%cn,p1-state);/若原队列只有一个进程,不必往队尾插/if(!p1-next)head-front=p1;/若原队列有多个进程/else head-front=p1-next;head-rear-next=p1;head-rear=p1;p1-next=NULL;/*时刻变化,队列为空时不做时刻变化*/if(empty(head)return;else if(head-front-runtimefront-runtime;else t=t+q;/第二种情况结束/XXX 大学操作系统课程设计 第 页 17 void main()queue*head;int q;head=init();head=creat(head);head=sort(head);printf(您输入的时间片轮转进程队列为:n);print(head);printf(请输入时间片轮转调度的时间片为:n);scanf(%d,&q);RR(head,q);
限制150内