进程调度概述
定义
进程存在的核心目的:虚拟化CPU,从而支持多个进程在少量的物理CPU上运行(每个进程以为它独享一个CPU)。
进程调度就是选择一个可用的进程(可能从多个可用进程集合中选择)到CPU上执行。单处理器系统从来不会有超过一个进程在运行。如果有多个进程,那么余下的则需要等待CPU空闲并重新调度。
调度队列
进程进入系统时被加入到作业队列中,该队列包含系统中所有进程。
驻留在内存中等待运行的程序保存在就绪队列中,该队列常用链表来实现,其头节点指向链表的第一个和最后一个PCB块的指针。
操作系统也有其他队列。等待特定IO设备的进程列表称为设备队列。每个设备都有自己的设备队列。
就绪队列中进程在就绪队列中等待直到被选中执行或被派遣。当进程分配到CPU执行时,可能发生:
- 进程发出一个IO请求,并放到IO队列中。
- 进程创建新的子进程,并等待其结束。
- 进程由于中断而强制释放CPU(被抢占),并被放回到就绪队列中。
即如下图:
调度的分类 & 调度程序
调度有以下几种:
- 长程调度(作业调度):决定加入待执行进程池
- 中程调度:决定加入部分/全部位于内存中的进程集合(换入/换出)
- 短程调度(进程调度):决定处理器执行哪个可运行进程(执行)
- I/O调度:决定可用I/O设备处理哪个进程挂起的I/O请求
除I/O调度外,对应到队列如下图所示:
进程会在各种调度队列之间迁移,为了调度,操作系统必须按某种方式从这些队列中选择进程。进程的选择是由相应的调度程序(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选择下一个就绪作业运行。
缺点:在任务运行时间相似的场景下平均周转时间高
经典调度算法对比:
实时调度
每个任务都有截止时间(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] 现代操作系统