1.CPU调度的直观想法
线程1阻塞,线程2 3都处于就绪态,该执行哪个呢?需要有调度策略
- FIFO
- 先进先出,简单有效。比如:食堂
- Priority
- 任务短的先执行(怎么知道任务的执行时长)
- 任务多了,优先级询问 会越来越长
- 如果优先级高的任务 耗时很长怎么办?比如优先级高的用户需要填一个很长的表格
2.面对诸多场景,如何设计调度算法?
- 目的:
- 面对用户,目的是让用户满意
- 面对进程:CPU调度的目标是 进程满意
- 如何让进程满意?
- 尽快结束任务:周转时间(从任务进入到任务结束)短
- 响应用户操作快:响应时间(从操作发生到响应)短
- 系统内耗时间少:吞吐量(完成的任务量)
- 总原则:系统专注于任务执行,又能合理调配任务
3.如何做到 合理调配任务
- 吞吐量 和 响应时间 有矛盾
- 响应时间小,需要进程频繁切换,切换的次数多了,系统内耗大,吞吐量就小了
- 前台任务 和 后台任务 关注点不同
- 前台任务 关注 响应时间,后台任务 关注 周转时间
- IO约束型任务 和 CPU约束型任务 有各自的特点
- IO约束型,比如word,CPU执行时间少,IO时间长
- CPU约束型,很长时间 都是CPU在计算,没有IO
任务类型不同,需要有折中方案,考虑很多 会使操作系统复杂
好的CPU调度算法 要折中也要简单
4. CPU调度算法及影响因素
4.1 FCFS(First Come, First Served)
谁先来,谁先被处理
P1 到 P5 顺序执行,平均周转时间是 40.2
短的任务放前边,短的任务优先执行,平均周转时间是 35
短的任务方前边,能增加任务的满意度
4.2 短任务优先
如果调度结果是 P1,P2,…,Pn,则平均周转时间为:
P1 + P2 + P3 + … + Pn = ∑(n + 1 - i) * Pi
P1的周转时间是 P1
P2的周转时间是 P1 + P2
……
Pn的周转时间中含有 n*P1 + (n - 1) * P2 + …
P1 计算的次数最多,需要把最短的任务放在前边
平均周转时间是 25.2
4.3 轮转调度 解决 响应时间问题
顺序执行 需要等前边的任务 全部执行完,自己才能执行,排序靠后的任务 一直得不到执行
如何解决?
按时间片来轮转调度
轮转调度叫 Robin,是一个小鸟
将P1分为10个时间片,P2氛围10个时间片,P3分为3个时间片……
按时间片切换,每个任务执行一段,轮转调度,不会偶一个任务长期等待
切换次数增多,切换的耗时就在增加,时间片大小要折中:
- 时间片大:响应时间太长
- 时间片小:吞吐量小
- 折中:时间片 10-100ms,切换时间 0.1-1ms(1%)
4.4 响应时间 与 周转时间
响应时间 和 周转时间 同时存在:word 更关心 响应时间,gcc 更关心 周转时间,两种任务同时存在,怎么办?
要设置优先级,设置 前台任务 和 后台任务
前台任务 优先级高,后台任务 优先级低。
定义 前台任务队列 和 后台任务队列,只有前台任务没有了 才调度后台任务
如果一直有前台任务,后台任务一直得不到执行(优先级低的任务一直得不到执行)……
任务的优先级要动态调整
一般后台任务 耗时比较长,一旦后台任务转到前台执行,可能耗时很长,一直不释放CPU,前台任务的响应时间又没法保证
前后台任务都要设置时间片,后台任务转到前台,执行一段,要释放CPU,让其他任务执行
要以 轮转调度为核心,又要考虑 优先级,要折中。考虑很多,又很麻烦……
4.5 还有很多问题
- 怎么判断 哪些是 前台任务,哪些是 后台任务?调度算法要认识这个任务,根据任务变化,调整优先级
- 一个任务 既有IO 又要 计算快。比如 gcc是CPU约束型的,按Ctrl + C 也是IO,word是IO约束型的,Ctrl + F 也要求 运算快
- 短任务优先,如何判断任务长度?长度是未来的信息……
总结:
- 调度:从就绪队列中 找一个 任务执行
- 调度算法要考虑 时间(周转时间、响应时间)、任务的特点(IO或CPU约束)、优先级
- 需要折中方案:短任务优先(减少周转时间)、以 轮转调度为核心,要设置优先级