操作系统——进程调度

2023-05-16

目录

1. 基本概念

1.1 CPU-I/O执行周期

1.2 CPU调度程序(CPU scheduler)

1.3 进程状态模型

1.4 抢占调度

1.5 调度程序(dispatcher)

1.6 调度准则

2. 调度算法

2.1 先到先服务(FCFS)

2.2 最短作业优先调度(SJF)

2.3 优先级调度

2.4 轮转调度(RR)

2.5 多级队列调度

2.6 多级反馈队列调度

3 线程调度

参考资料:


进程调度目的在进程间切换CPU,最大化CPU利用率,通过操作系统的调度使得计算机资源分配和使用更加高效。

1. 基本概念

1.1 CPU-I/O执行周期

进程的属性:进程执行包括周期进行CPU执行I/O等待。据此可以将程序分为CPU密集型程序I/O密集型程序

CPU密集型程序一般只有少量长CPU执行;I/O密集型程序一般具有大量短CPU执行。

1.2 CPU调度程序(CPU scheduler)

CPU空闲时,操作系统从就绪队列中选择一个进程来执行,进程选择采用短期调度程序(short-term scheduler)或CPU调度程序

调度程序分为:短期调度程序中期调度程序长期调度程序

  • 短期调度程序:从准备执行的进程中选择进程,并分配CPU,这里准备执行的进程理解为内存中就绪的进程。
  • 长期调度程序:从外部大容量存储设备(通常为磁盘)的缓冲池中选择进程,加载到内存。
  • 中期调度程序:将进程从内存(或从CPU竞争)中移出,从而降低多道程序程度(内存中的进程数量)。被调出的进程可被重新调入内存,并从中断处继续运行,这种方案称为交换(swap)。通过中期调度程序,进程可换入(swap in)和换出(swap out)。

1.3 进程状态模型

可以参考之前的博文——【操作系统——进程状态】。

其中七状态模型包含的情况比较全面,除了进程的创建、就绪、运行、等待、终止这五个状态,考虑在执行虚拟内存管理的操作系统中,可以将暂时不用的进程(处于就绪态和等待态的进程)换出(swap out)到外部存储设备(如硬盘)中,在适当的时间再将其换入(swap in)到内存中,此时引入了就绪挂起等待挂起状态。

1.4 抢占调度

需要CPU调度的4种情况

  1. 当一个进程从运行状态切换到等待状态(例如I/O请求,或wait()调用)

  2. 当一个进程从运行状态切换到就绪状态(例如当出现中断)

  3. 当一个进程从等待状态切换到就绪状态(例如I/O完成)

  4. 当一个进程终止

调度方案分为两种:(1)非抢占的(nonpreemptive)或协作的(cooperative)(2)抢占的(preemptive)非抢占调度下,一旦某个进程分配到CPU,该进程会一直使用CPU,直到它终止或切换到等待状态。抢占调度允许第二个进程抢占第一个进程的运行,这中间可能涉及进程共享数据的一致性问题,进程同步问题。

1.5 调度程序(dispatcher)

这个调度程序在英文原书中称为“dispatcher”,与上面说的CPU调度程序(CPU scheduler)不同,CPU scheduler负责进程的选择(调度),而dispatcher负责将CPU控制交给由CPU schedule(即短期调度程序)选择的进程CPU scheduler负责进程选择,dispatcher实现调度过程的进程切换细节,个人感觉二者属于上下游关系

dispatcher的主要功能如下:

  • 切换上下文;

  • 切换到用户模式;

  • 跳转到用户程序的合适位置,以便重新启动程序;

调度程序停止一个程序而启动另一个程序所需的时间称为调度延迟(dispatch latency)

1.6 调度准则

为了比较不同的CPU调度算法,采用一些比较准则来评价CPU调度算法的特性,具体的一些比较准则包括

  • CPU使用率
  • 吞吐量(throughput):一个时间单元内进程完成的数量;
  • 周转时间(turnaround time):进程从提交到进程完成的时间段;
  • 等待时间:进程在就绪队列种因等待所需的时间;
  • 响应时间:进程从提交请求到产生第一响应的时间。

