本次记录高响应比调度算法的C++实现。高响应比调度算法,简单的来说就是对每个进程对计算一个响应比,根据响应比的大小来判断要运行的进程。其实现思路如下:

具体步骤为:

  1. 首先定义进程控制块PCB类:
class PCB
{public:int ID;          //进程IDint runtime;      //进程已运行时间int lasttime;          //进程所需的剩余运行时间int alltime;           //进程的总运行时间int waittime = 1;        //进程等待时间float response;             //进程响应比State state;         //进程所处状态
};
  1. 进程初始化
    实例化进程对象,并且进行初始化。其中,进程的响应比通过以下公式定义:
    响应比response = 等待时间waittime / 进程总运行时间alltime + 1
 vector<PCB>process;for (int i = 0;i < 5;i++){PCB pcb;process.push_back(pcb);}process[0].ID = 0;process[0].runtime = 0;process[0].lasttime = 30;process[0].alltime = process[0].runtime + process[0].lasttime;process[0].response = float(process[0].waittime) / float(process[0].alltime) + 1.0;process[0].state = wait;process[1].ID = 1;process[1].runtime = 0;process[1].lasttime = 20;process[1].alltime = process[1].runtime + process[1].lasttime;process[1].response = float(process[1].waittime) / float(process[1].alltime) + 1.0;process[1].state = wait;process[2].ID = 2;process[2].runtime = 0;process[2].lasttime = 10;process[2].alltime = process[2].runtime + process[2].lasttime;process[2].response = float(process[2].waittime) / float(process[2].alltime) + 1.0;process[2].state = wait;process[3].ID = 3;process[3].runtime = 0;process[3].lasttime = 40;process[3].alltime = process[3].runtime + process[3].lasttime;process[3].response = float(process[3].waittime) / float(process[3].alltime) + 1.0;process[3].state = wait;process[4].ID = 4;process[4].runtime = 0;process[4].lasttime = 50;process[4].alltime = process[4].runtime + process[4].lasttime;process[4].response = float(process[4].waittime) / float(process[4].alltime) + 1.0;process[4].state = wait;
  1. 运行调度算法
    获取5个进程的响应比,寻找其中处于就绪状态且响应比最高的进程,并运行该进程。将该运行进程的运行时间加1、剩余运行时间减1,其他就绪进程的等待时间加1,再重新计算各个进程的响应比。
    直到某个进程的剩余运行时间为0,则表示该进程已经运行结束,则将进程状态置为finish,否则在当前时间片结束后将该进程状态置为wait。
    打印当前调度的进程信息,循环进行调度算法,直到所有进程的状态都为finish则退出循环,高响应比调度算法结束。
 int timeslice = 0;                    //运行消耗的时间片int flag = 0;         //已经运行完毕的进程数while (process[0].lasttime || process[1].lasttime || process[2].lasttime || process[3].lasttime || process[4].lasttime){float responses[5];for (int i = 0;i < 5;i++){//获取5个进程的响应比,如果某个进程已运行结束则将响应比缓冲区中对应值置为0float process_responses[] = { process[0].response,process[1].response,process[2].response,process[3].response,process[4].response };for (int k = 0;k < 5;k++){if (process[k].state == finish){process_responses[k] = 0;}}//如果某进程处于就绪状态,且其响应比是所有就绪进程中最高的,则运行该进程if ((process[i].state == wait) && (process[i].response == *max_element(process_responses, process_responses + 5))){process[i].state = run;cout << "进程" << process[i].ID << "开始运行" << endl;//将该进程的运行时间加1、剩余运行时间减1process[i].runtime += 1;process[i].lasttime -= 1;//将其他就绪进程的等待时间加1,且重新计算响应比for (int j = 0;j < 5;j++){if (i == j  || process[j].state==finish){continue;}process[j].waittime += 1;process[j].response = float(process[j].waittime) / float(process[j].alltime) + 1.0;}//如果该进程的剩余运行时间为0,则将该进程状态置为finish,同时flag+1if (0 == process[i].lasttime){process[i].state = finish;flag++;}//如果该进程的剩余运行时间不为0,则将该进程状态置为waitelse{process[i].state = wait;}//打印进程信息cout << "进程" << process[i].ID << "结束运行" << endl;printMessage();}}timeslice++;if (5 == flag){cout << "所有进程运行结束," << "消耗运行时间片:" << timeslice << endl;break;}}

其中使用printMessage()来进行进程信息打印工作,具体代码如下:

void printMessage()
{cout << "等待队列:";for (int j = 0; j < 5; j++) {if (process[j].state == wait){cout << "    " << process[j].ID;}}cout << endl;cout << "运行完毕队列:";for (int j = 0; j < 5; j++) {if (process[j].state == finish) {cout << " " << process[j].ID;}}cout << endl;cout << "ID\talltime\truntime\tlasttime\tresponse\twaittime\tstate" << endl;for (int j = 0; j < 5; j++) {cout << process[j].ID << '\t' << process[j].alltime <<  '\t' << process[j].runtime << '\t'  << process[j].lasttime << '\t' << '\t' << process[j].response << '\t' << '\t' << process[j].waittime << '\t' << '\t' << process[j].state << endl;}cout << "--------------------------------------------------------" << endl;
}

实现效果如下:


至此,实现了高响应比调度算法的C++实现。

