计算机操作系统(十二)详细讲解调计算机操作系统调度算法与多处理机调度

计算机操作系统(十二)详细讲解调计算机操作系统调度算法与多处理机调度


前言

  • 在之前的博客中,我们已对调度器/调度程序、闲逛调度以及调度算法的评价指标进行了讲解。
  • 接下来,本篇博客将继续深入探讨计算机操作系统的调度算法 ,并介绍多处理机调度相关内容

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

我的操作系统博客专栏
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482


一、调度算法入门的3个核心概念

(一)调度算法是什么?

简单说就是计算机分配任务的"规则"

  • 比如你去银行办业务,柜员按什么顺序叫号?是先来先办(先来先服务),还是优先处理简单业务(短作业优先)?
  • 计算机调度任务也需要类似规则,让CPU高效处理多个任务。

(二)两种基本调度模式

  • 非抢占式(温柔模式) :任务一旦开始执行,必须等到自己主动暂停(比如等数据输入)才会换人。

    🌰 就像你排队时,前面的人就算办业务很慢,也得等他办完才轮到你。

  • 抢占式(强制模式) :系统可以强行打断当前任务,优先处理更紧急的。

    🌰 比如急诊室里,不管前面有多少人排队,危重病人来了立刻插队。

(三)什么是"饥饿"?

有些任务因为调度规则永远轮不到执行,就像食堂打饭时,每次都让后面的人先打,你永远吃不上饭,这就是"饥饿"。好的调度算法要避免这种情况。

二、单机调度算法:从简单到优化的进化史

(一)初代算法:先来先服务(FCFS)

  • 核心思想:完全按任务到达顺序处理,先来的先做。
  • 规则:排队!谁先到队列头部,CPU就先处理谁。
  • 应用场景:早期操作系统的作业调度(比如批量处理打印任务)。
  • 是否可抢占:非抢占式(必须等当前任务自己结束)。
  • 优缺点
    ✅ 简单公平
    ❌ 效率低(比如前面有个超慢任务,后面所有快任务都得干等)
  • 会饿吗?:不会(按顺序处理,总有轮到你的时候)。

(二)效率升级:短作业优先(SJF)

  • 核心思想:优先处理"预计执行时间短"的任务。
  • 规则:每次从队列里挑最快能做完的任务先做。
  • 应用场景:适合任务执行时间可预估的场景(比如已知的计算任务)。
  • 是否可抢占 :分两种版本:
    • 非抢占式SJF:新任务来了先排队,等当前任务结束再比较
    • 抢占式SJF(Shortest Remaining Time First):如果新任务剩余时间更短,直接打断当前任务
  • 优缺点
    ✅ 整体效率高(减少平均等待时间)
    ❌ 对长任务不友好(可能一直被短任务插队,导致饥饿)
  • 会饿吗?:会!如果不断来短任务,长任务可能永远做不了。

(三)平衡大师:高响应比优先(HRRN)

  • 核心思想 :用一个公式平衡"等待时间"和"任务时长",避免长任务饿死。
    响应比 =(等待时间 + 执行时间)÷ 执行时间
    (等待越久、执行越短的任务,响应比越高,优先处理)
  • 规则:每次调度前计算所有任务的响应比,选最高的执行。
  • 应用场景:批处理系统(比如后台任务调度)。
  • 是否可抢占:非抢占式(任务开始后不打断)。
  • 优缺点
    ✅ 既照顾短任务,又不让长任务饿死
    ❌ 每次调度都要计算响应比,有点麻烦
  • 会饿吗?:不会(等待时间越长,响应比越高,迟早会被处理)。

(四)公平至上:时间片轮转(RR)

  • 核心思想:把CPU时间切成小块(时间片,比如10毫秒),每个任务轮流执行一个时间片。
  • 规则:任务执行到时间片结束就强制暂停,轮到下一个任务(抢占式)。
  • 应用场景:交互式系统(比如Windows、Linux的桌面任务调度)。
  • 是否可抢占:强制抢占式(时间一到必须让开)。
  • 优缺点
    ✅ 保证每个任务都能及时得到响应(比如打字时不会卡太久)
    ❌ 时间片设置不当会影响效率(太小导致频繁切换,太大变成FCFS)
  • 会饿吗?:不会(轮流执行,绝对公平)。

(五)优先级控场:优先级调度

  • 核心思想:给每个任务定优先级,优先处理高优先级任务。
  • 规则 :分为两种模式:
    • 静态优先级:任务创建时定好优先级(比如系统任务永远比用户任务优先级高)
    • 动态优先级:根据运行情况调整(比如长时间没执行的任务,优先级慢慢升高)
  • 是否可抢占:可抢占或非抢占式(看系统设计,比如手机系统会优先处理来电事件)。
  • 优缺点
    ✅ 能保证关键任务优先执行(比如杀毒软件扫描时优先处理病毒检测)
    ❌ 静态优先级可能导致低优先级任务饥饿
  • 会饿吗?:静态优先级会!动态优先级可避免。

