FCFS和SJF进程调度算法实验报告.docx

上传人:b****1 文档编号:1399838 上传时间:2023-04-30 格式:DOCX 页数:17 大小:111.94KB
下载 相关 举报
FCFS和SJF进程调度算法实验报告.docx_第1页
第1页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第2页
第2页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第3页
第3页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第4页
第4页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第5页
第5页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第6页
第6页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第7页
第7页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第8页
第8页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第9页
第9页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第10页
第10页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第11页
第11页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第12页
第12页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第13页
第13页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第14页
第14页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第15页
第15页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第16页
第16页 / 共17页
FCFS和SJF进程调度算法实验报告.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

FCFS和SJF进程调度算法实验报告.docx

《FCFS和SJF进程调度算法实验报告.docx》由会员分享,可在线阅读,更多相关《FCFS和SJF进程调度算法实验报告.docx(17页珍藏版)》请在冰点文库上搜索。

FCFS和SJF进程调度算法实验报告.docx

FCFS和SJF进程调度算法实验报告

xx大学 操作系统 实验报告

姓名:

学号:

班级:

实验日期:

实验名称:

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

实验一先来先服务FCFS和短作业优先SJF进程调度算法

1.实验目的:

通过这次实验,理解FCFS和SJF进程调度算法的运行原理,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。

 

2.需求分析

(1)输入的形式和输入值的范围;

输入:

进程个数N范围:

0

依次输入(进程名

进程到达时间范围:

0

进程服务时间)范围:

0

选择一种算法:

1—FCFS,2—SJF范围:

1或2或0

0—退出

 

(2)输出的形式

进程名字

到达时间

运行时间

开始运行时间

结束时间

执行顺序

周转时间

带权周转时间

时刻*:

进程*开始运行

***

***

***

***

***

***

***

***

时刻*:

进程*开始运行

***

***

***

***

***

***

***

***

平均周转时间:

平均带权周转时间:

 

(3)程序所能达到的功能

输入进程的个数N,以及每个进程的到达时间和运行时间。

通过选择FCFS或是SJF进程调度算法进行调度,计算出每个进程的开始运行时间、结束时间、执行顺序、周转时间、带权周转时间,并最终求得平均周转时间和平均带权周转时间。