进程调度的理想情况是:最大化CPU使用率和吞吐量,最小化周转时间、等待时间和响应时间。

2. 调度算法

2.1 先到先服务(FCFS)

先到先服务(First-Come First-Served,FCFS)调度算法。通过FIFO队列实现,当一个进程进入就绪队列中的时候,它的PCB会被链接到队列尾部;当CPU空闲时,它会分配给位于队列头部的进程,并且这个进程从队列中移去。

特点:

  • 平均等待时间往往很长;
  • 非抢占,可能导致一个进程占用CPU时间过长;
  • 会存在多个I/O进程在就绪队列中等待CPU密集型进程的完成(其他进程都等待一个大进程释放CPU),称为护航效果(convoy effect),导致CPU和设备的使用率降低。

2.2 最短作业优先调度(SJF)

最短作业优先(Shortest-Job-First,SJF)调度算法。将每个进程与其下次CPU执行长度关联起来,CPU空闲时会被赋给具有最短CPU执行时间(注意是下次CPU执行的时间最短而不是总的时间最短)的进程执行。另一种叫法是:最短下次CPU执行(shortest-next-CPU-burst)算法。

特点:

  • SJF算法可以证明是最优的,对于给定的一组进程,SJF算法的平均等待时间最短。
  • SJF算法困难在于如何确定下次CPU执行的长度。下次CPU执行通常预测为以前CPU执行的测量长度的指数平均(exponential average)。
  • SJF算法可以是抢占或非抢占的。

2.3 优先级调度

优先级调度(priority-scheduling)算法为每个进程关联一个优先级,具有最高优先级的进程会分到CPU;具有相同优先级的进程按照FCFS的顺序调度。SJF算法是一个简单的优先级算法,其优先级(p)为下次(预测的)CPU执行时间的导数。

特点:

  • 优先级算法可以是抢占的或非抢占的;
  • 主要问题是会导致无穷阻塞(indefinite blocking)饥饿(starvation)
  • 解决低优先级进程的无穷等待的方案之一:老化(aging),即逐渐增加在系统中等待时间很长的进程的优先级。

2.4 轮转调度(RR)

轮转(Round-Robin,RR)调度算法,类似FCFS调度,但是增加了抢占以切换进程。将一个较小的时间单元定义为时间量(time quantum)或时间片(time slice),将就绪队列作为循环队列,CPU调度整个就绪队列,为每个进程分配不超过一个是时间片的CPU。

特点:

  • RR算法的性能很大程度上取决于时间片的大小:时间片太小,频繁的进程上下文切换耗费大量资源;时间片太大,RR退化成FCFS。一般根据经验,80%的CPU执行应小于时间片。

2.5 多级队列调度

多级队列(multilevel queue)调度算法,将就绪队列分成多个单独的队列,根据进程属性(如内存大小、进程优先级、进程类型等),一个进程永久分到一个队列,每个队列有自己的调度算法。例如可有两个队列分别用于前台进程和后台进程,前台队列可采用RR算法调度,后台队列采用FCFS算法调度。

多级队列调度算法实例,有五个队列,优先级由高到低,分别为:(1)系统进程;(2)交互进程;(3)交互编辑进程;(4)批处理进程;(5)学生进程。其中每个队列与更低层队列相比具有绝对的优先,例如只有系统进程、交互进程和交互编辑进程队列都为空,批处理队列内的进程才能运行。如果一个批处理进程运行过程中有一个交互进程进入就绪队列,那么该批处理进程会被抢占。

另一种可能是,在队列之间划分时间片,每个队列具有一定比例的CPU时间,可用于调度队列内的进程。例如对于前台-后台队列例子,前台队列可有80%的CPU时间,用于进程之间的RR调度;后台队列可以有20%的CPU时间,用于按FCFS算法来调度进程。

2.6 多级反馈队列调度

多级反馈队列调度(multilevel feedback queue)调度算法允许进程在队列之间迁移,其特点在于:

  • 如果进程使用过多的CPU时间,其将会被放到更低的优先级队列;
  • I/O密集型和交互进程放在更高优先级队列上;
  • 在较低优先级队列中等待过长的进程会被移到更高优先级队列,以阻止饥饿的发生。

