首页 > 系统相关 >【面试】介绍几种常见的进程调度算法及其流程

【面试】介绍几种常见的进程调度算法及其流程

时间:2024-08-19 16:54:03浏览次数:14  
标签:优先级 队列 调度 面试 算法 时间 进程 CPU

面试模拟场景

面试官: 你能介绍一下几种常见的进程调度算法及其流程吗?

参考回答示例

进程调度是操作系统管理进程的核心功能,负责在多任务环境中分配CPU时间给各个进程。常见的进程调度算法包括先来先服务(FCFS)、短作业优先(SJF)、优先级调度、轮转调度(RR)以及多级反馈队列调度等。

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

概念:

  • FCFS 是最简单的调度算法,按照进程到达就绪队列的顺序分配CPU。先到的进程优先获得CPU执行权。

流程:

  1. 队列顺序: 所有进入就绪队列的进程按照到达的顺序排队。
  2. 执行顺序: 队列中的第一个进程获得CPU,执行直到完成。
  3. 队列更新: 执行完成后,进程退出队列,操作系统选择下一个进程继续执行。

优点:

  • 简单易实现: FCFS 算法非常简单,易于实现。
  • 公平: 每个进程按到达顺序执行,不会被饿死。

缺点:

  • 低效率: 如果第一个进程是长作业,会导致后续短作业等待较长时间,产生Convoy Effect。
  • 平均等待时间长: 由于长作业占据CPU时间,导致其他进程的平均等待时间较长。

示例:

进程到达顺序: P1, P2, P3
执行顺序: P1 -> P2 -> P3

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

概念:

  • SJF 根据进程的估计执行时间进行调度,优先选择执行时间最短的进程。SJF 可以是非抢占式或抢占式(也称为最短剩余时间优先, SRTF)。

流程:

  1. 估计执行时间: 系统估算每个进程的执行时间,并将进程放入就绪队列。
  2. 选择最短作业: 系统从就绪队列中选择执行时间最短的进程分配CPU。
  3. 执行与更新: 该进程执行完毕后,更新就绪队列,选择下一个最短作业。

优点:

  • 优化周转时间: SJF 可以最小化平均周转时间,通常在最优情况下能提高系统效率。
  • 适合短作业: 短作业优先保证了短进程可以快速完成,不会因长进程而被延迟。

缺点:

  • 难以预测: 估计执行时间并不总是准确的,可能导致次优调度决策。
  • 可能导致饥饿: 如果不断有短作业到达,长作业可能会长期得不到执行。

示例:

进程: P1(8), P2(4), P3(2)
执行顺序: P3 -> P2 -> P1

3. 优先级调度(Priority Scheduling)

概念:

  • 优先级调度根据每个进程的优先级分配CPU时间。优先级高的进程先执行。优先级可以是静态的,也可以是动态的,并且调度可以是抢占式或非抢占式。

流程:

  1. 设置优先级: 每个进程被分配一个优先级。
  2. 选择高优先级进程: 系统选择就绪队列中优先级最高的进程分配CPU。
  3. 执行与更新: 该进程执行完毕后,队列更新,选择下一个优先级最高的进程执行。

优点:

  • 灵活性: 可以根据进程的重要性调整优先级,实现灵活的资源分配。
  • 快速响应: 重要的或紧急的任务可以通过高优先级快速得到响应。

缺点:

  • 可能导致饥饿: 低优先级的进程可能永远得不到执行,特别是在高优先级任务不断到达的情况下。
  • 复杂性: 需要设计合理的优先级分配策略,避免低优先级任务饿死。

解决饥饿问题:

  • 优先级提升: 使用老化技术,随着时间的推移,低优先级的进程优先级逐渐提高,最终获得CPU时间。

示例:

进程: P1(优先级1), P2(优先级3), P3(优先级2)
执行顺序: P2 -> P3 -> P1

4. 轮转调度(RR, Round Robin)

概念:

  • 轮转调度是一种抢占式调度算法,为每个进程分配一个固定时间片(Time Slice),并按顺序轮流分配CPU时间。如果进程在时间片内未完成,则挂起并放回队列末尾,等待下一轮执行。

流程:

  1. 设置时间片: 设定固定的时间片,所有进程均分配相同的时间片。
  2. 分配CPU: 按照FIFO顺序,从队列头部选择进程分配CPU,执行时间片长的时间。
  3. 队列更新: 如果进程未在时间片内完成,则放回队列末尾,等待下一次调度。

优点:

  • 公平性: 所有进程得到相同的CPU时间片,适合时间共享系统。
  • 响应时间短: 系统可以快速响应,特别适合需要快速响应的交互式任务。

缺点:

  • 高上下文切换开销: 频繁的上下文切换会导致额外的开销,特别是在时间片较短时。
  • 时间片大小的选择: 时间片过长,退化为FCFS;时间片过短,会增加上下文切换的开销。

示例:

进程: P1(10ms), P2(5ms), P3(8ms)
时间片: 4ms
执行顺序: P1(4ms) -> P2(4ms) -> P3(4ms) -> P1(6ms) -> P3(4ms) -> P2(1ms)

5. 多级反馈队列调度(Multilevel Feedback Queue Scheduling)

