抢占式与非抢占式调度
抢占式与非抢占式调度之间的主要区别
- 在抢占式调度中,CPU被分配给进程一段时间,而在非抢占式调度中,CPU被分配给进程直到其终止。
- 在抢占式调度中,任务是根据优先级切换的,而在非抢占式调度中,不进行切换。
- 抢占式算法存在进程从就绪状态到运行状态切换的开销,而非抢占式调度没有这种切换开销。
- 抢占式调度是灵活的,而非抢占式调度是僵化的。

什么是抢占式调度?
抢占式调度是一种调度方法,其中任务通常被分配了优先级。有时,即使较低优先级的任务仍在运行,运行较高优先级的任务也很重要。
此时,较低优先级的任务会暂停一段时间,并在较高优先级的任务完成执行后恢复。
什么是无抢占式调度?
在这种调度方法中,CPU已被分配给特定进程。保持CPU繁忙的进程将通过上下文切换或终止来释放CPU。
它是可用于各种硬件平台的唯一方法。这是因为它不像抢占式调度那样需要专用硬件(例如计时器)。
当一个进程自愿进入等待状态或终止时,就会发生非抢占式调度。
抢占式与非抢占式调度:比较表
在这里,我们对抢占式与非抢占式调度进行了逐项比较。操作系统中抢占式与非抢占式调度之间的主要区别如下
抢占式调度 | 非抢占式调度 |
---|---|
处理器可以在任何当前进程执行的中间被抢占以执行不同的进程。 | 一旦处理器开始执行,它必须先完成,然后才能执行其他进程。它不能在中间暂停。 |
与非抢占式调度相比,CPU利用率更有效。 | 与抢占式调度相比,CPU利用率效率较低。 |
抢占式调度的等待时间和响应时间更短。 | 非抢占式调度方法的等待时间和响应时间更长。 |
抢占式调度是有优先级的。最高优先级的进程是当前被利用的进程。 | 当任何进程进入运行状态时,该进程的状态就不会从调度程序中删除,直到它完成其工作。 |
抢占式调度是灵活的。 | 非抢占式调度是僵化的。 |
示例:- 最短剩余时间优先、轮转调度等。 | 示例:先来先服务、最短作业优先、优先级调度等。 |
抢占式调度算法可以被抢占,即进程可以被调度 | 在非抢占式调度中,进程不能被调度 |
在此过程中,CPU被分配给进程一段时间。 | 在此过程中,CPU被分配给进程,直到它终止或切换到等待状态。 |
抢占式算法存在进程从就绪状态到运行状态以及反之切换的开销。 | 非抢占式调度没有进程从运行状态切换到就绪状态的开销。 |
抢占式调度的优点
这里是抢占式调度方法的优点/好处
- 抢占式调度方法更健壮,因此一个进程无法垄断CPU。
- 每次中断后都会重新考虑运行任务的选择。
- 每个事件都会导致正在运行的任务中断。
- 操作系统确保所有运行进程的 CPU 利用率相同。
- 在此,CPU的利用率是相同的,即所有运行进程将平等地使用CPU。
- 该调度方法还提高了平均响应时间。
- 在多道程序设计环境中,抢占式调度是有益的。
非抢占式调度的优点
这里是无抢占式调度方法的优点/好处
- 提供较低的调度开销
- 倾向于提供高吞吐量
- 这是一个概念上非常简单的方法
- 调度所需的计算资源更少
抢占式调度的缺点
以下是抢占式调度的缺点
- 调度需要有限的计算资源
- 调度程序需要更长的时间来挂起正在运行的任务、切换上下文并调度新进入的任务。
- 如果连续出现高优先级进程,低优先级进程需要等待更长时间。
非抢占式调度的缺点
这里是非抢占式调度的缺点/弊端
- 它可能导致饿死,特别是对于那些实时任务。
- 错误可能导致机器冻结。
- 它可能使实时和优先级调度变得困难。
- 进程响应时间差。
非抢占式调度的例子
在非抢占式 SJF 调度中,一旦 CPU 周期分配给进程,该进程就会一直持有该周期,直到它达到等待状态或终止。
考虑以下五个进程,每个进程都有其独特的爆发时间和到达时间。
进程队列 | 执行时间 | 到达时间 |
---|---|---|
P1 | 6 | 2 |
P2 | 2 | 5 |
P3 | 8 | 1 |
P4 | 3 | 0 |
P5 | 4 | 4 |
步骤 0) 在时间=0,P4 到达并开始执行。
步骤 1) 在时间=1,进程 P3 到达。但是,P4 仍需要 2 个执行单元才能完成。它将继续执行。
步骤 2) 在时间=2,进程 P1 到达并被添加到等待队列。P4 将继续执行。
步骤 3) 在时间=3,进程 P4 将完成其执行。比较 P3 和 P1 的爆发时间。执行进程 P1,因为其爆发时间比 P3 短。
步骤 4) 在时间=4,进程 P5 到达并被添加到等待队列。P1 将继续执行。
步骤 5) 在时间=5,进程 P2 到达并被添加到等待队列。P1 将继续执行。
步骤 6) 在时间=9,进程 P1 将完成其执行。比较 P3、P5 和 P2 的爆发时间。执行进程 P2,因为其爆发时间最短。
步骤 7) 在时间=10,P2 正在执行,P3 和 P5 在等待队列中。
步骤 8) 在时间=11,进程 P2 将完成其执行。比较 P3 和 P5 的爆发时间。执行进程 P5,因为其爆发时间较短。
步骤 9) 在时间=15,进程 P5 将完成其执行。
步骤 10) 在时间=23,进程 P3 将完成其执行。
步骤 11) 让我们计算上述示例的平均等待时间。
Wait time P4= 0-0=0 P1= 3-2=1 P2= 9-5=4 P5= 11-4=7 P3= 15-1=14 Average Waiting Time= 0+1+4+7+14/5 = 26/5 = 5.2
抢占式调度的例子
考虑以下三个进程在轮转法中
进程队列 | 执行时间 |
---|---|
P1 | 4 |
P2 | 3 |
P3 | 5 |
步骤 1) 执行开始于进程 P1,其爆发时间为 4。在这里,每个进程执行 2 秒。P2 和 P3 仍在等待队列中。
步骤 2) 在时间=2,P1 被添加到队列末尾,P2 开始执行。
步骤 3) 在时间=4,P2 被抢占并添加到队列末尾。P3 开始执行。
步骤 4) 在时间=6,P3 被抢占并添加到队列末尾。P1 开始执行。
步骤 5) 在时间=8,P1 的爆发时间为 4。它已完成执行。P2 开始执行。
步骤 6) P2 的爆发时间为 3。它已执行 2 个时间间隔。在时间=9,P2 完成执行。然后,P3 开始执行直到完成。
步骤 7) 让我们计算上面示例的平均等待时间。
Wait time P1= 0+ 4= 4 P2= 2+4= 6 P3= 4+3= 7