从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

  • 操作系统

    • 我的操作系统学习笔记

    • 我的操作系统实验笔记

    • 操作系统网课-王道考研

      • 0_课程白嫖指南
      • 1_1_操作系统的概念(定义)、功能和目标
      • 1_2_操作系统的特征
      • 1_3_操作系统的发展与分类
      • 1_4_操作系统的运行机制与体系结构
      • 1_5_中断和异常
      • 2_1_6_系统调用
      • 2_1_1_进程的定义、组成、组织方式、特征
      • 2_1_2_进程的状态与转换
      • 2_1_3_进程控制
      • 2_1_4_进程通信
      • 2_1_5_线程概念和多线程模型
      • 2_2_1_处理机调度的概念、层次
      • 2_2_2_进程调度的时机、切换与过程、方式
        • 进程调度的时机
        • 进程调度的方式
        • 进程的切换与过程
        • 小结
      • 2_2_3_调度算法的评价指标
      • 2_2_4_FCFS、SJF、HRRN调度算法
      • 2_2_5_调度算法:时间片轮转、优先级、多级反馈队列
      • 2_3_1_进程同步、进程互斥
      • 2_3_2_进程互斥的软件实现方法
      • 2_3_3_进程互斥的硬件实现方法
      • 2_3_4_信号量机制
      • 2_3_5_用信号量实现进程互斥、同步、前驱关系
      • 2_3_6_生产者-消费者问题
      • 2_3_7_多生产者-多消费者问题
      • 2_3_8_吸烟者问题
      • 2_3_9_读者-写者问题
      • 2_3_10_哲学家进餐问题
      • 2_3_11_管程
      • 2_4_1_死锁的概念
      • 2_4_2_死锁的处理策略—预防死锁
      • 2_4_3_死锁的处理策略—避免死锁
      • 2_4_4_死锁的处理策略—检测和解除
      • 3_1_1_内存的基础知识
      • 3_1_2_内存管理的概念
      • 3_1_3_覆盖与交换
      • 3_1_4_连续分配管理方式
      • 3_1_5_动态分区分配算法
      • 3_1_6_基本分页存储管理的基本概念
      • 3_1_7_基本地址变换机构
      • 3_1_8_具有快表的地址变换机构
      • 3_1_9_两级页表
      • 43_3_1_10_基本分段存储管理方式
      • 3_1_11_段页式管理方式
      • 3_2_1_虚拟内存的基本概念
      • 3_2_2_请求分页管理方式
      • 3_2_3_页面置换算法
      • 3_2_4_页面分配策略
      • 4_1_1_初识文件管理
      • 4_1_2_文件的逻辑结构
      • 4_1_3_文件目录
      • 4_1_4_文件的物理结构(上)
      • 4_1_4_文件的物理结构(下)
      • 54_4_1_5_文件存储空间管理
      • 4_1_6_文件的基本操作
      • 4_1_7_文件共享
      • 4_1_8_文件保护
      • 4_1_9_文件系统的层次结构
      • 4_2_1_磁盘的结构
      • 4_2_2_磁盘调度算法
      • 4_2_3_减少磁盘延迟时间的方法
      • 4_2_4_磁盘的管理
      • 5_1.2_I-O 控制器
      • 5_1.3_I-O 控制方式
      • 65_5_1_1_I-O 设备的概念和分类
      • 5_1_4_I-O 软件层次结构
      • 5_1_5_I-O 核心子系统
      • 5_1_6_假脱机技术
      • 5_1_7_设备的分配与回收
      • 5_1_8_缓冲区管理
  • Linux

  • 计算机网络

  • 数据库

  • 编程工具

  • 装机

  • 计算机基础
  • 操作系统
  • 操作系统网课-王道考研
2023-05-15
目录

222_进程调度的时机、切换与过程、方式

# 2.2_2_进程调度的时机、切换与过程、方式

