1、d)时间片轮转算法能够使用程序内置数据, 要求运行结果给出每个时间片是被哪个进程使用, 每个进程完成时, 要修改状态并输出提醒。e)多级反馈队列算法使用例题三数据, 要求运行结果给出正确进程调度次序和过程描述。二、 方法、 步骤: (说明程序相关算法原理或知识内容, 程序设计思绪和方法, 能够用步骤图表述, 程序关键数据结构设计、 关键函数之间调用关系等)先来先服务算法:按抵达时间前后, 选择最先来作业最先实施实现思想:对作业抵达时间按大小进行排序, 然后按次序实施短作业优先算法: 在后备队列中, 选择服务时间最短作业最先实施 对作业按抵达时间排序, 接着对抵达作业, 即后备队列中作业按服务时
2、间排序, 取服务时间最小作业最先实施高响应比算法:对作业优先权(响应时间/要求服务时间)进行计算, 对优先权最高最先实施实现实现: 计算后备队列中作业优先权, 并排序, 优先权最高最先实施时间片轮转算法:将全部就绪进程按先来先服务排成队列, 把CPU分配给队首进程, 进程只实施一个时间片, 时间片用完后, 将已使用时间片进程送往就绪队列末尾, 分配处理机给就绪队列中下一进程将作业按抵达时间排序, 在后备队列中选择第一个作业, 把CPU分配给它, 实施一个时间片, 时间片用完后, 将作业送往后备队列末尾, 把CPU分配给下一个作业, 直到全部作业完成多级反馈队列调度算法:设置多个就绪队列, 各个
3、队列优先级逐一降低, 各个队列时间片逐一增加, 优先级越高队列实施时间片就越短, 通常时间片按倍增规则, 每个新进程首优异入第一个队列, 遵照FCFS, 在目前队列时间片内, 进程若能完成, 退出, 进程若未完成, 降级到第二个队列, 一样遵照FCFS依次类推, 若在第二个队列时间片内仍未完成, 再降级到第三个队列设置多个就绪队列, 各个队列优先级逐一降低, 各个队列时间片逐一增加, 优先级越高队列实施时间片就越短, 通常时间片按倍增规则, 比如, 第二队列时间片要比第一个队列时间片长一倍, , 第i+1个队列时间片要比第i个队列时间片长一倍, 整合了时间片、 FCFS、 优先级三种机制。三试
4、验过程及内容: (对程序代码进行说明和分析, 越具体越好, 代码排版要整齐, 可读性要高)#include stdio.h#include/#includetime.hmath.h/#define NULL 0#define getpch(type)(type*)malloc(sizeof(type)typedef struct pcb PCB;struct pcb /定义进程控制块PCB int id; /标示符 char name10; /名称 int time_start; /抵达时间 int time_need; /服务时间 int time_left; /剩下运行时间 int tim
5、e_used; /已使用时间 char state; /进程状态;/*系统函数void _sleep(int n) clock_t goal; goal=(clock_t)n*CLOCKS_PER_SEC+clock(); while(goalclock();char _keygo() char c; printf(按任意键继续n); c=getchar(); return c;/*用户函数int time_unit=2;int num=5; /实际进程数量PCB pcbdata10= /例程内置数据 1000,A,0,4,4,0,R, 1001,B,1,3,3,0, 1002,C,2,5,5
6、,0, 1003,D,3,2,2,0, 1004,E,4,4,4,0,int num1=4;PCB pcbdata110= /例题一数据Job1,1,9,9,0,Job2,1,16,16,0,Job3Job4,1,11,11,0,int num2=4;PCB pcbdata210= /例题二数据P1,10,8,8,0,P2,12,12,12,0,P3,14,4,4,0,P4,16,6,6,0,int num3=4;PCB pcbdata310= /例程三数据,0,7,7,0,5,4,4,0,7,13,13,0,12,9,9,0,int ready10; /就绪队列, 存放进程在pcbdata中
7、位置int order10; /统计排序使用哪个数值作为排序对象void intput() int i;进程总数为: scanf(%d,&num); for(i=0;inum;i+) pcbdatai.id=1000+i; printf(输入第%d个进程名:,i+1); scanf(%spcbdatai.name);输入第%d个进程抵达时间:pcbdatai.time_start);输入第%d个进程服务时间:pcbdatai.time_need); pcbdatai.time_left=pcbdatai.time_need;n pcbdatai.time_used=0; pcbdatai.st
8、ate=; /*调度函数void FCFS() int i,j,temp; double k; orderi=pcbdatai.time_start; readyi=i;i+) /按抵达时间排序 for(j=i+1;jorderj) temp=orderi; orderi=orderj; orderj=temp; temp=readyi; readyi=readyj; readyj=temp; -先来先服务算法调度: 非抢占, 无时间片-n temp=pcbdataready0.time_start; for(i=0; printf(第%d个进程-%s,i+1,pcbdatareadyi.na
9、me);本进程正在运行 _sleep(1);运行完成n temp+=pcbdatareadyi.time_need; j=temp-pcbdatareadyi.time_start; k=(float)j/pcbdatareadyi.time_need;完成时间-%d,周转时间-%d,带权周转时间-%.1fn,temp,j,k);-全部进程调度完成-nvoid SJF() int i,j,temp,l,temp_num; int time=0;num1; orderi=pcbdata1i.time_start; readyi=i;-短作业算法调度: int t_ready10; /就绪队列,
10、存放进程在pcbdata中位置 int t_order10; t_orderi=pcbdata1readyi.time_need;/服务时间作为排序对象 t_readyi=readyi; time=order0; for(l=0;ll+) /判定抵达进程数, 用temp_num存放 for(i=0;num&pcbdata1readyi.time_startt_orderj&t_orderj!=0|t_orderi=0) temp=t_orderi; t_orderi=t_orderj; t_orderj=temp; temp=t_readyi; t_readyi=t_readyj; t_rea
11、dyj=temp; printf(,l+1,pcbdata1t_ready0.name); 正在运行 _sleep(1); time+=pcbdata1t_ready0.time_need; j=time-pcbdata1t_ready0.time_start; k=(float)j/pcbdata1t_ready0.time_need; t_order0=0;,time,j,k);void HRF()num2; orderi=pcbdata2i.time_start;-高响应比算法调度: t_orderi=1; /判定抵达进程数pcbdata2readyi.time_starti+) /计算
12、已抵达进程优先权 if(t_orderi)t_orderi=(time-pcbdata2t_readyi.time_start+ pcbdata2t_readyi.time_need)/pcbdata2t_readyi.time_need;i+) /按优先权排序 if(t_orderit_orderj) ,l+1,pcbdata2t_ready0.name); time+=pcbdata2t_ready0.time_need; j=time-pcbdata2t_ready0.time_start; k=(float)j/pcbdata2t_ready0.time_need;void Times
13、lice() int done=0; orderi=pcbdatai.time_start;-时间片轮转算法调度: 非抢占, 时间片大小为2-n donel+) /判定抵达进程数pcbdatareadyi.time_start if(time!=order0) /将已使用时间片进程, 即第一个移到队列末尾 for(i=1;i+) temp=t_readyi; t_readyi=t_readyi-1; t_readyi-1=temp; if(pcbdatat_ready0.state!=F)第%d个时间片被进程%s使用,l+1,pcbdatat_ready0.name);正在运行n 时间片使用完
14、, 所需时间%d,pcbdatat_ready0.time_left); time+=2; pcbdatat_ready0.time_used+=2; pcbdatat_ready0.time_left-=2;使用时间%d,还需时间%d,2,pcbdatat_ready0.time_left); /判定进程是否结束 if(pcbdatat_ready0.time_left=0) printf(进程%s结束n,pcbdatat_ready0.name); done+; pcbdatat_ready0.state= else进程%s就绪n void MRLA() int i,j,temp,l,te
15、mp_num,temp_num2; /系统时间 /已完成进程 int t_ready10; int queue10; /进程对应队列 int qtime10; /进程对应时间片num3; orderi=pcbdata3i.time_start; queuei=1; qtimei=0;-多级反馈算法调度: 抢占式, 时间片大小为2-nl+) num3&pcbdata3readyi.time_startqueuej&pcbdata3t_readyj.state!) temp=queuej-1; queuej-1=queuej; queuej=temp; temp=t_readyj-1; t_readyj-1=t_readyj; t_readyj=temp; temp=qtimej-1; qtimej-1=qtimej; qtimej=temp;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1