操作系统实验FCFS和短作业优先SJF调度算法模拟.docx

上传人:b****8 文档编号:13041777 上传时间:2023-06-10 格式:DOCX 页数:18 大小:335.01KB
下载 相关 举报
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第1页
第1页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第2页
第2页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第3页
第3页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第4页
第4页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第5页
第5页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第6页
第6页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第7页
第7页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第8页
第8页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第9页
第9页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第10页
第10页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第11页
第11页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第12页
第12页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第13页
第13页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第14页
第14页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第15页
第15页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第16页
第16页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第17页
第17页 / 共18页
操作系统实验FCFS和短作业优先SJF调度算法模拟.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统实验FCFS和短作业优先SJF调度算法模拟.docx

《操作系统实验FCFS和短作业优先SJF调度算法模拟.docx》由会员分享,可在线阅读,更多相关《操作系统实验FCFS和短作业优先SJF调度算法模拟.docx(18页珍藏版)》请在冰点文库上搜索。

操作系统实验FCFS和短作业优先SJF调度算法模拟.docx

操作系统实验FCFS和短作业优先SJF调度算法模拟

 

题目先来先服务FCFS和短作业优先SJF进程调度算法

 

姓名:

学号:

专业:

学院:

指导教师:

林若宁

 

二零一八年十一月

一、实验目的

模拟单处理器系统的进程调度,分别采用短作业优先和先来先服务的进程调度算法作为进程设计算法,以加深对进程的概念及进程调度算法的理解.

二、实验内容

1.短作业优先调度算法原理

短作业优先调度算法,是指对短作业或断进程优先调度的算法。

它们可以分别可以用于作业调度和进程调度。

短作业优先调度算法,是从后备队列中选择一个或若干个运行时间最短的作业,将它们调入内存运行。

短进程优先调度算法,是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

2.先来先服务调度算法原理 

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。

在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。

该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。

三、程序设计

1.概要设计

程序包括主函数、FCFS算法函数、SJF算法函数、输出函数; 主函数流程:

输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果

2.算法流程

SJF算法流程图:

3.详细设计

(1)定义一个结构体

typedefstructPCB

{

charjob_id[10];//作业ID

floatArr_time;//到达时刻

floatFun_time;//估计运行时间

floatWait_time;//等待时间

floatStart_time;//开始时刻

floatFin_time;//完成时刻

floatTur_time;//周转时间

floatWTur_time;//带权周转时间

intOrder;//优先标记

}list;

 

(2)先来先服务算法函数

voidfcfs(list*p,intcount)//先来先服务算法