高响应比调度算法既考虑作业的执行时间也考虑作业的等待时间,综合了先来先服务和最短作业优先两种算法的特点,其优势在于短作业与先后次序的兼顾,且不会使长作业长期得不到服务,但是其缺点也很明显,由于每次进行调度都需要计算每个作业的响应比导致了系统开销的增加。

操作系统实验2——高响应比调度算法相关推荐

  1. 作业调度响应比最高c语言实现,高响应比调度算法(c语言程序实现)

    <高响应比调度算法(c语言程序实现)>由会员分享,可在线阅读,更多相关<高响应比调度算法(c语言程序实现)(3页珍藏版)>请在人人文库网上搜索. 1.高响应比调度算法#incl ...

  2. 【操作系统】-- 先来先服务算法(FCFS)、短作业优先算法(SJF)、高响应比调度算法(HRRN)

    一.先来先服务(FCFS) 1.算法思想 主要从公平的角度考虑. 2.算法规则 按照 作业/进程 到达的先后顺序进行服务. 3.是否可抢占 非抢占式算法. 4.是否可导致饥饿 不会导致饥饿. 5.优缺 ...

  3. 操作系统实验之时间片轮转RR进程调度算法

    一.实验内容 设计程序模拟进程的时间片轮转RR调度过程.假设有n个进程分别在T1, - ,Tn时刻到达系统,它们需要的服务时间分别为S1, - ,Sn.分别利用不同的时间片大小q,采用时间片轮转RR进 ...

  4. 操作系统实验:驱动调度 模拟电梯调度算法 C语言实现

    一:实验内容 模拟电梯调度算法,对磁盘进行移臂和旋转调度. 二.实验题目 (1)."驱动调度"进程和"接收请求"进程能否占有处理器运行,取决于磁盘的结束中断信 ...

  5. 操作系统实验六:作业调度算法模拟

    一.实验目的 (1)掌握周转时间.等待时间.平均周转时间等概念及其计算方法. (2)理解五种常用的进程调度算法(FCFS.SJF.HRRF.HPF.RR),区分算法之间的差异性,并用C语言模拟实现各算 ...

  6. 《操作系统》实验三:高响应比优先调度和时间片轮转RR进程调度算法

    [实验题目]:高响应比优先调度和时间片轮转RR进程调度算法 [实验学时]:4学时 [实验目的] 通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法. ...

  7. 作业调度算法--高响应比优先 操作系统_处理器管理_编程题

    操作系统_处理器管理_编程题 作业调度算法–高响应比优先 输入N个作业,输入每个的作业名字,到达的时间,服务的时间,根据高响应比优先算法,计算出每个作业的完成的时间,周转的时间,带权周转的时间(其中保 ...

  8. 操作系统调度算法--高响应比优先调度算法解析

    高响应比优先调度算法(Highest Response Radio Next,HRRN)是一种对CPU中央控制器响应比的分配的算法.HRRN是介于FCFS(先来先服务算法)与SJF(短作业优先算法)之 ...

  9. 【计算机操作系统】用java模拟非抢占式(先来先到、短作业、高响应比),时间片轮转调度算法

    . 首先,我来介绍一下该程序大致内容 程序使用了ArrayList链表来模拟各进程队列,并且结果会显示出每个时刻的进程的运行信息.最后的所有进程的执行结果和进程的执行顺序. ps:各个模拟程序是相互独 ...

最新文章

  1. Block的副本放置策略
  2. CTFshow php特性 web100
  3. react中类组件this指向
  4. 快速理解孤儿进程和僵尸进程
  5. Python中的正则表达式(re)
  6. EL与JSTL表达式代码示例
  7. python不能import当前目录下的文件_python无法导入包是什么原因
  8. python基本词汇的特点_Python 爬完评论只会做词云?情感分析了解一下
  9. 小学计算机学打字教学教案,第13课 键盘指法练习
  10. 人工智能数学基础---定积分3:微积分基本公式(牛顿-莱布尼茨公式)
  11. 苹果2021新品发布会,iMac全新设计你GET到了吗
  12. SAP找出查询透明表的文本表
  13. 江苏省版权申请费用明细以及版权申报流程
  14. Tkinter 8.5 参考手册: a GUI for Python (五)8(鼠标)指针
  15. centos7克隆虚拟机
  16. 微软视频直播服务器,使用微软云媒体服务快速搭建视频直播
  17. 三星手机定时开关机设置方法
  18. mt7688 ap-client 模式下连接上级路由
  19. 圣劳伦斯散热器举行北交所IPO上市辅导签约仪式
  20. openfoam后处理求全床平均孔隙率

热门文章

  1. LDC1612异常读数268435455
  2. Linux的基本命令行操作(精简版)
  3. python统计套利_期货市场内外盘低频统计套利基于Python
  4. 必看!gitee上开源的商城源码
  5. Win11怎么添加用户?我们都知道系统一般默认是administraor用户
  6. 三天打鱼两天晒网python_趣味算法入门;第三题:三天打鱼两天晒网
  7. QGIS编译(跨平台编译)之十五:geos编译(Windows、Linux、MacOS环境下编译)
  8. 老男孩教育 | 努力5个月,收获年薪20w,成功转行!
  9. 上海有哪些值得加入的互联网公司?
  10. Hadoop2.x高可用架构