在开始之前,推荐大家阅读一篇文章《从零开始学习Python基础语法:打开编程大门的钥匙》https://cloud.tencent.com/developer/article/2471283,该文章介绍了 Python 基础语法,包括数据类型、控制流、函数等,并以待办事项管理器为例实践,有兴趣的朋友可以去了解下。
在现代操作系统中,进程调度算法起着至关重要的作用。它负责决定在某个特定时刻,哪个进程能够获得 CPU 资源并执行,合理的进程调度算法可以有效提高系统的资源利用率、响应速度以及整体性能。本文将对几种常见的进程调度算法进行详细介绍。
FCFS 是一种最简单的进程调度算法,它遵循 “先到先服务” 的原则。按照进程到达就绪队列的先后顺序依次分配 CPU 资源,即最先进入就绪队列的进程最先获得 CPU 执行权,直到该进程完成或者因等待某个事件(如 I/O 操作)而主动让出 CPU 为止。
假设有三个进程 P1、P2、P3,它们到达就绪队列的时间分别为 0 时刻、1 时刻、3 时刻,它们各自所需的 CPU 执行时间分别为 5 个时间单位、3 个时间单位、2 个时间单位。按照 FCFS 算法,首先调度 P1 执行,执行 5 个时间单位后,P1 结束,然后调度 P2 执行 3 个时间单位,最后调度 P3 执行 2 个时间单位。
SJF 算法以作业(进程)预计执行时间的长短为依据进行调度。优先选择预计执行时间最短的作业(进程)分配 CPU 资源,目的是使系统的平均周转时间尽可能短,提高系统的吞吐量。
假设有四个进程 P1、P2、P3、P4,它们的预计执行时间分别为 8 个时间单位、4 个时间单位、2 个时间单位、5 个时间单位。如果按照 SJF 算法,首先调度执行时间最短的 P3,然后是 P2,接着是 P4,最后是 P1。
每个进程都被赋予一个优先级,优先级高的进程优先获得 CPU 资源进行执行。优先级的设定可以根据不同的因素,比如进程的重要性、紧迫程度等。可以是静态优先级(在进程创建时就确定好,并且在整个生命周期内保持不变),也可以是动态优先级(在进程运行过程中根据某些条件动态调整优先级)。
假设有进程 P1、P2、P3,它们的优先级分别为 3(最高优先级为 5)、2、4,按照优先级调度算法,会先调度 P3 执行,当其执行完毕或者主动让出 CPU 后,再根据剩余进程的优先级决定下一个执行的进程。
将 CPU 时间划分成固定大小的时间片(例如 10 毫秒、20 毫秒等),每个就绪进程轮流获得一个时间片在 CPU 上执行。当一个进程的时间片用完后,无论其是否执行完毕,都要让出 CPU,排到就绪队列末尾等待下一轮调度,如此循环往复,保证每个就绪进程都能在一定时间内获得 CPU 资源。
假设有三个进程 P1、P2、P3 在就绪队列中,时间片设定为 5 个时间单位。首先调度 P1 执行 5 个时间单位,时间片用完后 P1 排到就绪队列末尾,接着调度 P2 执行 5 个时间单位,再调度 P3 执行 5 个时间单位,如此循环,直到所有进程都执行完毕。
这是一种综合了多种调度算法特点的复杂调度算法。它设置多个就绪队列,每个队列有不同的优先级,优先级越高的队列时间片越小。新创建的进程首先进入最高优先级的队列,按照时间片轮转的方式执行,如果一个进程在规定时间片内没有执行完,就会被移到下一级优先级更低、时间片更大的队列中继续执行,如此类推,并且进程可以根据一定情况动态调整在不同队列间的位置,从而实现对不同类型进程(如短作业、长作业、交互式进程等)的合理调度。
假设有三个多级反馈队列 Q1、Q2、Q3,优先级依次递减,Q1 的时间片为 2 个时间单位,Q2 的时间片为 5 个时间单位,Q3 的时间片为 10 个时间单位。新进程 P1 进入 Q1,执行 2 个时间单位后没执行完,就被移到 Q2 继续执行,若在 Q2 中执行 5 个时间单位还没结束,再被移到 Q3 执行。
综上所述,不同的进程调度算法各有其适用场景和优缺点,操作系统往往会根据自身的设计目标(如面向实时性、面向多用户分时等)以及硬件资源等因素综合考虑,选择合适的调度算法或者结合多种调度算法来提高系统的整体性能,满足用户的不同需求。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。