{

listtemp;//临时结构体变量

inti;

intj;

for(i=1;i

{

temp=p[i];

j=i-1;

while(temp.Arr_time=0)

{

p[j+1]=p[j];

--j;

}

p[j+1]=temp;

}

for(i=0;i

{

if(i==0)

{

p[i].Start_time=p[i].Arr_time;

}

else

{

p[i].Start_time=p[i-1].Fin_time;//开始时刻==前一个作业的完成时刻

}

p[i].Wait_time=p[i].Start_time-p[i].Arr_time;//等待==开始-到达

p[i].Fin_time=p[i].Start_time+p[i].Fun_time;//完成==开始+运行

p[i].Tur_time=p[i].Fin_time-p[i].Arr_time;//周转=完成-到达

p[i].WTur_time=p[i].Tur_time/p[i].Fun_time;//带权周转=周转/运行

}

return;

}

 

(3)最短作业优先函数

voidsjf(list*p,intcount)//最短作业优先算法(sjf)

{

listitem;//结构体变量

inti=0;

intj=0;

intk=0;//最短运行时间作业的下标

intflag=0;//优先级设置

floatmin=0;//最短运行时间

floattemp;//开始的时刻

temp=p[0].Arr_time;

//先求出最先到达作业的时刻

for(i=0;i

{

if(temp>p[i].Arr_time)

{

temp=p[i].Arr_time;//保存最先到达的作业的时刻

k=i;//最先到达的作业的下标,默认为p[0]

}

}

for(i=0;i

{

p[k].Order=++flag;//设置优先级为1,最高优先级

p[k].Start_time=temp;

p[k].Wait_time=temp-p[k].Arr_time;//计算各个时间

p[k].Fin_time=temp+p[k].Fun_time;

p[k].Tur_time=p[k].Fin_time-p[k].Arr_time;

p[k].WTur_time=p[k].Tur_time/p[k].Fun_time;

min=100;

temp=p[k].Fin_time;//后一个作业的开始时刻是前一个作业的完成时刻

for(j=0;j

{

if(p[j].Order!

=0||temp-p[j].Arr_time<=0)//跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)

continue;

if(min>p[j].Fun_time)

{

min=p[j].Fun_time;

k=j;//求出满足条件最短运行时间的作业的下标

}

}

}

 

for(i=1;i

{

item=p[i];

j=i-1;

while(item.Order=0)

{

p[j+1]=p[j];

--j;

}

p[j+1]=item;

}

return;

}

四、实验结果

测试数据:

进程名

到达时间

运行时间

A

0

4

B

1

3

C

2

5

D

4

4

(1)先来先服务算法调试

(2)最短作业优先算法调试

五、实验小结

FCFS调度算法有利于CPU繁忙型的作业,而不利于I/O繁忙型的作业(进程)。

CPU繁忙型作业是指该类作业需要大量的CPU时间进行计算,而很少请求I/O。

通常的科学计算便属于CPU繁忙型作业。

I/O繁忙型作业是指CPU进行处理时需频繁地请求I/O。

目前的大多数事务处理都属于I/O繁忙型作业。

SJ(P)F调度算法也存在不容忽视的缺点:

该算法对长作业不利,如作业C的周转时间由10增至16,其带权周转时间由2增至3.1。

更严重的是,如果有一长作业(进程)进入系统的后备队列(就绪队列),由于调度程序总是优先调度那些(即使是后进来的)短作业(进程),将导致长作业(进程)长期不被调度。

该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理。

由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意或无意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度。

 

#include"stdafx.h"

#include

#defineMAX100

 

typedefstructPCB

{

charjob_id[10];//作业ID

floatArr_time;//到达时刻

floatFun_time;//估计运行时间

floatWait_time;//等待时间

floatStart_time;//开始时刻

floatFin_time;//完成时刻

floatTur_time;//周转时间

floatWTur_time;//带权周转时间

intOrder;//优先标记

}list;

 

voidfcfs(list*p,intcount);

voidsjf(list*p,intcount);

voidprint(list*p,intcount);

voidavg(list*p,intcount);

 

voidfcfs(list*p,intcount)//先来先服务算法

{

listtemp;//临时结构体变量

inti;

intj;

for(i=1;i

{

temp=p[i];

j=i-1;

while(temp.Arr_time=0)

{

p[j+1]=p[j];

--j;

}

p[j+1]=temp;

}

for(i=0;i

{

if(i==0)

{

p[i].Start_time=p[i].Arr_time;

}

else

{

p[i].Start_time=p[i-1].Fin_time;//开始时刻==前一个作业的完成时刻

}

p[i].Wait_time=p[i].Start_time-p[i].Arr_time;//等待==开始-到达

p[i].Fin_time=p[i].Start_time+p[i].Fun_time;//完成==开始+运行

p[i].Tur_time=p[i].Fin_time-p[i].Arr_time;//周转=完成-到达

p[i].WTur_time=p[i].Tur_time/p[i].Fun_time;//带权周转=周转/运行

}

return;

}

 

voidsjf(list*p,intcount)//最短作业优先算法(sjf)

{

listitem;//结构体变量

inti=0;

intj=0;

intk=0;//最短运行时间作业的下标

intflag=0;//优先级设置

floatmin=0;//最短运行时间

floattemp;//开始的时刻

temp=p[0].Arr_time;

//先求出最先到达作业的时刻

for(i=0;i

{

if(temp>p[i].Arr_time)

{

temp=p[i].Arr_time;//保存最先到达的作业的时刻

k=i;//最先到达的作业的下标,默认为p[0]

}

}

for(i=0;i

{

p[k].Order=++flag;//设置优先级为1,最高优先级

p[k].Start_time=temp;

p[k].Wait_time=temp-p[k].Arr_time;//计算各个时间

p[k].Fin_time=temp+p[k].Fun_time;

p[k].Tur_time=p[k].Fin_time-p[k].Arr_time;

p[k].WTur_time=p[k].Tur_time/p[k].Fun_time;

min=100;

temp=p[k].Fin_time;//后一个作业的开始时刻是前一个作业的完成时刻

for(j=0;j

{

if(p[j].Order!

=0||temp-p[j].Arr_time<=0)//跳过不满足条件的(已设置优先级的和到达时刻要晚于前一个作业的完成时刻的)

continue;

if(min>p[j].Fun_time)

{

min=p[j].Fun_time;

k=j;//求出满足条件最短运行时间的作业的下标

}

}

}

 

for(i=1;i

{

item=p[i];

j=i-1;

while(item.Order=0)

{

p[j+1]=p[j];

--j;

}

p[j+1]=item;

}

return;

}

 

voidprint(list*p,intcount)//输出各个作业的详细信息

{

inti;

printf("*****************************************************************\n");

printf("ID\t到达\t运行\t等待\t开始\t完成\t周转\t带权周转\n");

for(i=0;i

{

printf("%s\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\n",p[i].job_id,p[i].Arr_time,p[i].Fun_time,p[i].Wait_time,p[i].Start_time,p[i].Fin_time,p[i].Tur_time,p[i].WTur_time);

}

 

return;

}

 

voidavg(list*p,intcount)

{

floatAvgTur1;//平均周转

floatAvgTur2;//平均带权周转

floatt1=0;

floatt2=0;

inti;

for(i=0;i

{

t1+=p[i].Tur_time;//周转时间和

t2+=p[i].WTur_time;//带权周转和

}

AvgTur1=t1/count;

AvgTur2=t2/count;

printf("\n平均周转时间为:

%f\t平均带权周转时间为:

%f\n",AvgTur1,AvgTur2);

printf("\n*****************************************************************\n");

return;

}

 

intmain()

{

listst[MAX];//最多可以一百个作业

intjob_count=0;//作业数量

intflag=1;//算法标记

inti=0;

printf("请输入作业数量:

");

scanf("%d",&job_count);

printf("请输入作业ID,到达时刻,估计运行时间(用空格隔开):

\n");

do

{

scanf("%s%f%f",st[i].job_id,&st[i].Arr_time,&st[i].Fun_time);

st[i].Order=0;//优先级初始化

}while(++i

printf("请选择算法:

\n1,先来先服务算法!

\n2,最短作业优先算法!

\n");

scanf("%d",&flag);

switch(flag)

{

case1:

{

fcfs(st,job_count);

printf("\n*******************************************\n\n");

printf("先来先服务算法\n");

}break;

case2:

{

sjf(st,job_count);

printf("\n*******************************************\n\n");

printf("最短作业优先算法\n");

}break;

}

print(st,job_count);

avg(st,job_count);

return0;

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 制度规范

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2