概念:

  • 多级反馈队列调度是一种复杂且灵活的调度算法,使用多个队列来存放进程。每个队列有不同的优先级和时间片,进程可以根据其行为在不同的队列间动态调整。

流程:

  1. 初始化队列: 进程初始进入最高优先级队列。
  2. 分配时间片: 根据进程的运行时间和行为,系统在不同优先级的队列中分配不同的时间片。
  3. 调整队列: 如果进程在指定时间内未完成,则降低其优先级,放入较低优先级的队列;相反,如果进程表现较好,可以提升到更高优先级的队列。

优点:

  • 灵活适应: 能够动态适应进程的行为,既照顾了短作业,也能处理长作业。
  • 减少饥饿: 通过多级队列和反馈机制,有效避免了低优先级进程饥饿的问题。

缺点:

  • 复杂性: 实现和管理多级反馈队列的复杂性较高,需要合理设计各级队列的时间片和优先级策略。
  • 不确定性: 进程的最终调度顺序可能难以预测,可能影响某些实时任务的执行。

示例:

队列1: 时间片2ms, 队列2: 时间片4ms, 队列3: 时间片8ms
进程: P1, P2, P3
初始执行顺序: P1(队列1) -> P2(队列1) -> P3(队列1)

6. 总结

几种常见的进程调度算法各有其特点和适用场景:

  • 先来先服务(FCFS): 简单易实现,但可能导致Convoy Effect。
  • 短作业优先(SJF): 优化平均周转时间,但可能导致长作业饥饿。
  • 优先级调度: 根据进程的重要性分配CPU,但需防止低优先级进程饥饿。
  • 轮转调度(RR): 公平分配时间片,适合交互式系统,但可能有较高的上下文切换开销。
  • 多级反馈队列: 动态调整进程优先级,灵活且强大,但实现复杂。

标签:优先级,队列,调度,面试,算法,时间,进程,CPU
From: https://blog.csdn.net/Lewiz_124/article/details/141328068

相关文章

  • 【面试】阐述TCP和UDP的区别
    面试模拟场景面试官:你能阐述一下TCP和UDP的区别吗?###参考回答示例1.连接性TCP:面向连接(Connection-Oriented):TCP是一种面向连接的协议,在传输数据之前需要建立连接。在TCP通信过程中,客户端和服务器之间通过“三次握手”来建立连接,然后再进行数据传输,确保两者之间的......
  • 算法与数据结构——时间复杂度
    时间复杂度运行时间可以直观且准确地反映算法的效率。要准确预估一段代码的运行时间,应该进行如下操作。确定运行平台,包括硬件配置、编程语言、系统环境等,这些因素都会影响代码的运行效率。评估各种计算操作的运行时间,例如加法操作需要1ns,乘法操作需要10ns,打印操作需要5ns等。......
  • 算法与数据结构——复杂度分析
    复杂度分析算法效率评估在算法设计中,我们追求以下两个层面的目标。找到问题解法:算法需要再规定的输入范围内可靠地求得问题的正确解寻求最优解法:同一个问题可能存在多种解法,我们希望找到尽可能高效的算法。也就是说,在能够解决问题的前提下,算法效率已经成为衡量算法优劣的主......
  • Java中的可达性分析算法图解,以及哪些对象可以作为GCRoots
    可达性分析算法图示:解释:因为在GCRoots中存在对于对象A的引用,而A又持有对对象B和对象C的引用,所以这一串都是有用的引用链,需要保留。对于对象D和对象E,他们只是相互进行引用,并没有和GCRoots中的对象有任何的关联,所以可以安全的回收。哪些对象可以作为GCRoots虚拟机栈(栈帧中的......
  • 【杂乱笔记】Kmp字符串匹配算法
    KMP算法逻辑构建next数组:初始化next数组,用于存储每个位置的最长相同前后缀长度。遍历模式字符串patt如果当前字符与前缀字符匹配,增加前缀长度,并更新next数组。如果不匹配,使用next[prefix\_len-1]回退到上一个可能的前缀长度,继续比较。字符串匹配:初始......
  • 实现strStr() —— KMP算法(包含next数组的优化)
    目录KMP算法KMP算法的应用前缀表最长公共前后缀为什么要使用前缀表如何计算前缀表前缀表和next数组时间复杂度分析例题28.实现strStr构造next数组 使用next数组来做匹配 前缀表统一减一C++代码实现前缀表(不减一)C++代码实现总结 拓展:next数组的优化 KMP算......
  • 常见的排序算法汇总(详解篇)
    目录排序的概念以及运用排序的概念1.插入排序1.1直接插入排序1.1.1 基本思想1.1.2代码实现直接插入排序的特征总结:1.1.3希尔排序(缩小增量排序)......
  • 定时任务调度`crond` 和 `at` 命令使用
    ......
  • .NET面试题系列(27)反射
    序言 应该场景数据库对象转实体 publicstaticList<T>TableToList<T>(DataTabletable)whereT:classORMAutoMapperSystem.TypeSystem.Type类对于反射起着核心的作用。但它是一个抽象的基类,Type有与每种数据类型对应的派生类,我们使用这个派生类的对象的方法、字段......
  • 任务调度
    java实现定时任务定时任务种类:Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行;而且作业类需要集成java.util.TimerTask,一般用的较少。Spring3.0以后自带的task,即:springsched......