1、淮海工学院计算机工程学院实 验 报 告 书课 程 名 : 操作系统原理 A 题 目: 进程调度 班 级: 计算机 142 学 号: 2014122778 姓 名: 陈韦迪 评语:成绩: 指导教师: 批阅时间: 年 月 日1、目的与要求进程是操作系统最重要的概念之一,进程调度是操作系统内核的重要功能,本实验要求用 Java 或 C/C+语言编写一个进程调度模拟程序,至少使用先来先服务、短进程优先、最高优先权优先或时间片轮转法四种算法中的两种算法来实现进程调度。通过本实验可加深对进程调度算法的理解。2、实验内容1、设计有 5 个进程并发执行的模拟调度程序,每个程序由一个 PCB 表示。2、模拟调度
2、程序至少使用先来先服务、短进程优先、最高优先权优先或时间片轮转法四种算法中的两种算法来实现进程调度。3、程序执行中应能在屏幕上显示出各进程的状态变化,以便于观察调度的整个过程。3、实验步骤程序包括主函数、FCFS 算法函数、SJF 算法函数、输出函数; 主函数流程:输入文件中的数据显示各进程数据选择算法调用相应算法的函数输出结果。算法流程图: 1.FCFS 先来先服务算法流程图:大型数据库系统概论实验报告 - 1 -Y N开 始按顺序执行判断上一个进程的完成时间是否大于下一个进程的到达时间上个进程的开始时间从下个进程的完成时间开始下个进程的开始时间从它到达的时间开始更新各数据循环累加,求总的周
3、转时间,总的带权周转时间求平均周转时间,带权周转时间输出结果调用结束大型数据库系统概论实验报告 - 2 -2.SJF 短作业优先算法流程图:Y N开 始按顺序执行判断上一个进程的完成时间是否大于下一个进程的到达时间上个进程的开始时间从下个进程的完成时间开始下个进程的开始时间从它到达的时间开始更新各数据循环累加,求总的周转时间,总的带权周转时间求平均周转时间,带权周转时间输出结果调用结束大型数据库系统概论实验报告 - 3 -4、测试数据与实验结果(可以抓图粘贴)测试数据:用“text.txt 文件在同一目录输入相关数据,并选择相应算法输出。测试格式:50 1 2 3 42 3 4 5 2输入结果
4、:大型数据库系统概论实验报告 - 4 -FCFS:SJF:五、结果分析与实验体会1、遇到的问题:一开始没有设置判断进程是否到达,导致短进程优先运行错误,后来加上判断语句后就解决了该问题。大型数据库系统概论实验报告 - 5 -2、算法性能分析及改进:应该让进程没有到达先后顺序也依然能算出结果,即加入循环,判断各个进程的先后,组成有序数列。3、实验体会: 通过本次实验,我加深了对先来先服务算法和短作业优先算法的理解,培养了自己的编程能力,通过实践加深了记忆。附源代码:#include #include #include #include using namespace std; const int
5、 MaxNum=100; int ArrivalTimeMaxNum; /到达时间 int ServiceTimeMaxNum; /服务时间 int FinishTimeMaxNum; /完成时间 int WholeTimeMaxNum; /周转时间 double WeightWholeTimeMaxNum; /带权周转时间 double AverageWT_FCFS,AverageWT_SJF; /平均周转时间 double AverageWWT_FCFS,AverageWWT_SJF; /平均带权周转时间void FCFS(int n); /先来先服务 void SJF(int n); /
6、短作业优先 void print(int n,int array); void print(int n,double array); 大型数据库系统概论实验报告 - 6 -void printproceed(int n); /输出 FCFS 进程运行状态 void main() int n,i,j; /n:进程数;i、j:循环计数变量 ifstream in(“text.txt“);/读文件 string s; for(i=0;in; break; case 1: for(j=0;jArrivalTimej; break; case 2: for(j=0;jServiceTimej; brea
7、k; /显示各进程数据 cout1 短作业优先 SJF2 关闭0cout1 SJF2 退出0“choice; while(choice!=0) /直到输入值为 0 跳出循环,结束程序 while(choice!=1 if(choice=0) return; if(choice=1) FCFS(n); /进行先来先服务 FCFS 算法 else SJF(n); /进行短作业优先服务 SJF 算法 cout1 SJF2 退出0“choice; return; /-先来先服务- void FCFS(int n) /第一个进程先服务 大型数据库系统概论实验报告 - 8 -FinishTime0=Arr
8、ivalTime0+ServiceTime0; WholeTime0=FinishTime0-ArrivalTime0; WeightWholeTime0=double(WholeTime0)/double(ServiceTime0); for(int i=1;iArrivalTimei) /如果上一个进程的完成时间大于下一个进程的到达时间FinishTimei=FinishTimei-1+ServiceTimei;/那么下一个进程的开始时间从上一个进程的完成时间开始 else FinishTimei=ArrivalTimei+ServiceTimei;/否则,下一个进程的开始时间从它本身的到
9、达时间开始 WholeTimei=FinishTimei-ArrivalTimei; WeightWholeTimei=double(WholeTimei)/double(ServiceTimei); double totalWT=0,totalWWT=0; for(int j=0;jn;j+) /循环累加,求总的周转时间,总的带权周转时间 totalWT+=WholeTimej; totalWWT+=WeightWholeTimej; AverageWT_FCFS=totalWT/double(n); AverageWWT_FCFS=totalWWT/double(n); /输出各结果 co
10、ut“-先来先服务 FCFS-“endl; cout“完成时间分别为:“; print(n,FinishTime); cout“周转时间分别为:“; print(n,WholeTime); cout“带权周转时间分别为:“; 大型数据库系统概论实验报告 - 9 -print(n,WeightWholeTime); cout“平均周转时间:“AverageWT_FCFSendl; cout“平均带权周转时间:“AverageWWT_FCFSendl; printproceed(n); /-短作业优先- void SJF(int n) int Short; /存放当前最短作业的序号 int Fin
11、ish=0; /存放当前完成时间 double totalWT=0,totalWWT=0; for(int a=0;an;a+) /初始化完成时间为 0 FinishTimea=0; int i; /循环计数累加变量 for(i=0;in;i+) int tag=0; /用于标记当前完成时间内,是否找到短作业 int Max=10000; for(int j=0;jn;j+) if(FinishTimej=0 Short=j; tag=1; if(tag=1) /找到短作业 FinishTimeShort=Finish+ServiceTimeShort; 大型数据库系统概论实验报告 - 10
12、- if(tag=0) /未找到 for(int k=0;kn,FinishTimek=0;k+) /直接进入下一未完成进程 Short=k; break; FinishTimeShort=ArrivalTimeShort+ServiceTimeShort; Finish=FinishTimeShort; for(i=0;in;i+) /计算周转时间、带权周转时间 WholeTimei=FinishTimei-ArrivalTimei; WeightWholeTimei=double(WholeTimei)/double(ServiceTimei); for(int j=0;jn;j+) /计
13、算总的周转时间、总的带权周转时间 totalWT+=WholeTimej; totalWWT+=WeightWholeTimej; AverageWT_FCFS=totalWT/double(n); AverageWWT_FCFS=totalWWT/double(n); /输出各值 cout“-短作业优先 SJF-“endl; cout“完成时间:“; print(n,FinishTime); cout“周转时间:“; print(n,WholeTime); 大型数据库系统概论实验报告 - 11 -cout“带权周转时间:“; print(n,WeightWholeTime); cout“平均
14、周转时间:“AverageWT_FCFSendl; cout“平均带权周转时间:“AverageWWT_FCFSendl; printproceed(n); void print(int n,int array) /打印 int 型数组 for(int i=0;in;i+) coutarrayi“ “; coutendl; void print(int n,double array) /打印 double 型数组 for(int i=0;in;i+) coutarrayi“ “; coutendl; void printproceed(int n) /打印各时刻各进程的运行情况 char ch=A; for(int i=0;in;i+) int StartTime=FinishTimei-ServiceTimei; cout“时刻“StartTime“:进程“char(ch+i)“开始运行“endl; cout“时刻“FinishTimei“:进程“char(ch+i)“停止运行“endl;