多级反馈队列调度程序可由下列参数定义:

  • 队列数量;
  • 每个队列的调度算法;
  • 用以确定何时升级到最高优先级队列的方法;
  • 用以确定何时降级到最低优先级队列的方法;
  • 用以确定进程在需要服务时将会进入那个队列的方法。

3 线程调度

线程可以分为用户级(user-level)线程内核级(kernel-level)线程在支持线程的操作系统上内核级线程(而不是进程)才是操作系统所调度的。这里理解为上述的进程调度算法,其实就CPU而言,并不严格区分该算法究竟是用于调度进程还是用于调度线程,而是用于调度基本的调度单元在支持线程的操作系统上,线程才是CPU调度的基本单元,此时上述调度算法此时用于线程调度。

关于用户级线程和内核级线程:用户级线程是由线程库管理的,内核并不知道。用户级线程最后运行在CPU上,映射到相应的内核级线程,这种映射不是直接的,可能采用轻量级进程(Light Weight Process,LWP),因此内核级线程和用户级线程的调度具体实现仍有所区别。

  • 进程竞争范围(Process-Contention Scope,PCS):对于实现多对一和多对多模型的系统线程库会调用用户级线程,以便在可用LWP上运行。线程调度到可用LWP上并不意味着线程真实运行在一个CPU上,而是需要系统调度内核线程到物理CPU)
  • 系统竞争范围(System-Contention Scope):为了决定哪个内核线程调度到同一个处理器上,内核采用SCS竞争CPU。采用一对一模型的系统如Windows、Linux和Solaris只采用SCS调度

参考资料:

