面试必备操作系统之进程调度算法(非常全面)
文章目录
- 背景
- 衡量指标
- 调度算法
- 先进先出(FIFO)
- 最短任务优先(SJF)
- 最短完成时间优先(STCF)
- 新衡量指标:响应时间
- 轮转(Round-Robin,RR)
- 去掉假设没有IO操作
- 参考
背景
假设在单核cpu上如何让进程运行更高效呢?在io等待的时候是否可以执行其他进程来达到高效的调度呢,在单核cpu中有程序并行运行的感觉,要做到这些就要依赖操作系统的调度算法。
衡量指标
在调度算法中,我们要选择哪一个调度算法,那个调度算法性能最高,评价标准是什么?一般我们都是周转时间来评论:
- T周转时间= T完成时间−T到达时间
如果假设所有的任务在同一时间到达,那么T到达时间= 0
,因此T周转时间= T完成时间
但是有时候一些调度算法为了性能会丢失公平性,也就是可能有些任务始终无法得到调度,也就是产生了饥饿,具体我们来看看下面不同的调度算法
调度算法
先进先出(FIFO)
这是最简单也是最基础的调度算法
定义:哪个任务先来就先执行哪个
特点:
- 实现简单
举例说明:
假设 现在有A、B、C三个任务在相同的时间到达系统(T到达时间= 0)。但是A比B早一点点,然后B比C早到达一点点。每个工作运行10s。这些工作的平均周转时间(average turnaround time)是多少呢?
这里我们先作出几个假设:
- 任务同时到达
- 任务没有IO操作
- 任务时间是已知的
随着研究的深入我们会慢慢放开这些假设
平均周转时间 = (10 + 20 + 30)/ 3 = 20
但是如果这里我们假设A运行的时间需要100s,其他条件不变,那么
平均周转时间 = (100 + 110 + 120)/ 3 = 110
可以看到平均周转时间非常高,这样来看FIFO就不那么好了。
这种现象通常被称为护航效应(convoy effect)。一些耗时较少的潜在资源消费者被排在重量级的资源消费者之后。就像你在排队买东西,明明你只要1秒钟就可以结完账,而前面的一个人买了一大堆东西,需要100s,而你就需要等待他100s。
所以这种调调算法缺点很明细,那么我们试试让最短的任务最先调度,是不是就解决了上面的问题呢?
最短任务优先(SJF)
- 定义:先运行最短的任务,然后是次短的任务
我们仍然使用上面的例子然后使用最短任务优先(SJF)调度算法来看看
平均周转时间 = (10 + 20 + 120)/3= 50
可以看到提升是非常明显的。看样子最短任务优先(SJF)似乎是我们理想的调度算法了,但是这是在我们假设任务同时到达的前提先发生的,现实往往并非如此,如果A、B、C任务不是同时到达呢。
这里我们再假设A在t = 0时到达,需要运行100s。而B和C在t = 10到达,且各需要运行10s
从图中可以看出,即使B和C在A之后不久到达,它们仍然被迫等到A完成,从而遭遇同样的护航问题。这3项工作的平均周转时间为
103.33s =(100+(110−10)+(120−10))/3
遇到这个问题我们要如何设计一款更好的调度算法呢,我们可能想到了,就是在B、C任务来临时,如果他们的执行时间相对A来说较短,就可以停下A去执行B、C,这种调度方式就是抢占式的,现代操作系统基本都是使用的抢占式调度算法。
最短完成时间优先(STCF)
在了解这个算法之前我们先聊聊两个定义
时钟中断:如果任务没有执行IO操作主动放弃使用CPU,即使是操作系统也无法获取到CPU的执行权,所以就有时钟设备可以编程为每隔几毫秒产生一次中断。产生中断时,当前正在运行的进程停止,操作系统中预先配置的中断处理程序(interrupthandler)会运行。此时,操作系统重新获得CPU的控制权。(基于硬件层面获取CPU控制权)
上下文切换:操作系统要为当前正在执行的进程保存一些寄存器的值(例如,到它的内核栈),并为即将执行的进程恢复一些寄存器的值(从它的内核栈)。
定义: 每当新工作进入系统时,它就会确定剩余工作和新工作中,谁的剩余时间最少,然后调度该工作
基于上面的例子我们再来看看这种调度算法的平均周转时间为
50s。
新衡量指标:响应时间
这里看似我们似乎找到了最优的调度算法
但是如果我们再加入一个考察指标呢:响应时间
如果我们知道任务长度,而且任务只使用CPU(即假设没有IO操作),而我们唯一的衡量是周转时间,STCF会是一个很好的策略。事实上,对于许多早期批处理系统,这些类型的调度算法有一定的意义。然而,引入分时系统改变了这一切。现在,用户将会坐在终端前面,同时也要求系统的交互性好。因此,一个新的度量标准诞生了:响应时间(response time)
T响应时间= T首次运行−T到达时间
如果我们有上面的调度(A在时间0到达,B和C在时间10达到),每个作业的响应时间如下:作业A为0,B为0,C为10(平均:3.33)
如果3个工作同时到达,第三个工作必须等待前两个工作全部运行后才能运行(一些IO操作)。这种方法虽然有很好的周转时间,但对于响应时间和交互性是相当糟糕的。假设你在终端前输入,不得不等待10s才能看到系统的回应,只是因为其他一些工作已经在你之前被调度:你肯定不太开心
因此,我们还有另一个问题:如何构建对响应时间敏感的调度程序?
轮转(Round-Robin,RR)
- 定义:RR在一个时间片(time slice,有时称为调度量子,scheduling quantum)内运行一个工作,然后切换到运行队列中的下一个任务,而不是运行一个任务直到结束。它反复执行,直到所有任务完成
因此,RR有时被称为时间切片(time-slicing)。因此,如果时钟中断是每10ms中断一次,则时间片可以是10ms、20ms或10ms的任何其他倍数
我们来看一个例子:
假设3个任务A、B和C在系统中同时到达,并且它们都希望运行5s
我们看看 最短任务优先(SJF)和 RR的一个对比
RR的平均响应时间是:(0 + 1 + 2)/3 = 1 周转时间:(13+14+15)/ 3 = 14
SJF 算法平均响应时间是:(0 + 5+ 10)/ 3 = 5
这里可以看到时间片长度对于RR是至关重要的。越短,RR在响应时间上表现越好。然而,时间片太短是有问题的:突然上下文切换的成本将影响整体性能。因此,系统设计者需要权衡时间片的长度,使其足够长,以便摊销(amortize)上下文切换成本,而又不会使系统不及时响应
- 摊销技术(amortization):通过减少成本的频度(即执行较少次的操作),系统的总成本就会降低。例如,如果时间片设置为10ms,并且上下文切换时间为1ms,那么浪费大约10%的时间用于上下文切换。如果要摊销这个成本,可以把时间片增加到100ms。在这种情况下,不到1%的时间用于上下文切换,因此时间片带来的成本就被摊销了
上下文切换的成本不仅仅来自保存和恢复少量寄存器的操作系统操作。程序运行时,它们在CPU高速缓存、TLB、分支预测器和其他片上硬件中建立了大量的状态。切换到另一个工作会导致此状态被刷新,且与当前运行的作业相关的新状态被引入,这可能导致显著的性能成本
上面的问题说完,我们可以看到RR我给出的另一个指标周转时间14,如果用之前的评判标准来说RR似乎是最差的调度算法。
所以看到似乎并没有完美的算法,这上面的算法似乎都有一个显著的特点:公平或非公平,即是否抢占式
- 如果是非公平的,响应时间会很短,但是要以周转时间为代价
- 如果是公平的,周转时间会很短,但是要以响应时间作为代价
去掉假设没有IO操作
待更新…
参考
- 操作系统导论
面试必备操作系统之进程调度算法(非常全面)相关推荐
- 【操作系统之进程调度算法习题】
操作系统之进程调度算法习题 1.第一题 解答: 2. 第二题 解答: 3. 第三题 解答: 1.第一题 在一个具有三道作业的批处理系统中,作业调度采用先来先服务(FCFS) 调度算法,进程调度采用 短 ...
- 操作系统实习-进程调度算法(C语言)
文章目录 设计目的 设计内容 设计思路 算法流程图 程序结构 实现代码 调试结果 设计目的 进程管理是操作系统中的重要功能,用来创建进程.撤消进程.实现进程状态转换,它提供了在可运行的进程之间复用CP ...
- 操作系统之进程调度算法
操作系统中的进程调度算法进行分析: 1.先来先服务算法(FCFS) 先来先服务算法是按照作业到达的先后次序来进行调度,或者说是优先考虑在系统中等待时间最长的作业,而不管该作业所执行时间的长短,从后备作 ...
- 操作系统:进程调度算法
进程调度算法 基本调度算法: 1. 先来先服务FCFS:既可以作为作业调度算法也可以作为进程调度算法:按作业或者进程到达的先后顺序依次调度:因此对于长作业比较有利. 算法优点:易于理解且实现简单, ...
- java实现操作系统时间片轮转进程调度算法(RR算法)
Time类 package RR算法; public class time {private int hour;private int min;public int getHour() {return ...
- 金三银四求职季,程序员面试必备——编程语言篇
每年的三四月都是准毕业生最焦灼最忙碌的季节,考研的结果基本都已确定,公务员考试也基本落下帷幕,春招将会陆续进行,很多同学也要开始决定未来工作的方向.每年的三四月份也都是互联网人的跳槽高峰期,所以三四月 ...
- 金三银四求职季,程序员面试必备——数据库篇
我们身处一个技术变革的时代,随着分布式.云计算.大数据等技术的飞速发展,各种数据库百花齐放.它们在具体功能和使用场景上各有千秋,在实现细节上也不尽相同,但是在工作原理上又有着诸多共通性和相似性. 跳槽 ...
- 金三银四求职季,程序员面试必备——数据分析篇
这个年代里,"用数据说话"已经像是一种过气的口号.各行各业不同角色和身份的人们都已懂得"用数据说话"的重要性,甚至日常生活中也需要用数据看清事实,科学吃瓜.所以 ...
- 操作系统中常见的进程调度算法
一.调度与调度算法 调度:操作系统管理了系统的有限资源,当有多个进程(或多个进程发出的请求)要使用这些资源时,因为资源的有限性,必须按照一定的原则选择进程(请求)来占用资源.这就是调度.目的是控制资源 ...
最新文章
- C++ File IO
- 如何禁止电脑某个程序运行(强制自律)
- 【MM模块】Batch 批次管理 2
- Jasypt 加密-整合SpringBoot
- Python判断两个域名的主域名是否相同
- 车借给朋友好几次,满油的车每次还回来都是没油了,我觉得心里有些不舒服是我太计较吗?
- 洛谷 绕钉子的长绳子
- 解决clipboard手机端无法复制的一种思路
- 非线性控制4——李雅普诺夫稳定性理论
- 移植工具 TIA Portal
- 2020 iOS拼多多(多多进宝)APP端接入,打开拼多多商品详情与授权
- 腾讯云GPU云服务器配置初体验
- 迷你世界显示服务器超时,迷你世界因出现不良信息下架 迷你世界下架原因
- 腾讯实习生面试经历及入职体验
- C语言醉酒,驾驶人在道路上饮酒醉酒驾驶机动车处3年以上有期徒刑
- Java 学习之路(二十)- 认识数组和变量
- Aifred、Wox免费开源的效率启动器
- InnoDB引擎--事务持久性
- 电脑上总显示宽带连接服务器怎么办啊,电脑显示宽带已连接网页打不开怎么办...
- Java命令--javap
热门文章
- win10无法安装.NET Framework 3.5服务,提示“无法启动服务”
- 045基于卷积神经网络的94种矿石识别
- PyTorch 源码解读之 cpp_extension:讲解 C++/CUDA 算子实现和调用全流程
- 【转载】buildroot教程
- APP 兼容性专项测试
- 485通信 中终端电阻(转)
- SpringKafka原理解析及源码学习-Spring生态(一)
- 手机里面的精品APP,让你轻松提升工作效率
- Android7.1开机声音
- 路由报错RangeError: Maximum call stack size exceeded at redirect (vue-router.esm.js?8c4f:1394:1)