进程调度模拟设计—先来先服务、最高响应比优先调度算法课程设计
.
课程设计任务书
学生姓名: 闫敏 专业班级: 计科1103班 指导教师: 蔡菁 工作单位: 计算机科学与技术学院
目: 进程调度模拟设计——先来先服务、最高响应比优先调度算法
初始条件:
1(预备内容:阅读操作系统的处理机管理章节内容,对进程调度的功能以及进程
调度算法有深入的理解。
2(实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务: (包括课程设计工作量及其技术要求,以及
撰写等具体要求)
1(模拟进程调度,能够处理以下的情形:
? 能够选择不同的调度算法(要求中给出的调度算法);
? 能够输入进程的基本信息,如进程名、到达时间和运行时间等;
? 根据选择的调度算法显示进程调度队列;
? 根据选择的调度算法计算平均周转时间和平均带权周转时间。
2(设计
内容应说明:
? 课程设计目的与功能;
? 需求分析,数据结构或模块说明(功能与框图);
? 源程序的主要部分;
? 测试用例,运行结果与运行情况分析;
? 自我评价与总结。
时间安排:
设计安排3周:
查阅、分析资料 1天
系统软件的分析与建模 4天
系统软件的设计 5天
系统软件的实现 3天
撰写文档 1天
课程设计验收答辩 1天
设计验收安排:设计周的第三周的指定时间到实验室进行上机验收。
设计报告书收取时间:课程设计验收答辩完结时。
(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)
指导教师签名: 2013 年 12 月 10日
系主任(或责任教师)签名: 2013 年 12 月 10日 .
.
目录
1.课程设计目的与功能 ........................................................................... 3 2.需求分析与模块说明 ........................................................................... 3
2.1需求分析 ..................................................................................... 3
2.1.1功能需求............................................................................. 3
2.1.2环境需求............................................................................. 4
2.1.3用户界面需求 ..................................................................... 4
2.2模块说明 ..................................................................................... 5 3.源程序的主要部分............................................................................... 5
3.1数据结构 ..................................................................................... 5
3.2主要函数 ..................................................................................... 7 4.测试用例,运行结果与运行情况分析 ............................................. 10
4.1测试用例 ................................................................................... 10
4.2运行结果分析............................................................................ 12 5.自我评价与总结 ................................................................................ 12 6. 附录.....................................................................................................13
.
.
1.课程设计目的与功能
模拟进程调度,能够处理以下的情形:
? 能够选择不同的调度算法(要求中给出的调度算法); ? 能够输入进程的基本信息,如进程名、到达时间和运行时间等; ? 根据选择的调度算法显示进程调度队列;
? 根据选择的调度算法计算平均周转时间和平均带权周转时间。 2.需求分析与模块说明
2.1需求分析
2.1.1功能需求
(1)实现先来先服务法:
先来先服务算法基本思想:按照作业提交或进 程变为就绪状态的先后次序,调入系统或分派CPU ,换句话说,调度程序每次选择的作业进程是等待时间最久的,而不管其运行时间的长短。这种调度算法突出的优点是实现简单,效率较低,在一些实 际的系统和一般应用程序中采用这种算法的较多。因此,在设计中,首先对输入的各进程的提交时间进行比较,对先进入等待队列的进程提供服务。
(2)实现最高响应比优先调度算法:
最高响应比优先法(HRN)是对FCFS方式和SJF 方式的一种综合平衡。HRN调度策略同时考虑每个作业的等待时间长短和估计需要.
.
的执行时间长短,从中选出响应比最高的作业投入执行。响应比R定义如下:
R=(W+T)/T=1+W/T 其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间。每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行。这样,即使是长作业,随着它等待时间的增加,W/T也就随着增加,也就有机会获得调度执行。这种算法是介于FCFS和SJF 之间的一种折中算法。由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF 法,从而采用HRN 方式时其吞吐量将小于采用SJF 法时的吞吐量。另外,由于每次调度前要计算响应比,系统开销也要相应增加。
2.1.2环境需求
开发环境、运行环境及开发语言:
开发环境:Windows平台,Visual C++ 6.0
运行环境:Windows全系列平台
开发语言:C++
2.1.3用户界面需求
输入输出均采用命令行界面,格式如下:
首先,输入进程数;其次,输入进程编号、进程名、到达时间、执行时间等相关信息;然后,选择算法,先来先服务算法或最高响应.
.
比算法;最后,输出程序运行所得结果。
2.2模块说明
程序流程图如下:
进程1
1:先来 信息
先服务 输入 进程进程2开始 数 2:最高信息
响应比
进程n
信息 3:退出
程序
首先选择调度算法,若选1先来先服务然则调用create()创建进程队列,然后调用fcfsrun()进行先来先服务算法,后Goto到起始点。若选择2最高响应比算法则调用create()创建进程队列,然后调用Hrn()进行最高响应比算法,后Goto到起始点。若选择3则退出,选择其他则报错。
3.源程序的主要部分
3.1数据结构
创建一个进程信息结构:
struct PCB
.
.
{
string name;//进程名
float ta;//进程到达时间
float ts;//进程估计运行的时间
float tb;//进程开始运行时间
float tm;//进程仍需运行的时间
float to;//进程完成的时间
float rn;//进程运行的次数
float totalTime;//周转时间
double weightTotalTime;//带权周转时间(周转时间/估计运行时间)
PCB *next;//定义指向下一个进程的指针 };
此外,对输入信息进行创建链表队列: PCB *create(PCB *head)
{
PCB *p1,*p2;
p1=p2=new PCB;
head=p1;
cout<<"请输入进程数:";
cin>>pronum;
for(int i=0;i
next=NULL;
cout<<"请依次输入第"<>p1->name>>p1->ta>>p1->ts;
p1->tm=p1->ts;
p1->rn=1;
p2->next=p1;
}
return head;
}
3.2主要函数
struct PCB,,;//进程结构
#define MAX_NUM 15
PCB *create(PCB *head);//创建进程队列
void deal(PCB *head);//FCFS记录处理
void sort(PCB *head);//将进程按到达的先后顺序排列
void fcfsrun(PCB *head);//先来先服务算法
void Hrn(PCB *head,int n);//最高响应比算法 .
.
void main(){}//主函数
其中先来先服务算法和最高响应比算法具体如下: void fcfsrun(PCB *head)//先来先服务算法
{
deal(head);
PCB *p,*q,*s;
p=head->next;
cout<<"进程执行顺序为:";
while(p!=NULL)
{
cout<<"--"<name;
p=p->next;
}
cout<next;
while(s!=NULL)
{
cout<name<ta<tb<t
o<totalTime<weightTotalTime<next;
}
cout<next;
p=head;
while(head)
{
q=head;
if(time < p->ta) //如果该进程提交时间早于其它进程,则先执行该进程
time=p->ta;
flag=head; //用于暂存将要执行的进程
//计算当前链表中进程的响应比
while(q && q->ta <= time)
{
if((time - q->ta)/(q->ts) > (time - flag->ta)/(flag->ts))
flag=q;
q=q->next;
}
if(time < flag->ta)//如果上一次结束时间比当前选中要执行进程的结束时间小
time=flag->ta; //则当前进程开始时间为提交时间
//输出当前执行进程的信息
cout<name;
cout<ta;
cout<ts);
cout<ta + flag->ts);
cout<<" "<ta + flag->ts)/flag->ts)<ta+flag->ts); //当前执行进程的周转时间
runTime +=j; //记录周转时间
time+=flag->ts;
drunTime+=j/flag->ts; //带权周转时间
pname[xuhao]=flag->name;
xuhao++;
//将执行过的进程从链表中删除
if(flag==head) //在链表头
head=head->next;
else
{ //在链表中
.
.
p1=head;
while(p1->next!=flag)
p1=p1->next;
p1->next=flag->next;
delete flag; //删除这个进程所占的节点
}
}
cout<<"进程执行顺序为:";
for(ss=0;ss ";
}
cout<
#include
#include
using namespace std;
struct PCB
{
string name;//进程名
float ta;//进程到达时间
float ts;//进程估计运行的时间
float tb;//进程开始运行时间
float tm;//进程仍需运行的时间
float to;//进程完成的时间
float totalTime;//周转时间
float weightTotalTime;//带权周转时间(周转时间/估计运行时间)
PCB *next;//定义指向下一个进程的指针
};
#define MAX_NUM 15
int pronum;//定义进程数为pronum
float total;//记录所有进程的总时间
float weight;//记录所有进程的带权周转时间
PCB *create(PCB *head);//创建进程队列
void deal(PCB *head);//FCFS记录处理
void sort(PCB *head);//将进程按到达的先后顺序排列 void fcfsrun(PCB *head);//先来先服务算法
void Hrn(PCB *head,int n);//最高响应比算法
void main()
{
int choice;
.
.
cout<<"*进程调度模拟设计--先来先服务、最高响应比优先算法*"<>choice;
PCB *head=NULL;//?
switch(choice)
{
case 1:head=create(head);fcfsrun(head);goto l1;
case 2:head=create(head);Hrn(head,pronum);goto l1;
case 3:break;
default:cout<<"输入错误~\n请重新输入:"<>pronum;
for(int i=0;inext=NULL;
cout<<"请依次输入第"<>p1->name>>p1->ta>>p1->ts;
p1->tm=p1->ts;
p2->next=p1;
}
return head;
}
void sort(PCB *head)//将进程按到达的先后顺序排列
{
PCB *p,*q,*r,*s;
if(head->next!=NULL)
{
.
.
p=head->next->next;
head->next->next=NULL;
}
while(p)
{
q=p;
p=p->next;
r=head;
s=head->next;
while(s&&s->ta<=q->ta)
{
r=s;
s=s->next;
}
r->next=q;
q->next=s;
}
}
void deal(PCB *head)//FCFS记录处理
{
sort(head);
PCB *p,*q;
q=head->next;
q->tb=q->ta;
q->to=q->tb+q->ts;
q->totalTime=q->to-q->ta;
q->weightTotalTime=q->totalTime/q->ts;
total+=q->totalTime;
weight+=q->weightTotalTime;
p=q->next;
while(p!=NULL)
{
p->tb=q->to;
p->to=p->tb+p->ts;
p->totalTime=p->to-p->ta;
p->weightTotalTime=p->totalTime/p->ts;
total+=p->totalTime;
weight+=p->weightTotalTime;
q=p;
.
.
p=p->next;
}
}
void fcfsrun(PCB *head)//先来先服务算法
{
deal(head);
PCB *p,*q,*s;
p=head->next;
cout<<"进程执行顺序为:";
while(p!=NULL)
{
cout<<"--"<name;
p=p->next;
}
cout<next;
while(s!=NULL)
{
cout<name<ta<tb<t
o<totalTime<weightTotalTime<next;
}
cout<next;
p=head;
while(head)
{
q=head;
if(time < p->ta) //如果该进程提交时间早于其它进程,则先执行该进程
time=p->ta;
flag=head; //用于暂存将要执行的进程
//计算当前链表中进程的响应比
while(q && q->ta <= time)
{
if((time - q->ta)/(q->ts) > (time - flag->ta)/(flag->ts))
flag=q;
q=q->next;
}
if(time < flag->ta)//如果上一次结束时间比当前选中要执行进程的结束时间小
time=flag->ta; //则当前进程开始时间为到达时间
//输出当前执行进程的信息
cout<name;
cout<ta;
cout<ts);
cout<ta + flag->ts);
cout<<" "<ta + flag->ts)/flag->ts)<ta+flag->ts); //当前执行进程的周转时间
runTime +=j; //记录周转时间
time+=flag->ts;
drunTime+=j/flag->ts; //带权周转时间
pname[xuhao]=flag->name;
xuhao++;
//将执行过的进程从链表中删除
if(flag==head) //在链表头
head=head->next;
else
.
.
{ //在链表中
p1=head;
while(p1->next!=flag)
p1=p1->next;
p1->next=flag->next;
delete flag; //删除这个进程所占的节点
}
}
cout<<"进程执行顺序为:";
for(ss=0;ss ";
}
cout<方案正确性、可行性、创造性
4 40 设计结果正确性
5 10 设计报告的
性
6 10 设计验收
总得分/等级 评语:
注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
2014 年 月 日
.