各位同学大家好。在这个小节中我们会继续学习进程,调度相关的一系列知识点,首先我们会来回答一下进程调度的时机是什么,什么时候需要进行进程调度,而什么时候又不能进行进程调度,并且在聊进程调度时机的问题的时候,会引出一个进程调度的方式的问题,分为非抢占式和抢占式两种

‍

另外进程调度的目的其实是为了进程切换,那么进程切换和进程调度有什么区别?进程切换的过程当中我们又需要做一些什么事情呢?这些都是小节的内容。

​

# 进程调度的时机

那么我们先来看一下进程调度的时机,之前我们已经介绍了进程调度的概念,进程调度也叫做低级调度,就是指按照一定的算法,从就绪队列当中选择一个进程为他分配处理机。

那么什么时候需要进行进程调度和切换?主要可以分为两个大类,第一种就是当前运行的进程,他主动的放弃了处理机。第二种是当前运行的进程被动的被迫的放弃了处理机。比如说如果一个进程它正常的中止,或者因为运行的过程当中发生了某种异常而不得不终止,再或者一个进程他发出了一个 lO 请求,然后主动的请求进入阻塞状态,然后用来等待 lO 完成。这些情况都是进程主动放弃处理机的一个具体的例子。那么被动放弃处理机,比如说给进程分配的时间片用完了,或者说有一个更紧急的事情需要处理,再或者当前有一个优先级更高的进程进入了就绪队列,那么这些情况下又有可能需要把当前运行的进程。强行的剥夺它的处理机使用权,然后它就不得不被动的放弃处理机, ‍ 而进程调度并不是什么时候都可以进行的,有的时候不能进行进程调度和切换。

比如说在我们处理中断的过程当中,由于中断处理它的过程是很复杂的,并且和硬件是息息相关的,因此在中断处理的过程中是很难做到中断处理到一半去进行进程调度和切换的。

而第二种情况是进程在操作系统内和程序临界区中,这种情况也不能进行进程调度,这一点不太容易理解之后咱们还会继续展开细聊。

第三种情况是在原子操作的过程中,也就是之前咱们介绍过的一些原语。比如说咱们之前讲原语的时候举过一个例子,在一个进程它的状态发生改变,比如说从阻塞态变为就绪态的时候,那么我们既需要修改进程 PCB 当中进程状态的标志位,同时也需要把 PCB 放到一个新的相应的就绪队列里。那么如果说我们只做了前面这一件事,中间就开始进行进程切换进程调度了,那么就有可能会导致 PCB 当中记录的这种状态标志,和 PCB 实际放的就绪队列还是阻塞队列,实际放在这个位置不相匹配的这种情况,而这种数据的不匹配就有可能会被系统造成一些安全隐患,所以说这种原语或者说原子操作中间的过程肯定是不能允许进行进程切换的。

​

那么接下来我们再来细聊一下第二个问题,进程在操作系统内核程序临界区中不能进行调度与切换,这是正确的一种表述,但是大家在做一个课后习题的时候会发现 12 年的一个题当中有个选项是说进程在处于临界区时不能进行处理及调度,这个表述是错误的。

在了解内核程序临界区和普通的临界区的区别之前,我们需要先聊一个现在暂时还没有接触的概念叫做临界资源,临界资源就是指一个时间段内只允许一个进程使用的资源,各个进程需要互斥地来访问临界资源,你访问的时候我不能访问,我访问的时候你不能访问,这是互斥的意思。

那么临界区就是指访问临界资源的那段代码,因此各个进程肯定也只能互斥的进入临界区,互斥的执行这一段访问临界资源的代码,而内核程序的临界区也就是前者,一般就是用来访问某一种内核数据结构的,比如说进程的就绪队列,那么当一个进程它此时处于一个内核程序临界区,并且这个临界区它是要访问就绪队列的话,那么在访问之前他会把就绪队列上锁。

