3.1 基本概念
处理机管理的工作是对CPU资源进行合理的分配使用,以提高处理机利用率,并使各用户公平地得到处理机资源。
调度的类型
-
高级调度/宏观调度/作业调度
- 对每个作业进行调度
-
中级调度/内外存交换(内存和外存的调度)
- 将进程的部分或全部换出到外存上(挂起),将当前所需部分换入到内存
-
低级调度/微观调度/进程或线程调度(进程和CPU的调度)【最基本的一种调度】
- 从就绪队列中选取一个,将处理机分配给他
何时进行调度
- 主动放弃CPU:进程正常终止、运行过程中发生异常而终止、进程主动请求阻塞(eg:IO)
- 被动放弃CPU:时间片到、有更紧急的事需要处理(eg:IO中断)、更高优先级的进程进入就绪队列
何时进行切换
- OS获得控制权后,就需要判断是否要切换进程
- **用户调用:**来自程序的显式请求(如:打开文件),该进程多半会被阻塞
- **陷阱:**最末一条指令导致出错,会引起进程移至退出状态
- **中断:**外部因素影响当前指令的执行,控制被转移至中断处理程序
在进程上下文中切换的步骤:
- 保存处理器的上下文,包括程序计数器和其它寄存器
- 更新正在运行进程的PCB
- 把进程的PCB移至合适的队列,eg:就绪、阻塞
- 选择另一个要执行的进程,更新其PCB
- 跳转到新进程PCB中的程序计数器所指向的位置执行
- 恢复处理机上下文
辨析:进程上下文切换 vs 陷入内核
- 进程上下文切换(Process Context Switch)
- 通常由调度器执行
- 保存进程执行断点
- 切换内存映射(页表基址、flush TLB)(修改页表基址?)
- 陷入内核
- CPU状态改变
- 由中断、异常、Trap指令(系统调用)引起。(OS权限改变,转到内核态)
- 需要保存执行现场(寄存器、堆栈等)
- 从用户态到内核态的切换(mode switch)涉及到的切换主要是寄存器上下文的切换,和通常所说的进程上下文切换(Process Context Switch)不同,mode switch的消耗相对要小很多。
调度的性能准则
- 从用户的角度、处理机的角度、算法实现的角度综合判断
调度性能准则
调度算法本身的调度性能准则
- 易于实现、维护
- 执行开销比
- 算法本身执行时间、占用空间
- 算法开销占调度后整体任务执行时间比例
3.2 涉及调度算法要考虑的问题(设计要点)
进程优先级(数)
- 优先级(数):表现了进程的重要性和紧迫性
- 静态优先级、动态优先级
进程就绪队列组织
- 按优先级排队方式
- 另一种方式:所有进程创建之后都进入到第一级就绪队列,随着进程的运行,可能会降低某些进程的优先级,如某些进程的时间片用完了,那么就会将其降级。
占用CPU的方式:不可抢占式、抢占式方式
进程的分类1:I/O密集型与CPU密集型
进程的分类2:
- 批处理进程(无需与用户交互、不需快响应)
- 交互式进程(需用户交互)
- 实时进程(高优先级优先、响应快)
3.3 典型的调度算法
常用的调度算法概述【王道P66】
-
⋆ \star ⋆ 先来先服务(FCFS)——作业/进程调度
- 有利于长作业、不利于短作业;有利于CPU繁忙的作业,不利于I/O繁忙的作业;算法简单效率低
-
⋆ \star ⋆ 最短作业优先(SJF)
-
非抢占式
-
优点:
- 比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间
- 提高系统的吞吐量
-
缺点:对长作业不利;不能根据作业紧迫程度来划分执行的优先级;难以准确估计作业/进程的执行时间
-
-
最短剩余时间响应(SRTF)
- 在短作业优先的基础上,改进为抢占式。
- 缺点:可能产生”饥饿“
-
最高响应比优先(HRRF)——作业/进程调度
- 响应比RP(相应优先级)=(已等待时间+要求运行时间)/(要求运行时间)
- 缺点:计算后备作业队列中每个作业的响应比,有一定的时间开销,性能比SJF略差
- 优点:短作业容易得到较高的响应比;长作业等待时间足够长后,也将获得足够高的响应比;不会饥饿
-
⋆ \star ⋆ 时间片轮转——进程调度
- 优点:公平、响应快、适用于分时操作系统
- 缺点:高频率的进程切换有一定开销、不区分任务的紧急程度、增大进程响应时间
-
⋆ \star ⋆ 优先级算法——作业/进程调度
- 适用于作业调度和进程调度,可分为抢占式和非抢占式
- 优点:区分了紧急程度,适用于实时操作系统
- 缺点:可能产生饥饿
-
多级队列算法(MQ)
- 不同队列可有不同的不同的优先级、时间片长度、调度策略等
-
多级反馈队列(MFQ)
- 时间片轮转+优先级算法
- 不必估计进程的执行时间,动态调节
扩展:
实时系统的调度算法
多处理机调度
Linux处理机调度