操作系统:进程调度

前言

CPU调度是多道程序操作系统的基础

对于支持线程的操作系统,操作系统实际调度的是内核级线程而非进程,不过,术语进程调度线程调度常常交替使用。

本章在讨论一般调度概念时,采用进程调度;在针对线程特定概念时,采用线程调度

一、基本概念

多道程序的目的是,始终允许某个进程运行以最大化CPU的利用率。

1.CPU-I/O执行周期

进程执行包括周期进行CPU执行(CPU区间)和I/O等待(I/O区间)。进程在执行的过程中,不断在这两个状态之间的进行切换。
进程从CPU执行开始,之后I/O执行;接着另一个CPU执行,接着另一个I/O执行;等等。最后的CPU执行通过系统请求结束,以便终止执行。

经过对大量进程进行分析,得出的结论显示进程一般由大量的短CPU区间(<8ms)和少量的长CPU区间组成

  1. I/O为主的程序里短CPU区间较多
  2. CPU为主的程序里长CPU区间较少

2.CPU调度程序

每当CPU空闲时,操作系统就应从就绪队列中选一个进程来执行。进程选择采用CPU调度程序或短期调度程序,调度程序从内存选择一个能执行的进程,并为之分配CPU

可以采用各种不同的排序方式对就绪队列中的进程进行排序(可以理解为不同的调度算法)

3.抢占调度

需要进行CPU调度的情况:

  1. 从运行状态转换成等待状态(如发生I/O)
  2. 从运行状态转换成就绪状态(如发生中断)
  3. 从等待状态转换成就绪状态(I/O完成)
  4. 进程终止
  5. 进程进入就绪队列

对于1、4情况,除了调度没有选择
在这里插入图片描述

非抢占调度(nonpreemptive):一旦把CPU分配给一个进程,直到该进程结束之前,不能把CPU分配给其他进程

抢占调度(preemptive):进程在执行过程中,可以被其他进程抢占CPU使用权

如果调度只发生在1、4情况下,则调度方案称为非抢占的或协作的;否则,调度方案称为抢占的。

4.调度程序

与CPU调度程序有关的另一个组件是调度程序(分派程序)。调度程序是一个模块,用来CPU的控制交给由短期调度程序选择的进程

其功能包括:

  • 切换上下文(context switch)
  • 切换到用户模式
  • 跳转到用户程序的合适位置,以重新启动程序

调度程序停止一个进程而启动另一个进程所要花的时间称为调度延迟(分派延迟)

思考: 分派延迟和上下文切换时间有区别吗?有的话,有什么区别?(个人观点)
上下文切换:将CPU切换到另一个进程需要保存旧进程的状态并为新进程加载已保存的状态。此任务称为上下文切换。
调度程序是将CPU控制权交给短期调度程序选择的进程的模块 。该功能涉及:切换上下文、切换到用户模式、跳到用户程序中的正确位置以重新启动该程序
调度程序停止一个进程并开始另一个进程所花费的时间称为调度延迟。
停止和开始进程是需要对旧进程保存和对新进程加载的,所以我感觉调度延迟应该比上下文切换长一些

二、调度准则

不同的调度算法具有不同的属性,分析CPU调度算法需要考虑以下准则

  1. CPU使用率(CPU Utilization):需要使CPU尽可能忙
  2. 吞吐量(Throughput):指的是在一个时间单元内所完成的进程数量
  3. 周转时间(Turnaround Time) :从进程提交到进程完成的时间段称为周转时间。周转时间为所有时间段之和,包括等待进入内存,在就绪队列中等待,在CPU上执行和I/O执行
  4. 等待时间(Waiting Time):在就绪队列中等待的时间
  5. 响应时间(Response Time): 从提交请求到产生第一相应的时间。注意,它是开始响应所需要的时间,而不是输出响应所需要的时间(交互系统)

三、调度算法

CPU调度处理的问题是:从就绪队列中选择进程以便为其分配CPU。

等待时间:进程实际结束时间减去从到达时间开始就执行并完成的理想结束时间

1.先到先服务调度(First Come, First Service Scheduling)
先请求CPU 的进程先分配CPU,非抢占式调度

由于其他进程都等待一个大进程释放CPU,故称之为护航效果。与让较短进程先进行相比,会导致CPU和设备使用率降低

2. 最短作业优先调度(Shortest Job First Scheduling)

