作业调度算法 设计思路 1 每个进程有一个作业控制块 JCB 表示 进程控制块包含如下信息 作业 号 作业到达时间 作业要求服务时间 等待时间 开始运行时间 结束运 行时间 周转时间 带权周转时间 优先权和是否已经完成 2 设置一个作业数量 num 3 由于在单道批处理系统中 作业一投入运行 它就占有计算机的一切资源直 到作业完成为止 因此调度作业时不必考虑它所需要的资源是否得到满足 它 所占用的 CPU 时限等因素 4 分别采用先来先服务 FCFS 最短作业优先 SJF 响应比高者优先 HRN 的调度算法对输入进程进行调度 5 先来先服务 FCFS 对先来的作业优先处理 6 最短作业优先 SJF 对已就绪作业进行短程序优先服务 7 响应比 等待时间 需要服务时间 需要服务时间 响应比高者优先 HRN 是对已就绪作业进行响应比高者优先服务 以免一些程序长时间不能 被执行 8 对每种调度算法都要求打印每个作业开始运行时刻 完成时刻 周转时间 带权周转时间 以及这组作业的平均周转时间及带权平均周转时间 以比较各 种算法的优缺点 开始 当前作业为依编号找到第一 个还没执行的作业 当前作业是最后一个作业 和下一个还没执行 的作业比较 返回这一次要 执行的作业 FCFS 当前作业取较早到 达的一个 Y N 开始 当前作业为依编号找到第一 个还没执行的作业 当前作业是最后一个作业 和下一个还没 执行的作业比较 返回这一次要 执行的作业 当前作业取较早到达且 服务时间较短的一个 Y N 当前在上次作业 被执行完之前到达 同时到达 当前作业取服务 时间较短的一个 当前作业取较早 到达的一个 YN YN SJF 开始 当前作业为依编号找到第一 个还没执行的作业 当前作业是最后一个作业 和下一个还没 执行的作业比较 返回这一次要 执行的作业 当前作业取较早到达且 相应比较高的一个 Y N 当前在上次作业 被执行完之前到达 同时到达 当前作业取相应 比较高的一个 当前作业取较早 到达的一个 YN YN HRN include include include conio h 是一个包含一些字符处理函数的头文件 如 getch getch 是无显示的从键盘接收一个字符 有显示的接收是 getchar typedef char string 10 定义 string 为含有 10 个字符元素的字符数组类型 struct task string name 作业号 int arrTime 作业到达时间 int serTime 作业要求服务时间 int waiTime 等待时间 int begTime 开始运行时间 int finTime 结束运行时间 int turTime 周转时间 int wTuTime 带权周转时间 int priority 优先权 int finish 是否已经完成 JCB 5 int num void input int i system cls printf nPlease input task number scanf d for i 0 i num i printf nPlease input task NO d n i printf The name of task scanf s JCB i name printf The time arrive scanf d printf The time need scanf d JCB i priority 0 JCB i finish 0 int FCFS int current int i j for i 0 i num i if JCB i finish current i 找到第一个还没完成的作业 break for j i j num j 和后面的作业比较 if JCB j finish 找出先来的未完成作业 return current 返回当前作业 int SJF int pre int current i j for i 0 i num i if JCB i finish current i 找到第一个还没完成的作业 break for j i j num j 和后面的作业比较 if JCB j finish 还没完成 运行 if JCB current arrTime JCB pre finTime 如果作业在上一个作业完成之前 到达 if JCB j arrTime JCB pre finTime 找出到达时间在上一个作业完成之前 服务时间比较小 的未完成作业 else 如果作业是在上一个作业完成之后到达 if JCB j arrTime JCB current arrTime current j 找出比较早到达的一个 if JCB j arrTime JCB current arrTime 如果同时到达 if JCB j serTime JCB current serTime current j 找出服务时间比较短的一个 return current 返回当前作业 int HRN int pre int current 1 i j 优先权 等待时间 服务时间 服务时间 for i 0 i num i JCB i waiTime JCB pre finTime JCB i arrTime 等待时间 上一个作业的完成 时间 到达时间 JCB i priority JCB i waiTime JCB i serTime JCB i serTime for i 0 i num i if JCB i finish current i 找到第一个还没完成的作业 break for j i j num j 和后面的作业比较 if JCB j finish 还没完成 运行 if JCB current arrTime JCB pre finTime 如果作业在上一个作业完成之 前到达 if JCB j arrTimeJCB current priority current j 找出到达时间在上一个作业完成之前 优先权高的作业 else 如果作业是在上一个作业完成之后到达 if JCB j arrTimeJCB current priority current j 找出服务时间比较短的一个 return current 返回当前作业 void runing int i int times int pre int staTime int endTime if times 0 JCB i begTime JCB i arrTime JCB i finTime JCB i begTime JCB i serTime JCB i turTime JCB i serTime JCB i wTuTime 1 0 staTime JCB i begTime else if JCB i arrTime JCB pre finTime JCB i begTime JCB i arrTime else JCB i begTime JCB pre finTime JCB i finTime JCB i begTime JCB i serTime JCB i turTime JCB i finTime JCB i arrTime JCB i wTuTime JCB i turTime JCB i serTime if times num 1 endTime JCB i finTime JCB i finish 1 void print int i int times if times 0 printf name arrTime serTime begTime finTime turTime wTuTime n printf 9s 9d 9d 9d 9d 9df 9df n JCB i name JCB i arrTime JCB i serTime JCB i begTime JCB i finTime JCB i turTime JCB i wTuTime void check int i int staTime endTime sumTurTime 0 0 sumWTuTime 0 0 aveTurTime aveWTuTime int current 0 times 0 pre 0 JCB pre finTime 0 printf n FCFS n for times 0 times num times current FCFS runing current times pre staTime endTime print current times pre current for i 0 i num i sumTurTime JCB i turTime sumWTuTime JCB i wTuTime aveTurTime sumTurTime num aveWTuTime sumWTuTime num printf total 9 2f 9 2f 9 2f 9 2f n staTime endTime aveTurTime aveWTuTime printf n for i 0 i num i JCB i finish 0 staTime endTime sumTurTime 0 0 sumWTuTime 0 0 aveTurTime aveWTuTime current 0 times 0 pre 0 JCB pre finTime 0 printf n SJF n for times 0 times num times current SJF pre runing current times pre staTime endTime print current times pre current for i 0 i num i sumTurTime JCB i turTime sumWTuTime JCB i wTuTime aveTurTime sumTurTime num aveWTuTime sumWTuTime num printf total 9d 9d 9d 9d n staTime endTime aveTurTime aveWTuTime printf n for i 0 i num i JCB i finish 0 staTime endTime sumTurTime 0 0 sumWTuTime 0 0 aveTurTime aveWTuTime current 0 times 0 pre 0 JCB pre finTime 0 printf n HRN n for times 0 times num times current HRN pre runing current times pre staTime endTime print current times pre current for i 0 i num i sumTurTime JCB i turTime sumWTuTime JCB i wTuTime aveTurTime sumTurTime num aveWTuTime sumWTuTime num printf total 9d 9d 9d f 9df n staTime endTime aveTurTime aveWTuTime printf n void main char again do system cls 清屏 printf please input 4 groups of datas n input check printf Continue Y N do again getch while again Y while again Y again y
展开阅读全文