-
许多适用于进程调度的算法也适用于线程调度,因此一并来讨论
-
进程切换的代价比较高,需要__从用户态切换到内核态__,并且要__保存当前进程的状态__
-
进程的分类
计算密集型: 绝大多数时间花费在计算上
IO密集型: 绝大多数时间花费在等待IO上
随着CPU速度的提高,越来越多的进程由计算密集型转化为IO密集型
-
需要进行调度的时机
1° 创建一个新的进程后
2° 一个进程退出后
3° 一个进程阻塞在IO或信号量或其他原因时
4° IO中断发生时
-
调度算法的大致分类
非抢占式调度算法: 每个进程(线程)一直运行,直至它被阻塞或主动让出
抢占式调度算法: 每个进程要么运行到进程结束,要么运行到分配的时段的最大值,时钟中断到来时进行重新分配
-
采用哪种调度算法,考虑的是不同环境下的需求
-
调度算法运行环境的大致分类
(1) 批处理系统
1° 特点: 运行周期性的作业,不会出现用户的短请求
2° 尽可能使用__非抢占式调度算法__ 或 长周期的抢占式调度算法,避免进程频繁切换
(2) 交互式用户环境(服务器也属于此类)
1° 特点: 有多个用户的请求
2° 尽可能使用 抢占式调度算法
(3) 实时系统
1° 特点: 相比交互式用户环境,实时系统只会运行那些用来推进现有应用的程序
2° 不是很需要进行抢占式
-
调度算法的目标
(1) 目标
1° 公平性。 保证相似优先级的进程得到相似的服务,不同类型的进程采用不同方式处理
2° 保持系统的所有部分尽可能忙碌
(2) 评价指标
1° 批处理系统
I. 吞吐量: 每小时完成的作业数量
II. 周转时间: 从一个批处理作业提交到它彻底完成所用的__平均时间__
III. CPU利用率: 一段时间内CPU工作的平均时间与总时间的比值
三个指标未必能同时达到最优,它们常常是矛盾的
2° 交互式系统
I. 最小响应时间: 从发出命令到命令得到响应所需的时间
均衡性问题:对于不同的活动,用户期望的响应时间是不一样的。所以对于用户认为应该快速执行的活动,应该尽可能保证短的响应时间
3° 实时系统
满足绝大多数的__截止时间__要求(例如一个实时播放音频的系统,如果总是不能满足截止时间要求,那么音质会严重下降)
为了达到实时系统的截止时间要求,需要有高度的可预测性
-
批处理系统的调度算法
(1) 先来先服务
1° 操作
每个进程只要被调度,就运行到它结束或阻塞;
先来的进程先被调度;
如果进程被阻塞后又恢复,那么它将成为最后到来的进程重新排队
2° 非抢占式
(2) 最短作业优先
1° 操作
每个进程只要被调度,就运行到它结束或阻塞;
同时有一批进程需要调度时,按照作业的时间长短进行排序,作业时间短的进程排序在前优先被调度
2° 非抢占式
3° 只有在所有的作业都可同时运行的情况下,最短作业优先算法才是最优解。实际情况很难达到
(3) 最短剩余时间优先
1° 操作
每个进程只要被调度,就运行到它结束或阻塞;
每次需要调度时,都统计它们的剩余运行时间(因为有的进程是阻塞后恢复的,剩余运行时间≠总运行时间),剩余时间短的进程排序在前优先被调度
2° 非抢占式
-
交互式系统的调度算法
适用于个人PC、服务器等
(1) 轮转调度
1° 操作
每个进程被分配一个__时间片__;
如果进程在时间片到来之前结束或阻塞,则CPU进行切换;
如果时间片到来时进程未结束, 则剥夺该进程的CPU进行再分配
2° 时间片长度的选取
若时间片长度太短 --> 进程频繁切换,而切换进程需要代价,造成CPU效率降低;
若时间片长度太长 --> 短请求的响应时间过长
经验规律是时间片长度为20-50ms
3° 抢占式
(2) 优先级调度
1° 操作
和__轮转调度__相同,但是引入了优先级系统,优先级高的进程先被调度
2° 解决低优先级进程"饥饿"问题的办法
I. 每个时钟中断发生时,降低当前进程的优先级,使得低优先级进程有机会被调度
II. 设置每个进程连续允许运行的最大时间片
3° 动态设定进程优先级的办法
对于某个进程A,若在上一个时间片中它占据CPU的时间比例为f,则将它的优先级置为 1/f
这样做的结果是: IO密集型的进程会被优先调度(这是我们希望看到的结果,因为IO密集型的进程只需要占用一点点的CPU时间,接下来它就去等待IO了,CPU空出来可以交给其他计算密集型的进程使用)
4° 轮转调度和优先级调度的结合
首先通过种种方式(静态、动态),确定所有进程的优先级级别;
对于不同级别的进程,采用优先级调度;
对于相同级别, 采用轮转调度。
(但是要注意"饥饿"问题)
5° 抢占式
(3) 多级队列
1° 操作
和__轮转调度__相同,但是不同进程分配的时间片数量不同;
首先将进程分为 终端响应, IO操作, 短时间片型, 长时间片型几种类型(只是一种分类方式),它们的优先级依次降低;
优先级高的进程优先被执行,但是运行的时间片数量少;优先级低的进程后被执行,但是运行的时间片数量多
2° 目标
优先级高的进程是IO密集型进程,它们应该优先被执行,但是由于它们占有CPU的时间短,因此需要经常切换,所以要分配少的时间片;
优先级低的进程是计算密集型进程,不应该被频繁切换,所以要分配数量多的连续时间片
(4) 最短进程优先
1° 让运行时间短的作业先被调度
2° 确定运行时间的方法
根据已经发生的命令的执行时间t来预测
Tn = aTn-2 + (1-a)Tn-1
(5) 保证调度
1° 如果有n个进程,保证调度的目标是保证每个进程获得 1/n的CPU时间
2° 操作
统计每个进程自创立以来用了多少CPU时间,再计算应该获得的CPU时间,两者相除作为优先级
(6) 彩票调度
1° 类似于俄罗斯轮盘赌,给重要的进程分配更多的彩票,让它们有更大的概率被调度
-
实时系统中的调度
(1) 可调度条件
设有m个周期事件, 每个时间以Pi的周期发生,处理一个时间需要的CPU时间是Ci, 若满足
m Σ Ci/Pi ≤ 1 i=1
则可以进行调度
(2) 调度算法: 在后面某章的内容中
chapter02_进程与线程_4_调度
最新推荐文章于 2023-08-31 20:39:13 发布