抢占式与非抢占式调度

抢占式与非抢占式调度之间的主要区别

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

什么是抢占式调度?

抢占式调度是一种调度方法,其中任务通常被分配了优先级。有时,即使较低优先级的任务仍在运行,运行较高优先级的任务也很重要。

此时,较低优先级的任务会暂停一段时间,并在较高优先级的任务完成执行后恢复。

什么是无抢占式调度?

在这种调度方法中,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 到达并开始执行。

Example of Non-Preemptive Scheduling

步骤 1) 在时间=1,进程 P3 到达。但是,P4 仍需要 2 个执行单元才能完成。它将继续执行。

Example of Non-Preemptive Scheduling

步骤 2) 在时间=2,进程 P1 到达并被添加到等待队列。P4 将继续执行。

Example of Non-Preemptive Scheduling

步骤 3) 在时间=3,进程 P4 将完成其执行。比较 P3 和 P1 的爆发时间。执行进程 P1,因为其爆发时间比 P3 短。

Example of Non-Preemptive Scheduling

步骤 4) 在时间=4,进程 P5 到达并被添加到等待队列。P1 将继续执行。

Example of Non-Preemptive Scheduling

步骤 5) 在时间=5,进程 P2 到达并被添加到等待队列。P1 将继续执行。

Example of Non-Preemptive Scheduling

步骤 6) 在时间=9,进程 P1 将完成其执行。比较 P3、P5 和 P2 的爆发时间。执行进程 P2,因为其爆发时间最短。

Example of Non-Preemptive Scheduling

步骤 7) 在时间=10,P2 正在执行,P3 和 P5 在等待队列中。

Example of Non-Preemptive Scheduling

步骤 8) 在时间=11,进程 P2 将完成其执行。比较 P3 和 P5 的爆发时间。执行进程 P5,因为其爆发时间较短。

Example of Non-Preemptive Scheduling

步骤 9) 在时间=15,进程 P5 将完成其执行。

Example of Non-Preemptive Scheduling

步骤 10) 在时间=23,进程 P3 将完成其执行。

Example of Non-Preemptive Scheduling

步骤 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

Example of Pre-emptive Scheduling

步骤 1) 执行开始于进程 P1,其爆发时间为 4。在这里,每个进程执行 2 秒。P2 和 P3 仍在等待队列中。

Example of Pre-emptive Scheduling

步骤 2) 在时间=2,P1 被添加到队列末尾,P2 开始执行。

Example of Pre-emptive Scheduling

步骤 3) 在时间=4,P2 被抢占并添加到队列末尾。P3 开始执行。

Example of Pre-emptive Scheduling

步骤 4) 在时间=6,P3 被抢占并添加到队列末尾。P1 开始执行。

Example of Pre-emptive Scheduling

步骤 5) 在时间=8,P1 的爆发时间为 4。它已完成执行。P2 开始执行。

Example of Pre-emptive Scheduling

步骤 6) P2 的爆发时间为 3。它已执行 2 个时间间隔。在时间=9,P2 完成执行。然后,P3 开始执行直到完成。

Example of Pre-emptive Scheduling

步骤 7) 让我们计算上面示例的平均等待时间。

Wait time 
P1= 0+ 4= 4
P2= 2+4= 6
P3= 4+3= 7