实验题目:响应比最高者优先算法一、 实验目的熟悉操作系统作业管理步骤,用C语言编程模拟实现响应比最高者优先算法二、 实验环境及仪器设备硬件环境:IBM-PC或兼容机软件环境:C语言编程环境三、 实验算法思想最高响应比优先法(HRN,Highest Response_ratio Next)是对FCFS方式和SJF方式的一种综合平衡FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短因此,这两种调度算法在某些极端情况下会带来某些不便HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行 响应比R定义如下: R =(W+T)/T = 1+W/T 其中T为该作业估计需要的执行时间,W为作业在后备状态队列中的等待时间每当要进行作业调度时,系统计算每个作业的响应比,选择其中R最大者投入执行这样,即使是长作业,随着它等待时间的增加,W / T也就随着增加,也就有机会获得调度执行这种算法是介于FCFS和SJF之间的一种折中算法由于长作业也有机会投入运行,在同一时间内处理的作业数显然要少于SJF法,从而采用HRN方式时其吞吐量将小于采用SJF 法时的吞吐量。
另外,由于每次调度前要计算响应比,系统开销也要相应增加(1)等待时间相等时则服务时间越短,优先级越高,符合SJF思想2)服务时间相等时,则等待时间越长,优先级越高,符合FCFS思想3)对于长作业,只要其等待时间足够长,也能获得处理机四、 实验步骤实验中,作业控制块及队列的数据结构定义如下:struct task {string name; /*作业号*/int arrTime; /* 作业到达时间*/int serTime; /*作业要求服务时间*/int waiTime; /*等待时间*/int begTime; /*开始运行时间*/int finTime; /*结束运行时间*/推荐精选int turTime; /*周转时间*/int wTuTime; /*带权周转时间*/int priority;/*优先权*/int finish;/*是否已经完成*/}JCB[10];存放作业控制块的区域:#define n 10JCB jobtable[10];int jobcount; 将作业控制块组织成一个队列,实验中采用静态链表的方式模拟作业的后备队列,作业队列头指针定义为:int *head;实验中,内存采用可移动的动态分区管理方法,即只要内存空闲区总和作业大就可以满足作业对内存的需求;对打印机和磁带机这两种独占设备采用静态分配法,即作业执行前必须获得所需资源,并且执行完才归还。
采用响应比高者优先调度算法进行调度时,必须计算出系统中所有满足必要条件作业的响应比,从中选择响应比最高的一个作业装入主存储器分配资源由于是实验,所以就将作业控制块出队,并输出作业名代替装入处存储器,同时修改系统的资源数量推荐精选推荐精选五、 实验清单#include#include#include#include#include#includetypedef 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[10];int num; void input(){ int i; system("cls"); printf("\n请输入作业数量: "); scanf("%d", &num); for(i=0;iJCB[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(" 名称 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n"); } printf("%9s%9d%9d%9d%9d%9d%9d\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; for(i=0; i