我们知道,在同一时间内,单个cpu只能执行一个任务。如果只是依照 任务的顺序 排队执行,那么当某一个任务占用时间过长,就会导致后续的任务无法被执行
这样无疑是非常低效的,要想解决这个问题,就得靠本文准备讲解的 调度策略,废话不多说,开搞!
什么是调度策略
其实就是当存在多个任务需要被cpu执行时,不同的任务调度策略会依据不同的规则来选择不同的任务进行执行,最终目的是实现程序运行的 效率最大化
调度策略如果按照 CPU核心数 来划分,可以分为 单处理器调度策略 和 多处理器调度策略,本文是围绕 单处理器调度策略 展开的,这点需要注意
调度策略有哪些
先到先得(First-Come-First-Served, FCFS)
这种就是最简单的,它依据 任务排列的顺序 依次执行,这是一种 非抢占策略,它有如下两个缺点
- 对短进程不利,因为排在前面的长进程会长期霸占cpu资源,所以后面的短进程就需要一直等待
- 对I/O密集的进程不利,因为一旦进行I/O操作,进程就会进入 阻塞休眠 的状态,从而会被重新放入就绪队列等待执行
轮询
RR(Round Robin,轮询)算法给每个任务分配一个 相同的 时间片,当任务的时间片用完之后或进入阻塞状态,调度器会中断当前任务,切换到下一个任务,以此类推,这是一种 抢占策略
它需要注意的点是如何确定时间片的大小。如果太大,会导致长进程的cpu占用时间过长,如果太小,会造成频繁的进程切换
通常来讲时间片的长度最好符合大部分进程 完成一次典型交互 所需的时间,这种策略对于 短进程、I/O密集进程 不友好
最短进程优先(Shortest Process Next, SPN)
按照进程的 预估执行时间 对进程进行优先级排序,先执行短进程,后执行长进程,这是一种 非抢占策略
进程的预估执行时间一般是由操作系统来收集进程运行数据并进行统计分析后得出的
它有两个缺点
- 如果有大量的短进程,那么长进程可能会饥饿得不到响应
- 由于是非抢占策略,所以一旦执行长进程,就会导致cpu的长期占用,后续的任务就得不到执行
最短剩余时间(Shortest Remaining Time, SRT)
在 SPN 的基础上,当一个进程添加到就绪队列时,操作系统会比较 刚添加的新进程的执行时间 和 当前正在执行的老进程的剩余时间,如果新进程的执行时间更短,新进程就会抢占老进程,这是一种 抢占策略
它有两个缺点:
- 需要系统额外记录“老进程“已经执行的时间,从而算出剩余时间
- 长进程可能会饥饿
最高响应比优先(HRRN)
可以解决长进程饥饿问题,同时提高进程的响应速率,它是依据响应比的大小来决定优先级,这是一种 非抢占策略,下面给出响应比的计算公式
响应比 = (等待执行时间 + 进程执行时间) / 进程执行时间
从公式中我们可以得出以下结论
- 对于短进程,由于进程执行时间短,因此分母小,响应比相对就更高,就会被优先执行
- 对于长进程,由于进程执行时间长,因此分母大,一开始的响应比会比较低,但是随着等待执行时间的增长,分子越来越大,响应比也随之增大,最终就可以被执行,避免了饿死的情况
没有一种调度策略是银弹,需要根据不同的场景进行选择,主要考虑以下两个因素
- 响应速率,即进程等待被执行的时间
- 公平性,兼顾短进程、长进程、I/O进程
这两者其实是互斥的关系,也许这就是所谓的鱼和熊掌不可兼得吧
结语
随着自己的技术学习不断深入,越来越觉得计算机的世界真奇妙,里面充满了各种智慧,现在觉得学习也是一种享受了,哈哈!
本篇文章所讲内容也是相对比较底层的知识,属于一种长线投资,最终收益就是我们的技术内功,所以,一起加油吧,骚年!