一、调度的概念、层次
1.1 知识总览
1.2 调度的基本概念
- 定义:当资源有限时,按照特定规则决定任务处理顺序的机制
- 生活实例:
- 银行服务:普通客户先到先服务,VIP客户优先级更高
- 宿舍卫生间:使用时间短的优先(1分钟>3分钟>10分钟),时间相同则先到先得
- 核心问题:在资源受限情况下,通过规则(如短作业优先、优先级等)实现任务有序处理
1.3 调度的三个层次 – 高级调度
- 别名:作业调度
- 作业定义:用户提交的具体任务 ≈ 请求操作系统启动程序处理特定任务
- 调度场景:内存不足时,从外存作业后备队列选择作业调入内存
- 关键特征:
- 每个作业生命周期内只调入/调出各一次
- 调入时创建PCB,调出时撤销PCB
- 实例说明:Windows系统提示”内存不足,请关闭程序”即涉及作业调度决策
PCB(进程控制块,Process Control Block) 是管理进程的核心数据结构,而高级调度(又称作业调度) 则负责从外存的后备作业队列中选择作业调入内存,并为其创建进程。
1.4 调度的三个层次 – 低级调度
- 别名:进程调度/处理机调度(最基本的一种调度)
- 核心功能:从就绪队列选取进程分配CPU资源
- 重要性:
- 实现多道程序并发执行的基础
- 通过高频调度(毫秒级)制造”并行”假象
- 运行机制:快速轮转使宏观上表现为多进程同时运行
1.5 调度的三个层次 – 中级调度
- 别名:内存调度
- 触发条件:内存资源紧张时
- 核心操作:
- 将非紧急进程数据移至外存 → 进入挂起态
- 内存空闲时选择挂起队列进程调回内存
- 现实表现:手机APP切换卡顿常因进程数据需从外存重新加载
- 频率特点:介于高级与低级调度之间
1.6 进程的挂起态与七状态模型
七状态模型通过引入 “挂起” 状态,解决了传统模型中内存资源管理和进程调度的局限性,使操作系统能更高效地处理多进程并发和资源竞争问题。理解该模型有助于深入掌握操作系统的进程调度机制和内存管理策略。
- 挂起态-暂时调到外存等待进程的状态
- 就绪挂起:内存不足时从就绪态转入
- 阻塞挂起:从阻塞态转入
- 状态转换:
- 就绪态 ↔ 就绪挂起(通过中级调度)
- 阻塞态 ↔ 阻塞挂起
- 特殊情形:阻塞挂起→事件发生→直接进入就绪挂起
- 创建异常:新建进程可能因内存不足直接进入就绪挂起
- 就绪挂起和阻塞挂起的区别
- 挂起态:进程映像在外存
- 阻塞态:进程映像在内存
- 队列管理:部分系统会细分多个挂起队列(按阻塞原因等)
一、七状态模型的核心状态及定义
七状态模型在传统的 “运行”“就绪”“阻塞” 基础上,增加了新建“终止”“就绪挂起”“阻塞挂起” 状态,具体如下:
新建(New)
定义:进程正在被创建的阶段,系统为其分配资源(如内存、PID 等),但尚未准备好执行。
示例:当用户启动一个应用程序时,进程首先进入新建状态,等待系统完成初始化。
就绪(Ready)
定义:进程已具备执行条件,等待 CPU 调度。
特点:进程的 PCB(进程控制块)已加载到内存,仅需获得 CPU 时间片即可运行。
运行(Running)
定义:进程正在 CPU 上执行。
限制:单 CPU 系统中同一时刻只有一个进程处于运行状态。
阻塞(Blocked)
定义:进程因等待某一事件(如 I/O 操作、资源分配)而暂停执行,此时即使有 CPU 资源也无法运行。
示例:进程读取文件时,因等待磁盘 I/O 完成而进入阻塞状态。
终止(Terminated)
定义:进程执行完毕或因错误终止,系统正在释放其资源(如内存、打开的文件句柄等)。
后续:终止后的进程可能仍在系统中保留状态信息,直到被彻底清除。
就绪挂起(Ready Suspended)
定义:进程处于就绪状态,但因系统资源紧张(如内存不足)被暂时交换到外存(磁盘),等待重新调入内存。
触发条件:系统为释放内存,将低优先级的就绪进程挂起。
阻塞挂起(Blocked Suspended)
定义:阻塞状态的进程被交换到外存,等待事件发生且被重新调入内存。
特点:与普通阻塞状态的区别在于,此时进程不在内存中,无法立即被调度。
二、状态转换关系及触发条件
七状态模型的状态转换由操作系统调度算法和事件驱动,以下是关键转换路径:
1. 新建 → 就绪
触发条件:进程创建完成,系统完成资源分配,准备好接受调度。
2. 就绪 → 运行
触发条件:CPU 调度器选择该进程,分配时间片。
3. 运行 → 就绪
触发条件:时间片用完,进程被抢占;
更高优先级进程进入就绪状态,当前进程被抢占。
4. 运行 → 阻塞
触发条件:进程需要等待事件(如 I/O、信号量),主动放弃 CPU。
5. 运行 → 终止
触发条件:进程执行完所有指令,或因错误(如越界访问)被系统终止。
6. 就绪 → 就绪挂起
触发条件:系统内存不足,将低优先级的就绪进程换出到外存。
7. 就绪挂起 → 就绪
触发条件:内存资源释放,挂起的进程被重新调入内存。
8. 阻塞 → 阻塞挂起
触发条件:系统将阻塞进程换出到外存,以释放内存。
9. 阻塞挂起 → 就绪挂起
触发条件:阻塞挂起的进程等待的事件发生(如 I/O 完成),变为就绪挂起状态,等待调入内存。
10. 阻塞挂起 → 阻塞
触发条件:较少见,通常当系统优先处理挂起的阻塞进程时,直接将其调入内存并恢复为阻塞状态。
三、七状态模型的优势与应用场景
内存管理优化
通过 “挂起” 状态将暂时不用的进程交换到外存,释放内存资源,提高系统吞吐量。
多任务调度精细化
区分 “就绪” 和 “就绪挂起”、“阻塞” 和 “阻塞挂起”,使调度算法能更灵活地处理不同优先级和资源需求的进程。
适应复杂系统需求
在嵌入式系统、大型服务器或多用户操作系统中,七状态模型能更准确地描述进程在资源受限环境下的状态变化。
与传统状态模型的对比
模型类型 | 核心状态 | 适用场景 |
---|---|---|
三状态模型 | 运行、就绪、阻塞 | 简单操作系统(如早期 UNIX) |
五状态模型 | 三状态 + 新建、终止 | 通用操作系统 |
七状态模型 | 五状态 + 就绪挂起、阻塞挂起 | 资源管理复杂的系统 |
1.7 进程的挂起态与七状态模型
- 空间维度:
- 高级/中级:外存↔内存(前者面向作业,后者面向进程)
- 低级:内存→CPU
- 频率梯度:高级(最低) < 中级 < 低级(最高)
- 状态影响:
- 高级:无→创建态→就绪态
- 中级:挂起态→就绪态(或阻塞挂起→阻塞态)
- 低级:就绪态→运行态
- 生命周期:
- 高级:单次调入调出
- 中级:可能多次调入调出
1.8 处理机调度知识回顾
二、进程调度的时机切换与过程调度方式
2.1 知识总览
2.2 进度调度的时机
1、什么时候需要进行进程调度与切换的情况?
- 主动放弃处理机:
- 进程正常终止
- 进程因异常而终止
- 进程主动请求阻塞(如等待I/O)
- 被动放弃处理机:
- 时间片用完
- 有更紧急任务需要处理(如I/O中断)
- 更高优先级进程进入就绪队列
2、什么时候不能进行进程调度与切换的情况?
- 中断处理过程:中断处理与硬件密切相关,难以中途切换
- 进程在内核程序临界区:访问内核数据结构(如就绪队列)时需上锁,解锁前不能调度
- 原子操作过程:原语操作必须一气呵成(如修改PCB状态并移动队列)
2.3 内核程序临界区和普通临界区区别
1、进程处于操作系统内核临界区为什么不能调度切换:
- 数据完整性保护 – 如果进程在修改内核数据结构时被切换,可能导致数据处于不一致状态,其他进程看到的是”半完成”的操作结果。
- 避免竞态条件 – 多个进程同时访问同一内核资源会产生竞争,可能造成系统崩溃或数据损坏。
- 原子性保证 – 临界区内的操作需要作为一个整体完成,中途切换会破坏操作的原子性。
2、进程处于普通临界区为什么可以调度切换:
- 非原子性保护 – 用户态临界区不像内核临界区那样要求绝对的原子性,允许进程在持有锁时被暂停。
- 锁状态保持 – 进程被切换时,它持有的锁状态会被保存,恢复执行时继续持有该锁。
- 避免优先级反转 – 如果禁止调度,低优先级进程可能长时间阻塞高优先级进程。
实际情况:
- 进程在临界区内可以被时间片用完而切换
- 进程在临界区内可以因更高优先级进程而被抢占
- 只是其他想进入同一临界区的进程会被阻塞等待
例外情况: 某些实时系统或特殊应用可能会临时禁用抢占来保证响应时间,但这不是普通临界区的标准行为。
因此,普通临界区主要是通过同步机制控制并发访问,而不是禁止调度。
2.4 进程调度的方式
1. 非剥夺调度方式
- 规则:仅允许进程主动放弃CPU
- 优点:实现简单,系统开销小
- 缺点:无法及时处理紧急任务
- 适用场景:早期批处理系统
2. 剥夺调度方式
- 规则:可强行剥夺当前进程CPU使用权
- 优点:
- 优先处理紧急任务
- 支持时间片轮转
- 适用场景:分时系统、实时操作系统
早期批处理系统是计算机发展史上的重要阶段,以下是其主要特点:
时代背景: 20世纪50-60年代,计算机资源极其昂贵,需要最大化利用率。
工作方式:
用户将作业(程序和数据)提交给操作员
操作员将多个作业收集成批次
系统依次自动执行整批作业
用户稍后取回结果
核心特征:
无交互性 – 作业提交后无法干预,必须等待全部完成
顺序执行 – 作业按提交顺序逐个处理
高吞吐量 – 减少人工干预,提高系统利用率
延迟反馈 – 从提交到获得结果需要较长时间
优点:
系统资源利用率高
减少操作员工作量
适合大量重复性计算任务
缺点:
缺乏灵活性和交互性
调试困难
响应时间长
无法处理紧急任务
典型代表: IBM的OS/360等系统
早期批处理系统为后来的多道程序设计、分时系统等奠定了基础,是操作系统发展的重要里程碑。
2.4 进程的切换与过程
进程调度和进程切换是两个相关但不同的概念:
1、进程调度 (Process Scheduling)
定义:决定下一个运行哪个进程的过程
主要工作:
从就绪队列中选择合适的进程
根据调度算法做出决策(如优先级、时间片等)
确定调度时机(时间片用完、进程阻塞、新进程到达等)
本质:这是一个”决策过程”
2、进程切换 (Process Switch/Context Switch)
定义:实际更换正在运行进程的操作
主要工作:
保存当前进程的上下文(寄存器、程序计数器等)
恢复目标进程的上下文
切换内存空间
更新进程状态
本质:这是一个”执行过程”
3、关系理解
简单类比:
进程调度 = “选择下一首歌”
进程切换 = “实际换歌并播放”
执行顺序:
先进行进程调度(选择进程)
再进行进程切换(实际切换)
开销差异:
调度开销相对较小(主要是算法计算)
切换开销较大(涉及大量状态保存和恢复)
两者配合完成了多任务操作系统的核心功能。
核心操作:
现场保存:将原进程的处理机运行环境数据(程序计数器、状态字、寄存器等)保存至PCB
现场恢复:从新进程的PCB中读取运行环境数据并载入寄存器
性能影响:
时间代价:切换需要消耗系统时间,频繁切换会导致系统效率下降
调度平衡:并非切换越频繁并发度越高,需权衡切换开销与执行效率
2.5 知识回顾
三、调度器&闲逛程序
3.1 调度器
核心功能: 负责进程在就绪态和运行态之间的转换,是操作系统内核的重要程序模块
3.2 调度程序的作用
调度程序的两个决定,调度程序决策内容:
1、让谁运行
- 选择运行进程(调度算法)
2、运行多长时间
- 确定运行时长(时间片大小)
算法选择: 采用先来先服务、短作业优先或时间片轮转等算法决定进程运行顺序
时间分配: 不同进程可分配不同时间片,如交互式进程通常分配较小时间片
管理范围: 处理当前运行进程的下机决策和就绪队列进程的上机选择
3、什么事件会触发调度程序?
- 触发事件:
- 新进程创建(可能引发抢占)
- 进程退出(释放CPU资源)
- 运行进程阻塞(主动放弃CPU)
- I/O中断发生(可能唤醒阻塞进程)
- 调度策略差异:
- 非抢占式: 仅当进程阻塞或退出时触发
- 抢占式: 每个时钟中断或每k个时钟中断触发检查
- 检查机制: 就绪队列变化时强制检查,时钟中断周期性唤醒调度程序
3.3 不支持内核级线程的操作系统
- 调度单位: 以整个进程为基本调度单位
- 资源分配: 进程既是调度单位也是资源分配单位
- 特点: 线程切换需要进程切换,开销较大
3.4 支持内核级线程的操作系统
- 调度单位: 内核线程成为基本调度单位
- 资源分离:
- 进程作为资源分配的基本单位
- 线程作为CPU调度的基本单位
- 优势: 线程切换无需进程切换,提高并发效率
3.5 闲逛进程
- 存在意义: 当就绪队列为空时运行的默认进程,保证CPU永不空闲
- 设计理念: 类似人类”抖腿”行为,维持CPU基础运行状态
闲逛进程的特性
- 优先级: 系统最低优先级,确保优先运行其他进程
- 指令特点:
- 执行0地址指令(不访存不访问寄存器)
- 完整指令周期后检查中断
- 能效设计: 低功耗运行模式,节省能源消耗
- 调度唤醒: 通过指令周期末尾的中断检查唤醒调度程序
四、调度算法的评价指标
4.1 知识总览
- 核心指标:包括CPU利用率、系统吞吐量、周转时间(含带权周转时间)、等待时间、响应时间五大类
- 学习要点:需理解各指标设计原理并掌握计算方法
4.2 CPU的利用率
设计背景:因CPU造价昂贵(早期占计算机成本大部分,现代仍不便宜),需最大化其工作效率
多道程序提示:实际考题多涉及多道程序,建议用甘特图辅助计算
4.3 系统吞吐量
定义:单位时间内完成的作业数量
4.4 周转时间
用户视角:关注作业从提交到完成的整体耗时
- 组成要素:
- 作业在外存后备队列等待时间(仅1次)
- 进程就绪队列等待时间(多次)
- CPU执行时间(多次)
- IO操作等待时间(多次)
- 计算公式:周转时间=完成时间−提交时间
系统视角:更关注平均周转时间
4.5 带权周转时间
- 设计动机:解决相同周转时间下,长作业用户感受更好的问题(类比厕所排队:短作业用户对等待更敏感)
- 计算公式:
- 特性:
- 值域:必然≥1(因周转时间包含运行时间)
- 比较原则:越小越好
4.6 等待时间
- 用户需求:希望作业尽可能少等待处理机
- 进程等待时间:建立后等待被服务的时间总和(不包括IO服务时间)
- 作业等待时间:需额外加上外存后备队列等待时间
- 调度影响:调度算法主要影响等待时间(因CPU/IO服务时间通常固定)
4.7 响应时间
- 定义:从用户提交请求到首次产生响应的时间间隔
4.8 知识回顾
五、调度算法-FCFS、SJF/SPF/SRTN、HRRN(重点)
5.1 知识总览
核心算法:本节涵盖三种主要调度算法:先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)
分析框架:每种算法将按统一框架分析:算法思想、算法规则、适用场景(进程调度还是作业调度)、抢占式还是非抢占式、优缺点及饥饿问题
重点 – 优缺点
5.2 先来先服务(FCFS – First Come First Serve)
先来先服务算法分析
1、算法思想:模拟日常排队场景,体现公平性原则,严格按到达顺序服务
2、算法规则:按照作业/进程到达的先后顺序进行服务
3、适用场景
- 作业调度:选择后备队列中到达时间最早的作业(外存)
- 进程调度:选择就绪队列中到达时间最早的进程(内存)
4、典型非抢占式算法,当前进程必须主动释放CPU才会触发调度
5、优缺点:
优点
- 公平性:符合直觉的排队规则
- 实现简单:无需复杂优先级计算
缺陷:
- 排在长作业(进程)后面的短作业需要等待很长时间
- 带权周转时间很大,对短作业来说用户体验不好
- 即FCFS算法对长作业有利,对短作业不利
6、无饥饿:所有任务最终都能获得服务
题目特征:纯计算型进程(无I/O操作)
注意:本例中的进程都是纯计算型的进程,一个进程到达后要么在等待,要么在运行。
如果是又有计算、又有 I/O 操作的进程,其等待时间就是周转时间-运行时间-I/O操作的时间
5.3 短作业/进程优先(SJF – Shortest Job First\SPF – Shortest Process First)
短作业优先算法分析
1、算法思想:追求最少的平均等待时间,最少的平均周转时间、最少的平均平均带权周转时间
2、算法规则:最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短)
3、适用场景:即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF,Shortest Process First)算法”
4、是否可抢占:SJF和SPF是非抢占式的算法;但是也有抢占式的版本一最短剩余时间优先算法(SRTN,Shortest Remaining Time Next)
5、优缺点:
优点
- 优点:“最短的”平均等待时间、平均周转时间,即相比FCFS等算法能获得更好的平均等待时间和周转时间
缺陷:
- 不公平。对短作业有利,对长作业不利。
- 可能产生饥饿现象。
- 另外,作业/进程的运行时间是由用户提供的,并不一定真实,不一定能做到真正的短作业优先
6、会。如果源源不断地有短作业/进程到来,可能使长作业/进程长时间得不到服务,产生“饥饿”现象。如果一直得不到服务,则称为“饿死“,即会导致饥饿现象,极端情况可能造成进程/作业”饿死”
短作业优先案例
最短剩余时间优先(SRTN, Shortest Remaining Time Next)
最短剩余时间优先算法:
- 1、每当有进程加入就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列;
- 另外,当一个进程完成时也需要调度。
对比非抢占式的短作业优先算法,显然抢占式的这几个指标又要更低
短作业优先注意点
- 默认约定:题目未说明时,“短作业优先”默认为非抢占式
- 最优性说明:
- 严格最优需满足”所有进程几乎同时到达“条件
- 抢占式版本(SRTN)在实际中能获得更优的平均指标
- 教材差异:不同教材对算法最优性的表述可能存在差异,需结合上下文理解
5.4 高响应比优先(HRRN,Highest Response Ratio Next)
FCFS 算法是在每次调度的时候选择一个等待时间最长的作业(进程)为其服务。但是没有考虑到作业的运行时间,因此导致了对短作业不友好的问题
SJF 算法是选择一个执行时间最短的作业为其服务。但是又完全不考虑各个作业的等待时间,因此导致了对长作业不友好的问题,甚至还会造成饥饿问题
能不能设计一个算法,即考虑到各个作业的等待时间,也能兼顾运行时间呢?
答:高响应比优先算法
- 调度规则: 每次选择响应比最高的进程/作业
- 适用场景: 既可用于作业调度,也可用于进程调度
- 抢占性: 通常为非抢占式
- 调度时机: 仅当进程主动放弃CPU时(完成或阻塞)才重新计算响应比
- 综合优势:
- 短作业优先:当等待时间相同时,优先短作业
- 公平性:当运行时间相同时,优先等待久的作业
- 防饥饿:长作业等待时间增加会提高其响应比
- 算法特点:
- 非抢占式
- 不会导致饥饿
- 权衡了FCFS和SJF的优点
例题:HRRN调度计算
六、调度算法-时间片轮转、优先级、多级反馈队列
- 主要内容:本节将学习时间片轮转、优先级调度和多级反馈队列三种调度算法
- 学习要点:
- 各算法的核心思想和解决的问题
- 算法的具体运行规则
- 适用于作业调度还是进程调度
- 属于抢占式还是非抢占式
- 算法的优缺点(常考选择题)
- 是否会导致饥饿现象
6.1 时间片轮转(RR,Round-Robin)
1、算法思想:公平轮流为各进程服务,保证每个进程在一定时间间隔内都能得到响应
2、算法规则:按照各进程到达就绪队列的顺序,轮流让各个进程执行个时间片(如100ms)。若进程未在一个时间片内执行完,则剥夺处理机,将进程重新放到就绪队列队尾重新排队。
3、用于作业/进程调度
- 适用范围:专门用于进程调度
- 原因:
- 时间片是处理机时间分配单位
- 只有装入内存建立进程后才能分配处理机时间
- 进程是执行的基本单位
4、是否可抢占
- 抢占机制:属于抢占式算法
- 实现方式:
- 时间片用完时强制剥夺处理机
- 通过时钟中断通知CPU时间片结束
- 时钟装置是计算机组成原理中的硬件组件
5、优缺点
- 优点:
- 公平性:所有进程机会均等
- 响应快:合理时间片下能保证及时响应
- 适合分时系统:满足多用户交互需求
- 缺点:
- 时间片设置难题:
- 过大:退化为FCFS,响应时间变长(如10个进程时可能等待9秒)
- 过小:进程切换开销过大(建议切换开销占比<1%)
- 不区分任务紧急程度
- 时间片设置难题:
6、是否会导致饥饿
- 饥饿分析:不会导致饥饿
- 原因:采用轮转机制保证每个进程都能定期获得时间片
- 注意点:时间片大小设置需要权衡响应时间和系统开销
例题:时间片轮转响应时间分析 – 时间片为2的情况
例题:时间片轮转响应时间分析 – 时间片为5的情况
- 题目解析:
- 进程到达顺序:P1(0,5)→P2(2,4)→P3(4,1)→P4(5,6)
- 时间片=2时的调度过程:
- 0-2:P1运行(剩余3)
- 2-4:P2运行(剩余2)
- 4-6:P1运行(剩余1)
- 6-7:P3运行(完成)
- 7-9:P2运行(完成)
- 9-16:P4分多次运行完成
- 时间片=5时的调度过程:
- 0-5:P1完整运行
- 5-9:P2完整运行
- 9-10:P3完整运行
- 10-16:P4分两次运行
- 关键发现:
- 当时间片足够大时会退化为FCFS算法
- 新到达进程优先于刚下处理机的进程排队
对比时间片2和5的情况
1、如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此时间片不能太大
2、另一方面,进程调度、切换是有时间代价的(保存,恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见时间片也不能太小。
综上:一般来说,请设计时间片时要让切换进程的开销占比不超过1%
(比如:系统中有10个进程在并发执行,如果时间片为1秒,则一个进程被响应可能需要等9秒….也就是说,如果用户在自己进程的时间片外通过键盘发出调试命令,可能需要等待9秒才能被系统响应)
6.2 优先级调度算法
优先级调度算法分析
- 核心思想:根据任务的紧急程度和重要程度决定处理顺序,为每个作业/进程设置优先级,调度时选择优先级最高的任务
- 适用范围:既可用于作业调度(选择外存后备队列中的作业进入内存),也可用于进程调度(选择内存就绪队列中的进程分配处理机),还可用于I/O调度
- 实现方式:
- 非抢占式:仅在进程主动放弃处理机时进行调度
- 抢占式:除进程主动放弃外,当就绪队列变化时也需检查是否发生抢占
- 优点:
- 能明确区分任务紧急程度和重要程度
- 特别适合实时操作系统
- 可灵活调整对不同类型进程的偏好
- 缺点:
- 可能导致低优先级进程饥饿(当持续有高优先级进程到达时)
- 需要合理设计优先级调整机制以避免不公平现象
例题:非抢占式优先级调度算法
- 题目解析:
- 审题要点:注意题目说明”优先数越大,优先级越高”(有些题目可能相反)
- 调度过程:
- 0时刻:只有P1到达,开始运行
- 7时刻:P1结束,检查就绪队列(P2,P3,P4),选择优先级最高的P3
- 8时刻:P3结束,选择优先级相同的P2(因到达时间更早)
- 12时刻:P2结束,最后运行P4
- 关键特征:调度仅发生在进程主动放弃处理机时
例题:抢占式优先级调度算法
- 题目解析:
- 审题要点:同样注意优先数与优先级的关系
- 调度过程:
- 0时刻:P1开始运行
- 2时刻:P2到达(优先级>P1),发生抢占
- 4时刻:P3到达(优先级>P2),再次抢占
- 5时刻:P3结束,选择就绪队列中等待时间最长的P2
- 7时刻:P2结束,选择P4(优先级>P1)
- 11时刻:P4结束,最后运行P1剩余部分
- 关键特征:每当新进程到达(就绪队列变化)时都需检查抢占可能
补充
- 队列组织方式:
- 多队列:按不同优先级组织多个就绪队列
- 单队列:高优先级进程排在更靠近队头的位置
- 优先级类型:
- 静态优先级:创建时确定后不再改变
- 动态优先级:初始值确定后可根据情况调整
- 优先级设置原则:
- 系统进程 > 用户进程
- 前台进程 > 后台进程
- I/O型进程 > 计算型进程(因I/O设备可与CPU并行工作,提高资源利用率)
- 动态调整策略:
- 长时间等待的进程:适当提高优先级(类似高响应比优先算法)
- 长时间运行的进程:适当降低优先级
- 频繁I/O操作的进程:提高优先级(因其可能是I/O繁忙型进程)
6.3 多级反馈队列调度算法
比较以上提到的算法
- FCFS优点:公平性最好,所有进程按到达顺序依次执行
- SJF优点:能优先处理短作业,使平均等待时间和周转时间最优
- 时间片轮转优点:保证各进程能及时获得响应
- 优先级调度优点:通过优先级灵活控制进程服务机会
- 设计目标:寻找能综合上述优点的折中调度算法 – 多级反馈队列调度算法
分析多级反馈队列调度算法
- 核心思想:对多种调度算法进行折中权衡
- 实现方式:
- 多级队列设置:建立多级就绪队列,优先级从高到低,时间片从小到大
- 新进程处理:新进程先进入第1级队列,按FCFS原则等待分配时间片
- 时间片用完处理:若进程未结束,则进入下一级队列队尾;若已在最下级队列则重新放回队尾
- 调度规则:仅当第k级队列为空时才调度k+1级队列队头进程
- 综合优点:
- 公平性:继承FCFS优点,新进程优先获得服务
- 响应快:类似时间片轮转,新进程能快速获得响应
- 短作业优:短进程只需经历前几级队列即可完成,类似SJF
- 防作弊:无需预先估计进程运行时间,避免用户虚报
- 灵活性:可调整对不同类型进程的偏好程度
- 特殊处理:
- IO型进程:阻塞唤醒后可保持原队列优先级,不降级
- 计算型进程:会逐步降级到低优先级队列
- 缺点:
- 复杂性:实现规则较为复杂
- 饥饿风险:当持续有短进程到达时,长进程可能饥饿
例题:多级反馈队列调度算法
- 题目解析:
- 队列设置:三级队列,时间片分别为1、2、4单位时间
- P1处理:0时刻进入第1级队列,执行1单位时间后转入第2级队列
- P2处理:1时刻到达,抢占执行1单位时间后转入第2级队列
- 抢占机制:5时刻P3到达第1级队列,抢占正在运行的P2,P2返回原队列队尾
- 最终处理:当高级队列为空时,才处理低级队列中的进程
- 饥饿现象:若持续有短进程到达,低级队列进程可能长期得不到服务
七、多级队列调度算法
7.1 多级队列调度定义
- 基本结构:系统按进程类型设置多个队列,进程创建后根据类型插入对应队列
- 队列分类:通常分为系统进程、交互式进程和批处理进程三类队列
- 工作流程:每次调度时先选择队列,再从选中队列中选择具体进程执行
7.2 队列优先级设定
- 优先级顺序:系统进程(最高) > 交互式进程 > 批处理进程(最低)
- 系统进程:如内存管理进程,需要最高优先级保证系统稳定运行
- 交互式进程:如游戏、打字软件,需要快速响应(用户操作后立即反馈)
- 批处理进程:如AI模型训练、视频渲染,对响应时间不敏感
- 设计原因:
- 系统进程优先级最高是必然要求
- 交互式进程需要及时反馈用户体验(如游戏操作、打字响应)
- 批处理进程优先级最低因为用户不关心其执行速度(如视频渲染进度)
7.3 队列调度策略
- 队列间调度:
- 固定优先级:高优先级队列非空时始终优先调度,可能导致低优先级队列饥饿
- 时间片划分:按比例分配时间(如系统50%、交互式40%、批处理10%)
- 队列内调度:
- 系统进程队列:可采用优先级调度(选择最紧急的进程)
- 交互式队列:采用时间片轮转(RR),保证快速响应
- 批处理队列:采用先来先服务(FCFS)
- 实际应用:
- 队列分类可更细致(多于三级)
- 各队列可采用不同调度算法的组合
- 时间片划分比例可根据实际需求调整
八、对上述算法的回顾
算法对比:
- FCFS:
- 非抢占式
- 优点:公平简单
- 缺点:对短作业不利
- SJF:
- 默认非抢占式(有抢占式变种SRTN)
- 优点:最短平均等待时间
- 缺点:可能导致长作业饥饿
- HRRN:
- 非抢占式
- 优点:综合前两者优势
- 缺点:计算开销较大、
- 系统适用性:
- 这些算法更关注系统整体性能
- 适用于早期批处理系统
- 现代系统中FCFS常作为其他算法的组成部分
1. 时间片轮转调度
- 抢占性: 采用抢占式调度机制
- 核心优势:
- 保证公平性,特别适合分时系统
- 每个进程都能获得均等的CPU时间
- 主要缺点:
- 频繁的上下文切换带来额外开销
- 未考虑进程优先级差异
- 饥饿问题: 不会导致进程饥饿
- 时间片设置:
- 时间片过大:退化为先来先服务(FCFS)算法
- 时间片过小:系统开销显著增加,大量时间用于进程切换
2. 优先级调度
- 实现方式:
- 抢占式版本:高优先级进程可立即抢占CPU
- 非抢占式版本:仅在当前进程主动放弃CPU时进行调度
- 应用场景: 特别适合实时系统需求
- 优势特点: 能有效区分不同优先级任务
- 潜在问题:
- 可能导致低优先级进程长期得不到执行(饥饿)
- 需要合理的优先级设置策略
- 优先级类型:
- 静态优先级:进程创建时确定且不变
- 动态优先级:可根据系统状况调整
- 调度时机:
- 非抢占式:仅检查进程主动放弃CPU的时刻
- 抢占式:还需检查就绪队列变化时的抢占可能性
3. 多级反馈队列调度
- 算法特点:
- 实现机制较为复杂
- 采用抢占式调度策略
- 主要优势: 在响应时间和系统吞吐量之间取得良好平衡
- 潜在缺陷: 仍可能导致某些进程饥饿
- 实践应用: Unix系统采用此算法
- 学习建议: 需结合具体例题理解其运行规则
4. 算法适用性分析
- 系统演进:
- 早期批处理系统关注宏观指标(如平均周转时间)
- 现代交互式系统更注重响应时间和公平性
- 算法适配:
- 这三种算法特别适合交互式系统需求
- 能提供快速响应和公平的资源分配
- 性能平衡: 通过多种策略实现系统性能的优化平衡
5. 学习建议
- 重点掌握:
- 各算法导致饥饿的可能性分析
- 时间片大小的影响评估
- 优先级设置原则与方法
- 实践方法: 通过课后习题巩固调度算法的核心概念
- 考核重点: 比起早期算法,这些算法的优缺点较少直接考察
本网站原创文章版权归何大锤的狂飙日记所有。发布者:何大锤,转转请注明出处:何大锤的博客