武汉理工大学《操作系统》课程设计说明书
学 号:
课 程 设 计
题 目
进程调度模拟设计
时间片轮转、非强占式短进程优先算法
学 院
计算机科学与技术
专 业
计算机科学与技术
计算机
班 级
姓 名
指导教师
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<<" 时间片轮转法进程调度完成 !"<