1实验一先来先服务FCFS和短作业优先SJF进程调度算法
更新时间:2023-09-03 14:14:01 阅读量: 教育文库 文档下载
- 汇编实验一推荐度:
- 相关推荐
操作系统实验一 FCFS和SJF 实验报告含代码
实验一 先来先服务FCFS和短作业优先SJF进程调度算法
一:需求分析
程序设计的任务:设计程序模拟进程的先来先服务FCFS和短作业优先SJF调度过程。假设有n个x进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。分别采用先来先服务FCFS和短作业优先SJF进程调度算法进行调度,计算每个进程的完成时间、周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。
(1)输入的形式和输入值的范围
为免去测试时候需要逐步输入数据的麻烦,输入时采用输入文件流方式将数据放在.txt文件中,第一行为进程个数,第二行为进程到达时间(各个进程的到达时间之间用空格隔开),第三行为进程的服务时间(每个服务时间之间用空格隔开)。
(2)输出的形式 模拟整个调度过程,输出每个时刻的进程运行状态,同时输出了每个进程的完成时间,并且按要求输出了计算出来的每个进程的周转时间、带权周转时间、所有进程的平均周转时间以及带权平均周转时间。
(3)程序所能达到的功能
能够模拟出进程的先来先服务FCFS算法和短作业优先SJF算法的调度过程,输入进程个数n;每个进程的到达时间T1, … ,Tn和服务时间S1, … ,Sn;选择算法1-FCFS,2-SJF,3-退出,用户做出选择即可输出对应的算法调度过程或者退出程序。
(4)测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果 测试数据及其输出结果: 也可看下面截图的测试结果
二:概要设计
程序包括主函数、FCFS算法函数、SJF算法函数、输出函数; 主函数流程:输入文件中的数据—显示各进程数据—选择算法—调用相应算法的函数—输出结果
三:详细设计 算法流程图:
操作系统实验一 FCFS和SJF 实验报告含代码
FCFS 先来先服务算法流程图:
开始
按排好的顺序第一 个进程先进行
Y 判断上一个进程的完 成时间是否大于下一 个进程的到达时间
N
下一个进程的开始时间从 上个进程的完成时间开始
下一个进程的开始时间从 它本身的到达时间开始
更新各数据
循环累加, 求总的 周转时间, 总的带 权周转时间
求平均周转时间, 带权周转时间
输出结果
调用结束
操作系统实验一 FCFS和SJF 实验报告含代码
SJF 算法流程图:
开始
初始化数据
N
利用一个 for
循环判断 是否找到短作业
Y
直接进入下一未完成进程并且 FinishTime[Short]=ArrivalTime[Short ]+ServiceTime[Short]
FinishTime[Short]=Finish+ServiceTi me[Short]
Finish=FinishTime[ Short]
计算周转时间、带 权周转时间
计算总的周转时 间、总的带权周转 时间
计算平均周转时 间、平均带权周转 时间
操作系统实验一 FCFS和SJF 实验报告含代码
四:调试分析
(1):调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析; 开始的时候没有判断进程是否到达,导致短进程优先算法运行结果错误,后来加上了判断语句后就解决了改问题。
(2):算法的性能分析及其改进设想;
即使用户输入的进程到达时间没有先后顺序也能准确的计算出结果。(加循环,判断各个进程的到达时间先后,组成一个有序的序列) (3):经验和体会。 通过本次实验,深入理解了先来先服务和短进程优先进程调度算法的思想,培养了自己的动手能力,通过实践加深了记忆。 五:用户使用说明
在同一目录下的.txt文件中按输入要求输入相关数据,并且根据提示选择相应的算法。 六:测试结果
测试数据:输出结果:
操作系统实验一 FCFS和SJF 实验报告含代码
七:附录 源程序:
#include<iostream> #include<iomanip> //格式化输出结果 #include<sstream> //读取文件 #include<fstream> //读取文件 using namespace std; const int MaxNum=100; int ArrivalTime[MaxNum]; //到达时间 int ServiceTime[MaxNum]; //服务时间 int FinishTime[MaxNum]; //完成时间 int WholeTime[MaxNum]; //周转时间 double WeightWholeTime[MaxNum]; //带权周转时间 double AverageWT_FCFS,AverageWT_SJF; //平均周转时间 double AverageWWT_FCFS,AverageWWT_SJF; //平均带权周转时间
操作系统实验一 FCFS和SJF 实验报告含代码
void FCFS(int n); //先来先服务 void SJF(int n); //短作业优先 void print(int n,int array[]); void print(int n,double array[]); void printproceed(int n); //输出FCFS进程运行状态
void main() { int n,i,j; //n:进程数;i、j:循环计数变量 ifstream in("text.txt");//读文件 string s; for(i=0;i<3,getline(in,s);i++) { //当i=0读入进程数n ;i=1读入各进程到达时间 ;i=2读入各进程服务时间 istringstream sin(s); switch(i) { case 0: sin>>n; break; case 1: for(j=0;j<n;j++) sin>>ArrivalTime[j]; break; case 2: for(j=0;j<n;j++) sin>>ServiceTime[j]; break; } } //显示各进程数据 cout<<setfill(' ')<<setw(7)<<"进程名"<<setw(1)<<""; char ch='A'; for(i=0;i<n;i++) cout<<setw(3)<<char(ch+i); cout<<endl<<"到达时间"; for(i=0;i<n;i++) cout<<setw(3)<<ArrivalTime[i]; cout<<endl<<"服务时间"; for(i=0;i<n;i++) cout<<setw(3)<<ServiceTime[i]; cout<<endl; //选择算法:先来先服务FCFS-->1 短作业优先SJF-->2 关闭-->0
操作系统实验一 FCFS和SJF 实验报告含代码
cout<<"请选择算法: FCFS-->1 SJF-->2 退出-->0"<<endl<<"选择:"; int choice; cin>>choice; while(choice!=0) //直到输入值为0跳出循环,结束程序 { while(choice!=1 && choice !=2 && choice!=0 ) { cout<<"Please enter 0, 1 or 2!"<<endl; cin>>choice; } if(choice==0) return; if(choice==1) FCFS(n); //进行先来先服务FCFS算法 else SJF(n); //进行短作业优先服务SJF算法 cout<<endl<<"请选择: FCFS-->1 SJF-->2 退出-->0"<<endl<<"选择:"; cin>>choice; } return; }
//------------------先来先服务---------------------------------------- void FCFS(int n) { //第一个进程先服务 FinishTime[0]=ArrivalTime[0]+ServiceTime[0]; WholeTime[0]=FinishTime[0]-ArrivalTime[0]; WeightWholeTime[0]=double(WholeTime[0])/double(ServiceTime[0]); for(int i=1;i<n;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]);
操作系统实验一 FCFS和SJF 实验报告含代码
} double totalWT=0,totalWWT=0; for(int j=0;j<n;j++) { //循环累加,求总的周转时间,总的带权周转时间 totalWT+=WholeTime[j]; totalWWT+=WeightWholeTime[j]; } AverageWT_FCFS=totalWT/double(n); AverageWWT_FCFS=totalWWT/double(n); //输出各结果 cout<<"---------先来先服务FCFS--------------"<<endl; cout<<"完成时间分别为:"; print(n,FinishTime); cout<<"周转时间分别为:"; print(n,WholeTime); cout<<"带权周转时间分别为:"; print(n,WeightWholeTime); cout<<"平均周转时间:"<<AverageWT_FCFS<<endl; cout<<"平均带权周转时间:"<<AverageWWT_FCFS<<endl; printproceed(n); }
//------------------短作业优先-------------------------------- void SJF(int n) { int Short; //存放当前最短作业的序号 int Finish=0; //存放当前完成时间 double totalWT=0,totalWWT=0; for(int a=0;a<n;a++) //初始化完成时间为0 FinishTime[a]=0; int i; //循环计数累加变量 for(i=0;i<n;i++) { int tag=0; //用于标记当前完成时间内,是否找到短作业 int Max=10000; for(int j=0;j<n;j++) { if(FinishTime[j]==0 && ArrivalTime[j]<=Finish && ServiceTime[j]<=Max) { Max=ServiceTime[j]; Short=j; tag=1;
操作系统实验一 FCFS和SJF 实验报告含代码
}
} } if(tag==1) { //找到短作业 FinishTime[Short]=Finish+ServiceTime[Short]; } if(tag==0) { //未找到 for(int k=0;k<n,FinishTime[k]==0;k++) { //直接进入下一未完成进程 Short=k; break; } FinishTime[Short]=ArrivalTime[Short]+ServiceTime[Short]; } Finish=FinishTime[Short]; }
for(i=0;i<n;i++)
{ //计算周转时间、带权周转时间 WholeTime[i]=FinishTime[i]-ArrivalTime[i]; WeightWholeTime[i]=double(WholeTime[i])/double(ServiceTime[i]); }
for(int j=0;j<n;j++)
{ //计算总的周转时间、总的带权周转时间 totalWT+=WholeTime[j]; totalWWT+=WeightWholeTime[j]; }
AverageWT_FCFS=totalWT/double(n); AverageWWT_FCFS=totalWWT/double(n);
//输出各值
cout<<"---------短作业优先SJF--------------"<<endl; cout<<"完成时间:"; print(n,FinishTime); cout<<"周转时间:"; print(n,WholeTime); cout<<"带权周转时间:"; print(n,WeightWholeTime);
cout<<"平均周转时间:"<<AverageWT_FCFS<<endl;
cout<<"平均带权周转时间:"<<AverageWWT_FCFS<<endl; printproceed(n);
操作系统实验一 FCFS和SJF 实验报告含代码
void print(int n,int array[]) { //打印int型数组 for(int i=0;i<n;i++) cout<<array[i]<<" "; cout<<endl; }
void print(int n,double array[]) { //打印double型数组 for(int i=0;i<n;i++) cout<<array[i]<<" "; cout<<endl; }
void printproceed(int n)
{ //打印各时刻各进程的运行情况 char ch='A'; for(int i=0;i<n;i++) { int StartTime=FinishTime[i]-ServiceTime[i]; cout<<"时刻"<<StartTime<<":进程"<<char(ch+i)<<"开始运行"<<endl; cout<<"时刻"<<FinishTime[i]<<":进程"<<char(ch+i)<<"停止运行"<<endl; } }
正在阅读:
1实验一先来先服务FCFS和短作业优先SJF进程调度算法09-03
会办单位复函08-26
2013年东莞最新版会计从业资格考试试题及答案看完必过07-06
护理干预在腮腺肿瘤术后预防涎瘘中的作用05-28
货币金融学名词解释09-28
人卫。第七版生理学。第八章 第七节 尿的排放 第九章 感觉器官的04-20
内蒙古工业大学钻床夹具设计说明书06-10
河南省安阳市洹北中学2017年高考物理一轮复习第六单元圆周运动真题与模拟单元重组卷02-02
铝铸件常见缺陷、机理及防止方法05-20
学生自我鉴定(优秀3篇)03-28
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 先来
- 调度
- 算法
- 进程
- 优先
- 作业
- 实验
- 服务
- FCFS
- SJF
- 《计算机应用基础》各章课后习题
- 第2章 搭建Java EE开发环境-new
- 药品零售追溯管理制度
- 2016-2022年中国水煤浆市场深度调研与行业前景预测报告
- C语言图形+数组答案
- 国开大《商务英语4》自测试题7及答案
- 初中化学优质课听课心得体会
- 2017-2022年中国分离薄膜行业深度分析与投资前景预测报告
- 浙江省等级医院综合评审二类指标技术水平
- 大学物理刚体的转动
- 翟中和第四版细胞生物学1~6章习题及答案
- 建设工程质量责任主体质量行为资料监督检查记录
- 碘量法测定水中溶解氧
- 古建基础知识【古建专家精心整理】(六)
- 2015年4月西城区一模大作文讲评【审题、评分细则、标杆文】
- 2016年三类人员继续教育考试题库
- 办公软件应用windows7+Office2010中级(四级)操作员试题汇编-第五套
- 《关于禁止滥用知识产权排除、限制竞争行为的规定》国家工商行政管理总局令第74号
- 2015年广东高考地理一轮复习 塑造地表形态力量
- 丹参注射液对慢性阻塞性肺疾病模型大鼠转化生长因子β1的影响