在开始之前,推荐大家阅读一篇文章《从零开始学习Python基础语法:打开编程大门的钥匙》https://cloud.tencent.com/developer/article/2471283,该文章介绍了 Python 基础语法,包括数据类型、控制流、函数等,并以待办事项管理器为例实践,有兴趣的朋友可以去了解下。
引言在现代操作系统中,进程调度算法起着至关重要的作用。它负责决定在某个特定时刻,哪个进程能够获得 CPU 资源并执行,合理的进程调度算法可以有效提高系统的资源利用率、响应速度以及整体性能。本文将对几种常见的进程调度算法进行详细介绍。
一、先来先服务调度算法(First-Come, First-Served,FCFS)1. 基本原理FCFS 是一种最简单的进程调度算法,它遵循 “先到先服务” 的原则。按照进程到达就绪队列的先后顺序依次分配 CPU 资源,即最先进入就绪队列的进程最先获得 CPU 执行权,直到该进程完成或者因等待某个事件(如 I/O 操作)而主动让出 CPU 为止。
2. 示例假设有三个进程 P1、P2、P3,它们到达就绪队列的时间分别为 0 时刻、1 时刻、3 时刻,它们各自所需的 CPU 执行时间分别为 5 个时间单位、3 个时间单位、2 个时间单位。按照 FCFS 算法,首先调度 P1 执行,执行 5 个时间单位后,P1 结束,然后调度 P2 执行 3 个时间单位,最后调度 P3 执行 2 个时间单位。
3. 优缺点优点:实现简单,易于理解,公平对待每一个先到达的进程。缺点:对短作业不利,若长作业先到达,后面的短作业需要等待很长时间才能执行,可能导致平均周转时间较长,系统整体性能不高。二、短作业优先调度算法(Shortest Job First,SJF)1. 基本原理SJF 算法以作业(进程)预计执行时间的长短为依据进行调度。优先选择预计执行时间最短的作业(进程)分配 CPU 资源,目的是使系统的平均周转时间尽可能短,提高系统的吞吐量。
2. 示例假设有四个进程 P1、P2、P3、P4,它们的预计执行时间分别为 8 个时间单位、4 个时间单位、2 个时间单位、5 个时间单位。如果按照 SJF 算法,首先调度执行时间最短的 P3,然后是 P2,接着是 P4,最后是 P1。
3. 优缺点优点:能有效降低平均周转时间,提高系统吞吐量,对于短作业来说,可以较快地得到执行,充分利用系统资源。缺点:需要提前知道作业的执行时间,在实际系统中往往很难准确预估;对长作业不利,长作业可能会长时间处于等待状态,出现 “饥饿” 现象,即一直得不到 CPU 资源而无法执行。三、优先级调度算法(Priority Scheduling)1. 基本原理每个进程都被赋予一个优先级,优先级高的进程优先获得 CPU 资源进行执行。优先级的设定可以根据不同的因素,比如进程的重要性、紧迫程度等。可以是静态优先级(在进程创建时就确定好,并且在整个生命周期内保持不变),也可以是动态优先级(在进程运行过程中根据某些条件动态调整优先级)。
2. 示例假设有进程 P1、P2、P3,它们的优先级分别为 3(最高优先级为 5)、2、4,按照优先级调度算法,会先调度 P3 执行,当其执行完毕或者主动让出 CPU 后,再根据剩余进程的优先级决定下一个执行的进程。
3. 优缺点优点:可以灵活地根据进程的重要性等因素来分配 CPU 资源,适用于对实时性要求较高的系统,比如实时控制系统等。缺点:同样可能出现 “饥饿” 现象,如果源源不断有高优先级的进程进入就绪队列,低优先级的进程可能永远无法获得 CPU 执行;另外,如何合理地确定优先级是一个较复杂的问题。四、时间片轮转调度算法(Round Robin,RR)1. 基本原理将 CPU 时间划分成固定大小的时间片(例如 10 毫秒、20 毫秒等),每个就绪进程轮流获得一个时间片在 CPU 上执行。当一个进程的时间片用完后,无论其是否执行完毕,都要让出 CPU,排到就绪队列末尾等待下一轮调度,如此循环往复,保证每个就绪进程都能在一定时间内获得 CPU 资源。
2. 示例假设有三个进程 P1、P2、P3 在就绪队列中,时间片设定为 5 个时间单位。首先调度 P1 执行 5 个时间单位,时间片用完后 P1 排到就绪队列末尾,接着调度 P2 执行 5 个时间单位,再调度 P3 执行 5 个时间单位,如此循环,直到所有进程都执行完毕。
3. 优缺点优点:对所有进程公平对待,每个进程都能获得 CPU 资源,响应时间比较快,适用于分时操作系统,能让多个用户感觉自己独占 CPU。缺点:频繁的进程切换会增加系统开销,因为每次切换都需要保存和恢复进程的上下文信息;如果时间片设置不合理,例如时间片过大,就类似于 FCFS 算法,时间片过小则会导致过多的切换开销,影响系统效率。五、多级反馈队列调度算法(Multilevel Feedback Queue,MLFQ)1. 基本原理这是一种综合了多种调度算法特点的复杂调度算法。它设置多个就绪队列,每个队列有不同的优先级,优先级越高的队列时间片越小。新创建的进程首先进入最高优先级的队列,按照时间片轮转的方式执行,如果一个进程在规定时间片内没有执行完,就会被移到下一级优先级更低、时间片更大的队列中继续执行,如此类推,并且进程可以根据一定情况动态调整在不同队列间的位置,从而实现对不同类型进程(如短作业、长作业、交互式进程等)的合理调度。
2. 示例假设有三个多级反馈队列 Q1、Q2、Q3,优先级依次递减,Q1 的时间片为 2 个时间单位,Q2 的时间片为 5 个时间单位,Q3 的时间片为 10 个时间单位。新进程 P1 进入 Q1,执行 2 个时间单位后没执行完,就被移到 Q2 继续执行,若在 Q2 中执行 5 个时间单位还没结束,再被移到 Q3 执行。
3. 优缺点优点:融合了多种调度算法的优点,既能照顾到短作业快速执行,又能保证长作业最终也能得到足够的 CPU 时间,对交互式进程也有较好的响应,具有较好的适应性和灵活性。缺点:算法相对复杂,实现起来难度较大,参数(如各队列的优先级、时间片大小等)的合理设置需要根据具体系统进行大量调试和优化。总结综上所述,不同的进程调度算法各有其适用场景和优缺点,操作系统往往会根据自身的设计目标(如面向实时性、面向多用户分时等)以及硬件资源等因素综合考虑,选择合适的调度算法或者结合多种调度算法来提高系统的整体性能,满足用户的不同需求。