简介

当CPU有大量任务要处理,但由于资源有限,无法同时处理。所有就需要某种规则来决定任务处理的顺序,这就是调度。

调度层次

根据调度频率与层次,共分为三种

  1. 高级调度

    也称为作业调度(Long-Trem Scheduling),频次很低,它决定哪些进程从外存(硬盘)加载到内存
  2. 中级调度

    也称为内存调度(Medium-Term Scheduing),频次中等,将暂时无法运行的进程(阻塞进程)交换到外存,也就是所谓的挂起。释放内存资源,后续再重新加载到内存中。
  3. 低级调度

    也称为进程调度(Short-Term Scheduing),频次极高,每秒可达数千次。它直接决定当前哪个就绪进程获得CPU。
---- 做什么? 发生在哪? 频率 对进程的影响
高级调度 选择合适的作业调入内存,并创建进程 外存=>内存 最低 NULL=>初始态=>就绪态
中级调度 从阻塞队列中选择合适的进程调回内存 外存=>内存 中等 阻塞态=>就绪态
低级调度 从就绪队列中选择合适的进程配合CPU 内存=>CPU 极高 就绪态=>运行态

进程调度的模型

相对进程的状态模型,这里出现了两种新状态,就绪挂起和阻塞挂起。

这本质上是一种优化,比如进程进入了就绪态/阻塞态。但该进程优先级很低,CPU根本调度不到该进程,该进程还白白占用内存,那不如将它挂起,从内存移入外存。释放内存为更高优先级的进程服务。

比如你的屏保程序,是CPU完全没事干的时候,才会运行。如果一直占用内存,只会白白浪费。

眼见为实

常见调度算法

调度算法的选择直接影响系统性能,常见算法为抢占式(直接中断)和非抢占式(进程自愿释放)

  1. 先来先服务(First-Come First-Served,FCFS)

    按照进程进入就绪队列的顺序分配CPU,先到先得。

    优点:实现简单,公平性基于到达顺序

    缺点:可能导致"护航消息",短CPU时间的进程要等待长CPU进程执行完成,周转性较差

  2. 短作业优先(Shortest Job First,SJF)

    选择预计执行最短的进程优先运行。

    优点:平均周转时间最小化

    缺点:需要预知运行时间,实现很难。谁家好人算这个啊!

  3. 轮转法(Round Robin,RR)

    为每个进程分配固定的时间片(比如15ms),进程时间片用完后,返回就绪队列。

    优点:保证程序快速响应,适合交互式系统

    缺点:上下文切换频繁,降低系统性能

  4. 优先级调度(Priority Scheduling)

    为每个进程分配优先级,高优先级先执行。

    分为静态优先级:进程创建时即确定好优先级,动态优先级:根据运行情况动态调整优先级

    优点:按需运行,高优先级进程能占用大量CPU。

    缺点:低优先级进程可能一直得不到调用。动态设置优先级时,优先级难以界定。

  5. 多级反馈队列(Multilevel Feedback Queues)

    设置多个优先级队列,比如按照时间片的长短分组。新进程首先进入高优先级队列,如果未在时间片内完成,则降级到下一级队列

进程调度时机与方式

什么时候需要进程调度?

  1. 主动放弃

    • 进程正常终止
    • 运行过程中发生异常而终止
    • 主动阻塞,比如等待I/O,Sleep
  2. 被动放弃
    • 分配的时间片用完
    • 更高优先级进程的插入,比如I/O中断

什么时候不能进程调度?

  1. 处理中断的过程
  2. 进程处于操作系统内核临界区
  3. 系统原语操作过程

说人话就时,当系统执行原子操作时,就不能调度。

你都是原子操作了,要是能被调度,那还叫原子操作吗?

进程调度方式

  1. 抢占式

    由操作系统剥夺当前进程的CPU使用权
  2. 非抢占式

    进程主动放弃CPU,全凭良心。

进程调度程序

  1. 支持内核级线程的操作系统,调度的对象是线程
  2. 不支持内核级线程的操作系统,调度的对象是进程

Idle进程

CPU通电后,就需要一直运行。就算没有工作,也要给CPU几条指令,组成一个循环,在那里空转

因此系统会创建这么一个特殊的Idle进程

从它的工作性质不难猜出它的特性:

  1. 优先级最低
  2. 能耗低
  3. 啥也不干

眼见为实

