当前位置: 首页 > news >正文

操作系统笔记:进程调度(Process Scheduling)

一、什么是进程调度

进程调度(Process Scheduling) 是操作系统中负责选择下一个要运行的进程的一项核心功能。在多道程序设计系统中,多个进程竞争CPU资源,调度器根据特定策略选择一个进程运行。

目标

  • 提高CPU利用率
  • 提高系统吞吐量
  • 减少平均等待时间
  • 保证响应时间
  • 实现公平性与优先级

二、调度类型

调度类型说明
长程调度(Long-term)决定哪些进程进入就绪队列
中程调度(Mid-term)暂停/恢复进程(换出/换入)以节省内存
短程调度(Short-term)选择哪个就绪进程获得CPU(核心调度器)

实际中,主要关注短程调度,即CPU调度。


三、调度时机

进程调度的典型触发场景包括:

  1. 进程从运行状态 → 阻塞(如等待I/O)
  2. 进程从运行状态 → 就绪(时间片耗尽)
  3. 进程终止
  4. 优先级更高的进程进入就绪队列(抢占式调度)

四、调度方式:非抢占 vs 抢占

类型描述特点
非抢占式一旦CPU被分配,直到终止或阻塞简单、安全,但响应差
抢占式系统可中断当前运行进程调度他人响应快,但复杂

五、常见调度算法(经典)

1. 先来先服务

  • 按照进程到达时间先后执行
  • 非抢占式
  • 简单易实现,但容易造成长作业阻塞短作业

2. 短作业优先(SJF)

  • 按预估CPU时间从短到长排序
  • 非抢占式 or 抢占式(抢占版本称为最短剩余时间优先SRTF
  • 最优平均等待时间,但难以预知作业时间

3. 时间片轮转(RR)

  • 所有进程轮流执行,每次限时(时间片)
  • 抢占式,公平性强
  • 时间片大小影响性能与响应(小 → 响应好,切换多)

4. 优先级调度

  • 为每个进程分配优先级
  • 可抢占式或非抢占式
  • 可能导致饥饿(低优先级长期不运行)
  • 可引入**老化机制(aging)**缓解饥饿

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

  • 不同优先级进程分配到不同队列
  • 每个队列使用不同算法(如前台RR,后台FCFS)
  • 队列之间不可交互(静态)

6. 多级反馈队列调度(MFQ)

  • 类似多级队列,但允许进程在不同队列间迁移
  • 初始放高优先级队列,执行一次没完成则降级
  • 老化机制内置,适应性强,是实际常用的复杂调度策略

六、调度算法比较

算法平均等待时间响应速度公平性实现复杂度
FCFS一般偏高简单
SJF最低
RR中等
优先级不定(看策略)不定
多级反馈复杂

七、重要调度指标

指标含义
周转时间完成时间 - 提交时间
带权周转时间周转时间 / 服务时间
等待时间就绪队列中等待CPU的总时间
响应时间第一次响应所花时间(用于交互式系统)

八、进程调度相关术语回顾

  • 进程控制块(PCB):记录进程状态、寄存器、优先级等调度所需信息
  • 就绪队列:存放等待CPU的进程
  • 上下文切换(Context Switch):保存/恢复进程执行状态的开销操作

九、面试常见问题及参考回答

为什么需要进程调度?

答: 因为系统资源有限,多个进程必须共享CPU等资源,调度器通过一定策略动态决定哪个进程运行,从而提升CPU利用率、响应时间和系统吞吐量。


非抢占式调度的缺点?

答:

  • 无法强制切换,可能导致响应慢
  • 一个进程运行时间过长会拖慢其他进程
  • 不适用于交互式、实时系统

时间片轮转的优缺点?

答:

优点:

  • 公平性强,每个进程都有机会
  • 响应时间快,适合交互式系统

缺点:

  • 时间片太大 → 类似FCFS,响应差
  • 时间片太小 → 上下文切换频繁,浪费资源

多级反馈队列如何解决饥饿问题?

答:

  • 低优先级进程若等待过久,将被提升优先级(老化机制)
  • 动态调整进程优先级,确保所有进程都能运行

实际系统中常用哪些调度算法?

答:

  • Windows:多级反馈队列 + 优先级提升/衰减机制
  • Linux:O(1)调度器(老)、CFS(完全公平调度器)
  • Unix:多级反馈 + 动态优先级
  • Android:基于Linux CFS,并引入用户交互响应优化策略

十、总结

  • 进程调度是操作系统资源管理核心之一
  • 关键任务:选择最合适的进程运行,满足性能和公平
  • 多种算法适用于不同场景,没有“最优算法”
  • 面试重点:理解调度策略原理 + 实际适用性 + 面试题举例
http://www.lryc.cn/news/588787.html

相关文章:

  • 纸板加工制造学习1
  • Listener(监听器)
  • 【监控实战】Grafana自动登录如何实现
  • 【prometheus+Grafana篇】基于Prometheus+Grafana实现SQLserver数据库的监控与可视化
  • 半导体制造流程深度解析:外观缺陷检测的AI化路径与实践
  • 批量制作Word:如何根据表格数据的内容批量制作word,根据Excel的数据批量制作word文档的步骤和注意事项
  • docker安装prometheus和Grafana
  • 【PTA数据结构 | C语言版】将表达式树转换成中缀表达式
  • JDK1.8函数式编程实战(附日常工作案例,仅此一篇耐心看完彻底搞懂)
  • 进程探秘:从 PCB 到 fork 的核心原理之旅
  • Isaac Sim仿真赋能机器人工作流,推动具身智能在机器人领域研究
  • Web前端入门:JavaScript 由程序触发绑定事件的几种方式
  • redisson 设置了过期时间,会自动续期吗
  • [ctfshow web入门]web98 学习PHP的引用
  • LeetCode 3136.有效单词:遍历模拟
  • 21.映射字典的值
  • 连接new服务器注意事项
  • 非实时的防控场景
  • LLM面试题及讲解 4
  • 【Tauri】Tauri 2.x+Vue自动更新教程对接后端接口更新
  • C++--哈希
  • CPU寄存器、进程上下文与Linux O(1)调度器原理
  • 知识付费小程序资质全解析
  • 进程的内存映像,只读区,可读写区,堆,共享库,栈详解
  • 【机器学习基础【5】】Python数据科学三件套:从数据创建到处理再到可视化实战
  • 链表的 哑结点的本质
  • 排序算法实战(上)
  • 经典排序算法之希尔排序
  • 解锁Python爬虫:数据获取与清洗的进阶指南
  • 深入浅出 RabbitMQ-核心概念介绍与容器化部署