操作系统短作业优先调度算法Word格式文档下载.docx
《操作系统短作业优先调度算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统短作业优先调度算法Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
一、实验题目
采用短作业优先算法的的进程调度程序
二、课程设计的目的
●操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合一起,独立分析和解决实际问题的机会。
●进一步巩固和复习操作系统的根底知识。
●培养学生结构化程序、模块化程序设计的方法和能力。
●提高学生调试程序的技巧和软件设计的能力。
●提高学生分析问题、解决问题以与综合利用C语言进展程序设计的能力。
三、设计容
设计并实现一个采用短作业优先算的进程调度算法演示程序
四、设计要求
1.每一个进程有一个PCB,其容可以根据具体情况设定。
2.进程数、进入存时间、要求服务时间、优先级等均可以在界面上设定
3.可读取样例数据〔要求存放在外部文件中〕进展进程数、进入存时间、时间片长度、进程优先级的初始化
4.可以在运行中显示各进程的状态:
就绪、执行〔由于不要求设置互斥资源与进程间同步关系,故只有两种状态〕
5.采用可视化界面,可在进程调度过程中随时暂停调度,查看当前进程的状态以与相应的阻塞队列
五、主要数据结构与其说明
算法的根本概念和原理:
本次课程设计主要是采用短作业优先算法进程的进程调度过程。
短作业优先调度算法,是指对短作业或短进程优先调度的算法。
他们可以分别用于作业调度和进程调度,短作业优先的调度算法是从后备队列中选择一个或假设干个估计运行时间最短的作业,将他们调入存运行。
而短进程优先调度算法如此是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给他,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再度重新调度。
本程序采用了非抢占式短作业优先调度。
而非抢占式这种方式,一旦把处理机分配给某进程后,便让该进程一直执行,直至该进程完成或发生某事件而被阻塞时,才再把处理机分配给其它进程,决不允许某进程抢占已经分配出去的处理机。
这种调度方式的优点是实现简单,系统开销小,适用于大多数的批处理系统环境。
但它难以满足紧急任务的要求——立即执行,因而可能造成难以预料的后果。
因此,在要求比拟严格的实时系统中,不宜采用这种调度方式。
本课程设计主要是在满足要求多道单处理机的情况下进展短作业的优先调度。
算法的简要说明:
短作业〔进程〕优先调度算法SJ〔P〕F,是指对短作业或短进程优先调度的算法。
它们可以分别用于作业调度和进程调度。
短作业优先〔SJF〕的调度算法是从后备队列中选择一个或假设干个估计运行时间最短的作业,将它们调入存运行。
而短进程〔SPF〕调度算法如此是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机再重新调度。
优点是SJ(P)F调度算法能有效地降低作业〔进程〕的平均等待时间,提高系统吞吐量。
缺点是该算法对长作业不利;
完全未考虑作业的紧迫程度,因而不能保证紧迫性作业〔进程〕长期不被调度;
由于作业〔进程〕的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业游戏那调度。
该程序定义了一个进程数据块(structProcess_),该数据块有进程名(name)、到达时间(arrivetime)、服务时间(servicetime)、开始执行时间(starttime)、完成时间(finishtime)、周转时间(zztime)、带权周转时间(dqzztime)、执行顺序〔order〕。
用到的公式有:
完成时间=到达时间+服务时间;
周转时间=完成时间+到达时间;
带权周转时间=周转时间/服务时间;
(第一次执行的进程的完成时间=该进程的到达时间;
下一个进程的开始执行时间=上一个进程的完成时间)。
运行进程的顺序需要对进程的到达时间和服务时间进展比拟。
如果某一进程是从0时刻到达的,那么首先执行该进程;
之后就比拟进程的服务时间,谁的服务时间短就先执行谁〔如果服务时间一样如此看它们的到达时间,到达时间短的先执行〕;
如果到达时间和服务时间一样,如此按先来先服务算法执行。
六、程序运行结果
1进入操作界面如下
2输入进程的信息
3各时刻进程的状态
4进程信息
5平均带权周转时间界面
七、流程图
本次课程设计主要是通过比拟各个进程的优先级以与各进程所需要占用的CPU时间来确定哪个作业优先运行,短作业优先调度算法除了能保证优先级更高的作业优先运行外,还能使一样优先级的前提下,所需CPU时间最短的那个作业优先运行,次外,本次课程设计还增加了阻塞时间和被阻塞时间来对个进程的运行加以控制。
此次课程设计的总体流程图如下:
八、源程序文件
#include<
iostream>
#defineMaxNum100
usingnamespacestd;
structProcess_struct{
intNumber;
//进程编号
charName[MaxNum];
//进程名称
intArrivalTime;
//到达时间
intServiceTime;
//开始运行时间
intFinishTime;
//运行完毕时间
intWholeTime;
//运行时间
intrun_flag;
//调度标志
intorder;
//运行次序
doubleWeightWholeTime;
//周转时间
doubleAverageWT_FCFS,AverageWT_SJF;
//平均周转时间
doubleAverageWWT_FCFS,AverageWWT_SJF;
//平均带权周转时间
}Process[MaxNum];
intN;
//实际进程个数
intSJF();
//短作业优先
intSJF(){//短作业优先算法
inttemp_time=0;
//当期那时间
inti=0,j;
intnumber_schedul,temp_counter;
//进程编号,当前已执行进程个数
floatrun_time;
run_time=Process[i].WholeTime;
j=1;
while((j<
N)&
&
(Process[i].ArrivalTime==Process[j].ArrivalTime))//判断是否有两个进程同时到达
{
if(Process[j].WholeTime<
Process[i].WholeTime)
{
run_time=Process[i].WholeTime;
i=j;
}
j++;
}
//查找下一个被调度的进程
//对找到的下一个被调度的进程求相应的参数
number_schedul=i;
Process[number_schedul].ServiceTime=Process[number_schedul].ArrivalTime;
Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime+Process[number_schedul].WholeTime;
Process[number_schedul].run_flag=1;
temp_time=Process[number_schedul].FinishTime;
Process[number_schedul].order=1;
temp_counter=1;
while(temp_counter<
N)
for(j=0;
j<
N;
j++)
if((Process[j].ArrivalTime<
=temp_time)&
(!
Process[j].run_flag))
{
run_time=Process[j].WholeTime;
number_schedul=j;
break;
}
if(Process[j].WholeTime<
run_time)
{
run_time=Process[j].WholeTime;
number_schedul=j;
}
//查找下一个被调度的进程
Process[number_schedul].ServiceTime=temp_time;
Process[number_schedul].FinishTime=Process[number_schedul].ServiceTime+Process[number_schedul].WholeTime;
Process[number_schedul].run_flag=1;
temp_time=Process[number_schedul].FinishTime;
temp_counter++;
Process[number_schedul].order=temp_counter;
}return0;
}
intPinput();
//进程参数输入
intPoutput();
//调度结果输出
voidmain()
{
intoption;
printf("
********************主菜单************************\n"
);
*1使用短作业优先*\n"
*0退出*\n"
**************************************************\n"
//system("
cls"
system("
color1f"
scanf("
%d"
&
option);
switch(option)
case0:
printf("
运行完毕。
\n"
break;
case1:
对进程用短作业优先调度。
\n\n"
Pinput();
SJF();
Poutput();
int