选择CPU区间长度最短的进程,这里的CPU区间是进程的下一个CPU区间(也就是剩余CPU区间),而不是进程整个区间长度。(也就是说,在某一时刻,选择当前所有进程中剩余占用CPU时间最短的先执行

分为非抢占式优先级调度,抢占式优先级调度

对于给定的一组进程,在平均等待时间上,最短作业优先调度算法是最优算法。但问题是预先知道下一个CPU区间(remaining execution time)的长度是有难度的。

3. 优先级调度(Priority Scheduling)

每个进程都有它的优先级,通常用数字来表示进程的优先级,数字值越小它的优先级越高。分为非抢占式优先级调度,抢占式优先级调度

可能会发生的问题是饥饿(starvation)或无穷阻塞(infinite blocking),即低优先级进程无法运行的问题

低优先级进程的无穷等待问题的解决方法之一是老化,即随着等待时间的长度,增加进程的优先级

注意的是,低优先级进程再次release时,它的优先级不是增加的优先级,而是原来的优先级

4. 轮转调度(Round Robin)

轮转调度算法是专门为分时系统设计的,类似于FCFS算法,但增加了抢占以切换进程

将较小时间单元定义为时间量或时间片。时间片一般是10-100毫秒

可能有两种情况:

  1. 如果进程在给定的时间片内提前结束,进程本身会自动释放CPU,调度程序接着处理就绪队列下一个进程。
  2. 否则,每个进程只能运行给定的时间片,定时器会中断,进而终端操作系统,进行上下文切换,再将当前进程加入就绪队列尾部,并调度就绪队列下一个进程执行

RR算法性能很大程度上却决于时间片的大小

  1. 如果时间片太大会导致轮转法调度与FCFS(FIFO)相同
  2. 如果时间片太小会导致上下文切换负载太重

如果上下文切换时间约为时间片10%,那么约10%的CPU时间会浪费在上下文切换上。

通常,如果绝大多数进程能在一个时间片内完成,那么平均周转时间会改善。

周转时间并未随着时间片大小的增加而改善。根据经验,时间片应大于80%的CPU区间

5. 多级队列调度(Multilevel Queue Scheduling)

在进程很容易分成不同组的情况下,可以有另一类调度算法。

多级队列调度将将就绪队列分成多个单独的队列,一个进程永久分到一个队列。每个队列有自己的调度算法,并提供队列之间调度机制

1.队列内的采用的调度机制
2.队列之间可采用的调度机制

  • 固定优先级抢占调度
    如前台队列比后台队列具有高优先级,但有可能产生饥饿问题
  • 队列之间划分时间片
    每个队列都有给定的CPU时间,这个时间可用于调度队列内的进程。例如赋予前台队列80%CPU时间,赋予后台队列20%CPU时间

6. 多级反馈队列调度(Multilevel Feedback Queue Scheduling)

多级反馈队列调度算法允许进程在队列之间迁移。如果进程使用过多CPU时间,那么他会被迁移到更低优先级队列。

这种形式的老化阻止了饥饿的发生

多级反馈队列调度程序需要确定下列参数

  1. 队列数量
  2. 每个队列的调度算法
  3. 确定何时升级到更高优先级队列的方法
  4. 确定何时降级到更低优先级队列的方法
  5. 确定进程在需要服务时应进入哪个队列的方法

四、线程调度

内核级线程才是操作系统所调度的。
用户级线程由线程库来管理。

用户级线程为运行在CPU上,最终会映射到相关内核级线程,但这种映射可能不是直接的,可能采用轻量级进程(LWP)

用户级和内核级线程之间的一个区别在于它们是如何调度的。

1.对于实现多对一和多对多模型的系统线程库调度用户级线程到一个有效的LWP,也就是用户线程映射内核线程,被称为进程竞争范围(Process-Contention Scope :PCS)

  • 根据优先级完成,一般是由程序员给定
  • 竞争发生在相同进程的线程之间

2.对于一对一模型,系统将内核线程调度到有效的物理处理器上,被称为系统竞争范围

  • 竞争发生在系统的所有线程之间

五、多处理器调度

如果有多个CPU,则负载分配成为可能,调度问题就相应更复杂。这里讨论多处理器调度的几个问题。这里主要关注同构系统。

Homogeneous (同构处理器):处理器功能、结构相同
Heterogeneous(异构处理器):处理器功能、结构不同

1.多处理器调度的方法

对称多处理(Symmetric):又称SMP,每个处理器有自己的调度算法,不允许处理器之间的移动

非对称多处理(Asymmetric) :只有一个处理器进行调度任务,其他只执行用户代码。允许处理器之间的移动

2.处理器亲和性

由于进程从一个处理器移动到另一个处理器时,进程原来的缓存无效和重新填充代价过高,大多SMP系统试图避免进程的转移,而试图让他在同一处理器上运行,这称为处理器亲和性

处理器的亲和性有多种形式

  1. 软亲和性:试图保持但不保证。允许进程在处理器之间的移动
  2. 硬亲和性:保证其在自己这里运行。不允许处理器之间的移动

3.负载平衡

在SMP系统中,重要的是保持所有处理器的⼯作负载平衡

负载平衡是设法将工作负载平均地分配到SMP系统中的所有处理器上

负载平衡通常有两种方式,并相互并不排斥

  1. 推迁移
    将进程从超载处理器推到空闲或不太忙处理器,从而平均分配负载
  2. 拉迁移
    当空闲处理器从一个忙处理器上拉一个等待任务时,发生拉迁移。

六、实时CPU调度

实时系统中的进程具有截止时间(deadline)要求,进程必须在给定的截止时间内完成执行,有截止时间的进程称为实时任务(real-time tasks)

  1. 硬实时系统(Hard Real-Time Systems)
    »具有硬截止时间
    »必须在截止时间内结束任务
    »例如,军用设备、医疗设备等
  2. 软实时系统(Soft Real-Time Systems)
    »任务具有软截止时间
    »可以适当的超过截止时间结束任务
    »例如,音频、视频系统等

任务模型

  1. 定期任务Periodic Tasks:定期发布任务
  2. 非周期性任务Aperiodic Tasks:不定期发布,没有截止日期,所以响应时间就是绩效指标
  3. 零星任务Sporadic Tasks:不是定期发布,而是在给定的时间内发布间隔,有最后期限

优先级调度算法

  1. 单调速率调度(Rate Monotonic)
  2. 最早截止期限优先调度(Earliest Deadline First)
    急的任务先处理
  3. Earliest Deadline Zero Laxity
    不能再延迟的任务先处理

参考

《操作系统概念》

猜你喜欢

转载自blog.csdn.net/weixin_44759105/article/details/111381906