[1] Silberschatz, A., Galvin, P. B., and Gagne, G. 操作系统概念(原书第9版) (郑扣根等译)[M]. 机械工业出版社, 2020.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统——进程调度 的相关文章

  • Java课程设计之学习成绩管理系统

    package System import java awt import java awt event import java io import javax swing import javax swing table Abstract
  • 6.OS运行机制(补充)

    中断
  • java调优总结

    JVM调优总结 序 几年前写过一篇关于JVM调优的文章 前段时间拿出来看了看 又添加了一些东西 突然发现 基础真的很重要 学习的过程是一个由表及里 再由里及表的过程 呵呵 所谓的 温故而知新 而真正能走完这个轮回的人 也就能称为大牛或专家了
  • linux 如何创建卷组

    1 创建一个物理卷 Pvcreate dev sd1 dev sd2 dev sd3 dev sd4 2 用刚才创建的物理卷创建一个卷组 Vgcreate 卷组名 dev sd1 dev sd2 dev sd3 dev sd4 3 创建逻辑
  • Linux网络安全-Zabbix入门(一)

    一 基本概念 1 监控目的 运行情况 提前发现问题 2 监控资源类别 公开 tcp udp 端口 私有 cpu 磁盘 监控一切需要监控的东西 只要能够想到 能够用命令实现的都能用来监控 如果想远程管理服务器就有远程管理卡 比如Dell id
  • mapengpeng1999@163.com 操作系统4~处理机调度

    处理机调度 1 三级调度体系 1 处理机调度主要是对处理机运行时间进行分配 即 按照一定算法或策略 将处理机运行时间分配给各个并发进程 同时尽量提高处理机的使用效率 2 现代操作系统中 按调度所实现的功能分3种类型 高级调度 中级调度和低级
  • 操作系统学习(九)进程通信

    一 知识总览 二 定义 进程通信是指进程之间的信息交换 每个进程都拥有自己的内存空间 是相互独立的 这样在每个进程执行时 才不会被其他进程所干扰 三 进程通信的方式 1 共享存储 1 两个进程对共享区的访问必须是互斥的 即在同一时间内 只允
  • Linux 磁盘与文件系统管理(鸟哥私房菜)

    本文来自 http vbird dic ksu edu tw linux basic 0230filesystem php 第八章 Linux 磁盘与文件系统管理 系统管理员很重要的任务之一就是管理好自己的磁盘文件系统 每个分割槽不可太大也
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • CF、SF、OF、ZF标志位

    没学汇编 这种题我真是做一道错一道 OF overflow flag 溢出标志位 溢出标志位 OF 1 表示带符号整数运算时结果发生溢出 对于无符号整数运算 OF没有意义 对于有符号数的溢出判断方式有 1 采用一位符号位 思想为 或 则为溢
  • nslookup命令详解

    nslookup命令用于查询DNS的记录 查看域名解析是否正常 在网络故障的时候用来诊断网络问题 nslookup的用法相对来说还是蛮简单的 主要是下面的几个用法 1 直接查询 这个可能大家用到最多 查询一个域名的A记录 nslookup
  • 《一个操作系统的实现》读书笔记-- 第一章--最小的“操作系统”

    一 最简单的 操作系统 最最简单的 操作系统 就是一个最最简单的引导扇区 Boot Sector 虽然它不具有任何功能 但是它却能够直接在裸机上运行 不依赖其他软件 一个引导扇区是512个字节 并且以0xAA55为结束标识的扇区 下面就是那
  • 03LinuxC线程学习之线程共享和非共享

    1 线程共享和非共享 1 1 线程共享资源 1 文件描述符表 由于线程间共享进程间的内容 而文件描述符表在主线程的PCB当中 各个线程可以直接去请求访问 所以线程间通信就不需要像进程那样通过管道这些方式通信 2 每种信号的处理方式 即当某个
  • 操作系统 段页式存储管理

    一 引入 分页系统是以页面作为内存分配的基本单位 能有效地提高内存利用率 但信息共享等不方便 分段系统是以段作为内存分配的基本单位 它能够更好地满足用户多方面的需要 信息共享 动态链接等 但采用分区方式管理物理内存 仍然存在碎片问题 段页式
  • 使用inet_ntop转换IPv6地址时在macOS和linux上的行为不一样

    下面这段python代码在macOS和linux时运行的结果是不同的 import socket ip socket inet pton socket AF INET6 1 2 3 0 5 6 7 8 print socket inet n
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法 前段时间需要用到一个FTP文件夹下载的功能 于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • 解析IDEA中的Artifacts配置

    1 Artifact 2 Artifact名称 3 Artifact类型 4 输出路径 xff08 也就是Deployment root部署根目录 xff09 xff0c 项目运行后的输出根目录 5 输出根目录 xff0c 即4指定的地址
  • IDEA代码以及注释格式化,行宽设置,以及自动换行

    一 设置代码最大行宽 xff0c 以及自动换行 勾选wrap on typing xff0c 即在编码时 xff0c 超出最大行宽 xff0c 则自动换行 xff0c 或者采用下面这种方式 xff0c 在手动格式化的时候 xff0c 进行自
  • IDEA设置代码规范,代码格式化设置,以及ALIBABA编码规约

    阿里巴巴格式化模板文件下载地址 https github com alibaba p3c 第一个文件是 代码格式化时用的模板 第二个文件是 注释模板 一 eclipse 格式化设置 格式化模板导入 依次点击 xff1a Window gt
  • 数组的初始化 array initializer is not allowed here

    此处不允许使用数组初始值设定项 array initializer is not allowed here 数组的使用分声明和初始化两部分 xff0c 两者可同时进行 xff0c 也可分开进行 int array 声明 array 61 n
  • Maven打包所有依赖到一个可执行jar中,将外部依赖加入到classPath中

    首先说一下比较常用的两种打包方式 xff1a 前提 xff1a maven构建可执行jar包时 xff0c 如果项目依赖了pom中定义的dependency之外的外部jar包 xff0c maven jar plugin默认是不会把这 些额
  • postgresql数据库|数据库实操----表复制详解

    前言 xff1a 通常情况下 xff0c 我们对数据库的增删改查的时候 xff0c 为了确保数据的安全 xff0c 需要备份表 xff0c 那么 xff0c 一种方法是通过pg dump 这个工具做SQL转储操作 xff0c 此方法比较复杂
  • Centos7 配置防火墙 firewall

    一 firewall 1 从CentOS7开始 xff0c 默认使用firewall来配置防火墙 xff0c 没有安装iptables xff08 旧版默认安装 xff09 2 firewall的配置文件是以xml的格式 xff0c 存储在
  • Windows多媒体开发框架介绍

    Windows 多媒体开发框架介绍 欢迎来到 Windows 的多媒体开发世界2D 绘图 API1 GDI2 GDI 43 3 Direct2D 音频 API1 MME2 DirectSound3 Windows Core AudioCor
  • 【Ubuntu】在QT运行程序后无结果显示,只有终端运行的解决办法

    转自 http stackoverflow com questions 3255035 qt creator run in terminal https bugs launchpad net ubuntu 43 source qtcreat
  • 【蓝桥杯嵌入式】关于CT117E下载程序出问题解决方案(含keil mdk4和keil mdk5移植)

    废话 万事开头难 xff0c 然后中间难 xff0c 最后难 寒假刚开始 xff0c 我看到了蓝桥杯嵌入式 很快啊 xff01 报名 买板一气呵成 没想到这块CT117E板子它不讲武德 xff0c 来骗 xff0c 来偷袭我这个二十岁的小伙
  • c语言冒泡排序详解(分析每一步,附代码)

    冒泡排序 xff08 Bubble Sort xff09 xff0c 是一种计算机科学领域的较简单的排序算法 它重复地走访过要排序的元素列 xff0c 依次比较两个相邻的元素 xff0c 如果顺序 xff08 如从大到小 首字母从Z到A x
  • 解决maven update project 后项目jdk变成1.5

    一 问题描述 在Eclipse中新建了一个Maven工程 然后更改JDK版本为1 7 结果每次使用Maven gt Update project的时候JDK版本都恢复成1 5 二 原因分析 Maven官方文档有如下描述 xff1a 编译器插
  • C语言——整型和浮点型混合运算

    1 int和double混合运算 C语言int和double混合运算时 xff0c 会自动将int类型的数据转换为double类型的数据 xff0c 最后得到的结果也是double类型 如下例 xff1a double a 61 4 0 9
  • C语言——函数指针

    目录 1 函数指针概念 1 1 函数指针的声明 1 2 函数指针的定义 1 3 使用typedef定义函数指针的别名 1 4 将常数转换为函数指针 1 5 函数指针的调用 1 6 将函数指针作为函数的传入参数 2 简单的例子 1 函数指针概
  • C语言——多线程基础(pthread)

    目录 1 线程的定义以及线程的创建 1 1 线程和进程的概念 1 2 使用pthread create 函数创建进程 2 使用pthread join 等待线程结束 2 1 使用pthread join 等待线程结束 2 1 使用pthre
  • C++——双端队列(deque)

    1 双端队列 xff08 deque xff09 双端队列 xff08 deque xff09 是队列的一种变形 xff0c 一般队列只能在队尾添加元素 xff08 push xff09 xff0c 在队首删除元素 xff08 pop xf
  • Linux|集群初始化脚本--osiniit.sh简介

    前言 xff1a 不管是什么部署 xff0c 前期的准备工作通常都是比较繁琐的 xff0c 但同时这些工作又具有程式化的特征 xff0c 也就是说都是有一定的流程的 xff0c 固定的步骤的 OK xff0c shell脚本处理这样的程式问
  • C++——优先级队列(priority_queue)

    目录 1 优先级队列 xff08 priority queue xff09 1 1 基本概念 1 2 优先级队列的定义 1 3 通过重写仿函数来支持自定义数据类型 1 4 通过运算符重载来支持自定义比较函数 1 5 优先级队列的基本操作 2
  • 操作系统——进程状态

    进程从创建到执行 xff0c 再到执行完毕销毁的过程中 xff0c 经历了不同的进程状态 xff0c 进程状态部分取决于进程当前的活动 xff0c 可以将进程状态分为 xff08 1 xff09 三状态模型 xff1b xff08 2 xf
  • 操作系统——进程调度

    目录 1 基本概念 1 1 CPU I O执行周期 1 2 CPU调度程序 xff08 CPU scheduler xff09 1 3 进程状态模型 1 4 抢占调度 1 5 调度程序 xff08 dispatcher xff09 1 6