而如果说进程当前还没有推出内核程序临界区的话,也就意味着临界资源并没有被解锁。那么在没有解锁的过程中,如果说我们要发生进程调度的话,那么进程调度相关的程序肯定是需要访问就绪队列这个连接资源的,因为他要从就绪队列当中挑选一个进程为他分配处理机。那么由于就绪队列临界资源,它此时还是上锁的一个状态。所以如果说在这种情况下就进行进程调度的话,那么进程调度肯定是没办法顺利的进行下去的,因为此时这个还没有解锁

所以可以看到对于内核程序临界区访问的这些临界资源,也就是这些内核数据结构而言,如果这些临界资源被上锁了,并且没有被尽快的释放的话,那么有可能会影响到操作系统内核其他的管理工作,就比如说刚才咱们聊到的进程切换,所以说我们在访问这些内核程序临界区的期间内,我们不能进行进程的调度和切换,我们必须让进程迅速的尽快的执行完内核程序临界区的那些代码,然后完成对临界资源的访问,之后就尽快的把对临界资源的锁给解除,只有这样其他的操作系统内核才可以继续有序的进行管理工作。

而另外一种情况,假如此时进程访问的是一种普通的临界资源,比如说是一个打印机的话,那么他在访问的时候会先进行上锁,打印机在完成打印完成之前进程其实是一直在临界区内的,他还一直保持着对打印机的访问,但是由于它还没有退出临界区,所以临界资源并不会被解锁,但是打印机它又是一种慢速的 lO 设备,如果这个情况下不允许进程调度进程切换的话,那么就会导致进程它需要一直空等着打印机的打印结束。所以在进程空等的过程当中,它同时还霸占着 CPU,所以 CPU 可以说一直是在空闲的状态,他一直没有做一些有意义的事情。

所以如果说进程在访问一个普通的临界资源,这个情况下其实是应该进行进程调度的。因为普通的临界区访问的这些普通的临界资源,并不会像之前所说的例子一样,直接的影响到操作系统内核的管理工作,所以说为了增加系统的并发度,增加 CPU 的利用率,那么在访问这些普通的临界区的时候,是可以进行进程调度和切换的。那么讲到这里刚开始的这两个问题,为什么前者对为什么后者错,相信大家已经有所理解了。

​ ‍

# 进程调度的方式

那么接下来我们再来看下一个问题,在有的操作系统当中,它只允许进程主动的放弃处理机,而不允许进程在运行的过程中被迫的被剥夺处理机资源。但是又有的操作系统它是允许当有更紧急的任务处需要处理的时候,它是会强行的剥夺当前运行进程的处理机资源的。

​

当前运行的进程是否可以被强行的剥夺处理及资源,这个问题我们引出了下一个知识点,就是进程调度的方式分为非剥夺调度方式和剥夺调度方式,前者又可以称作非抢占式,后者又可以称作抢占式。

那么非剥夺调度方式就是咱们刚才聊到的只允许进程主动的放弃处理机这样一种方式,除非进程它正常或者异常的终止,或者他主动的要求进入阻塞,他不然处理机是会一直为当前运行的进程所为它服务的。

那么抢占式或者说剥夺调度方式的话,如果说此时有一个更重要更紧急的任务需要处理的话,那么当前执行的进程就会被暂停执行,被剥夺处理机资源,然后把处理机分配给更重要更紧急的进程进行处理。

显然前面这种方式它的规则会相对来说要简单一些,所以这种方式实现起来要简单,并且系统管理的开销也要更小。但是缺点就在于他没有办法及时的处理紧急任务,所以这种非抢占式只适合于早期的一些批处理系统,

而后者抢占式,它可以优先的处理更紧急的进程,并且可以让各个进程按照时间片轮转的这种方式来执行。当时间片到的时候,就可以强行的把当前运行的进程,把它的处理机资源给剥夺,所以说后面这种方式它就比较适合于后面出现的分时操作系统和实时操作系统,这就是进程调度的方式的问题,分为这样两种

