操作系统——短作业优先调度算法.docx
《操作系统——短作业优先调度算法.docx》由会员分享,可在线阅读,更多相关《操作系统——短作业优先调度算法.docx(6页珍藏版)》请在冰豆网上搜索。
操作系统——短作业优先调度算法
操作系统——短作业优先调度算法
实验内容
模拟实现FCFS/SJF调度。
设置作业体:
作业名,作业的到达时间,服务时间,作业状态(W——等待,R——运⾏,F——完成),作业间的链接指针;作业初始化:
由⽤户输⼊作业名、服务时间、到达时间进⾏初始化,同时,初始化作业的状态为W。
显⽰函数:
在作业调度前、调度中和调度后进⾏显⽰。
排序函数:
对等待状态的作业按照调度算法排序(不同的调度算法排序⽅式不同),注意考虑到达时间。
调度函数:
每次从等待队列队⾸调度已到达的适合的作业执⾏,状态变化。
当服务结束时,状态变为F。
删除函数:
撤销状态为F的作业。
实验要求
(1)测试数据可以随即输⼊或从⽂件中读⼊;
(2)必须要考虑到作业的到达时间;
(3)最终能够计算每⼀个作业的周转时间、带权周转。
实验要求做先来先服务或者短作业优先都可以,这⾥我做的是抢占式的短作业优先算法,⼀些函数没有按着实验内容⾥给的函数来,但是实验要求的内容基本都实现了。
先看⼀下实验结果:
输⼊的数据是之前我们学校慕课上的⼀个题⽬的数据:
先显⽰作业的初始状态:
显⽰调度情况:
计算出的各个作业的周转时间和带权周转时间:
可以⾃⼰算⼀下,程序运⾏出来的结果是对的,我只测试了慕课上的样例,其他的样例没测,如有错误,欢迎指正。
代码如下:
#include
usingnamespacestd;constintMAX=1e5;
#defineW"waitting"#defineR"running"#defineF"finished"
structWORK
{
stringwork_nam;e//作业名intserve_time;//剩余服务时间intr_serve_time;//服务时间intarrive_time;//到达时间
stringwork_stat;e//作业状态
intend_time;//结束时间
intturnover_time;//周转时间
};
WORKwork[MAX];//作业
intn;//作业数量
boolcmp_SJF(WORKx,WORK)y//排序函数
{
if(x.serve_time!
=y.serve_time)//服务时间不同时短作业优先
returnx.serve_timeelse//服务时间相同时先来先服务
returnx.arrive_time}
}
boolcmp_arr_time(WORKx,WORK)y//按到达时间从⼩到⼤排序
{
returnx.arrive_time}
intcount_work(intt)//计算某⼀时间有多少个作业进⼊
{
intcnt=0;
for(inti=1;i<=n;+i+)
{
if(work[i].arrive_time<=t)
++;cnt
}
returncnt;
}
voidupdate_work(intnum,intc_time)//更新当前每个作业的状态
{
intt=0;
for(inti=1;i<=num;+i+)
{
if(work[i].serve_time<=0)//作业已经结束
{
[i]w.soerve_time=0;[i]w.woorkrk_state=F;
}
elseif(work[i].serve_time>0)//作业还没结束
{
=;i
[i]w.soerve_time--;[i]w.woorkrk_state=R;
t
break;
}
}
for(inti=1;i<=n;+i+)//更新状态
{
if(i!
=t)
{
if(work[i].work_state!
=F)[i].wworokr_kstate=W;
}
if(work[i].work_state==F&&work[i].end_time==-1)[i]w.eonrdk_time=c_time;
}
}
booljudge_over()//判断作业是否全部完成
{
for(inti=1;i<=n;+i+)if(work[i].work_state!
=F)
returnfalse;
returntrue;
}
intmain()
{
cou"<";
ci>n>n;
for(inti=1;i<=n;+i+)
{
c"<c"<>c>inwork[i].work_name;
c"<>c>inwork[i].serve_time;
c"<>c>inwork[i].arrive_time;w[io].rwkork_state=W;w[io].reknd_time=-1;
w[io].rrk_serve_time=work[i].serve_time;
}
sort(work+1,work+1+n,cmp_arr_time);//先按到达时间排序
cou"<cou<<"服务时间
<"<"当前状态
<"for(inti=1;i<=n;+i+)
{
co
<<}
couintarrive_num=0;//已到达的作业数量
intcurrent_time=0;//当前时间
cou"<while(!
is_over)
{
c<"<"作业名
<"<"到达时间 "
<<"剩余服务时间
<"<"当前状态
<"arrive_nu=mcount_work(current_time);
sort(work+1,work+1+arrive_num,cmp_SJF);//排序
update_work(arrive_num,current_time);
for(inti=1;i<=arrive_num;+i+)
{
<<}
current_tim++e;
is_o=vejrudge_over();c}
cou"<cou<"<"周转时间
<"<"带权周转时间
<"for(inti=1;i<=n;+i+)
{
w[io].rtkurnover_time=work[i].end_time-work[i].arrive_time;//周转时间
doublewight_time=1.0*work[i].turnover_time/work[i].r_serve_time;//带权周转时间
cc}
return0;
}