(六)终极优化:多级反馈队列

  • 核心思想 :把任务分成多个队列,按优先级排队,不同队列用不同调度规则。
    🌰 比如:
    第1队列(高优先级):时间片轮转(10ms),处理交互式任务(如鼠标点击)
    第2队列(中优先级):时间片轮转(20ms),处理普通程序
    第3队列(低优先级):SJF,处理后台批量任务(如下载、备份)
  • 规则
    1. 新任务先进入最高优先级队列
    2. 每个队列时间片用完后,任务降级到下一级队列
    3. 高优先级队列空了,才处理低优先级队列
  • 应用场景:现代操作系统(如Linux的CFS调度器就是多级反馈的变种)。
  • 优缺点
    ✅ 兼顾公平性、响应速度和效率
    ❌ 队列和时间片参数配置复杂
  • 会饿吗?:不会(任务最多降到最低队列,总会被处理)。

三、从单机到多核:多处理机调度的新挑战

(一)多处理机调度是什么?

当计算机有多个CPU(或多核CPU)时,需要决定哪个任务分配到哪个CPU上执行,就像工厂里多个工人同时干活,如何分配任务让大家都不闲着。

(二)单机vs多核调度的区别

对比项 单处理机(1个CPU) 多处理机(多个CPU)
任务分配 只决定执行顺序 既要决定顺序,又要分配到哪个CPU
核心目标 减少任务等待时间 让所有CPU负载均衡(别有的忙死有的闲死)
特殊问题 任务在不同CPU间迁移会影响效率(因为CPU缓存数据可能丢失)

(三)多核调度的两大关键

  1. 负载均衡

    让每个CPU的任务量尽量平均。

    🌰 比如3个CPU,别让2个满负荷运行,第3个空闲。

    实现方法:定期检查各CPU的任务队列,把多的任务"搬"到少的CPU上。

  2. 处理机亲和性

    让任务尽量固定在一个CPU上执行(利用CPU缓存)。

    🌰 比如你经常用某台打印机,下次直接去那台打印机的队列,不用重新找位置,速度更快。

    但如果某个CPU太忙,也会打破亲和性,把任务迁移到其他CPU(在效率和负载间找平衡)。

四、总结

  1. 单机调度进化逻辑

    从最简单的先来先服务(FCFS),到追求效率的短作业优先(SJF),发现长任务会饿死,于是用高响应比(HRRN)平衡;交互式场景需要公平,就有时间片轮转(RR);关键任务要优先,加优先级调度;最后用多级反馈队列(MFQ)综合所有优点。

  2. 多核调度核心目标

    不再只关注单个CPU的效率,而是让多个CPU一起高效工作,重点解决"任务怎么分"(负载均衡)和"怎么分更高效"(处理机亲和性)。

  3. 一句话总结

    调度算法没有"最好",只有"最合适"------根据场景选规则:

    • 批处理任务(如后台计算):优先选SJF/HRRN
    • 桌面交互(如看视频+打字):用时间片轮转+优先级调度
    • 多核服务器:重点做负载均衡,兼顾亲和性

以上就是对本次关于操作系统博客内容的总结,后续我们将深入探讨操作系统更多知识。

我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343

我的操作系统博客专栏
https://blog.csdn.net/2402_83322742/category_12916780.html?spm=1001.2014.3001.5482

|--------------------|
| 非常感谢您的阅读,喜欢的话记得三连哦 |

相关推荐
pianmian19 分钟前
3dczml时间动态图型场景
前端·javascript·数据库
友莘居士25 分钟前
创建信任所有证书的HttpClient:Java 实现 HTTPS 接口调用,等效于curl -k
java·开发语言·https·httpclient·curl -k
患得患失94925 分钟前
【Django DRF】一篇文章总结Django DRF框架
数据库·django·sqlite
君的名字29 分钟前
怎么判断一个Android APP使用了React Native 这个跨端框架
android·react native·react.js
伊织code1 小时前
macOS 安装 PostgreSQL
数据库·macos·postgresql·gui·安装·客户端·psql
abc小陈先生1 小时前
JUC并发编程1
java·juc
飞飞9871 小时前
spring mvc
java·服务器·前端
贺函不是涵1 小时前
【沉浸式求职学习day47】【JSP详解】
java·开发语言·学习
曼岛_1 小时前
[Java实战] Docker 快速启动 Sentinel 控制台(二十八)
java·docker·sentinel
君的名字1 小时前
怎么判断一个Android APP使用了Electron 这个跨端框架
android·javascript·electron