进程调度概述

定义

进程存在的核心目的:虚拟化CPU,从而支持多个进程在少量的物理CPU上运行(每个进程以为它独享一个CPU)。

进程调度就是选择一个可用的进程(可能从多个可用进程集合中选择)到CPU上执行。单处理器系统从来不会有超过一个进程在运行。如果有多个进程,那么余下的则需要等待CPU空闲并重新调度。

调度队列

进程进入系统时被加入到作业队列中,该队列包含系统中所有进程。

驻留在内存中等待运行的程序保存在就绪队列中,该队列常用链表来实现,其头节点指向链表的第一个和最后一个PCB块的指针。

操作系统也有其他队列。等待特定IO设备的进程列表称为设备队列。每个设备都有自己的设备队列。

操作系统-进程调度_ostep

就绪队列中进程在就绪队列中等待直到被选中执行或被派遣。当进程分配到CPU执行时,可能发生:

  1. 进程发出一个IO请求,并放到IO队列中。
  2. 进程创建新的子进程,并等待其结束。
  3. 进程由于中断而强制释放CPU(被抢占),并被放回到就绪队列中。

即如下图:

操作系统-进程调度_进程调度_02

调度的分类 & 调度程序

调度有以下几种:

  • 长程调度(作业调度):决定加入待执行进程池
  • 中程调度:决定加入部分/全部位于内存中的进程集合(换入/换出)
  • 短程调度(进程调度):决定处理器执行哪个可运行进程(执行)
  • I/O调度:决定可用I/O设备处理哪个进程挂起的I/O请求

除I/O调度外,对应到队列如下图所示:

操作系统-进程调度_ostep_03

进程会在各种调度队列之间迁移,为了调度,操作系统必须按某种方式从这些队列中选择进程。进程的选择是由相应的调度程序(scheduler)来执行的。

  • 短程调度程序 从准备执行的进程中选择进程,并为之分配CPU。

    • 短程调度程序通常100ms至少执行一次,由于每次执行之间的时间较短,短程调度程序必须要快

    • 导致当前进程阻塞或抢占当前运行进程的事件(时钟中断、I/O 中断、操作系统调用、信号)发生时,会调用短程调度程序。

  • 长程调度程序 批处理系统中,进程更多的是被提交,而不是马上执行。这些进程通常放到磁盘的缓冲池里,以便以后执行。长程(作业)调度程序从该池中选择进程,并装入内存以准备执行。

    • 长程调度程序执行的并不频繁,所以长程调度程序能使用更多的时间来选择执行进程。长程调度程序控制多道程序设计的程度(内存中进程的数量)。长程调度程序必须仔细选择执行进程。

    • 绝大多数进程可分为:I/O密集计算(CPU)密集。为使系统达到平衡和更好的性能,长程调度程序应当选择一个合理的包含I/O为主的和CPU为主的组合进程以充分使用设备和短程调度程序。

    • Linux和Windows系统通常没有长程调度程序,这些系统的稳定性依赖于物理限制,如果系统性能下降很多,会有用户的退出。

  • 中程调度程序 分时系统中可能引入中程调度程序,其核心思想是能够将进程从内存中移出,从而降低多道程序设计的程度,之后进程可以被换入。

三者在执行频繁程度上有较大差别,执行频繁程度:短程调度 > 中程调度 > 长程调度

调度算法

● 非抢占:在这种情况下,一且进程处于运行状态,就会不断执行直到终止,进程要么因为等待I/O,要么因为请求某些操作系统服务而阻塞自己。

● 抢占:当前正运行进程可能被操作系统中断,并转换为就绪态。一个新进程到达时,或中断发生后把一个阻塞态进程置为就绪态时,或出现周期性的时间中断时,需要进行抢占决策。

经典调度

先来先服务 FCFS

算法描述:非抢占、先请求CPU的进程先分配CPU。

缺点:在长短任务混合的场景下对短任务不友好

最短作业优先 SJF(SPN)

算法描述:非抢占、下次选择预计时间最短的进程。

缺点:

  • 必须预知任务运行时间
  • 表现严重依赖于任务到达时间点
  • 不公平,有饥饿风险

在SJF中加入抢占即是最短剩余时间优先。

抢占:

最短剩余时间有限 SRT

算法描述:抢占、选择预期剩余时间最短的进程。

缺点:

  • 必须预知任务运行时间
  • 长任务有饥饿风险

时间片轮转(Round Robin ,RR)

算法描述:抢占、以一个周期(q)产生中断,当中断发生时,当前运行的程序置于就绪队列(队尾)中,然后基于FCFS选择下一个就绪作业运行。

缺点:在任务运行时间相似的场景下平均周转时间高

经典调度算法对比:

操作系统-进程调度_ostep_04

实时调度

每个任务都有截止时间(Deadline)。

软实时(Soft Real Time):允许超过截止时间、视频播放,每一帧的渲染

硬实时(Hard Real Time):不允许超过截止时间、自动驾驶汽车的刹车任务

最早截止时间优先 (Earliest Deadline First, EDA )

算法描述:每次调度截止时间最近的任务

缺点:在任务不可调度时,会造成多数任务都错过截止时间(多米诺效应)

优先级调度

算法描述:设置许多独立的队列(queue),每个队列有不同的优先级(priority level)。任何时刻,一个工作只能存在于一个队列中。优先级调度总是优先执行较高优先级的工作(即在较高级队列中的工作)。具有同样的优先级的作业采用轮转调度。

做法:多级反馈队列(Multi-level Feedback Queu, MLFQ)

公平共享调度

  • 每个用户占用的资源是成比例的,而非被任务的数量决定
  • 每个用户占用的资源是可以被计算的
    • 设定"权重值"以确定相对比例(绝对值不重要)
    • 例:权重为4的用户使用资源,是权重为2的用户的2倍

做法:彩票调度

reference

[1] 操作系统概念

[2] 操作系统-精髓与设计原理

[3] 上海交通大学并行与分布式系统研究所-进程/线程调度

[4] 操作系统导论(ostep)

[5] 现代操作系统