《现代操作系统》02章 进程与线程(二)
0 前文
4 调度
调度进程——需要决定多个就绪的进程或线程哪个可以运行
调度算法——调度进程使用的算法
4.1 调度介绍
进程行为
CPU运算——CPU密集型
IO活动——IO密集型
何时调度
创建进程后——执行子进程or父进程
进程退出后——执行哪个就绪进程
进程阻塞后——执行哪个就绪进程
进程被中断——执行被打断进程or新就绪进程
时钟中断后:
非抢占式——若没有更高优先级进程等待到时,则继续运行
抢占式——中断发生,挂起当前进程,运行其他就绪进程
算法分类
分类 | 应用方向 | 策略 |
---|---|---|
批处理 | 商业领域、大型机 | 非抢占式、中断周期长的抢占式 |
交互式 | 服务器 | 抢占式 |
实时 | 实时性应用 | 抢占式非抢占式均有 |
调度算法的目标
所有系统:
公平——每个进程公平的CPU份额
------同等级别的进程拥有同等的CPU资源
策略强制执行——按照约定的策略执行
------例如高级别的进程抢先低级别进程运行
平衡——保持系统的所有部分都忙碌
批处理系统(本章研究):
吞吐量——每小时作业数,越大越好
周转时间——从提交到终止的平均时间,越小越好
------要在吞吐量和周转时间中寻找平衡
CPU利用率——保持CPU始终忙碌
------并不是最重要的
交互式系统(本章研究):
响应时间——快速响应请求
------最重要的
均衡性——满足用户期望
------对于一个操作得耗时用户有一个基本的(未必正确的)概念
实时系统(07章研究):
满足截止时间——避免丢失数据
可预测性——多媒体系统(音视频)中避免品质降低
4.2 批处理系统调度
有些算法既可以用在批处理系统也可以用在交互系统
先来先服务(非抢占)
排队运行,先就绪者先运行
阻塞后再就绪,排至队尾
优点:易于理解,方便实现
缺点:IO密集型进程效率低下
最短作业优先(非抢占)
运行时间可预知
所有作业共同到达,优先选择时间短者运行
最短剩余时间优先(抢占)
运行时间可预知
新作业到达,与当前运行作业剩余时间相比,短者优先
4.3 交互式系统调度
4.3.1 轮转调度
维护一张可运行进程的表
每个进程被分配时间片
时间片使用完挂起排至队尾,切换下一个进程
进程提前结束,立即切换
时间片长度的选择尤为关键
过短:切换频繁,浪费很多的CPU时间用来切换(恢复内存映像,寄存器值等等)
过长:发生短请求的长响应时间
时间片长度一般在:20ms-50ms
4.3.2 优先级调度
进程被赋予不同或相同的优先级
优先级高的就绪进程优先运行
为防止高优先进程无限抢占:
两种解决方法:
- 每个时钟中断降低当前进程优先级
- 每个进程被赋予最大运行时间片,使用完后,次级进程运行
优先级的分配:
可以是动态的,也可以是静态的
军队学校根据行政等级分配进程优先级
商业服务器根据缴纳的费用分配优先级
为IO密集型进程分配高优先级(尽快开始下一次IO操作)
一种简单地动态分配算法:
优先级 = (1/f)*T
f:该进程在上一时间片用掉的时间
T:时间片的时长
eg:T=50ms f=1ms 则优先级 = 50 f=25ms 则优先级 = 2
优先级分类算法:
进程按照优先级分为几类,每类中按照轮转调度的方式调度,当高优先级类中有就绪进程时,不会理会低优先级类中的就绪进程
进程的优先级需要动态调整,否则出现低优先级进程的饥饿现象
4.3.3 多级队列
设立优先级类:
CTSS(一个分时系统)的设计:
优先级 | 单次运行时间片数 |
---|---|
8 | 1 |
7 | 2 |
6 | 4 |
5 | 8 |
… | … |
当允许运行时间片数用完后,被移到下一类
- eg:一个进程需要运行100个时间片,初始优先级最高,随着推移,优先级的降低,单次运行时间变长,仅切换了7次进程运行完成,减少了进程切换次数并完成了任务
但是上面的例子存在一个问题,若一直有高优先级进程运行,低优先级进程将一直被挂起(也就是饥饿现象),因此并不是完美的。
XDS940的设计:
名称 | 分配条件 | 优先级 |
---|---|---|
终端 | 等待终端输入的进程被唤醒 | 高 |
IO | 等待磁盘数据IO的进程就绪 | - |
短时间片 | 时间片用完仍为就绪 | - |
长时间片 | 多次时间片用完且并未被阻塞 | 低 |
4.3.4 最短进程优先
借鉴了批处理系统中的算法
最短优先的首要问题就是估计运行时长
老化算法
上一次运行时间T0
这次运行时间T1
预测下次运行时间T2 = a*T0 + (1-a)*T1
a:老化速度,越小老化的越快(先前的值影响减小快)
4.3.5 保证调度
追求绝对的公平,n个进程平等级别,要拥有相同的CPU运行时间
eg: 有n个进程,则每个进程要获得CPU时间的1/n
m = CPU总时间/n 各个进程应得的CPU时间
p1、p2:某两个进程实际的CPU时间
进程1公平指数 = p1/m
进程2公平指数 = p2/m
公平指数小于1的被亏欠,大于1的占了便宜,总不能一直占便宜,所以下次运行时让亏了的先运行
4.3.6 彩票调度
给进程提供系统资源(例如CPU时间)的彩票
调度时随机指定一张彩票为中奖彩票,拥有该彩票的进程运行
拥有彩票数量越多,获奖概率越大
彩票的数量会随着进程的增减动态调整(彩票的回收与分发)
进程协同情况下还可以互相赠送彩票
4.3.7 公平分享调度
多用户情况下,公平分配CPU时间给不同的用户
eg:用户1进程:ABCD,用户2进程:E
公平的定义 | 轮转调度 |
---|---|
1:1 | AEBECEDE… |
2:1 | ABECDEABE… |
4.4 实时系统中的调度
一般出现在多媒体、工业控制、航空、军事等领域中
分类
硬实时(HRT) | 满足绝对的截止时间 |
---|---|
软实时(SRT) | 允许偶尔的错失截止时间 |
每个进程的行为可预测和提前掌握
进程寿命短
进程执行速度快
检测到外部信号,调度程序按照满足所有截止时间的要求调度进程
事件
周期性事件 | 以规则的时间间隔发生 |
---|---|
非周期性事件 | 发生时间不可预知 |
可完全调度的条件
∑ i = 1 n C i P i ⩽ 1 \sum_{i=1}^{n} \frac {Ci}{Pi} \leqslant 1 i=1∑nPiCi⩽1
Ci——i事件的时长
Pi——i事件发生的周期
n——事件数
假设:上下文切换时间很小
4.5 策略和机制
此前的调度都认为各个进程相互独立,但有时多个进程是相互关联的
例如一个数据库进程,他有几个子进程(请求分析,磁盘访问等),数据库进程知道哪个进程的任务更紧迫,但系统并不知道,这就引出——调度机制(scheduling mechanism)与调度策略(scheduling policy)分离原则
机制策略分离原则
调度算法参数化,参数由用户进程给出(例如上面的数据库进程),这样策略的部分决定权留给了用户,而调度机制有操作系统决定
4.6 线程调度
用户级线程
内核并不知晓线程的存在,仍然按照进程进行调度
而线程的调度由用户程序完成
线程调度算法是可定制的
内核级线程
内核可以任意调度不同进程内的线程,线程变得公开透明
但内核级线程调度需要上下文切换,效率低
线程调度算法由系统决定
X 往期文章
Python+OpenCV+imutils的简单图片处理(放缩、翻转、旋转、灰度RGB提取)
这里是海小皮,刚刚开学,抽空学习了新的一节,我们共同进步!!