​ ‍

# 进程的切换与过程

那么既然我们选择了一个进程,要为他分配处理机的话,在进程与进程切换的过程当中又发生了一些什么事情呢?

首先我们来聊一聊狭义的进程调度和进程切换有什么区别?狭义的进程调度指的是从就绪队列中选中一个要运行的进程这样一个过程,而这个要运行的进程它可以是刚刚才暂停执行的进程,也可以是另一个进程。

如果选中的是另一个进程的话,那么我们就需要进行进程切换,而进程切换指的就是之前的进程让出处理机,然后之后的进程占用处理机这样的一个过程。

而有的题目当中出现的进程调度,它指的是广义的进程调度,广义的进程调度包含了进程切换和选择一个进程这样前面所说的这两个步骤,所以在读题的时候,如果出现了两种调度的含义,大家不要觉得奇怪,自己能够分辨它是狭义的还是广义的就可以了。 ‍ 那么进程切换的过程主要完成了什么事情,其实我们可以把这个过程简化为两件事情。

第一件事就是把对原来正在运行的进程,它的各种数据,包括处理机的运行环境,这些数据把它保存下来。

第二件事就是把新的进程的各种各样的运行环境之类的数据把它恢复过来,而运行环境运行现场的一些信息,比如说程序计数器,程序状态字,然后各种数据寄存器,这些信息一般是存在进程控制块 PCB 当中的,所以对这个数据进行保存,其实保存到了 PCB 当中,而对这些数据进行恢复,其实是从 PCB 当中读出这些数据,并且把这些数据放到相应的寄存器当中。 ‍ 那么经过刚才的分析,我们会发现进程的切换其实并不是一瞬间就可以完成的,它是需要付出一定的时间代价的。所以我们不能简单的认为进程切换越频繁,进程的并发度就越高。如果进程的切换调度过于频繁的话,其实反而会导致整个系统的效率降低。因为系统会把大部分的时间都花在进程切换的开销上,而真正用于执行进程推进进程的时间反而会减少,所以进程切换是有代价的。了解这一点对于理解咱们之后讲时间片的一个调度算法是至关重要的,这个地方大家稍微注意一下。 ‍ ​

# 小结

那么我们再来快速回顾一下这个小节,内容并不多,并且也不算是考试的重点,不过大家也需要理解。首先我们介绍了进程调度的时机,包括什么时候需要进程,调度分为进程主动放弃处理机和进程被动放弃处理机这两种情况,并且我们举了一系列的例子,

之后我们介绍什么时候不能进行进程调度,重点介绍了进程在操作系统内核程序临界区当中,为什么不能进行进程调度,因为这个时候进程进行进程调度,有可能会影响到操作系统内核的一系列管理工作。而如果进程处于一个普通的程序临界区当中,他访问的是一个普通的临界资源的话,这种情况下是可以进行进程调度的,这一点是不太容易理解的难点,但是也不算重点。

那么之后我们又介绍了进程切换的过程,其中大家最需要注意最需要理解的是进程的调度和切换是有代价的,只需要知道这一点就可以了,其他的这些要有一个大体的印象就可以。另外我们还介绍了进程调度的两种方式,分为抢占式和非抢占式,而这两种调度方式会在之后咱们讲调度算法的时候大量的出现,所以继续学习后面的内容会对这两个部分的理解会更加深入。好的,那么这就是这个小节的全部内容。

​

上次更新: 2025/5/9 14:55:39
2_2_1_处理机调度的概念、层次
2_2_3_调度算法的评价指标

← 2_2_1_处理机调度的概念、层次 2_2_3_调度算法的评价指标→

最近更新
01
语雀文档一键下载至本地教程
07-04
02
要成功,就不要低估环境对你的影响
07-03
03
血泪教训:电子设备要定期开机
07-02
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式