《现代操作系统》02章 进程与线程(二)

0 前文

《现代操作系统》01章 基本概念

《现代操作系统》02章 进程与线程(一)

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=1nPiCi1

Ci——i事件的时长
Pi——i事件发生的周期
n——事件数
假设:上下文切换时间很小

4.5 策略和机制

此前的调度都认为各个进程相互独立,但有时多个进程是相互关联的

例如一个数据库进程,他有几个子进程(请求分析,磁盘访问等),数据库进程知道哪个进程的任务更紧迫,但系统并不知道,这就引出——调度机制(scheduling mechanism)与调度策略(scheduling policy)分离原则

机制策略分离原则

调度算法参数化,参数由用户进程给出(例如上面的数据库进程),这样策略的部分决定权留给了用户,而调度机制有操作系统决定

4.6 线程调度

用户级线程

内核并不知晓线程的存在,仍然按照进程进行调度
而线程的调度由用户程序完成
线程调度算法是可定制的

内核级线程

内核可以任意调度不同进程内的线程,线程变得公开透明
但内核级线程调度需要上下文切换,效率低
线程调度算法由系统决定

X 往期文章

《现代操作系统》02章 进程与线程(一)

《现代操作系统》01章 基本概念

Python+OpenCV+imutils的简单图片处理(放缩、翻转、旋转、灰度RGB提取)

python手写K-means实现二维聚类.

这里是海小皮,刚刚开学,抽空学习了新的一节,我们共同进步!!

猜你喜欢

转载自blog.csdn.net/weixin_42464904/article/details/114290573