用先来先服务算法和短进程优先算法实现进程调度.docx
《用先来先服务算法和短进程优先算法实现进程调度.docx》由会员分享,可在线阅读,更多相关《用先来先服务算法和短进程优先算法实现进程调度.docx(14页珍藏版)》请在冰豆网上搜索。

用先来先服务算法和短进程优先算法实现进程调度
淮海工学院计算机工程学院
实验报告书
课程名:
操作系统原理A
题目:
进程调度
班级:
计算机142
学号:
2014122778
姓名:
韦迪
1、目的与要求
进程是操作系统最重要的概念之一,进程调度是操作系统核的重要功能,本实验要求用Java或C/C++语言编写一个进程调度模拟程序,至少使用先来先服务、短进程优先、最高优先权优先或时间片轮转法四种算法中的两种算法来实现进程调度。
通过本实验可加深对进程调度算法的理解。
2、实验容
1、设计有5个进程并发执行的模拟调度程序,每个程序由一个PCB表示。
2、模拟调度程序至少使用先来先服务、短进程优先、最高优先权优先或时间片轮转法四种算法中的两种算法来实现进程调度。
3、程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。
3、实验步骤
程序包括主函数、FCFS算法函数、SJF算法函数、输出函数;主函数流程:
输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果。
算法流程图:
1.FCFS先来先服务算法流程图:
2.SJF短作业优先算法流程图:
4、测试数据与实验结果(可以抓图粘贴)
测试数据:
用“text.txt文件在同一目录输入相关数据,并选择相应算法输出。
测试格式:
5
01234
23452
输入结果:
FCFS:
SJF:
五、结果分析与实验体会
1、遇到的问题:
一开始没有设置判断进程是否到达,导致短进程优先运行错误,后来加上判断语句后就解决了该问题。
2、算法性能分析及改进:
应该让进程没有到达先后顺序也依然能算出结果,即加入循环,判断各个进程的先后,组成有序数列。
3、实验体会:
通过本次实验,我加深了对先来先服务算法和短作业优先算法的理解,培养了自己的编程能力,通过实践加深了记忆。
附源代码:
#include
#include
#include
#include
usingnamespacestd;
constintMaxNum=100;
intArrivalTime[MaxNum];//到达时间
intServiceTime[MaxNum];//服务时间
intFinishTime[MaxNum];//完成时间
intWholeTime[MaxNum];//周转时间
doubleWeightWholeTime[MaxNum];//带权周转时间
doubleAverageWT_FCFS,AverageWT_SJF;//平均周转时间
doubleAverageWWT_FCFS,AverageWWT_SJF;//平均带权周转时间
voidFCFS(intn);//先来先服务
voidSJF(intn);//短作业优先
voidprint(intn,intarray[]);
voidprint(intn,doublearray[]);
voidprintproceed(intn);//输出FCFS进程运行状态
voidmain()
{
intn,i,j;//n:
进程数;i、j:
循环计数变量
ifstreamin("text.txt");//读文件
strings;
for(i=0;i<3,getline(in,s);i++)
{//当i=0读入进程数n;i=1读入各进程到达时间;i=2读入各进程服务时间
istringstreamsin(s);
switch(i)
{
case0:
sin>>n;
break;
case1:
for(j=0;jsin>>ArrivalTime[j];
break;
case2:
for(j=0;jsin>>ServiceTime[j];
break;
}
}
//显示各进程数据
cout<(1)<<"";
charch='A';
for(i=0;icout<cout<for(i=0;icout<cout<for(i=0;icout<cout<//选择算法:
先来先服务FCFS-->1短作业优先SJF-->2关闭-->0
cout<<"请选择算法:
FCFS-->1SJF-->2退出-->0"<";
intchoice;
cin>>choice;
while(choice!
=0)//直到输入值为0跳出循环,结束程序
{
while(choice!
=1&&choice!
=2&&choice!
=0)
{
cout<<"Pleaseenter0,1or2!
"<cin>>choice;
}
if(choice==0)
return;
if(choice==1)
FCFS(n);//进行先来先服务FCFS算法
else
SJF(n);//进行短作业优先服务SJF算法
cout<FCFS-->1SJF-->2退出-->0"<";cin>>choice;
}
return;
}
//------------------先来先服务----------------------------------------
voidFCFS(intn)
{
//第一个进程先服务
FinishTime[0]=ArrivalTime[0]+ServiceTime[0];
WholeTime[0]=FinishTime[0]-ArrivalTime[0];
WeightWholeTime[0]=double(WholeTime[0])/double(ServiceTime[0]);
for(inti=1;i{
if(FinishTime[i-1]>ArrivalTime[i])//如果上一个进程的完成时间大于下一个进程的到达时间
FinishTime[i]=FinishTime[i-1]+ServiceTime[i];//那么下一个进程的开始时间从上一个进程的完成时间开始
else
FinishTime[i]=ArrivalTime[i]+ServiceTime[i];//否则,下一个进程的开始时间从它本身的到达时间开始
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
WeightWholeTime[i]=double(WholeTime[i])/double(ServiceTime[i]);
}
doubletotalWT=0,totalWWT=0;
for(intj=0;j{//循环累加,求总的周转时间,总的带权周转时间
totalWT+=WholeTime[j];
totalWWT+=WeightWholeTime[j];
}
AverageWT_FCFS=totalWT/double(n);
AverageWWT_FCFS=totalWWT/double(n);
//输出各结果
cout<<"---------先来先服务FCFS--------------"<cout<<"完成时间分别为:
";
print(n,FinishTime);
cout<<"周转时间分别为:
";
print(n,WholeTime);
cout<<"带权周转时间分别为:
";
print(n,WeightWholeTime);
cout<<"平均周转时间:
"<cout<<"平均带权周转时间:
"<printproceed(n);
}
//------------------短作业优先--------------------------------
voidSJF(intn)
{
intShort;//存放当前最短作业的序号
intFinish=0;//存放当前完成时间
doubletotalWT=0,totalWWT=0;
for(inta=0;aFinishTime[a]=0;
inti;//循环计数累加变量
for(i=0;i{
inttag=0;//用于标记当前完成时间,是否找到短作业
intMax=10000;
for(intj=0;j{
if(FinishTime[j]==0&&ArrivalTime[j]<=Finish&&ServiceTime[j]<=Max)
{
Max=ServiceTime[j];
Short=j;
tag=1;
}
}
if(tag==1)
{//找到短作业
FinishTime[Short]=Finish+ServiceTime[Short];
}
if(tag==0)
{//未找到
for(intk=0;k{//直接进入下一未完成进程
Short=k;
break;
}
FinishTime[Short]=ArrivalTime[Short]+ServiceTime[Short];
}
Finish=FinishTime[Short];
}
for(i=0;i{//计算周转时间、带权周转时间
WholeTime[i]=FinishTime[i]-ArrivalTime[i];
WeightWholeTime[i]=double(WholeTime[i])/double(ServiceTime[i]);
}
for(intj=0;j{//计算总的周转时间、总的带权周转时间
totalWT+=WholeTime[j];
totalWWT+=WeightWholeTime[j];
}
AverageWT_FCFS=totalWT/double(n);
AverageWWT_FCFS=totalWWT/double(n);
//输出各值
cout<<"---------短作业优先SJF--------------"<cout<<"完成时间:
";
print(n,FinishTime);
cout<<"周转时间:
";
print(n,WholeTime);
cout<<"带权周转时间:
";
print(n,WeightWholeTime);
cout<<"平均周转时间:
"<cout<<"平均带权周转时间:
"<printproceed(n);
}
voidprint(intn,intarray[])
{//打印int型数组
for(inti=0;icout<cout<}
voidprint(intn,doublearray[])
{//打印double型数组
for(inti=0;icout<cout<}
voidprintproceed(intn)
{//打印各时刻各进程的运行情况
charch='A';
for(inti=0;i{
intStartTime=FinishTime[i]-ServiceTime[i];
cout<<"时刻"<进程"<cout<<"时刻"<进程"<}
}