logo资料库

进程调度模拟设计—时间片轮转、非强占式短进程优先算法.doc

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
武汉理工大学《操作系统》课程设计说明书 学 号: 课 程 设 计 题 目 进程调度模拟设计 时间片轮转、非强占式短进程优先算法 学 院 计算机科学与技术 专 业 计算机科学与技术 计算机 班 级 姓 名 指导教师 2010 年 01 月 18 日
武汉理工大学《操作系统》课程设计说明书 课程设计任务书 学生姓名: 专业班级: 指导教师: 工作单位: 计算机科学与技术学院 题 目: 进程调度模拟设计——时间片轮转、非强占式短进程优先算法 初始条件: 1.预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程调度算法有 深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.模拟进程调度,能够处理以下的情形: ⑴ 能够选择不同的调度算法(要求中给出的调度算法); ⑵ 能够输入进程的基本信息,如进程名、到达时间和运行时间等; ⑶ 根据选择的调度算法显示进程调度队列; ⑷ 根据选择的调度算法计算平均周转时间和平均带权周转时间。 2.设计报告内容应说明: ⑴ 课程设计目的与功能; ⑵ 需求分析,数据结构或模块说明(功能与框图); ⑶ 源程序的主要部分; ⑷ 测试用例,运行结果与运行情况分析; ⑸ 自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正; iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他方法(如果有,简要说明该方法); v)对实验题的评价和改进意见,请你推荐设计题目。 时间安排: 设计安排一周:周 1、周 2:完成程序分析及设计。 周 2、周 3:完成程序调试及测试。 周 4、周 5:验收、撰写课程设计报告。 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日 1
武汉理工大学《操作系统》课程设计说明书 进程调度模拟设计 (时间片轮转、非强占式短进程优先算法) 1 课程设计目的与功能 1.1 设计目的 通过设计、编制、调试一个进程调度模拟程序,加深对处理机调度以及各种调度算法 原理的理解,并实现时间片轮转、非强占式短进程优先算法。通过学习操作系统的关于处 理机管理的相关内容,设计并编写进程调度的模拟程序,使用时间片轮转、非强占式短进 程优先算法,能够输出各个进程的执行情况,并输出进程的平均周转时间和平均带权周转 时间,以对进程调度有更加直观的了解,加深对处理机调度的理解,复习 C++高级语言的 使用,加强自己的理论水平和实际的动手能力。 1.2 设计功能 本次课程设计模拟进程调度,须实现以下几种功能: (1) 让用户输入进程的相关信息,如进程名、提交时间、运行时间,并能够判断信 息的正确性。 (2) 对于同一组数据,让用户挑选时间片轮转算法和非强占式短进程优先算法来进 行进程调度。 (3) 对于时间片轮转法,要求输出每一个有效时间片的具体信息,即所有时间片所 对应的进程以及时间片的大小。对于非强占式短进程优先算法,要求输出进程 执行的顺序以及开始时间和结束时间。 (4) 对于进程,要求输出进程的开始运行时间、结束时间、周转时间、带权周转时 间,并输出对应的平均周转时间和平均带权周转时间。 1.3 开发环境 使用系统:Windows 7 使用语言:C++ 开发工具:Visual Studio 2008 2
武汉理工大学《操作系统》课程设计说明书 2 需求分析,数据结构或模块说明 2.1 需求分析 通过设计一个模拟进程调度的系统,来实现进程调度,对进程调度的功能以及进程调 度算法有一个更加深入的理解。其中进程的状态可以分为等待、就绪、执行、完成这几种。 在本次模拟中,进程都是独立的,没有进程间的合作,故可以省掉等待这个状态。 用户只需要输入进程的进程名、到达时间、预计运行时间,然后选择调度算法(时间 片轮转法、非强占式短进程优先),然后就可以得到进程的执行情况,查看结果可得到相 应算法的调度序列,每个进程的到达时间、预计运行时间、开始时间、结束时间和周转时 间、带权周转时间,以及平均周转时间和平均带权周转时间,以及平均周转时间和平均带 权周转时间。 2.2 数据结构或模块说明 2.2.1 数据结构 此次课程设计中,进程作为基本数据处理单元,需要对进程的基本信息进行相关的描 述。进程的基本信息包括进程进程名、到达的时间、预计的进程运行时间、开始时间、结 束时间、周转时间、带权周转时间、是否在等待队列中。设计一个模块,用以实现进程的 基本信息的定义和封装,提高设计的简洁性,如使用类模块。其中进程的信息默认是 public 的,故使用 struct 来定义。 struct process{ string name;//进程名 double submittime;//提交时间 double runtime;//预计运行时间 double starttime;//开始时间 double endtime;//结束时间 double ontime;//周转时间 double ontimepower;//带权周转时间 double remaintime;//运行剩余时间 int ready;//是否在就绪队列中,1 是 0 否 }; 此次程序主要是利用数组来实现的,在程序中定义了一个结构体数组 process pro[N] 3
武汉理工大学《操作系统》课程设计说明书 用来保存每一条记录,每个结点包括进程进程名、到达的时间、预计的进程运行时间、开 始时间、结束时间、周转时间、带权周转时间、是否在等待队列中。 对于时间片轮转法,以时间为主线设计算法,起始时间为 now,初值为 0,将提交时间 小于 now 的进程加入到就绪队列中,并将就绪队列中进程的标号保存在 a 数组中,如果 a 数组中的进程数为 0,则改变 now 的值,使 now 变为所有未完成进程中提交时间最小的值, 然后再次对 a 进行赋值,选出就绪中第一个进程,并让次进程退出就绪队列,运行一个时 间片 slicetime,然后将在这一个时间片中提交的进程加入就绪队列,并将新加入的进程 以提交时间进行排序,最后如果进程没有运行完,则加入到就绪队列的尾部。这是基本的 算法过程。其中时间片的大小由用户输入,如果一个进程的剩余运行时间小于一个时间片, 则这个进程运行结束后,这个时间片就结束,开始下一个时间片。 对于非强占式短进程优先,相对于时间片轮转法比较简单。因为一个进程一次就运行 完成了,对于就绪队列,只要找出运行时间最短的就行了,在提交时间小于 now 的前提下, 不必考虑提交时间影响执行的顺序。这个算法思路和时间片轮转法很相似,但相对简单, 主要区别在于这个就绪队列是每次调用时都会全部刷新一次,这样算法上就简单了许多。 2.2.2 模块说明 本次程序中主要函数的作用如下: int isover(process pro[],int num)//判断所有进程是否运行完毕 void readyqueue(process pro[],int a[],int num,int &length,double now) //将新提交的进程加入到就绪队列中,并将标号保存在 a 中 void set(process &p,double &t,double slicetime) //时间片轮转法,对进程的属性进行设置 void output(process pro[],int num)//将所有进程的所有信息输出 void set(process &p,double &t)//短进程优先法,对进程的属性进行设置 int find(process pro[],int a[],int num,double now) //将提交的所有进程加入到就绪队列中,并找出运行时间最短的一个,返回 void roundrobin(process pro[],int num)// 时间片轮转法 void shortfirst(process pro[],int num)// 短进程优先法 4
武汉理工大学《操作系统》课程设计说明书 3 源程序的主要部分 3.1 时间片轮转法对于就绪队列中进程的操作 void readyqueue(process pro[],int a[],int num,int &length,double now) { int len=length;//保存 length for(int i=0;ipro[a[j]].submittime){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } } 此函数主要是将提交时间小于 now 的新进程加入到就绪队列中,由于进程的提交时间 对于时间片轮转法很重要,必须对进程进行排序。 3.2 时间片轮转法 5
武汉理工大学《操作系统》课程设计说明书 void roundrobin(process pro[],int num) { cout<<"时间片轮转法进程调度开始: "<>slicetime; }while(slicetime<=0); double now=0; int a[N];//就绪的进程数组 for(int i=0;i
武汉理工大学《操作系统》课程设计说明书 now=pro[i].submittime; } readyqueue(pro,a,num,length,now); } int first=a[0]; for(int i=0;i>ch; if(ch=='Y'||ch=='y') output(pro,num); cout<<" 时间片轮转法进程调度完成 !"<
分享到:
收藏