重生之我是操作系统(五)----CPU调度的更多相关文章

  1. 操作系统:cpu调度 6-25

    1. 进程选择 1小时和1分钟? 进程优先1分钟,再执行1小时. 时间短的进程先执行,执行顺序也有关. 2. 遇到io操作,执行的进程先让出cpu,切换其他进程. 3.进程先来先服务,进程调度策略: ...

  2. 操作系统学习笔记(五)--CPU调度

    由于第四章线程的介绍没有上传视频,故之后看书来补. 最近开始学习操作系统原理这门课程,特将学习笔记整理成技术博客的形式发表,希望能给大家的操作系统学习带来帮助.同时盼望大家能对文章评论,大家一起多多交 ...

  3. 操作系统(五)CPU调度

    CPU调度是多道程序操作系统的基础.

  4. 操作系统概念学习笔记 10 CPU调度

    操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU.操作系统能够提高计算机的吞吐率. 对于单处理器系统.每次仅仅同意一个进程执行:不论什么其它进程必须等待,直到C ...

  5. 操作系统学习笔记:CPU调度

    CPU调度的目的在于提高CPU利用率,不让CPU闲着.CPU是宝贵的资源,如果有一个进程,本来在CPU中运行,忽然因为要使用IO资源,于是转而请求IO,这边CPU挂起,造成就绪队列中的其他进程等待,这 ...

  6. 操作系统 | 结合 CPU 理解一行 Java 代码是怎么执行的

    根据冯·诺依曼思想,计算机采用二进制作为数制基础,必须包含:运算器.控制器.存储设备,以及输入输出设备,如下图所示. 我们先来分析 CPU 的工作原理,现代 CPU 芯片中大都集成了,控制单元,运算单 ...

  7. 【转】CPU调度

    转自:http://blog.csdn.net/xiazdong/article/details/6280345 CPU调度   用于多道程序 以下先讨论对于单CPU的调度问题. 回顾多道程序,同时把 ...

  8. Thread.Sleep(0)的意义 操作系统中CPU的竞争策略

    在线程的学习中遇到的 不太明白就搜了一下  有一篇觉得写得很好的分享一下 转载:http://www.360doc.com/content/12/1220/07/1054746_255212714.s ...

  9. spring boot / cloud (十五) 分布式调度中心进阶

    spring boot / cloud (十五) 分布式调度中心进阶 在<spring boot / cloud (十) 使用quartz搭建调度中心>这篇文章中介绍了如何在spring ...

  10. 操作系统切换CPU的方式

    操作系统切换CPU的方式 1 IO等待切换. 2 时间轮询切换,也就是如果没有IO等待的情况下,就会有时间轮询切换,不让CPU一直处理一个任务   CPU的处理速度是纳秒级别的,所有我们可以同时听歌, ...

随机推荐

  1. Logstash介绍

    Logstash是一个开源数据收集引擎,具有实时管道功能.Logstash可以动态地将来自不同数据源的数据统一起来,并将数据标准化到你所选择的目的地. 集中.转换和存储你的数据 Logstash是一个 ...

  2. 分布式配置中心--Apollo

    分布式配置中心--Apollo Apollo(阿波罗)是携程开源的分布式配置中心,能够集中化管理应用不同环境.不同集群的配置,支持配置热发布并实时推送到应用端,并且具备规范的权限及流程治理等特性,适用 ...

  3. manim边学边做--局部变换

    本次介绍的两个用于变换的动画类:TransformMatchingShapes和TransformMatchingTex. 它们的主要特点是对一组对象或一段文本进行局部变换,适用于复杂的图形或者文本的 ...

  4. 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

    九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) @ 目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 1. RDB 概述 ...

  5. mac安装php单点调试环境

    页面预览和抓包方式 sudo php-fpm sudo killall php-fpm 开启/usr/local/etc/nginx/ nginx nginx -s quit 运行Charles就行 ...

  6. dp 常见套路总结

    dp 里存的东西值域不大的时候,考虑把状态中某一维和 dp 里存的东西交换,进行 dp. 连续段 dp 时,考虑把连续段化为对每个元素考虑接上一个元素. dp 里的值可能存在某个上界,超过这个值一定不 ...

  7. P2730 [USACO3.2] 魔板 Magic Squares 题解

    一些废话 夜深人静的夜晚,我开了这道题.看起来,完成它是一件轻而易举的事.我想了想,打开Dev-C++,开始写代码. 然而,那时的我还不知道,我踏入了深渊...... 咳咳,中二病犯了,前面的文字请忽 ...

  8. java list集合去重的两种方式

  9. QT5笔记: 26. 多窗体应用程序设计

  10. 机器学习 | 强化学习(6) | 策略梯度方法(Policy Gradient Method)

    6-策略梯度方法(Policy Gradient Method) 策略梯度概论(Introduction) 基于策略(Policy-Based) 的强化学习 对于上一节课(价值函数拟合)中采用参数\( ...