1、操作系统实验操作系统实验报告一【实验题目】先来先服务FCFS和短作业优先SJF进程调度算法【实验目的】 通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。【实验内容】问题描述:设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个进程分别在T1, ,Tn时刻到达系统,它们需要的服务时间分别为S1, ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。程序要求如下:1)进程个数n;每个进程的到达时间T1, ,
2、Tn和服务时间S1, ,Sn;选择算法1-FCFS,2-SJF。2)要求采用先来先服务FCFS和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。实现提示:用C+语言实现提示:1)程序中进程调度时间变量描述如下: static int MaxNum=100;int ArrivalTimeMaxNum; int ServiceTi
3、meMaxNum; int FinishTimeMaxNum; int WholeTimeMaxNum; double WeightWholeTimeMaxNum; double AverageWT_FCFS,AverageWT_SJF; double AverageWWT_FCFS,AverageWWT_SJF;2)进程调度的实现过程如下: 变量初始化; 接收用户输入n,T1, ,Tn,S1, ,Sn;算法选择1-FCFS,2-SJF; 按照选择算法进行进程调度,计算进程的完成时间、周转时间和带权周转时间; 计算所有进程的平均周转时间和平均带权周转时间; 按格式输出调度结果。【实验要求】1)
4、上机前认真复习FCFS和SJF进程调度调度算法,熟悉进程调度的执行过程;2)上机时独立编程、调试程序;3)根据具体实验要求,完成好实验报告(包括实验的目的、内容、要求、源程序、实例运行结果截图)。【源代码】一、在VisualC+6.0中实现。【程序代码】#include#include#define Number 5void main() int daodaNumber,fuwuNumber,i; for(i=0;iNumber;i+) cout请输入第i+1daodaifuwui; struct statedd /声明结构 bool doneF,doneS; int daoda,fuwu;
5、float wancheng,zhouzhuan,daiquan,wan,zhou,dai; ; statedd processNumber;/声明结构变量,这里为数组 int timeflyF=0,timeflyS=0;/定义两个类似于秒表的变量 int j,k,nextproF,nextproS; / 获取数据 for(i=0;iNumber;i+) processi.doneF = false; processi.doneS = false; processi.wancheng = 0; processi.zhouzhuan = 0; processi.daiquan = 0; proc
6、essi.wan = 0; processi.zhou = 0; processi.dai =0; processi.daoda = daodai; processi.fuwu = fuwui; / 获取最先到达的进程下标first int first=0; for(i=1;idaodai) first=i; processfirst.doneF=true; processfirst.doneS=true; processfirst.wancheng = processfirst.fuwu + processfirst.daoda; processfirst.wan = processfirs
7、t.fuwu + processfirst.daoda; timeflyF += processfirst.daoda+processfirst.fuwu; timeflyS += processfirst.daoda+processfirst.fuwu; / 接下去到达的进程 /* / fcfs * for(j=1;jNumber;j+) nextproF = Number+1; for(k =0 ; kNumber; k+ ) if( !processk.doneF ) if( processk.daoda processk.daoda ) nextproF = k; /获取到达时刻最先的
8、进程 /else /if2 /if1 /for / 处理 processnextproF.wancheng = processnextproF.fuwu + timeflyF; timeflyF += processnextproF.fuwu; processnextproF.doneF=true; / circle2 / SJF * for(j=1;jNumber;j+) nextproS = Number+1; for(k=0 ; kNumber; k+ ) if(!processk.doneS) if( processk.daoda processk.fuwu ) nextproS =
9、k; /获取服务时间最小的进程 /else /if2 /if1 /for / 处理 processnextproS.wan = processnextproS.fuwu + timeflyS; timeflyS += processnextproS.fuwu; processnextproS.doneS=true; / circle2/* float Fz=0,Fdq=0,Sz=0,Sdq=0;/ for(i=0;iNumber;i+) /- processi.zhouzhuan=processi.wancheng-processi.daoda; Fz += processi.zhouzhua
10、n; processi.daiquan=processi.zhouzhuan/processi.fuwu; Fdq += processi.daiquan; /- processi.zhou=processi.wan-processi.daoda; Sz += processi.zhou; processi.dai=processi.zhou/processi.fuwu; Sdq += processi.dai; /=输出=/- couttendl; coutFCFS:endl;coutsetw(10)进程ID ;coutsetw(10)完成时间 ;coutsetw(10)周转时间 ;cout
11、setw(10)带权周转时间 endl;for(i=0;iNumber;i+) coutsetw(10)i+1 ; coutsetw(10)setiosflags(ios:fixed)setprecision(2)processi.wancheng ; coutsetw(10)setiosflags(ios:fixed)setprecision(2)processi.zhouzhuan ; coutsetw(10)setiosflags(ios:fixed)setprecision(2)processi.daiquan endl;cout平均周转时间为: setiosflags(ios:fix
12、ed)setprecision(2)Fz/Numberendl;cout平均带权周转时间为:setiosflags(ios:fixed)setprecision(2)Fdq/Numberendl;/-couttendl; coutSJF:endl;coutsetw(10)进程ID ;coutsetw(10)完成时间 ;coutsetw(10)周转时间 ;coutsetw(10)带权周转时间 endl;for(i=0;iNumber;i+) coutsetw(10)i+1 ; coutsetw(10)setiosflags(ios:fixed)setprecision(2)processi.wa
13、n ; coutsetw(10)setiosflags(ios:fixed)setprecision(2)processi.zhou ; coutsetw(10)setiosflags(ios:fixed)setprecision(2)processi.dai endl;cout平均周转时间为: setiosflags(ios:fixed)setprecision(2)Sz/Numberendl;cout平均带权周转时间为:setiosflags(ios:fixed)setprecision(2)Sdq/Numberendl;couttendl;【效果截图】二、在Visual Studio 2
14、008中基于对话框模式实现,最终生成exe可执行文件。【主要代码】void Csc20101114Dlg:OnBnClickedjisuan() / TODO: 在此添加控件通知处理程序代码 / test /*daodaA=0; daodaB=1; daodaC=2; daodaD=3; daodaE=4; fuwuA=4; fuwuB=3; fuwuC=5; fuwuD=2; fuwuE=4; UpdateData(false);*/ / test struct statedd bool doneF; bool doneS; int daoda; int fuwu; float wanche
15、ng; float zhouzhuan; float daiquan; float wan; float zhou; float dai; ; statedd process5; int timeflyF=0; int timeflyS=0; int circle; int circle2; int nextproF; int nextproS; UpdateData(true); / 获取数据 process0.doneF = false; process0.doneS = false; process0.wancheng = 0; process0.zhouzhuan = 0; proce
16、ss0.daiquan = 0; process0.wan = 0; process0.zhou = 0; process0.dai =0; process0.daoda = daodaA; process0.fuwu = fuwuA; process1.doneF = false; process1.doneS = false; process1.wancheng = 0; process1.zhouzhuan = 0; process1.daiquan = 0; process1.wan = 0; process1.zhou = 0; process1.dai =0; process1.d
17、aoda = daodaB; process1.fuwu = fuwuB; process2.doneF = false; process2.doneS = false; process2.wancheng = 0; process2.zhouzhuan = 0; process2.daiquan = 0; process2.wan = 0; process2.zhou = 0; process2.dai =0; process2.daoda = daodaC; process2.fuwu = fuwuC; process3.doneF = false; process3.doneS = fa
18、lse; process3.wancheng = 0; process3.zhouzhuan = 0; process3.daiquan = 0; process3.wan = 0; process3.zhou = 0; process3.dai =0; process3.daoda = daodaD; process3.fuwu = fuwuD; process4.doneF = false; process4.doneS = false; process4.wancheng = 0; process4.zhouzhuan = 0; process4.daiquan = 0; process
19、4.wan = 0; process4.zhou = 0; process4.dai =0; process4.daoda = daodaE; process4.fuwu = fuwuE; / 最先到达的进程 int minnum=min(daodaA,min(daodaB,min(daodaC,min(daodaD,daodaE); for(circle =0 ; circle5; circle+ ) if( minnum = processcircle.daoda ) processcircle.doneF=true; processcircle.doneS=true; processci
20、rcle.wancheng = processcircle.fuwu + processcircle.daoda; processcircle.wan = processcircle.fuwu + processcircle.daoda; processcircle.zhouzhuan = processcircle.wancheng - processcircle.daoda; processcircle.zhou= processcircle.wan - processcircle.daoda; processcircle.daiquan = processcircle.zhouzhuan
21、/processcircle.fuwu; processcircle.dai = processcircle.zhou/processcircle.fuwu; timeflyF += processcircle.daoda+processcircle.fuwu; timeflyS += processcircle.daoda+processcircle.fuwu; break; / 接下去到达的进程 / fcfs * for( circle2 =0;circle25;circle2+) nextproF = 8; for(circle =0 ; circle5; circle+ ) if( !
22、processcircle.doneF ) if( processcircle.daoda processcircle.daoda ) nextproF = circle; /获取到达时刻最先的进程 / 处理 processnextproF.wancheng = processnextproF.fuwu + timeflyF; processnextproF.zhouzhuan = processnextproF.wancheng - processnextproF.daoda; processnextproF.daiquan = processnextproF.zhouzhuan/proce
23、ssnextproF.fuwu; timeflyF += processnextproF.fuwu; processnextproF.doneF=true; / circle2 / SJF * for( circle2 =0;circle25;circle2+) nextproS = 8; for(circle =0 ; circle5; circle+ ) if(!processcircle.doneS) if( processcircle.daoda processcircle.fuwu ) nextproS = circle; /获取服务时间最小的进程 / 处理 processnextproS.wan = processnextproS.fuwu + timeflyS; processnextproS.zhou= processnextproS.wan - processnextproS.daoda; processnextproS.dai = processnextproS.zhou/processnextpro
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1