1、实验三进程调度一实验目的加深理解并模拟实现进程(作业)调度算法。1)熟悉常用的进程调度算法,如 FCFS、SPF、FPF、高响应比优先、时间片轮转;2)结合所学的数据结构及编程知识,选择三种进程调度算法予以实现。二实验属性该实验为设计性实验。三实验仪器设备及器材普通 PC386 以上微机四实验要求1) 编程实现单处理机系统中的进程调度,要求从FCFS、SPF、FPF、高响应比优先、时间片轮转算法中至少选择三个;2) 最后编写主函数对所做工作进行测试。实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告、实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。
2、实验后认真书写符合规范格式的实验报告(参见附录A) ,并要求用正规的实验报告纸和封面装订整齐,按时上交。五、需求分析1、1) 输入的形式和输入值的范围输入值:进程个数Num 范围:0#includeusing namespace std;static const int Max=100;int ArrivalTimeMax;/到达时间int ServiceTimeMax;/服务时间int FinishTimeMax;/完成时间int WholeTimeMax;/周转时间double WeightWholeTimeMax;/帯权周庄时间double AverageWT_FCFS,AverageW
3、T_SJF; /平均周转时间double AverageWWT_FCFS,AverageWWT_SJF;/平均帯权周转时间int ServiceTime_SJFMax;/在 SJF 算法中使用到int Num=0;int NowTime=0;/记录当前时间double SumWT=0,SumWWT=0;/SumWT 用来计算总的周转时间,SumWWT 用来计算总的帯权周转时间int i;int choice;/记录选择 / 先到先服务算法void FCFS()/找最早到达的。coutNowTime)/假如进程到达的时间比现在已经运行的时间 NowTime 大,说明在 NowTime 时刻进程未
4、到达 NowTime=ArrivalTimei;/把进程的到达时间赋给 NowTimeNowTime+=ServiceTimei;/把进程的服务时间加到 NowTime 上FinishTimei=NowTime;/计算完成时间WholeTimei=FinishTimei-ArrivalTimei;/计算周转时间 =完成时间-到达时间WeightWholeTimei=(double)WholeTimei/ServiceTimei;/计算带权周转时间=周转时间/服务时间SumWT+=WholeTimei;/计算总的周转时间SumWWT+=WeightWholeTimei;/计算总的帯权周转时间Av
5、erageWT_FCFS=SumWT/Num;/平均周转时间AverageWWT_FCFS=SumWWT/Num;/平均帯权周转时间for(i=0;i=Num) allin=1; else j=Num;j=j-1;/j 是已经到达的进程数while(kServiceTime_SJFk)/比较,找到服务时间最短的进程min=k;k+; ServiceTime_SJFmin=0;/找完后置零,便于下一次循环时使用NowTime+=ServiceTimemin;/累加当前时间FinishTimemin=NowTime;/完成时间for(i=0;iNum;while(Num100|NumNum;for
6、(i=0;iArrivalTimei;for(i=0;idata;ServiceTimei=data;ServiceTime_SJFi=data;coutchoice;void main() char flag=y;Loop:NowTime=0;SumWT=0;SumWWT=0;/参数初始化input();/输入if(choice=1)FCFS();/调用 FCFS 算法else if(choice=2)SJF();/调用 SJF 算法else/输入有误,则重新选择 while(1)coutchoice;if(choice=1) FCFS();break;else if(choice=2) S
7、JF();break; coutflag;if(flag=y | flag=Y)goto Loop;2、高优先权优先调度算法#include “stdio.h“ #include “stdlib.h“ #define getpch(type) new typestruct pcb /* 定义进程控制块 PCB */ char name10; /进程名char state; /状态int super; /优先级int ntime; /要求服务时间int rtime; /已运行时间struct pcb* next; *ready=NULL,*p;typedef struct pcb PCB;voi
8、d sort(PCB *a) /* 建立对进程进行优先级排列函数*/ PCB *first, *second; int insert=0; if(ready=NULL)|(a-super)(ready-super) /*优先级最大者,插入队首*/ a-next=ready; ready=a; else /* 进程比较优先级,插入适当的位置中*/ first=ready; second=first-next; while(second!=NULL) if(a-super)(second-super) /*若插入进程比当前进程优先数大 ,插入到当前进程前面*/a-next=second; firs
9、t-next=a; second=NULL; insert=1; else /*指针后移,寻找插入点*/first=first-next; second=second-next; if(insert=0) first-next=a;/* 插入进程优先数最低,则插入到队尾*/ void createpcb() /* 建立进程控制块函数*/ int i,num; printf(“ttt 最高优先权优先调度算法模拟tn“);printf(“n 请输入进程数目:“); scanf(“%d“, for(i=0;iname, p-rtime=0; p-state=w; p-next=NULL; sort(
10、p); void display1() /*建立进程显示函数 ,用于显示当前进程*/ printf(“n 进程名 状态 优先数 要求服务的时间 已运行时间 n“); void display2(PCB * pr) printf(“%3.5s %7c %6d %12d %10d“,pr-name,pr-state,pr-super,pr-ntime,pr-rtime);printf(“n“); void check() /* 建立进程查看函数 */ PCB *pr; printf(“n“);printf(“n“);printf(“n * 当前正在运行的进程是%s 的状态如下:n“,p-name)
11、;display1();display2(p); pr=ready; printf(“n *当前就绪队列中进程的状态如下:n“);if(pr=NULL) printf(“ *就绪队列为空!“);else display1();while(pr!=NULL) display2(pr);pr=pr-next; void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/ printf(“n 进程 %s 已完成.n“,p-name); free(p); void running() /* 建立进程就绪函数( 进程运行时间到,置就绪状态)*/ (p-rtime)+; /*运行时间加
12、一*/ if(p-rtime=p-ntime) /*已运行时间与要求服务时间相等时,撤销进程*/destroy(); /* 调用 destroy 函数*/ else (p-super)-; /*优先权减一*/p-state=w; sort(p); /*调用 sort 函数*/ void main() createpcb(); printf(“n 初始时就绪队列的状态如下:“); display1();p=ready;while(p!=NULL) display2(p);p=p-next; printf(“n 开始运行:“);while(ready!=NULL) p=ready; ready=p-next; p-next=NULL; p-state=R; check(); running(); printf(“n 进程已经完成.n“);