(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。

正确一(FCFS)

正确二(SJF)

 

输入参数错误

 

3、概要设计

所有抽象数据类型的定义:

staticintMaxNum=100;

intArrivalTime[MaxNum];//到达时间

intServiceTime[MaxNum];//服务时间

intFinishTime[MaxNum];//结束时间

intWholeTime[MaxNum];//周转时间

doubleWeightWholeTime[MaxNum];//带权周转时间

doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间

doubleAverageWWT_FCFS,AverageWWT_SJF;//平均带权周转时间

主程序的流程:

●变量初始化

●接受用户输入的N,T1…..Tn,S1….Sn;

●选择算法进行进程调度,计算进程的开始运行时间、结束时间、执行顺序、周转时间、带权周转时间;

●计算所有进程的平均周转时间、平均带权周转时间;

●按照格式输出调度结果。

各程序模块之间的层次(调用)关系

Main函数通过对Pinput函数进行调用,对函数的成员变量进行赋值,再通过算法的选择对算法函数进行选择调用,求出题目要求的各个数据结果,最后通过Poutput函数对结果进行格式输出。

4、详细设计

实现程序模块的具体算法。

intFCFS(){//先来先服务算法

inti;

inttemp_time=0;

temp_time=Process[0].ArrivalTime;

for(i=0;i

{

Process[i].ServiceTime=temp_time;

Process[i].FinishTime=Process[i].ServiceTime+Process[i].WholeTime;

Process[i].run_flag=1;

temp_time=Process[i].FinishTime;

Process[i].order=i+1;

}

return0;

}

 

intSJF()//短作业优先算法

{

inttemp_time=0;

inti=0,j;

intnumber_schedul,temp_counter;

doublerun_time;

run_time=Process[i].WholeTime;

j=1;

while((j

{if(Process[j].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

{

for(j=0;j

{

if((Process[j].ArrivalTime<=temp_time)&&(!

Process[j].run_flag))

{

run_time=Process[j].WholeTime;

number_schedul=j;

break;

}

}

for(j=0;j

{

if((Process[j].ArrivalTime<=temp_time)&&(!

Process[j].run_flag))

if(Process[j].WholeTime

{

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;

}

 

5、调试分析

(1)调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析

在调试的过程中,所出现问题最集中的地方在于算法的设计和编译,FCFS算法相对简单一些,只要根据进程到达的时间按照顺序依次执行计算即可,而SJF算法由于要涉及每个进程的到达时间和服务时间,并且要进行比较和排序,所以在算法上有一定难度,开始时没有判断进程是否到达,导致短进程优先算法结果错误,后来加上判断语句后就解决了该问题。

(2)算法的性能分析

即使用户输入的进程到达时间没有先后顺序到达也能准确计算出结果。

(加循环判断各个进程的到达时间先后,组成一个有序的序列)

(3)经验体会

通过本次实验,深入理解了先来先服务和短作业优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。

 

6、用户使用说明

 

程序的使用说明,列出每一步的操作步骤。

            

 

输入作业个数、作业号、提交时间、运行时间

 

 

输入选择数来选择调度算法

其他数

退出程序

 

.

7、附录

带注释的源程序,注释应清楚具体

*************头文件***********

#include

#defineMaxNum100

structProcess_struct{

intNumber;//进程编号

charName[MaxNum];//进程名字

intArrivalTime;//到达时间

intStartTime;//开始时间

intorder;//运行次序

intServiceTime;//服务时间

intFinishTime;//结束时间

intWholeTime;//周转时间

intrun_flag;//调度标志

doubleWeightWholeTime;//带权周转时间

doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间

doubleAverageWWT_FCFS,AverageWWT_SJF;//平均带权周转时间

}Process[MaxNum];

 

intN;//实际进程个数

intFCFS();//先来先服务

intSJF();//短作业优先

intFCFS(){//先来先服务算法

inti;

inttemp_time=0;//当前时间

temp_time=Process[0].ArrivalTime;

for(i=0;i

{

Process[i].StartTime=temp_time;

Process[i].FinishTime=Process[i].StartTime+Process[i].ServiceTime;

Process[i].run_flag=1;

temp_time=Process[i].FinishTime;

Process[i].order=i+1;

}

return0;

}

 

intSJF()//短作业优先算法

{

inttemp_time=0;

inti=0,j;

intnumber_schedul,temp_counter;//进程编号,当前已执行进程个数

doublerun_time;

run_time=Process[i].ServiceTime;

j=1;

while((j

{

if(Process[j].ServiceTime

{

run_time=Process[i].ServiceTime;

i=j;

}

j++;

}

//查找下一个被调度的进程

//对找到的下一个被调度的进程求相应的参数

number_schedul=i;

Process[number_schedul].StartTime=Process[number_schedul].ArrivalTime

Process[number_schedul].FinishTime=Process[number_schedul].StartTime+Process[number_schedul].ServiceTime;

Process[number_schedul].run_flag=1;

temp_time=Process[number_schedul].FinishTime;

Process[number_schedul].order=1;

temp_counter=1;

while(temp_counter

{

for(j=0;j

{

if((Process[j].ArrivalTime<=temp_time)&&(!

Process[j].run_flag))

{

run_time=Process[j].ServiceTime;

number_schedul=j;

break;

}

}

for(j=0;j

{

if((Process[j].ArrivalTime<=temp_time)&&(!

Process[j].run_flag))

if(Process[j].ServiceTime

{

run_time=Process[j].ServiceTime;

number_schedul=j;

}

}

Process[number_schedul].StartTime=temp_time;

Process[number_schedul].FinishTime=Process[number_schedul].StartTime+Process[number_schedul].ServiceTime;

Process[number_schedul].run_flag=1;

temp_time=Process[number_schedul].FinishTime;

temp_counter++;

Process[number_schedul].order=temp_counter;

}

return0;

}

 

*************主函数***************

#include

#include"FCFS_SJF.h"

usingnamespacestd;

intPinput();//进程参数输入

intPoutput();//调度结果输出

voidmain()

{

intoption;

Pinput();

cout<<"1—FCFS"<

cout<<"2—SJF"<

cout<<"0—退出"<

cout<<"请选择算法:

";

cin>>option;

switch(option)

{

case0:

cout<<"运行结束"<

break;

case1:

cout<<"对进程用先来先服务调度"<

FCFS();

Poutput();

break;

case2:

cout<<"对进程用短作业优先调度"<

SJF();

Poutput();

break;

}

}

intPinput()//进程参数输入

{

inti;

cout<<"请输入进程数目:

";

loop:

cin>>N;

if(N<=0||N>100)

{cout<<"进程个数不合要求,请重新输入:

";

gotoloop;

}

for(i=0;i

{

cout<<"************************"<

cout<<"请输入第"<

";

cin>>Process[i].Name;

cout<<"到达时间:

";

one:

cin>>Process[i].ArrivalTime;

if(Process[i].ArrivalTime<0||Process[i].ArrivalTime>100)

{cout<<"到达时间不合要求,请重新输入:

";

gotoone;

}

cout<<"运行时间:

";

Two:

cin>>Process[i].ServiceTime;

if(Process[i].ServiceTime<0||Process[i].ServiceTime>100)

{cout<<"运行时间不合要求,请重新输入:

";

gotoTwo;

}

Process[i].StartTime=0;

Process[i].FinishTime=0;

Process[i].WeightWholeTime=0;

Process[i].order=0;

Process[i].run_flag=0;

}

return0;

}

intPoutput()//进程参数输出

{

inti;

doubleturn_round_time=0,f1=0,w=0;

cout<<"进程名字到达时间运行时间开始运行时间结束时间执行顺序周转时间带权周转时间"<

for(i=0;i

{

Process[i].WeightWholeTime=Process[i].FinishTime-Process[i].ArrivalTime;

f1=Process[i].WeightWholeTime/Process[i].ServiceTime;

turn_round_time+=Process[i].WeightWholeTime;

w+=f1;

cout<<"时刻"<

进程"<

cout<<""<

<

}

cout<<"平均周转时间="<

cout<<"平均带权周转时间="<

return0;

}

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

当前位置:首页 > 幼儿教育 > 幼儿读物

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

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